aboutsummaryrefslogtreecommitdiffhomepage
path: root/AT91SAM7S256/Source/c_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'AT91SAM7S256/Source/c_cmd.c')
-rw-r--r--AT91SAM7S256/Source/c_cmd.c221
1 files changed, 163 insertions, 58 deletions
diff --git a/AT91SAM7S256/Source/c_cmd.c b/AT91SAM7S256/Source/c_cmd.c
index e834625..7bb9b71 100644
--- a/AT91SAM7S256/Source/c_cmd.c
+++ b/AT91SAM7S256/Source/c_cmd.c
@@ -236,9 +236,9 @@ static pSysCall SysCallFuncs[SYSCALL_COUNT] =
cCmdWrapUndefinedSysCall,
cCmdWrapUndefinedSysCall, // 75
cCmdWrapUndefinedSysCall,
- cCmdWrapUndefinedSysCall,
// enhanced NBC/NXC
- cCmdWrapIOMapReadByID, // 78
+ cCmdWrapInputPinFunction, // 77
+ cCmdWrapIOMapReadByID,
cCmdWrapIOMapWriteByID,
cCmdWrapDisplayExecuteFunction, // 80
cCmdWrapCommExecuteFunction,
@@ -942,7 +942,9 @@ UWORD cCmdHandleRemoteCommands(UBYTE * pInBuf, UBYTE * pOutBuf, UBYTE * pLen)
case RC_LS_WRITE:
{
- i = pInBuf[1];
+ i = (pInBuf[1] & 0x03);
+ UBYTE NoRestartOnRead = (pInBuf[1] & 0x04);
+ UBYTE bFast = (pInBuf[1] & 0x08);
Count = pInBuf[2];
//Don't do anything if illegal port specification is made
@@ -952,7 +954,7 @@ UWORD cCmdHandleRemoteCommands(UBYTE * pInBuf, UBYTE * pOutBuf, UBYTE * pLen)
break;
}
- RCStatus = cCmdLSWrite(i, Count, &(pInBuf[4]), pInBuf[3], 0);
+ RCStatus = cCmdLSWrite(i, Count, &(pInBuf[4]), pInBuf[3], NoRestartOnRead, bFast);
}
break;
@@ -3704,7 +3706,7 @@ NXT_STATUS cCmdColorSensorRead (UBYTE Port, SWORD * SensorValue, UWORD * RawArra
UBYTE cCmdIsDSElementIDSane(DS_ELEMENT_ID Index)
{
- if (Index < VarsCmd.DataspaceCount)
+ if ((Index & DATA_ARG_IMM_MASK) < VarsCmd.DataspaceCount)
return TRUE;
else
return FALSE;
@@ -3759,9 +3761,14 @@ void cCmdSetValFlt(void * pVal, TYPE_CODE TypeCode, float NewVal)
switch (TypeCode)
{
case TC_ULONG:
+ {
+ *(ULONG*)pVal = (ULONG)NewVal;
+ }
+ break;
+
case TC_SLONG:
{
- *(ULONG*)pVal = NewVal;
+ *(SLONG*)pVal = (SLONG)NewVal;
}
break;
@@ -3965,8 +3972,12 @@ void* cCmdDSPtr(DS_ELEMENT_ID DSElementID, UWORD Offset)
void * pDSItem;
DV_INDEX DVIndex;
TYPE_CODE TypeCode;
+ UBYTE bPointer = (DSElementID & 0x8000) != 0;
NXT_ASSERT(cCmdIsDSElementIDSane(DSElementID));
+
+ DSElementID &= DATA_ARG_IMM_MASK;
+ // pointers are only valid if the type is UWORD
TypeCode = cCmdDSType(DSElementID);
if (TypeCode == TC_ARRAY)
@@ -3988,8 +3999,17 @@ void* cCmdDSPtr(DS_ELEMENT_ID DSElementID, UWORD Offset)
pDSItem = cCmdDSPtr(INC_ID(DSElementID), Offset);
}
else
- pDSItem = (VarsCmd.pDataspace + VarsCmd.pDataspaceTOC[DSElementID].DSOffset + Offset);
-
+ {
+ if (bPointer && (TypeCode == TC_UWORD))
+ {
+ pDSItem = (VarsCmd.pDataspace + VarsCmd.pDataspaceTOC[DSElementID].DSOffset + Offset);
+ DSElementID = cCmdGetVal(pDSItem, TypeCode);
+ pDSItem = cCmdDSPtr(DSElementID, Offset);
+ }
+ else
+ pDSItem = (VarsCmd.pDataspace + VarsCmd.pDataspaceTOC[DSElementID].DSOffset + Offset);
+ }
+
NXT_ASSERT((UBYTE*)pDSItem < POOL_SENTINEL);
return pDSItem;
@@ -7365,7 +7385,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
(Arg1 == OPARR_SUMSQR) || (Arg1 == OPARR_STD))
{
pArg2 = cCmdResolveDataArg(Arg2, 0, &TypeCode2);
- if (TypeCode3 == TC_FLOAT)
+ if (TypeCode2 == TC_FLOAT)
{
fval = 0;
for (i = 0; i < MinCount; i++)
@@ -7381,7 +7401,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
else if (Arg1 != OPARR_STD)
cCmdSetValFlt(pArg2, TypeCode2, fval);
}
- else if (IS_SIGNED_TYPE(TypeCode3) && (Arg1 != OPARR_SUMSQR))
+ else if (IS_SIGNED_TYPE(TypeCode2) && (Arg1 != OPARR_SUMSQR))
{
sval = 0;
for (i = 0; i < MinCount; i++)
@@ -7401,7 +7421,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
for (i = 0; i < MinCount; i++)
{
pArg3 = cCmdResolveDataArg(INC_ID(Arg3), ARRAY_ELEM_OFFSET(DVIndex3, ArgVal4 + i), NULL);
- if (IS_SIGNED_TYPE(TypeCode3))
+ if (IS_SIGNED_TYPE(TypeCode2))
{
// this can only be the SUMSQR operation (given the IF statement above)
svaltmp = cCmdGetVal(pArg3, TypeCode3);
@@ -7424,9 +7444,9 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
if (Arg1 == OPARR_STD)
{
float avg, delta, sumSqr;
- if (TypeCode3 == TC_FLOAT)
+ if (TypeCode2 == TC_FLOAT)
avg = fval/numElements;
- else if (IS_SIGNED_TYPE(TypeCode3))
+ else if (IS_SIGNED_TYPE(TypeCode2))
avg = (float)sval/numElements;
else
avg = (float)uval/numElements;
@@ -7434,18 +7454,18 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
for (i = 0; i < MinCount; i++)
{
pArg3 = cCmdResolveDataArg(INC_ID(Arg3), ARRAY_ELEM_OFFSET(DVIndex3, ArgVal4 + i), NULL);
- if (TypeCode3 == TC_FLOAT)
+ if (TypeCode2 == TC_FLOAT)
delta = cCmdGetValFlt(pArg3, TypeCode3) - avg;
- if (IS_SIGNED_TYPE(TypeCode3))
+ else if (IS_SIGNED_TYPE(TypeCode2))
delta = (float)(SLONG)cCmdGetVal(pArg3, TypeCode3) - avg;
else // unsigned types
delta = (float)cCmdGetVal(pArg3, TypeCode3) - avg;
sumSqr += (delta*delta);
}
delta = sqrtf(sumSqr / (numElements - (float)1.0));
- if (TypeCode3 == TC_FLOAT)
+ if (TypeCode2 == TC_FLOAT)
cCmdSetValFlt(pArg2, TypeCode2, delta);
- else if (IS_SIGNED_TYPE(TypeCode3))
+ else if (IS_SIGNED_TYPE(TypeCode2))
cCmdSetVal(pArg2, TypeCode2, (SLONG)delta);
else
cCmdSetVal(pArg2, TypeCode2, (ULONG)delta);
@@ -7454,7 +7474,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
else if ((Arg1 == OPARR_MIN) || (Arg1 == OPARR_MAX))
{
pArg2 = cCmdResolveDataArg(Arg2, 0, &TypeCode2);
- if (TypeCode3 == TC_FLOAT)
+ if (TypeCode2 == TC_FLOAT)
{
if (Arg1 == OPARR_MIN)
fval = FLT_MAX;
@@ -7470,7 +7490,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode)
}
cCmdSetValFlt(pArg2, TypeCode2, fval);
}
- else if (IS_SIGNED_TYPE(TypeCode3))
+ else if (IS_SIGNED_TYPE(TypeCode2))
{
if (Arg1 == OPARR_MIN)
sval = LONG_MAX;
@@ -7703,7 +7723,7 @@ UBYTE cCmdLSCalcBytesReady(UBYTE Port)
//cCmdLSWrite
//Write BufLength bytes into specified port's lowspeed buffer and kick off comm process to device
-NXT_STATUS cCmdLSWrite(UBYTE Port, UBYTE BufLength, UBYTE *pBuf, UBYTE ResponseLength, UBYTE NoRestartOnRead)
+NXT_STATUS cCmdLSWrite(UBYTE Port, UBYTE BufLength, UBYTE *pBuf, UBYTE ResponseLength, UBYTE NoRestartOnRead, UBYTE bFast)
{
if (Port >= NO_OF_LOWSPEED_COM_CHANNEL)
{
@@ -7735,9 +7755,13 @@ NXT_STATUS cCmdLSWrite(UBYTE Port, UBYTE BufLength, UBYTE *pBuf, UBYTE ResponseL
*pChState = LOWSPEED_INIT;
pMapLowSpeed->State |= (COM_CHANNEL_ONE_ACTIVE << Port);
if (NoRestartOnRead)
- pMapLowSpeed->NoRestartOnRead |= (0x01 << Port);
+ pMapLowSpeed->NoRestartOnRead |= (COM_CHANNEL_NO_RESTART_1 << Port);
+ else
+ pMapLowSpeed->NoRestartOnRead &= ~(COM_CHANNEL_NO_RESTART_1 << Port);
+ if (bFast)
+ pMapLowSpeed->Speed |= (COM_CHANNEL_ONE_FAST << Port);
else
- pMapLowSpeed->NoRestartOnRead &= ~(0x01 << Port);
+ pMapLowSpeed->Speed &= ~(COM_CHANNEL_ONE_FAST << Port);
return (NO_ERR);
}
@@ -8203,10 +8227,12 @@ NXT_STATUS cCmdWrapReadButton(UBYTE * ArgV[])
NXT_STATUS cCmdWrapCommLSWrite(UBYTE * ArgV[])
{
SBYTE * pReturnVal = (SBYTE*)(ArgV[0]);
- UBYTE Port = *(ArgV[1]);
+ UBYTE Port = (*(ArgV[1]) & 0x03); // 0..3 are valid port numbers
UBYTE * pBuf;
UWORD BufLength;
UBYTE ResponseLength = *(ArgV[3]);
+ UBYTE NoRestartOnRead = (*(ArgV[1]) & 0x04);
+ UBYTE bFast = (*(ArgV[1]) & 0x08);
DV_INDEX DVIndex;
//Resolve array arguments
@@ -8214,7 +8240,11 @@ NXT_STATUS cCmdWrapCommLSWrite(UBYTE * ArgV[])
pBuf = cCmdDVPtr(DVIndex);
BufLength = DV_ARRAY[DVIndex].Count;
- *pReturnVal = cCmdLSWrite(Port, (UBYTE)BufLength, pBuf, ResponseLength, 0);
+ *pReturnVal = cCmdLSWrite(Port, (UBYTE)BufLength, pBuf, ResponseLength, NoRestartOnRead, bFast);
+ if (bFast && (*pReturnVal == NO_ERR))
+ *pReturnVal = pMapLowSpeed->pFunc(Port);
+ if (*pReturnVal >= NO_ERR)
+ *pReturnVal = NO_ERR; // returning a positive value causes problems in NXC API code that expects 0 (success) or non-zero error
return (NO_ERR);
}
@@ -8590,8 +8620,8 @@ NXT_STATUS cCmdWrapCommBTWrite(UBYTE * ArgV[])
//
//cCmdWrapCommBTRead
//ArgV[0]: (return) Status byte, SBYTE
-//ArgV[1]: Count to read
-//ArgV[2]: Buffer
+//ArgV[1]: Buffer
+//ArgV[2]: Count to read
//
NXT_STATUS cCmdWrapCommBTRead(UBYTE * ArgV[])
{
@@ -9532,19 +9562,33 @@ NXT_STATUS cCmdWrapCommHSControl(UBYTE * ArgV[])
return (NO_ERR);
}
+//cCmdHSCalcBytesReady
+//Calculate true number of bytes available in the inbound HS buffer
+UBYTE cCmdHSCalcBytesReady()
+{
+ SWORD Tmp = pMapComm->HsInBuf.InPtr - pMapComm->HsInBuf.OutPtr;
+ if (Tmp < 0)
+ Tmp = (pMapComm->HsInBuf.InPtr + (SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr));
+ return (UBYTE)(Tmp);
+}
+
//cCmdWrapCommHSCheckStatus
//ArgV[0]: SendingData, UBYTE out
//ArgV[1]: DataAvailable, UBYTE out
NXT_STATUS cCmdWrapCommHSCheckStatus(UBYTE * ArgV[])
{
- *(ArgV[0]) = (pMapComm->HsOutBuf.InPtr != pMapComm->HsOutBuf.OutPtr) || (pMapComm->HsState == HS_SEND_DATA);
- *(ArgV[1]) = (pMapComm->HsInBuf.InPtr != pMapComm->HsInBuf.OutPtr);
+ *(ArgV[0]) = (pMapComm->HsState > HS_BYTES_REMAINING) ?
+ (pMapComm->HsState - HS_BYTES_REMAINING) :
+ 0;
+ *(ArgV[1]) = cCmdHSCalcBytesReady();
+
return (NO_ERR);
}
//cCmdWrapCommHSWrite
//ArgV[0]: (return) Status byte, SBYTE
//ArgV[1]: Buffer
+//ArgV[2]: BufferLength -- not used for Write
NXT_STATUS cCmdWrapCommHSWrite(UBYTE * ArgV[])
{
SBYTE * pReturnVal = (SBYTE*)(ArgV[0]);
@@ -9577,41 +9621,79 @@ NXT_STATUS cCmdWrapCommHSWrite(UBYTE * ArgV[])
return (NO_ERR);
}
+//cCmdHSRead
+//Read BufLength bytes from the hispeed buffer
+NXT_STATUS cCmdHSRead(UBYTE BufLength, UBYTE * pBuf)
+{
+ UBYTE BytesReady, BytesToRead;
+
+ if (BufLength > SIZE_OF_HSBUF)
+ {
+ return (ERR_INVALID_SIZE);
+ }
+
+ BytesReady = cCmdHSCalcBytesReady();
+
+ if (BufLength > BytesReady)
+ {
+ return (ERR_COMM_CHAN_NOT_READY);
+ }
+
+ BytesToRead = BufLength;
+
+ HSBUF * pInBuf = &(pMapComm->HsInBuf);
+
+ //If the bytes we want to read wrap around the end, we must first read the end, then reset back to the beginning
+ if (pInBuf->OutPtr + BytesToRead >= SIZE_OF_HSBUF)
+ {
+ BytesToRead = SIZE_OF_HSBUF - pInBuf->OutPtr;
+ memcpy(pBuf, pInBuf->Buf + pInBuf->OutPtr, BytesToRead);
+ pInBuf->OutPtr = 0;
+ pBuf += BytesToRead;
+ BytesToRead = BufLength - BytesToRead;
+ }
+ if (BytesToRead > 0) {
+ memcpy(pBuf, pInBuf->Buf + pInBuf->OutPtr, BytesToRead);
+ pInBuf->OutPtr += BytesToRead;
+ }
+
+ return (NO_ERR);
+}
+
//cCmdWrapCommHSRead
//ArgV[0]: (return) Status byte, SBYTE
//ArgV[1]: Buffer, out
+//ArgV[2]: BufferLength, UBYTE, specifies size of buffer requested
NXT_STATUS cCmdWrapCommHSRead(UBYTE * ArgV[])
{
- //Normally, bytes available is a simple difference.
- SLONG Tmp = pMapComm->HsInBuf.InPtr - pMapComm->HsInBuf.OutPtr;
-
- //If InPtr is actually behind OutPtr, circular buffer has wrapped. Account for wrappage...
- if (Tmp < 0)
- Tmp = (pMapComm->HsInBuf.InPtr + (SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr));
-
- //Resolve array arguments
- // output buffer
+ SBYTE * pReturnVal = (SBYTE*)(ArgV[0]);
DV_INDEX DVIndex = *(DV_INDEX *)(ArgV[1]);
- //Size Buffer to Length
- NXT_STATUS Status = cCmdDVArrayAlloc(DVIndex, (UWORD)Tmp);
- if (IS_ERR(Status))
- return Status;
- UBYTE* pBuf = cCmdDVPtr(DVIndex);
- ArgV[1] = pBuf;
+ UBYTE BufLength = *(ArgV[2]);
+ UBYTE BytesToRead;
+ NXT_STATUS Status;
+ UBYTE * pBuf;
- //If the bytes we want to read wrap around the end, we must first read the end, then reset back to the beginning
- UBYTE BytesToRead = (UBYTE)Tmp;
- if (pMapComm->HsInBuf.OutPtr + BytesToRead >= SIZE_OF_HSBUF)
+ BytesToRead = cCmdHSCalcBytesReady();
+
+ if (BytesToRead > 0)
{
- BytesToRead = SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr;
- memcpy(pBuf, pMapComm->HsInBuf.Buf + pMapComm->HsInBuf.OutPtr, BytesToRead);
- pMapComm->HsInBuf.OutPtr = 0;
- pBuf += BytesToRead;
- BytesToRead = Tmp - BytesToRead;
- }
+ //Limit buffer to available data
+ if (BufLength > BytesToRead)
+ BufLength = BytesToRead;
- memcpy(pBuf, pMapComm->HsInBuf.Buf + pMapComm->HsInBuf.OutPtr, BytesToRead);
- pMapComm->HsInBuf.OutPtr += BytesToRead;
+ Status = cCmdDVArrayAlloc(DVIndex, BufLength);
+ if (IS_ERR(Status))
+ return (Status);
+
+ pBuf = cCmdDVPtr(DVIndex);
+ *pReturnVal = cCmdHSRead(BufLength, pBuf);
+ }
+ else
+ {
+ Status = cCmdDVArrayAlloc(DVIndex, 0);
+ if (IS_ERR(Status))
+ return (Status);
+ }
return (NO_ERR);
}
@@ -9621,16 +9703,18 @@ NXT_STATUS cCmdWrapCommHSRead(UBYTE * ArgV[])
//ArgV[1]: Port specifier, UBYTE
//ArgV[2]: Buffer to send, UBYTE array, only SIZE_OF_LSBUF bytes will be used
//ArgV[3]: ResponseLength, UBYTE, specifies expected bytes back from slave device
-//ArgV[4]: NoRestartOnRead, UBYTE, specifies whether or not to restart before the read
+//ArgV[4]: Options, UBYTE, specifies whether or not to restart before the read and whether to use fast mode or not
//
NXT_STATUS cCmdWrapCommLSWriteEx(UBYTE * ArgV[])
{
+/*
SBYTE * pReturnVal = (SBYTE*)(ArgV[0]);
UBYTE Port = *(ArgV[1]);
UBYTE * pBuf;
UWORD BufLength;
UBYTE ResponseLength = *(ArgV[3]);
- UBYTE NoRestartOnRead = *(ArgV[4]);
+ UBYTE NoRestartOnRead = *(ArgV[4]) & 0x01;
+ UBYTE bFast = *(ArgV[4]) & 0x02;
DV_INDEX DVIndex;
//Resolve array arguments
@@ -9638,8 +9722,8 @@ NXT_STATUS cCmdWrapCommLSWriteEx(UBYTE * ArgV[])
pBuf = cCmdDVPtr(DVIndex);
BufLength = DV_ARRAY[DVIndex].Count;
- *pReturnVal = cCmdLSWrite(Port, (UBYTE)BufLength, pBuf, ResponseLength, NoRestartOnRead);
-
+ *pReturnVal = cCmdLSWrite(Port, (UBYTE)BufLength, pBuf, ResponseLength, NoRestartOnRead, bFast);
+*/
return (NO_ERR);
}
@@ -9793,6 +9877,27 @@ NXT_STATUS cCmdWrapRandomEx(UBYTE * ArgV[])
return NO_ERR;
}
+
+//
+//cCmdWrapInputPinFunction
+//ArgV[0]: (return) Result word, UWORD
+//ArgV[1]: UBYTE Cmd
+//ArgV[2]: UBYTE Port
+//ArgV[3]: UBYTE Pin
+//ArgV[4]: UBYTE pData
+//
+NXT_STATUS cCmdWrapInputPinFunction(UBYTE * ArgV[])
+{
+ *(UWORD*)(ArgV[0]) =
+ pMapInput->pFunc(*(UBYTE*)(ArgV[1]),
+ *(UBYTE*)(ArgV[2]),
+ *(UBYTE*)(ArgV[3]),
+ (UBYTE*)(ArgV[4])
+ );
+ return (NO_ERR);
+}
+
+
NXT_STATUS cCmdWrapUndefinedSysCall(UBYTE * ArgV[])
{
return (NO_ERR);