shellmatta_transport.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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_init_transport_inst()
  8. {
  9. transportLayerInst.h2s_sequenceCnt = 0;
  10. transportLayerInst.s2h_sequenceCnt = 0;
  11. transportLayerInst.state = STATE_GET_SOH;
  12. transportLayerInst.mandatory = false;
  13. transportLayerInst.active = false;
  14. return SHELLMATTA_OK;
  15. }
  16. shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data)
  17. {
  18. switch (transportLayer->state)
  19. {
  20. case STATE_GET_SOH:
  21. if (SHELLMATTA_START_OF_HEADER == *data)
  22. {
  23. transportLayer->state = STATE_GET_PROTOCOL_VERSION;
  24. transportLayer->active = true;
  25. }
  26. else
  27. {
  28. transportLayer->active = false;
  29. transportLayer->state = STATE_GET_PAYLOAD;
  30. }
  31. break;
  32. case STATE_GET_PROTOCOL_VERSION:
  33. transportLayer->state = STATE_GET_PACKET_TYPE;
  34. break;
  35. case STATE_GET_PACKET_TYPE:
  36. transportLayer->state = STATE_GET_PAYLOAD_LENGTH;
  37. break;
  38. case STATE_GET_PAYLOAD_LENGTH:
  39. transportLayer->state = STATE_GET_SOURCE;
  40. break;
  41. case STATE_GET_SOURCE:
  42. transportLayer->state = STATE_GET_DESTINATION;
  43. break;
  44. case STATE_GET_DESTINATION:
  45. transportLayer->state = STATE_GET_H2S_SEQUENCE_CNT;
  46. break;
  47. case STATE_GET_H2S_SEQUENCE_CNT:
  48. transportLayer->state = STATE_GET_S2H_SEQUENCE_CNT;
  49. break;
  50. case STATE_GET_S2H_SEQUENCE_CNT:
  51. transportLayer->state = STATE_GET_PAYLOAD;
  52. break;
  53. case STATE_GET_PAYLOAD:
  54. if ( (payloadLength == payloadCounter)
  55. && (true == transportLayer->active))
  56. {
  57. transportLayer->state = STATE_GET_CRC;
  58. }
  59. break;
  60. case STATE_GET_CRC:
  61. if (SHELLMATTA_LENGTH_CRC == crcCounter)
  62. {
  63. transportLayer->state = STATE_GET_SOH;
  64. protocolVersion = 0u;
  65. packetType = 0u;
  66. payloadLength = 0u;
  67. source = 0u;
  68. destination = 0u;
  69. crc32 = 0u;
  70. payloadCounter = 0u;
  71. crcCounter = 0u;
  72. transportLayer->active = false;
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. return SHELLMATTA_OK;
  79. }