\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
} 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
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
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
**********************/\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
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
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
* 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
*******************/\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