From: Andy Spencer Date: Mon, 10 Feb 2014 01:26:10 +0000 (+0000) Subject: More bug fixes.. X-Git-Url: http://pileus.org/git/?p=~andy%2Fcsm213a-hw;a=commitdiff_plain;h=5d952f724284994ac55b2b5471e10f38c451120e More bug fixes.. --- diff --git a/vis/device.py b/vis/device.py index 82b8b45..852b873 100644 --- a/vis/device.py +++ b/vis/device.py @@ -18,34 +18,38 @@ class State: #information stored class Frame: # Sensor types - ACC_SNS = 0x00 - MAG_SNS = 0x01 - LGT_SNS = 0x02 - TCH_SNS = 0x03 - A2D_SNS = 0x04 + SNS_ACC = 0x00 + SNS_MAG = 0x01 + SNS_LGT = 0x02 + SNS_TCH = 0x03 + SNS_A2D = 0x04 SNS_NUM = 0x05 SNS_SHIFT = 4 SNS_MASK = 0xF0 # Data types - INT = 0 - LONG = 1 - FLOAT = 2 - DOUBLE = 3 - - TYP_NUM = 4 + TYP_S8 = 0 + TYP_S16 = 1 + TYP_S32 = 2 + TYP_U8 = 3 + TYP_U16 = 4 + TYP_U32 = 5 + TYP_F32 = 6 + TYP_F64 = 7 + + TYP_NUM = 8 TYP_SHIFT = 0 TYP_MASK = 0x0F # Command codes - STOP = 0 - START = 1 - RATE = 2 + CMD_STOP = 0 + CMD_START = 1 + CMD_RATE = 2 - OPER_NUM = 3 - OPER_SHIFT = 0 - OPER_MASK = 0x0F + CMD_NUM = 3 + CMD_SHIFT = 0 + CMD_MASK = 0x0F # Frame information HEADER = 0x02 @@ -57,25 +61,23 @@ class Frame: DATA_POS = 3 # Maps - snsMap = {ACC_SNS: 'acc', - MAG_SNS: 'mag', - LGT_SNS: 'lgt', - TCH_SNS: 'tch', - A2D_SNS: 'a2d'} - - cmdMap = {START, 'start', - STOP, 'stop', - RATE, 'rate'} - - sizeMap = {INT: 2, - LONG: 4, - FLOAT: 4, - DOUBLE: 8} - - fmtMap = {INT: 'h', - LONG: 'i', - FLOAT: 'f', - DOUBLE: 'd'} + snsMap = {SNS_ACC: 'acc', + SNS_MAG: 'mag', + SNS_LGT: 'lgt', + SNS_TCH: 'tch', + SNS_A2D: 'a2d'} + + cmdMap = {CMD_START, 'start', + CMD_STOP, 'stop', + CMD_RATE, 'rate'} + + sizeMap = {TYP_S8: 1, TYP_S16: 2, TYP_S32: 4, + TYP_U8: 1, TYP_U16: 2, TYP_U32: 4, + TYP_F32: 4, TYP_F64: 8} + + fmtMap = {TYP_S8: 'b', TYP_S16: 'h', TYP_S32: 'i', + TYP_U8: 'B', TYP_U16: 'H', TYP_U32: 'I', + TYP_F32: 'f', TYP_F64: 'd'} # Parser data index = 0 # read index @@ -201,15 +203,15 @@ class Device: def set_rate(self, sensor, interval): sns = Frame.findCode(Frame.snsMap, sensor) - bits = (sns << Frame.SNS_SHIFT) | \ - (Frame.RATE << Frame.OPER_SHIFT) + bits = (sns << Frame.SNS_SHIFT) | \ + (Frame.CMD_RATE << Frame.CMD_SHIFT) self._write_binary('Bf', bits, interval) def set_enable(self, sensor, enabled): sns = Frame.findCode(Frame.snsMap, sensor) - oper = Frame.START if enabled else Frame.STOP - bits = (sns << Frame.SNS_SHIFT) | \ - (oper << Frame.OPER_SHIFT) + cmd = Frame.CMD_START if enabled else Frame.CMD_STOP + bits = (sns << Frame.SNS_SHIFT) | \ + (cmd << Frame.CMD_SHIFT) self._write_binary('B', bits) def process(self): diff --git a/vis/visual.py b/vis/visual.py index ac42208..62a0bc3 100644 --- a/vis/visual.py +++ b/vis/visual.py @@ -34,7 +34,7 @@ class Visual: self.accs = get_objects(['accx', 'accy', 'accz']) self.mags = get_objects(['magx', 'magy', 'magz']) self.lgts = get_objects(['lgt']) - self.tchs = get_objects(['tch']) + self.tchs = get_objects(['tchp', 'tchd']) self.a2ds = get_objects(['a2d0', 'a2d1', 'a2d2', 'a2d3', 'a2d4', 'a2d5']) # Signal handlers @@ -126,26 +126,27 @@ class Visual: def update(self, state): - def setxyz(objs, vals): - if vals[0]: objs[0].set_text('X: %f' % vals[0]) - if vals[1]: objs[1].set_text('Y: %f' % vals[1]) - if vals[2]: objs[2].set_text('Z: %f' % vals[2]) - def setabs(objs, vals): + def setval(objs, vals, lbls): for i in range(0,len(objs)): - if vals[i]: objs[i].set_text('%f' % vals[i]) - - setxyz(self.accs, state.acc) - setxyz(self.mags, state.mag) - setabs(self.lgts, state.lgt) - setabs(self.tchs, state.tch) - setabs(self.a2ds, state.a2d) + if vals[i] == None: + continue + if lbls and lbls[i]: + objs[i].set_text('%s: %f' % (lbls[i], vals[i])) + else: + objs[i].set_text('%f' % vals[i]) + + setval(self.accs, state.acc, ['X', 'Y', 'Z']) + setval(self.mags, state.mag, ['X', 'Y', 'Z']) + setval(self.lgts, state.lgt, []) + setval(self.tchs, state.tch, ['P', 'D']) + setval(self.a2ds, state.a2d, []) def debug(self, state): print('update: ' + str(state)) print('\tacc - ' + str(state.acc)) print('\tmag - ' + str(state.mag)) print('\tlgt - ' + str(state.lgt)) - print('\ttch - ' + str(state.tch)) + print('\ttch - ' + str(state.touch)) print('\ta2d - ' + str(state.a2d)) def timer(self): diff --git a/vis/visual.ui b/vis/visual.ui index a9f1557..1c862a7 100644 --- a/vis/visual.ui +++ b/vis/visual.ui @@ -2,6 +2,21 @@ + + Serial + gtk-connect + + + + Settings + gtk-preferences + + + + Xively + gtk-connect + + 100 1 @@ -19,26 +34,10 @@ 1 10 - - 100 - 1 - 1 - 10 - - - Serial - gtk-connect - - - - Settings - gtk-preferences - - - - Xively - gtk-connect - + + Upload + gtk-floppy + 6 @@ -46,17 +45,18 @@ 1 10 - - Upload - gtk-floppy - - 100 1 1 10 + + 100 + 1 + 1 + 10 + 100 1 @@ -834,7 +834,7 @@ - + True False True @@ -1032,37 +1032,7 @@ - - True - False - 0 - 0.0 - - - 1 - 2 - 3 - 4 - GTK_FILL - - - - - True - False - 0 - 0.0 - - - 1 - 2 - 4 - 5 - GTK_FILL - - - - + True False 0 @@ -1131,6 +1101,71 @@ GTK_FILL + + + True + False + + + True + False + 0 + P: 0.0 + + + True + True + 0 + + + + + True + False + 0 + D: 0.0 + + + True + True + 1 + + + + + 1 + 2 + 3 + 4 + GTK_FILL + + + + + True + False + + + True + False + 0 + 0.0 + + + True + True + 0 + + + + + 1 + 2 + 4 + 5 + GTK_FILL + + 1 diff --git a/yue/main.cpp b/yue/main.cpp index 1b02887..19c8803 100644 --- a/yue/main.cpp +++ b/yue/main.cpp @@ -18,10 +18,10 @@ #define TIME_ACCURACY 0.01 #define ACC_SNS_DEFAULT 0.1 // default collecting interval in seconds -#define MAG_SNS_DEFAULT 1.0 -#define LGT_SNS_DEFAULT 1.0 -#define TCH_SNS_DEFAULT 1.0 -#define A2D_SNS_DEFAULT 1.0 +#define MAG_SNS_DEFAULT 0.1 +#define LGT_SNS_DEFAULT 0.1 +#define TCH_SNS_DEFAULT 0.1 +#define A2D_SNS_DEFAULT 0.1 #define LED_OUT_DEFAULT 0.5 #define MIN_RATE 1E-4 // 1 kHz @@ -33,30 +33,29 @@ #define MAX_FRAME_SIZE 256 -#define SNS_NUM 5 -#define TYPE_NUM 4 -#define OPER_NUM 3 +#define SNS_NUM 5 +#define TYP_NUM 8 +#define CMD_NUM 3 typedef enum { - ACC_SNS, - MAG_SNS, - LGT_SNS, - TCH_SNS, - A2D_SNS, + SNS_ACC, + SNS_MAG, + SNS_LGT, + SNS_TCH, + SNS_A2D, } sns_t; typedef enum { - INT, - LONG, - FLOAT, - DOUBLE, + TYP_S8, TYP_S16, TYP_S32, + TYP_U8, TYP_U16, TYP_U32, + TYP_F32, TYP_F64, } type_t; typedef enum { - STOP, - START, - RATE, -} oper_t; + CMD_STOP, + CMD_START, + CMD_RATE, +} cmd_t; // Data Frame Information typedef struct { @@ -73,11 +72,11 @@ typedef struct { typedef struct { uint8_t header; struct { - uint8_t oper : 4; - uint8_t sns : 4; + uint8_t cmd : 4; + uint8_t sns : 4; } bits; float interval; -} __attribute__((__packed__)) command_t; +} __attribute__((__packed__)) control_t; // Define Devices & Pins MMA8451Q accSensor(PTE25, PTE24, MMA8451_I2C_ADDRESS); @@ -101,16 +100,16 @@ float lgtTmr = LGT_SNS_DEFAULT; float a2dTmr = A2D_SNS_DEFAULT; float ledTmr = LED_OUT_DEFAULT; -bool accEnable = false; -bool magEnable = true; +bool accEnable = true; +bool magEnable = false; bool lgtEnable = false; 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]; @@ -119,7 +118,7 @@ uint8_t rxFrame[MAX_FRAME_SIZE]; void clock1_interrupt(void); void serialRx_interrupt(void); -void runCommand(command_t *cmd); +void runCommand(control_t *cmd); void sendAccInfo(void); void sendMagInfo(void); @@ -164,7 +163,7 @@ void serialRx_interrupt(void) { // Byte version static int index = 0; static int length = 0; - command_t *cmd = (command_t*)rxFrame; + control_t *cmd = (control_t*)rxFrame; while (serial.readable()) { rxFrame[index++] = serial.getc(); @@ -176,10 +175,10 @@ void serialRx_interrupt(void) { // Byte version index = 0; break; case 1: // Bits - if (cmd->bits.sns >= SNS_NUM || - cmd->bits.oper >= OPER_NUM) { + if (cmd->bits.sns >= SNS_NUM || + cmd->bits.cmd >= CMD_NUM) { state = index = 0; - } else if (cmd->bits.oper == RATE) { + } else if (cmd->bits.cmd == CMD_RATE) { length = 4; state = 2; } else { @@ -250,52 +249,52 @@ void clock1_interrupt(void){ * Command handler * *******************/ -void runCommand(command_t *cmd) +void runCommand(control_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); + sns_t snsType = (sns_t)cmd->bits.sns; + cmd_t cmdType = (cmd_t)cmd->bits.cmd; + 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; + case SNS_ACC: + switch(cmdType){ + case CMD_STOP: accEnable = false; break; + case CMD_START: accEnable = true; break; + case CMD_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; + case SNS_MAG: + switch(cmdType){ + case CMD_STOP: magEnable = false; break; + case CMD_START: magEnable = true; break; + case CMD_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; + case SNS_LGT: + switch(cmdType){ + case CMD_STOP: lgtEnable = false; break; + case CMD_START: lgtEnable = true; break; + case CMD_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; + case SNS_TCH: + switch(cmdType){ + case CMD_STOP: tchEnable = false; break; + case CMD_START: tchEnable = true; break; + case CMD_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; + case SNS_A2D: + switch(cmdType){ + case CMD_STOP: a2dEnable = false; break; + case CMD_START: a2dEnable = true; break; + case CMD_RATE: a2dTmr = interval; break; } break; } @@ -310,7 +309,7 @@ void sendAccInfo(void){ accData[0] = accSensor.getAccX(); accData[1] = accSensor.getAccY(); accData[2] = accSensor.getAccZ(); - int len = packToFrame(txFrame, ACC_SNS, FLOAT, 3, accData); + int len = packToFrame(txFrame, SNS_ACC, TYP_F32, 3, accData); printStr("[ACC] accX=%-2.4f accY=%-2.4f accZ=%-2.4f\r\n", accData[0], accData[1], accData[2]); @@ -319,9 +318,15 @@ void sendAccInfo(void){ } void sendMagInfo(void){ - int magData[3]; - magSensor.getValues(&magData[0], &magData[1], &magData[2]); - int len = packToFrame(txFrame, MAG_SNS, INT, 3, magData); + // magSensor uses the wrong types, + // so we have to convert it + int tmp[3]; + magSensor.getValues(&tmp[0], &tmp[1], &tmp[2]); + uint16_t magData[3]; + magData[0] = tmp[0]; + magData[1] = tmp[1]; + magData[2] = tmp[2]; + int len = packToFrame(txFrame, SNS_MAG, TYP_S16, 3, magData); printStr("[MAG] magX=%hd magY=%hd magZ=%hd %d\r\n", magData[0], magData[1], magData[2], sizeof(int)); @@ -331,7 +336,7 @@ void sendMagInfo(void){ void sendLgtInfo(void){ float lgtData = lgtSensor.read(); - int len = packToFrame(txFrame, LGT_SNS, FLOAT, 1, &lgtData); + int len = packToFrame(txFrame, SNS_LGT, TYP_F32, 1, &lgtData); printStr("[LGT] intensity=%f\r\n", lgtSensor.read()); @@ -343,7 +348,7 @@ void sendTchInfo(void){ float tchData[2]; tchData[0] = tchSensor.readPercentage(); tchData[1] = tchSensor.readDistance(); - int len = packToFrame(txFrame, TCH_SNS, FLOAT, 2, tchData); + int len = packToFrame(txFrame, SNS_TCH, TYP_F32, 2, tchData); printStr("[TCH] force=%0.4f distance=%2.2f\r\n", tchData[0], tchData[1]); @@ -359,7 +364,7 @@ void sendA2dInfo(void){ a2dData[3] = 0; a2dData[4] = 0; a2dData[5] = 0; - int len = packToFrame(txFrame, A2D_SNS, FLOAT, 6, a2dData); + int len = packToFrame(txFrame, SNS_A2D, TYP_F32, 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], @@ -374,10 +379,14 @@ void sendA2dInfo(void){ int calDataSize(type_t dataType){ switch(dataType){ - case INT: return 2; - case LONG: return 4; - case FLOAT: return 4; - case DOUBLE: return 8; + case TYP_S8: return 1; + case TYP_S16: return 2; + case TYP_S32: return 4; + case TYP_U8: return 1; + case TYP_U16: return 2; + case TYP_U32: return 4; + case TYP_F32: return 4; + case TYP_F64: return 8; } return 4; }