/** * @file shellmatta_transport.h * @brief transport layer functions of shellmatta * @author Simon Fischer */ #include "shellmatta_transport.h" shellmatta_retCode_t shellmatta_init_transport_inst() { transportLayerInst.h2s_sequenceCnt = 0; transportLayerInst.s2h_sequenceCnt = 0; transportLayerInst.state = STATE_GET_SOH; transportLayerInst.mandatory = false; transportLayerInst.active = false; return SHELLMATTA_OK; } shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data) { switch (transportLayer->state) { case STATE_GET_SOH: if (SHELLMATTA_START_OF_HEADER == *data) { transportLayer->state = STATE_GET_PROTOCOL_VERSION; transportLayer->active = true; } else { transportLayer->active = false; transportLayer->state = STATE_GET_PAYLOAD; } break; case STATE_GET_PROTOCOL_VERSION: transportLayer->state = STATE_GET_PACKET_TYPE; break; case STATE_GET_PACKET_TYPE: transportLayer->state = STATE_GET_PAYLOAD_LENGTH; break; case STATE_GET_PAYLOAD_LENGTH: transportLayer->state = STATE_GET_SOURCE; break; case STATE_GET_SOURCE: transportLayer->state = STATE_GET_DESTINATION; break; case STATE_GET_DESTINATION: transportLayer->state = STATE_GET_H2S_SEQUENCE_CNT; break; case STATE_GET_H2S_SEQUENCE_CNT: transportLayer->state = STATE_GET_S2H_SEQUENCE_CNT; break; case STATE_GET_S2H_SEQUENCE_CNT: transportLayer->state = STATE_GET_PAYLOAD; break; case STATE_GET_PAYLOAD: if ( (payloadLength == payloadCounter) && (true == transportLayer->active)) { transportLayer->state = STATE_GET_CRC; } break; case STATE_GET_CRC: if (SHELLMATTA_LENGTH_CRC == crcCounter) { transportLayer->state = STATE_GET_SOH; protocolVersion = 0u; packetType = 0u; payloadLength = 0u; source = 0u; destination = 0u; crc32 = 0u; payloadCounter = 0u; crcCounter = 0u; transportLayer->active = false; } break; default: break; } return SHELLMATTA_OK; }