/** * @file shellmatta_transport.h * @brief transport layer functions of shellmatta * @author Simon Fischer */ #include "shellmatta_transport.h" shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data) { switch (transportLayer->state) { case STATE_IDLE: if (SHELLMATTA_START_OF_HEADER == *data) { transportLayer->state = STATE_SOH; } else { transportLayer->state = STATE_PAYLOAD; } break; case STATE_SOH: transportLayer->state = STATE_PROTOCOL_VERSION; break; case STATE_PROTOCOL_VERSION: transportLayer->state = STATE_PACKET_TYPE; break; case STATE_PACKET_TYPE: transportLayer->state = STATE_PAYLOAD_LENGTH; break; case STATE_PAYLOAD_LENGTH: transportLayer->state = STATE_SOURCE; break; case STATE_SOURCE: transportLayer->state = STATE_DESTINATION; break; case STATE_DESTINATION: transportLayer->state = STATE_H2S_SEQUENCE_CNT; break; case STATE_H2S_SEQUENCE_CNT: transportLayer->state = STATE_S2H_SEQUENCE_CNT; break; case STATE_S2H_SEQUENCE_CNT: transportLayer->state = STATE_PAYLOAD; break; case STATE_PAYLOAD: transportLayer->state = STATE_CRC; break; case STATE_CRC: transportLayer->state = STATE_IDLE; transportLayer->h2s_sequenceCnt += 1; // TODO: incrementing both h2s and s2h doesn't make much sense, does it? transportLayer->s2h_sequenceCnt += 1; break; default: break; } return SHELLMATTA_OK; }