]> Pileus Git - ~andy/csm213a-hw/blobdiff - yue/main.cpp
Get things running
[~andy/csm213a-hw] / yue / main.cpp
index c82b9ca40887e2fc47bd3ce6ac775c9709c252e8..0b42bfd9ff2dc57615cf6a4bf182acfe1c4b99be 100644 (file)
 \r
 #define MAX_FRAME_SIZE    256\r
 \r
+#define SNS_NUM  5\r
+#define TYPE_NUM 4\r
+#define OPER_NUM 3\r
+\r
 typedef enum {\r
     ACC_SNS,\r
     MAG_SNS,\r
@@ -49,31 +53,31 @@ typedef enum {
 } type_t;\r
 \r
 typedef enum {\r
-    START,\r
     STOP,\r
-    SET_INT,\r
+    START,\r
+    RATE,\r
 } oper_t;\r
 \r
 // Data Frame Information\r
 typedef struct {\r
     uint8_t header;\r
     struct {\r
-        uint8_t sns  : 5;\r
-        uint8_t type : 3;\r
+        uint8_t type : 4;\r
+        uint8_t sns  : 4;\r
     } bits;\r
     uint8_t count;\r
     uint8_t data[];\r
-} state_t;\r
+} __attribute__((__packed__)) state_t;\r
 \r
 // Command Frame Information\r
 typedef struct {\r
     uint8_t header;\r
     struct {\r
-        uint8_t sns  : 5;\r
-        uint8_t oper : 3;\r
+        uint8_t oper : 4;\r
+        uint8_t sns  : 4;\r
     } bits;\r
     float   interval;\r
-} command_t;\r
+} __attribute__((__packed__)) command_t;\r
 \r
 // Define Devices & Pins\r
 MMA8451Q   accSensor(PTE25, PTE24, MMA8451_I2C_ADDRESS);\r
@@ -104,9 +108,9 @@ bool tchEnable = false;
 bool a2dEnable = false;\r
 bool ledEnable = true;\r
 \r
-bool useStr = true;\r
+bool useStr = false;\r
 bool useHex = false;\r
-bool useBin = false;\r
+bool useBin = true;\r
 \r
 uint8_t txFrame[MAX_FRAME_SIZE];\r
 uint8_t rxFrame[MAX_FRAME_SIZE];\r
@@ -115,6 +119,8 @@ uint8_t rxFrame[MAX_FRAME_SIZE];
 void clock1_interrupt(void);\r
 void serialRx_interrupt(void);\r
 \r
+void runCommand(command_t *cmd);\r
+\r
 void sendAccInfo(void);\r
 void sendMagInfo(void);\r
 void sendLgtInfo(void);\r
