Jelajahi Sumber

initial addition of transport layer code

Fischer, Simon | Friedrich Lütze GmbH 3 tahun lalu
induk
melakukan
d7d2c87156
2 mengubah file dengan 154 tambahan dan 0 penghapusan
  1. 62 0
      src/shellmatta_transport.c
  2. 92 0
      src/shellmatta_transport.h

+ 62 - 0
src/shellmatta_transport.c

@@ -0,0 +1,62 @@
+/**
+ * @file    shellmatta_transport.h
+ * @brief   transport layer functions of shellmatta
+ * @author  Simon Fischer <fischer.simon.1991@gmail.com>
+ */
+
+#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;
+}

+ 92 - 0
src/shellmatta_transport.h

@@ -0,0 +1,92 @@
+/**
+ * @file    shellmatta_transport.h
+ * @brief   transport layer functions of shellmatta
+ * @author  Simon Fischer <fischer.simon.1991@gmail.com>
+ */
+
+#ifndef _SHELLMATTA_TRANSPORT_H_
+#define _SHELLMATTA_TRANSPORT_H_
+
+#include "shellmatta.h"
+
+/** @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 */
+/** @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))
+/** @} */
+
+/**
+ * @brief definition of shellmatta transport layer states
+ */
+typedef enum
+{
+    STATE_IDLE              = 0u,   /**< idle state of transport layer */
+    STATE_SOH                   ,   /**< start of header state of transport layer */
+    STATE_PROTOCOL_VERSION      ,   /**< protocol version state of transport layer */
+    STATE_PACKET_TYPE           ,   /**< packet type state of transport layer */
+    STATE_PAYLOAD_LENGTH        ,   /**< payload length state of transport layer */
+    STATE_SOURCE                ,   /**< source state of transport layer */
+    STATE_DESTINATION           ,   /**< destination state of transport layer */
+    STATE_H2S_SEQUENCE_CNT      ,   /**< host to shellmatta sequence counter state of transport layer */
+    STATE_S2H_SEQUENCE_CNT      ,   /**< shellmatta to host sequence counter state of transport layer */
+    STATE_PAYLOAD               ,   /**< payload state of transport layer */
+    STATE_CRC                   ,   /**< crc state of transport layer */
+} 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
+{
+    uint32_t h2s_sequenceCnt;               /**<  */
+    uint32_t s2h_sequenceCnt;               /**<  */
+    shellmatta_transport_state_t state;     /**<  */
+    bool mandatory;                         /**<  */
+} shellmatta_transport_layer_t;
+
+shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data);
+
+#endif /* _SHELLMATTA_TRANSPORT_H_ */