Browse Source

expand transport layer by some meta information

Fischer, Simon 3 years ago
parent
commit
b976b8a213
2 changed files with 88 additions and 52 deletions
  1. 50 27
      src/shellmatta_transport.c
  2. 38 25
      src/shellmatta_transport.h

+ 50 - 27
src/shellmatta_transport.c

@@ -6,52 +6,75 @@
 
 
 #include "shellmatta_transport.h"
 #include "shellmatta_transport.h"
 
 
+shellmatta_retCode_t shellmatta_init_transport_inst()
+{
+    transportLayerInst.h2s_sequenceCnt = 0;
+    transportLayerInst.s2h_sequenceCnt = 0;
+    transportLayerInst.state = STATE_GET_SOH;
+    transportLayerInst.mandatory = false;
+    transportLayerInst.active = false;
+
+    return SHELLMATTA_OK;
+}
+
 shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data)
 shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data)
 {
 {
     switch (transportLayer->state)
     switch (transportLayer->state)
     {
     {
-    case STATE_IDLE:
+    case STATE_GET_SOH:
         if (SHELLMATTA_START_OF_HEADER == *data)
         if (SHELLMATTA_START_OF_HEADER == *data)
         {
         {
-            transportLayer->state = STATE_SOH;
+            transportLayer->state = STATE_GET_PROTOCOL_VERSION;
+            transportLayer->active = true;
         }
         }
         else
         else
         {
         {
-            transportLayer->state = STATE_PAYLOAD;
+            transportLayer->active = false;
+            transportLayer->state = STATE_GET_PAYLOAD;
         }
         }
         break;
         break;
-    case STATE_SOH:
-        transportLayer->state = STATE_PROTOCOL_VERSION;
+    case STATE_GET_PROTOCOL_VERSION:
+        transportLayer->state = STATE_GET_PACKET_TYPE;
         break;
         break;
-    case STATE_PROTOCOL_VERSION:
-        transportLayer->state = STATE_PACKET_TYPE;
+    case STATE_GET_PACKET_TYPE:
+        transportLayer->state = STATE_GET_PAYLOAD_LENGTH;
         break;
         break;
-    case STATE_PACKET_TYPE:
-        transportLayer->state = STATE_PAYLOAD_LENGTH;
+    case STATE_GET_PAYLOAD_LENGTH:
+        transportLayer->state = STATE_GET_SOURCE;
         break;
         break;
-    case STATE_PAYLOAD_LENGTH:
-        transportLayer->state = STATE_SOURCE;
+    case STATE_GET_SOURCE:
+        transportLayer->state = STATE_GET_DESTINATION;
         break;
         break;
-    case STATE_SOURCE:
-        transportLayer->state = STATE_DESTINATION;
+    case STATE_GET_DESTINATION:
+        transportLayer->state = STATE_GET_H2S_SEQUENCE_CNT;
         break;
         break;
-    case STATE_DESTINATION:
-        transportLayer->state = STATE_H2S_SEQUENCE_CNT;
+    case STATE_GET_H2S_SEQUENCE_CNT:
+        transportLayer->state = STATE_GET_S2H_SEQUENCE_CNT;
         break;
         break;
-    case STATE_H2S_SEQUENCE_CNT:
-        transportLayer->state = STATE_S2H_SEQUENCE_CNT;
+    case STATE_GET_S2H_SEQUENCE_CNT:
+        transportLayer->state = STATE_GET_PAYLOAD;
         break;
         break;
-    case STATE_S2H_SEQUENCE_CNT:
-        transportLayer->state = STATE_PAYLOAD;
-        break;
-    case STATE_PAYLOAD:
-        transportLayer->state = STATE_CRC;
+    case STATE_GET_PAYLOAD:
+        if (    (payloadLength == payloadCounter)
+            &&  (true == transportLayer->active))
+        {
+            transportLayer->state = STATE_GET_CRC;
+        }
         break;
         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; 
+    case STATE_GET_CRC:
+        if (SHELLMATTA_LENGTH_CRC == crcCounter)
+        {
+            transportLayer->state = STATE_GET_SOH;
+            protocolVersion = 0u;
+            packetType      = 0u;
+            payloadLength   = 0u;
+            source          = 0u;
+            destination     = 0u;
+            crc32           = 0u;
+            payloadCounter  = 0u;
+            crcCounter      = 0u;
+            transportLayer->active = false;
+        }
         break;
         break;
     
     
     default:
     default:

+ 38 - 25
src/shellmatta_transport.h

@@ -14,35 +14,35 @@
 
 
 /* payload length defines */
 /* payload length defines */
 /** @brief max length of a plain data payload */
 /** @brief max length of a plain data payload */
-#define SHELLMATTA_PAYLOAD_MAXLENGTH        (uint8_t(255))
+#define SHELLMATTA_PAYLOAD_MAXLENGTH        ((uint8_t)(255))
 /** @brief max length of a request sequence counters payload */
 /** @brief max length of a request sequence counters payload */
-#define SHELLMATTA_PAYLOAD_LEN_SEQ_REQ      (uint8_t(0))
+#define SHELLMATTA_PAYLOAD_LEN_SEQ_REQ      ((uint8_t)(0))
 /** @brief max length of a respond sequence counters payload */
 /** @brief max length of a respond sequence counters payload */
-#define SHELLMATTA_PAYLOAD_LEN_SEQ_RES      (uint8_t(0))
+#define SHELLMATTA_PAYLOAD_LEN_SEQ_RES      ((uint8_t)(0))
 /** @brief max length of a request buffersize payload */
 /** @brief max length of a request buffersize payload */
-#define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_REQ  (uint8_t(1))
+#define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_REQ  ((uint8_t)(1))
 /** @brief max length of a respond buffersize payload */
 /** @brief max length of a respond buffersize payload */
-#define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_RES  (uint8_t(1))
+#define SHELLMATTA_PAYLOAD_LEN_BUFSIZE_RES  ((uint8_t)(1))
 
 
 /* header field length defines */
 /* header field length defines */
 /** @brief length of headerfield: start of header */
 /** @brief length of headerfield: start of header */
-#define SHELLMATTA_LENGTH_SOH               (uint8_t(1))
+#define SHELLMATTA_LENGTH_SOH               ((uint8_t)(1))
 /** @brief length of headerfield: protocol version */
 /** @brief length of headerfield: protocol version */
-#define SHELLMATTA_LENGTH_PROT_VERSION      (uint8_t(1))
+#define SHELLMATTA_LENGTH_PROT_VERSION      ((uint8_t)(1))
 /** @brief length of headerfield: packet type */
 /** @brief length of headerfield: packet type */
-#define SHELLMATTA_LENGTH_PACKET_TYPE       (uint8_t(1))
+#define SHELLMATTA_LENGTH_PACKET_TYPE       ((uint8_t)(1))
 /** @brief length of headerfield: payload length */
 /** @brief length of headerfield: payload length */
-#define SHELLMATTA_LENGTH_PAYLOAD_LENGTH    (uint8_t(1))
+#define SHELLMATTA_LENGTH_PAYLOAD_LENGTH    ((uint8_t)(1))
 /** @brief length of headerfield: source */
 /** @brief length of headerfield: source */
-#define SHELLMATTA_LENGTH_SOURCE            (uint8_t(1))
+#define SHELLMATTA_LENGTH_SOURCE            ((uint8_t)(1))
 /** @brief length of headerfield: destination */
 /** @brief length of headerfield: destination */
-#define SHELLMATTA_LENGTH_DESTINATION       (uint8_t(1))
+#define SHELLMATTA_LENGTH_DESTINATION       ((uint8_t)(1))
 /** @brief length of headerfield: host to shell sequence counter */
 /** @brief length of headerfield: host to shell sequence counter */
-#define SHELLMATTA_LENGTH_H2S_SEQUENCE_CNT  (uint8_t(1))
+#define SHELLMATTA_LENGTH_H2S_SEQUENCE_CNT  ((uint8_t)(1))
 /** @brief length of headerfield: shell to host sequence counter */
 /** @brief length of headerfield: shell to host sequence counter */
-#define SHELLMATTA_LENGTH_S2H_SEQUENCE_CNT  (uint8_t(1))
+#define SHELLMATTA_LENGTH_S2H_SEQUENCE_CNT  ((uint8_t)(1))
 /** @brief length of headerfield: crc32 of header + payload without crc32 */
 /** @brief length of headerfield: crc32 of header + payload without crc32 */
-#define SHELLMATTA_LENGTH_CRC               (uint8_t(4))
+#define SHELLMATTA_LENGTH_CRC               ((uint8_t)(4))
 /** @} */
 /** @} */
 
 
 /**
 /**
@@ -50,17 +50,16 @@
  */
  */
 typedef enum
 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 */
+    STATE_GET_SOH                =0u,   /**< start of header state of transport layer */
+    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 */
 } shellmatta_transport_state_t;
 } shellmatta_transport_state_t;
 
 
 /**
 /**
@@ -85,8 +84,22 @@ typedef struct
     uint32_t s2h_sequenceCnt;               /**<  */
     uint32_t s2h_sequenceCnt;               /**<  */
     shellmatta_transport_state_t state;     /**<  */
     shellmatta_transport_state_t state;     /**<  */
     bool mandatory;                         /**<  */
     bool mandatory;                         /**<  */
+    bool active;                            /**<  */
 } shellmatta_transport_layer_t;
 } shellmatta_transport_layer_t;
 
 
+static uint8_t protocolVersion                  = 0u;
+static shellmatta_transport_packet_t packetType = 0u;
+static uint8_t payloadLength                    = 0u;
+static uint8_t source                           = 0u;
+static uint8_t destination                      = 0u;
+static uint32_t crc32                           = 0u;
+static uint8_t payloadCounter                   = 0u;
+static uint8_t crcCounter                       = 0u;
+
+shellmatta_transport_layer_t transportLayerInst;
+
+shellmatta_retCode_t shellmatta_init_transport_inst();
+
 shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data);
 shellmatta_retCode_t shellmatta_handle_transport_fsm(shellmatta_transport_layer_t *transportLayer, char *data);
 
 
 #endif /* _SHELLMATTA_TRANSPORT_H_ */
 #endif /* _SHELLMATTA_TRANSPORT_H_ */