shellmatta_transport.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * @file shellmatta_transport.h
  3. * @brief transport layer functions of shellmatta
  4. * @author Simon Fischer <fischer.simon.1991@gmail.com>
  5. */
  6. #ifndef _SHELLMATTA_TRANSPORT_H_
  7. #define _SHELLMATTA_TRANSPORT_H_
  8. #include "shellmatta.h"
  9. #define PROTOCOL_VERSION 0x01u
  10. /** @brief value of start-of-header character */
  11. #define SHELLMATTA_START_OF_HEADER 0x01u
  12. /* payload length defines */
  13. /** @brief max length of a plain data payload */
  14. #define SHELLMATTA_PAYLOAD_MAXLENGTH ((uint8_t)(255))
  15. /** @brief max length of a request sequence counters payload */
  16. #define SHELLMATTA_PAYLOAD_LEN_SEQ_REQ ((uint8_t)(0))
  17. /** @brief max length of a respond sequence counters payload */
  18. #define SHELLMATTA_PAYLOAD_LEN_SEQ_RES ((uint8_t)(0))
  19. /** @brief max length of a request buffersize payload */
  20. #define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_REQ ((uint8_t)(1))
  21. /** @brief max length of a respond buffersize payload */
  22. #define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_RES ((uint8_t)(1))
  23. /* header field length defines */
  24. #define SHELLMATTA_HEADER_LENGTH ((uint8_t)(8))
  25. /** @brief length of headerfield: start of header */
  26. #define SHELLMATTA_LENGTH_SOH ((uint8_t)(1))
  27. /** @brief length of headerfield: protocol version */
  28. #define SHELLMATTA_LENGTH_PROT_VERSION ((uint8_t)(1))
  29. /** @brief length of headerfield: packet type */
  30. #define SHELLMATTA_LENGTH_PACKET_TYPE ((uint8_t)(1))
  31. /** @brief length of headerfield: payload length */
  32. #define SHELLMATTA_LENGTH_PAYLOAD_LENGTH ((uint8_t)(1))
  33. /** @brief length of headerfield: source */
  34. #define SHELLMATTA_LENGTH_SOURCE ((uint8_t)(1))
  35. /** @brief length of headerfield: destination */
  36. #define SHELLMATTA_LENGTH_DESTINATION ((uint8_t)(1))
  37. /** @brief length of headerfield: host to shell sequence counter */
  38. #define SHELLMATTA_LENGTH_H2S_SEQUENCE_CNT ((uint8_t)(1))
  39. /** @brief length of headerfield: shell to host sequence counter */
  40. #define SHELLMATTA_LENGTH_S2H_SEQUENCE_CNT ((uint8_t)(1))
  41. /** @brief length of headerfield: crc32 of header + payload without crc32 */
  42. #define SHELLMATTA_LENGTH_CRC ((uint8_t)(4))
  43. /* positional defines */
  44. #define SHELLMATTA_POS_SOH ((uint8_t)0)
  45. #define SHELLMATTA_POS_PROT_VER ((uint8_t)1)
  46. #define SHELLMATTA_POS_PACKET_TYPE ((uint8_t)2)
  47. #define SHELLMATTA_POS_PAYLOAD_LEN ((uint8_t)3)
  48. #define SHELLMATTA_POS_SRC ((uint8_t)4)
  49. #define SHELLMATTA_POS_DST ((uint8_t)5)
  50. #define SHELLMATTA_POS_CNT_H2S ((uint8_t)6)
  51. #define SHELLMATTA_POS_CNT_S2H ((uint8_t)7)
  52. #define SHELLMATTA_POS_PAYLOAD ((uint8_t)8)
  53. /* utility defines */
  54. #define SHELLMATTA_SHIFT_BY_1 ((uint8_t)(1))
  55. #define SHELLMATTA_SHIFT_BY_2 ((uint8_t)(2))
  56. #define SHELLMATTA_SHIFT_BY_3 ((uint8_t)(3))
  57. #define SHELLMATTA_SHIFT_BY_8 ((uint8_t)(8))
  58. #define SHELLMATTA_SHIFT_BY_16 ((uint8_t)(16))
  59. #define SHELLMATTA_SHIFT_BY_24 ((uint8_t)(24))
  60. /**
  61. * @brief definition of shellmatta transport layer states
  62. */
  63. typedef enum
  64. {
  65. STATE_GET_SOH =0u, /**< start of header state of transport layer */
  66. STATE_MANUAL_INPUT ,
  67. STATE_GET_PROTOCOL_VERSION , /**< protocol version state of transport layer */
  68. STATE_GET_PACKET_TYPE , /**< packet type state of transport layer */
  69. STATE_GET_PAYLOAD_LENGTH , /**< payload length state of transport layer */
  70. STATE_GET_SOURCE , /**< source state of transport layer */
  71. STATE_GET_DESTINATION , /**< destination state of transport layer */
  72. STATE_GET_H2S_SEQUENCE_CNT , /**< host to shellmatta sequence counter state of transport layer */
  73. STATE_GET_S2H_SEQUENCE_CNT , /**< shellmatta to host sequence counter state of transport layer */
  74. STATE_GET_PAYLOAD , /**< payload state of transport layer */
  75. STATE_GET_CRC , /**< crc state of transport layer */
  76. STATE_PROCESS_PAYLOAD
  77. } shellmatta_transport_state_t;
  78. /**
  79. * @brief definition of shellmatta transport layer packet types
  80. */
  81. typedef enum
  82. {
  83. PACKET_DATA = 0x00u, /**< packet type to send plain data */
  84. PACKET_SEQ_CNT_REQUEST = 0x01u, /**< packet type to request sequence counters */
  85. PACKET_SEQ_CNT_RESPOND = 0x81u, /**< packet type to respond with sequence counters */
  86. PACKET_MAX_BUFFERSIZE_REQUEST = 0x02u, /**< packet type to set and request max buffersize */
  87. PACKET_MAX_BUFFERSIZE_RESPOND = 0x82u, /**< packet type to respond with max buffersize */
  88. PACKET_SEARCH_DEVICE_REQUEST = 0x03u, /**< UNUSED: packet type to request search for a device by unique id */
  89. PACKET_SEARCH_DEVICE_RESPOND = 0x83u, /**< UNUSED: packet type to respond with search results */
  90. PACKET_SET_ADDRESS_REQUEST = 0x04u, /**< UNUSED: packet type to set and request an address */
  91. PACKET_SET_ADDRESS_RESPOND = 0x84u /**< UNUSED: packet type to respond with a set address */
  92. } shellmatta_transport_packet_t;
  93. typedef struct
  94. {
  95. uint8_t h2s_sequenceCnt; /**< */
  96. uint8_t s2h_sequenceCnt; /**< */
  97. shellmatta_transport_state_t state; /**< */
  98. bool mandatory; /**< */
  99. bool active; /**< */
  100. bool continueStep; /**< */
  101. shellmatta_write_t originalWrite; /**< */
  102. } shellmatta_transport_layer_t;
  103. extern uint8_t protocolVersion;
  104. extern shellmatta_transport_packet_t packetType;
  105. extern uint32_t payloadLength;
  106. extern uint8_t source;
  107. extern uint8_t destination;
  108. extern uint32_t crc32;
  109. extern uint8_t payloadCounter;
  110. extern uint8_t crcCounter;
  111. extern uint8_t packetSequenceCounter_h2s;
  112. extern uint8_t packetSequenceCounter_s2h;
  113. extern char payloadBuffer[SHELLMATTA_PAYLOAD_MAXLENGTH];
  114. extern shellmatta_transport_layer_t transportLayerInst;
  115. shellmatta_retCode_t shellmatta_reset_transport(void);
  116. shellmatta_retCode_t shellmatta_init_transport_inst(void);
  117. shellmatta_retCode_t shellmatta_handle_transport_fsm(char *data);
  118. shellmatta_retCode_t shellmatta_write_transport(const char* data, uint32_t length);
  119. #endif /* _SHELLMATTA_TRANSPORT_H_ */