@@ -154,83 +160,44 @@ int main(void) {
  **********************/\r
 \r
 void serialRx_interrupt(void) {                     // Byte version\r
-    clock1.detach();                                // close the interrupt temporarily\r
-    int i = 0;\r
-    uint8_t ch = serial.getc();\r
-\r
-    while (ch!=HEADER){\r
-        if (serial.readable()){\r
-            ch = serial.getc();\r
-        }\r
-        else{\r
-            printStr("[ERROR] broken data!\r\n");\r
-            clock1.attach(&clock1_interrupt, TIME_ACCURACY);\r
-            return;\r
+    static int state  = 0;\r
+    static int index  = 0;\r
+    static int length = 0;\r
+\r
+    command_t *cmd = (command_t*)rxFrame;\r
+\r
+    while (serial.readable()) {\r
+        rxFrame[index++] = serial.getc();\r
+        switch (state) {\r
+            case 0: // Header\r
+                if (cmd->header == HEADER)\r
+                    state = 1;\r
+                else\r
+                    index = 0;\r
+                break;\r
+            case 1: // Bits\r
+                if (cmd->bits.sns  >= SNS_NUM ||\r
+                    cmd->bits.oper >= OPER_NUM) {\r
+                    state = index = 0;\r
+                } else if (cmd->bits.oper == RATE) {\r
+                    length = 4;\r
+                    state  = 2;\r
+                } else {\r
+                    state  = 3;\r
+                }\r
+                break;\r
+            case 2: // Data\r
+                if (--length == 0)\r
+                    state = 3;\r
+                break;\r
+            case 3: // Tail\r
+                if (rxFrame[index-1] == TAIL)\r
+                    runCommand(cmd);\r
+                state = 0;\r
+                index = 0;\r
+                break;\r
         }\r
     }\r
-\r
-    //TODO: ticker for time out\r
-    while (serial.readable()){\r
-        rxFrame[i] = ch;\r
-        if (ch=='\n')\r
-            break;\r
-        ch = serial.getc();\r
-        i++;\r
-    }\r
-    rxFrame[++i] = '\0';\r
-\r
-    // Cast to command and\r
-    command_t *cmd = (command_t *)rxFrame;\r
-\r
-    // Validate interval\r
-    sns_t  snsType  = (sns_t )cmd->bits.sns;\r
-    oper_t operType = (oper_t)cmd->bits.oper;\r
-    float  interval = CLAMP(cmd->interval, MIN_RATE, MAX_RATE);\r
-\r
-    // Save value to global data\r
-    switch(snsType){\r
-        case ACC_SNS:\r
-            switch(operType){\r
-                case START:     accEnable = true;  break;\r
-                case STOP:      accEnable = false; break;\r
-                case SET_INT:   accTmr = interval; break;\r
-            }\r
-            break;\r
-\r
-        case MAG_SNS:\r
-            switch(operType){\r
-                case START:     magEnable = true;  break;\r
-                case STOP:      magEnable = false; break;\r
-                case SET_INT:   magTmr = interval; break;\r
-            }\r
-            break;\r
-\r
-        case LGT_SNS:\r
-            switch(operType){\r
-                case START:     lgtEnable = true;  break;\r
-                case STOP:      lgtEnable = false; break;\r
-                case SET_INT:   lgtTmr = interval; break;\r
-            }\r
-            break;\r
-\r
-        case TCH_SNS:\r
-            switch(operType){\r
-                case START:     tchEnable = true;  break;\r
-                case STOP:      tchEnable = false; break;\r
-                case SET_INT:   tchTmr = interval; break;\r
-            }\r
-            break;\r
-\r
-        case A2D_SNS:\r
-            switch(operType){\r
-                case START:     a2dEnable = true;  break;\r
-                case STOP:      a2dEnable = false; break;\r
-                case SET_INT:   a2dTmr = interval; break;\r
-            }\r
-            break;\r
-    }\r
-\r
-    clock1.attach(&clock1_interrupt, TIME_ACCURACY);\r
 }\r
 \r
 void clock1_interrupt(void){\r
@@ -279,6 +246,61 @@ void clock1_interrupt(void){
     sdma_flush();\r
 }\r
 \r
+/*******************\r
+ * Command handler *\r
+ *******************/\r
+\r
+void runCommand(command_t *cmd)\r
+{\r
+    // Validate interval\r
+    sns_t  snsType  = (sns_t )cmd->bits.sns;\r
+    oper_t operType = (oper_t)cmd->bits.oper;\r
+    float  interval = CLAMP(cmd->interval, MIN_RATE, MAX_RATE);\r
+\r
+    // Save value to global data\r
+    switch(snsType){\r
+        case ACC_SNS:\r
+            switch(operType){\r
+                case STOP:   accEnable = false; break;\r
+                case START:  accEnable = true;  break;\r
+                case RATE:   accTmr = interval; break;\r
+            }\r
+            break;\r
+\r
+        case MAG_SNS:\r
+            switch(operType){\r
+                case STOP:   magEnable = false; break;\r
+                case START:  magEnable = true;  break;\r
+                case RATE:   magTmr = interval; break;\r
+            }\r
+            break;\r
+\r
+        case LGT_SNS:\r
+            switch(operType){\r
+                case STOP:   lgtEnable = false; break;\r
+                case START:  lgtEnable = true;  break;\r
+                case RATE:   lgtTmr = interval; break;\r
+            }\r
+            break;\r
+\r
+        case TCH_SNS:\r
+            switch(operType){\r
+                case STOP:   tchEnable = false; break;\r
+                case START:  tchEnable = true;  break;\r
+                case RATE:   tchTmr = interval; break;\r
+            }\r
+            break;\r
+\r
+        case A2D_SNS:\r
+            switch(operType){\r
+                case STOP:   a2dEnable = false; break;\r
+                case START:  a2dEnable = true;  break;\r
+                case RATE:   a2dTmr = interval; break;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
 /*******************\r
  * Sensors reading *\r
  *******************/\r
@@ -337,7 +359,7 @@ void sendA2dInfo(void){
     a2dData[3] = 0;\r
     a2dData[4] = 0;\r
     a2dData[5] = 0;\r
-    int len = packToFrame(txFrame, A2D_SNS, FLOAT, 2, a2dData);\r
+    int len = packToFrame(txFrame, A2D_SNS, FLOAT, 6, a2dData);\r
 \r
     printStr("[A2D] data=%2.2f %2.2f %2.2f %2.2f %2.2f %2.2f\r\n",\r
                 a2dData[0], a2dData[1], a2dData[2],\r
@@ -350,7 +372,7 @@ void sendA2dInfo(void){
  * Helper functions *\r
  ********************/\r
 \r
-int calDataSize(uint8_t dataType){\r
+int calDataSize(type_t dataType){\r
     switch(dataType){\r
         case INT:    return 2;\r
         case LONG:   return 4;\r
@@ -365,7 +387,12 @@ int calDataSize(uint8_t dataType){
  *******************/\r
 \r
 int packToFrame(uint8_t *frame, sns_t snsType, type_t dataType, int dataNum, void *data){\r
-    int      size  = dataNum + calDataSize(dataType);\r
+    //const char pattern[] = "\x80\x81\x82\x83"\r
+    //                       "\x84\x85\x86\x87"\r
+    //                       "\x88\x89\x8A\x8B"\r
+    //                       "\x8C\x8D\x8E\x8F";\r
+\r
+    int      size  = dataNum * calDataSize(dataType);\r
     state_t *state = (state_t*)frame;\r
     uint8_t *tail  = &state->data[size];\r
 \r