|
@@ -386,73 +386,95 @@ shellmatta_retCode_t shellmatta_processData(shellmatta_handle_t handle,
|
|
if( (NULL != inst)
|
|
if( (NULL != inst)
|
|
&& (SHELLMATTA_MAGIC == inst->magic))
|
|
&& (SHELLMATTA_MAGIC == inst->magic))
|
|
{
|
|
{
|
|
-
|
|
|
|
- uint8_t headerCounter = 0;
|
|
|
|
- while ( (size >= headerCounter)
|
|
|
|
- || ( (true == transportLayerInst.mandatory)
|
|
|
|
- && (size >= headerCounter)))
|
|
|
|
|
|
+ if ( (transportLayerInst.state != STATE_PROCESS_PAYLOAD)
|
|
|
|
+ && (transportLayerInst.state != STATE_MANUAL_INPUT))
|
|
{
|
|
{
|
|
- /* if payload is reached, continue with usual behaviour */
|
|
|
|
- if (STATE_GET_PAYLOAD == transportLayerInst.state)
|
|
|
|
|
|
+ // TODO: Move this into shellmatta_transport.c
|
|
|
|
+ /* use headerCounter to watch how many header fields have been worked on */
|
|
|
|
+ uint8_t headerCounter = 0;
|
|
|
|
+ while ( (size > headerCounter)
|
|
|
|
+ || ( (true == transportLayerInst.mandatory)
|
|
|
|
+ && (size > headerCounter))
|
|
|
|
+ || ( (true == transportLayerInst.continueStep)))
|
|
{
|
|
{
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ switch (transportLayerInst.state)
|
|
|
|
+ {
|
|
|
|
+ case STATE_GET_SOH:
|
|
|
|
+ /* wait for SOH or go to payload */
|
|
|
|
+ break;
|
|
|
|
|
|
- switch (transportLayerInst.state)
|
|
|
|
- {
|
|
|
|
- case STATE_GET_SOH:
|
|
|
|
- /* wait for SOH or go to payload */
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_PROTOCOL_VERSION:
|
|
|
|
+ protocolVersion = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_PROTOCOL_VERSION:
|
|
|
|
- protocolVersion = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_PACKET_TYPE:
|
|
|
|
+ packetType = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_PACKET_TYPE:
|
|
|
|
- packetType = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_PAYLOAD_LENGTH:
|
|
|
|
+ payloadLength = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_PAYLOAD_LENGTH:
|
|
|
|
- payloadLength = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_SOURCE:
|
|
|
|
+ source = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_SOURCE:
|
|
|
|
- source = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_DESTINATION:
|
|
|
|
+ destination = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case STATE_GET_H2S_SEQUENCE_CNT:
|
|
|
|
+ transportLayerInst.h2s_sequenceCnt = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case STATE_GET_S2H_SEQUENCE_CNT:
|
|
|
|
+ transportLayerInst.s2h_sequenceCnt = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_DESTINATION:
|
|
|
|
- destination = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case STATE_GET_H2S_SEQUENCE_CNT:
|
|
|
|
- transportLayerInst.h2s_sequenceCnt = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case STATE_GET_S2H_SEQUENCE_CNT:
|
|
|
|
- transportLayerInst.s2h_sequenceCnt = data[headerCounter];
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_PAYLOAD:
|
|
|
|
+ if (0u == payloadLength)
|
|
|
|
+ {
|
|
|
|
+ transportLayerInst.continueStep = true;
|
|
|
|
+ }
|
|
|
|
+ payloadBuffer[payloadCounter++] = data[headerCounter];
|
|
|
|
+ break;
|
|
|
|
|
|
- case STATE_GET_CRC:
|
|
|
|
- crc32 |= data[headerCounter] << (SHELLMATTA_LENGTH_CRC - crcCounter++);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
|
|
+ case STATE_GET_CRC:
|
|
|
|
+ transportLayerInst.continueStep = false;
|
|
|
|
+ crc32 |= data[headerCounter] << (SHELLMATTA_LENGTH_CRC - crcCounter++) * 8u;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ /* handling of transport layer fsm */
|
|
|
|
+ ret = shellmatta_handle_transport_fsm(&transportLayerInst, data);
|
|
|
|
+
|
|
|
|
+ if (SHELLMATTA_ERROR == ret)
|
|
|
|
+ {
|
|
|
|
+ // TODO: Better error handling
|
|
|
|
+ /* error in this case means crc error */
|
|
|
|
+ shellmatta_printf(handle, "crc error\r\n");
|
|
|
|
+ transportLayerInst.state = STATE_GET_SOH;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ headerCounter++;
|
|
|
|
+
|
|
|
|
+ if (transportLayerInst.state == STATE_PROCESS_PAYLOAD)
|
|
|
|
+ {
|
|
|
|
+ shellmatta_processData(handle, payloadBuffer, payloadLength);
|
|
|
|
+ shellmatta_handle_transport_fsm(&transportLayerInst, data);
|
|
|
|
+ return SHELLMATTA_OK;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- /* handling of transport layer fsm */
|
|
|
|
- shellmatta_handle_transport_fsm(&transportLayerInst, data);
|
|
|
|
- headerCounter++;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- /* if all data is processed but transport layer fsm is still not in payload, return */
|
|
|
|
- if (transportLayerInst.state != STATE_GET_PAYLOAD)
|
|
|
|
|
|
+ if ( (transportLayerInst.active)
|
|
|
|
+ && (transportLayerInst.state != STATE_PROCESS_PAYLOAD)
|
|
|
|
+ && (transportLayerInst.state != STATE_MANUAL_INPUT))
|
|
{
|
|
{
|
|
return SHELLMATTA_OK;
|
|
return SHELLMATTA_OK;
|
|
}
|
|
}
|
|
- else
|
|
|
|
- {
|
|
|
|
- payloadCounter += size;
|
|
|
|
- }
|
|
|
|
|
|
|
|
/** -# in busy mode - keep calling this command */
|
|
/** -# in busy mode - keep calling this command */
|
|
if(NULL != inst->busyCmd)
|
|
if(NULL != inst->busyCmd)
|
|
@@ -780,6 +802,13 @@ shellmatta_retCode_t shellmatta_processData(shellmatta_handle_t handle,
|
|
{
|
|
{
|
|
ret = SHELLMATTA_USE_FAULT;
|
|
ret = SHELLMATTA_USE_FAULT;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /* if manual input happened, reset transport layer fsm back to initial state */
|
|
|
|
+ if (transportLayerInst.state == STATE_MANUAL_INPUT)
|
|
|
|
+ {
|
|
|
|
+ transportLayerInst.state = STATE_GET_SOH;
|
|
|
|
+ }
|
|
|
|
+
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|