/** * @file shellmatta_transport.h * @brief transport layer functions of shellmatta * @author Simon Fischer */ #ifndef _SHELLMATTA_TRANSPORT_H_ #define _SHELLMATTA_TRANSPORT_H_ #include "shellmatta.h" #define PROTOCOL_VERSION 0x01u /** @brief value of start-of-header character */ #define SHELLMATTA_START_OF_HEADER 0x01u /* payload length defines */ /** @brief max length of a plain data payload */ #define SHELLMATTA_PAYLOAD_MAXLENGTH ((uint8_t)(255)) /** @brief max length of a request sequence counters payload */ #define SHELLMATTA_PAYLOAD_LEN_SEQ_REQ ((uint8_t)(0)) /** @brief max length of a respond sequence counters payload */ #define SHELLMATTA_PAYLOAD_LEN_SEQ_RES ((uint8_t)(0)) /** @brief max length of a request buffersize payload */ #define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_REQ ((uint8_t)(1)) /** @brief max length of a respond buffersize payload */ #define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_RES ((uint8_t)(1)) /* header field length defines */ #define SHELLMATTA_HEADER_LENGTH ((uint8_t)(8)) /** @brief length of headerfield: start of header */ #define SHELLMATTA_LENGTH_SOH ((uint8_t)(1)) /** @brief length of headerfield: protocol version */ #define SHELLMATTA_LENGTH_PROT_VERSION ((uint8_t)(1)) /** @brief length of headerfield: packet type */ #define SHELLMATTA_LENGTH_PACKET_TYPE ((uint8_t)(1)) /** @brief length of headerfield: payload length */ #define SHELLMATTA_LENGTH_PAYLOAD_LENGTH ((uint8_t)(1)) /** @brief length of headerfield: source */ #define SHELLMATTA_LENGTH_SOURCE ((uint8_t)(1)) /** @brief length of headerfield: destination */ #define SHELLMATTA_LENGTH_DESTINATION ((uint8_t)(1)) /** @brief length of headerfield: host to shell sequence counter */ #define SHELLMATTA_LENGTH_H2S_SEQUENCE_CNT ((uint8_t)(1)) /** @brief length of headerfield: shell to host sequence counter */ #define SHELLMATTA_LENGTH_S2H_SEQUENCE_CNT ((uint8_t)(1)) /** @brief length of headerfield: crc32 of header + payload without crc32 */ #define SHELLMATTA_LENGTH_CRC ((uint8_t)(4)) /* positional defines */ #define SHELLMATTA_POS_SOH ((uint8_t)0) #define SHELLMATTA_POS_PROT_VER ((uint8_t)1) #define SHELLMATTA_POS_PACKET_TYPE ((uint8_t)2) #define SHELLMATTA_POS_PAYLOAD_LEN ((uint8_t)3) #define SHELLMATTA_POS_SRC ((uint8_t)4) #define SHELLMATTA_POS_DST ((uint8_t)5) #define SHELLMATTA_POS_CNT_H2S ((uint8_t)6) #define SHELLMATTA_POS_CNT_S2H ((uint8_t)7) #define SHELLMATTA_POS_PAYLOAD ((uint8_t)8) /* utility defines */ #define SHELLMATTA_SHIFT_BY_1 ((uint8_t)(1)) #define SHELLMATTA_SHIFT_BY_2 ((uint8_t)(2)) #define SHELLMATTA_SHIFT_BY_3 ((uint8_t)(3)) #define SHELLMATTA_SHIFT_BY_8 ((uint8_t)(8)) #define SHELLMATTA_SHIFT_BY_16 ((uint8_t)(16)) #define SHELLMATTA_SHIFT_BY_24 ((uint8_t)(24)) /** * @brief definition of shellmatta transport layer states */ typedef enum { STATE_GET_SOH =0u, /**< start of header state of transport layer */ STATE_MANUAL_INPUT , STATE_GET_PROTOCOL_VERSION , /**< protocol version state of transport layer */ STATE_GET_PACKET_TYPE , /**< packet type state of transport layer */ STATE_GET_PAYLOAD_LENGTH , /**< payload length state of transport layer */ STATE_GET_SOURCE , /**< source state of transport layer */ STATE_GET_DESTINATION , /**< destination state of transport layer */ STATE_GET_H2S_SEQUENCE_CNT , /**< host to shellmatta sequence counter state of transport layer */ STATE_GET_S2H_SEQUENCE_CNT , /**< shellmatta to host sequence counter state of transport layer */ STATE_GET_PAYLOAD , /**< payload state of transport layer */ STATE_GET_CRC , /**< crc state of transport layer */ STATE_PROCESS_PAYLOAD } shellmatta_transport_state_t; /** * @brief definition of shellmatta transport layer packet types */ typedef enum { PACKET_DATA = 0x00u, /**< packet type to send plain data */ PACKET_SEQ_CNT_REQUEST = 0x01u, /**< packet type to request sequence counters */ PACKET_SEQ_CNT_RESPOND = 0x81u, /**< packet type to respond with sequence counters */ PACKET_MAX_BUFFERSIZE_REQUEST = 0x02u, /**< packet type to set and request max buffersize */ PACKET_MAX_BUFFERSIZE_RESPOND = 0x82u, /**< packet type to respond with max buffersize */ PACKET_SEARCH_DEVICE_REQUEST = 0x03u, /**< UNUSED: packet type to request search for a device by unique id */ PACKET_SEARCH_DEVICE_RESPOND = 0x83u, /**< UNUSED: packet type to respond with search results */ PACKET_SET_ADDRESS_REQUEST = 0x04u, /**< UNUSED: packet type to set and request an address */ PACKET_SET_ADDRESS_RESPOND = 0x84u /**< UNUSED: packet type to respond with a set address */ } shellmatta_transport_packet_t; typedef struct { uint8_t h2s_sequenceCnt; /**< */ uint8_t s2h_sequenceCnt; /**< */ shellmatta_transport_state_t state; /**< */ bool mandatory; /**< */ bool active; /**< */ bool continueStep; /**< */ shellmatta_write_t originalWrite; /**< */ } shellmatta_transport_layer_t; extern uint8_t protocolVersion; extern shellmatta_transport_packet_t packetType; extern uint32_t payloadLength; extern uint8_t source; extern uint8_t destination; extern uint32_t crc32; extern uint8_t payloadCounter; extern uint8_t crcCounter; extern uint8_t packetSequenceCounter_h2s; extern uint8_t packetSequenceCounter_s2h; extern char payloadBuffer[SHELLMATTA_PAYLOAD_MAXLENGTH]; extern shellmatta_transport_layer_t transportLayerInst; shellmatta_retCode_t shellmatta_reset_transport(void); shellmatta_retCode_t shellmatta_init_transport_inst(void); shellmatta_retCode_t shellmatta_handle_transport_fsm(char *data); shellmatta_retCode_t shellmatta_write_transport(const char* data, uint32_t length); #endif /* _SHELLMATTA_TRANSPORT_H_ */