shellmatta_transport.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * @file shellmatta_transport.h
  3. * @brief transport layer functions of shellmatta
  4. * @author Simon Fischer <fischer.simon.1991@gmail.com>
  5. */
  6. #include "shellmatta_transport.h"
  7. shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data)
  8. {
  9. switch (transportLayer->state)
  10. {
  11. case STATE_IDLE:
  12. if (SHELLMATTA_START_OF_HEADER == *data)
  13. {
  14. transportLayer->state = STATE_SOH;
  15. }
  16. else
  17. {
  18. transportLayer->state = STATE_PAYLOAD;
  19. }
  20. break;
  21. case STATE_SOH:
  22. transportLayer->state = STATE_PROTOCOL_VERSION;
  23. break;
  24. case STATE_PROTOCOL_VERSION:
  25. transportLayer->state = STATE_PACKET_TYPE;
  26. break;
  27. case STATE_PACKET_TYPE:
  28. transportLayer->state = STATE_PAYLOAD_LENGTH;
  29. break;
  30. case STATE_PAYLOAD_LENGTH:
  31. transportLayer->state = STATE_SOURCE;
  32. break;
  33. case STATE_SOURCE:
  34. transportLayer->state = STATE_DESTINATION;
  35. break;
  36. case STATE_DESTINATION:
  37. transportLayer->state = STATE_H2S_SEQUENCE_CNT;
  38. break;
  39. case STATE_H2S_SEQUENCE_CNT:
  40. transportLayer->state = STATE_S2H_SEQUENCE_CNT;
  41. break;
  42. case STATE_S2H_SEQUENCE_CNT:
  43. transportLayer->state = STATE_PAYLOAD;
  44. break;
  45. case STATE_PAYLOAD:
  46. transportLayer->state = STATE_CRC;
  47. break;
  48. case STATE_CRC:
  49. transportLayer->state = STATE_IDLE;
  50. transportLayer->h2s_sequenceCnt += 1;
  51. // TODO: incrementing both h2s and s2h doesn't make much sense, does it?
  52. transportLayer->s2h_sequenceCnt += 1;
  53. break;
  54. default:
  55. break;
  56. }
  57. return SHELLMATTA_OK;
  58. }