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