
aggregator code initial version add plot menu to continuously print #sensor, V, I on uart
kl25-aggregator-plot.cpp@0:667d2b410f9a, 2019-03-26 (annotated)
- Committer:
- vincenxp
- Date:
- Tue Mar 26 08:37:58 2019 +0000
- Revision:
- 0:667d2b410f9a
initial version; add plot menu to continuously print #sensor, V, I on uart
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vincenxp | 0:667d2b410f9a | 1 | /******************************************************************************* |
vincenxp | 0:667d2b410f9a | 2 | * |
vincenxp | 0:667d2b410f9a | 3 | * MIT License (https://spdx.org/licenses/MIT.html) |
vincenxp | 0:667d2b410f9a | 4 | * Copyright 2018 NXP |
vincenxp | 0:667d2b410f9a | 5 | * |
vincenxp | 0:667d2b410f9a | 6 | * MBED code for FRDM-KL25Z aggregator. Configures and triggers "smart" sensors. |
vincenxp | 0:667d2b410f9a | 7 | * Aggregates data and sends up the line to a host computer over USB serial. |
vincenxp | 0:667d2b410f9a | 8 | * Other FRDM boards (K64F or K66F) may be used for ethernet connection or for |
vincenxp | 0:667d2b410f9a | 9 | * more local memory or faster processing speed. |
vincenxp | 0:667d2b410f9a | 10 | * |
vincenxp | 0:667d2b410f9a | 11 | * |
vincenxp | 0:667d2b410f9a | 12 | * !!! 3Dec18: This now appears to be fixed with current version of library.. |
vincenxp | 0:667d2b410f9a | 13 | * !!! must use mbed-2 from 20 Mar 2018 or serial port won't work !!! |
vincenxp | 0:667d2b410f9a | 14 | * !!! do not update mbed library... !!! |
vincenxp | 0:667d2b410f9a | 15 | * |
vincenxp | 0:667d2b410f9a | 16 | ********************************************************************************/ |
vincenxp | 0:667d2b410f9a | 17 | |
vincenxp | 0:667d2b410f9a | 18 | #include "mbed.h" |
vincenxp | 0:667d2b410f9a | 19 | |
vincenxp | 0:667d2b410f9a | 20 | // Custom setup |
vincenxp | 0:667d2b410f9a | 21 | #define CUSTOM 1 |
vincenxp | 0:667d2b410f9a | 22 | |
vincenxp | 0:667d2b410f9a | 23 | char version_info[] = "3 Dec 2018"; // date info... |
vincenxp | 0:667d2b410f9a | 24 | |
vincenxp | 0:667d2b410f9a | 25 | Serial uart(USBTX, USBRX); // standard FRDM board USBx |
vincenxp | 0:667d2b410f9a | 26 | |
vincenxp | 0:667d2b410f9a | 27 | // set up GPIO connections... |
vincenxp | 0:667d2b410f9a | 28 | DigitalOut reset(PTB0); // PTA1 on smart sensor board |
vincenxp | 0:667d2b410f9a | 29 | DigitalOut interrupt(PTB1); // PTA0 on smart sensor board |
vincenxp | 0:667d2b410f9a | 30 | const int sensors = 14; |
vincenxp | 0:667d2b410f9a | 31 | DigitalOut select[sensors] = // PTA2 on smart sensor board |
vincenxp | 0:667d2b410f9a | 32 | { (PTD4), (PTA12), (PTA4), (PTA5), (PTC8), (PTC9), (PTA13), |
vincenxp | 0:667d2b410f9a | 33 | (PTD5), (PTD0), (PTD2), (PTD3), (PTD1), (PTB3), (PTB2)}; |
vincenxp | 0:667d2b410f9a | 34 | I2C i2c(PTE0, PTE1); |
vincenxp | 0:667d2b410f9a | 35 | |
vincenxp | 0:667d2b410f9a | 36 | int addr8bit = 0x48 << 1; // default start addr for communication with sensors |
vincenxp | 0:667d2b410f9a | 37 | |
vincenxp | 0:667d2b410f9a | 38 | // multipliers of ten used for decompressing data... |
vincenxp | 0:667d2b410f9a | 39 | // *note* this array fails when it's not a const. index 4 returns zero for some |
vincenxp | 0:667d2b410f9a | 40 | // reason... maybe mbed, not sure... seems to be mbed-2 related... |
vincenxp | 0:667d2b410f9a | 41 | const float pow10[14] = {1.0, 1.0e-1, 1.0e-2, 1.0e-3, 1.0e-4, 1.0e-5, 1.0e-6, |
vincenxp | 0:667d2b410f9a | 42 | 1.0e-7, 1.0e-8, 1.0e-9, 1.0e-10, 1.0e-11, 1.0e-12, 1.0e-13}; |
vincenxp | 0:667d2b410f9a | 43 | |
vincenxp | 0:667d2b410f9a | 44 | |
vincenxp | 0:667d2b410f9a | 45 | // some more variables... |
vincenxp | 0:667d2b410f9a | 46 | int n, i, j, k, status, temp; |
vincenxp | 0:667d2b410f9a | 47 | #if (CUSTOM == 1) |
vincenxp | 0:667d2b410f9a | 48 | int delay=0; // starting delay for measurement updates... |
vincenxp | 0:667d2b410f9a | 49 | #else |
vincenxp | 0:667d2b410f9a | 50 | int delay=500000; // starting delay for measurement updates... |
vincenxp | 0:667d2b410f9a | 51 | #endif |
vincenxp | 0:667d2b410f9a | 52 | long int count=0; |
vincenxp | 0:667d2b410f9a | 53 | char cmd[20]; // buffer for holding data sent to/from sensor boards |
vincenxp | 0:667d2b410f9a | 54 | char params[sensors][10];// array to keep sensor parameter data... |
vincenxp | 0:667d2b410f9a | 55 | bool deebug=false; // flag to print extra stuff for debug... |
vincenxp | 0:667d2b410f9a | 56 | float v1, v2, i1, i2; // for holding full float vs. compressed 3-sigfig measurements |
vincenxp | 0:667d2b410f9a | 57 | bool full = false; // boolean to control whether full binary numbers sent |
vincenxp | 0:667d2b410f9a | 58 | bool gui = true; // flag to print data out in compressed format |
vincenxp | 0:667d2b410f9a | 59 | bool plot = true; // flag use to send data in a plot-able format |
vincenxp | 0:667d2b410f9a | 60 | bool barg = false; // flag for bar graph... |
vincenxp | 0:667d2b410f9a | 61 | |
vincenxp | 0:667d2b410f9a | 62 | // timer so we can time how long things take... |
vincenxp | 0:667d2b410f9a | 63 | Timer t; |
vincenxp | 0:667d2b410f9a | 64 | |
vincenxp | 0:667d2b410f9a | 65 | // set up various arrays related to smart sensors... |
vincenxp | 0:667d2b410f9a | 66 | bool present[sensors] = { false, false }; // whether or not a sensor is present |
vincenxp | 0:667d2b410f9a | 67 | bool continuous = true; // flag for making continuous vs. triggered measurements... |
vincenxp | 0:667d2b410f9a | 68 | // this array of addresses also needed to be made a const array or |
vincenxp | 0:667d2b410f9a | 69 | // some values would inexplicably change and cause I2C errors |
vincenxp | 0:667d2b410f9a | 70 | // (because the address in the array gets changed somehow)... const fixes... |
vincenxp | 0:667d2b410f9a | 71 | // this seems to be mbed-2 related... |
vincenxp | 0:667d2b410f9a | 72 | const short int address[sensors] = // assigned address for each sensor |
vincenxp | 0:667d2b410f9a | 73 | { 0x50<<1, 0x51<<1, 0x52<<1, 0x53<<1, 0x54<<1, |
vincenxp | 0:667d2b410f9a | 74 | 0x55<<1, 0x56<<1, 0x57<<1, 0x58<<1, 0x59<<1, |
vincenxp | 0:667d2b410f9a | 75 | 0x5a<<1, 0x5b<<1, 0x5c<<1, 0x5d<<1 }; |
vincenxp | 0:667d2b410f9a | 76 | |
vincenxp | 0:667d2b410f9a | 77 | // this union allows easily converting float value to bare bytes and back again... |
vincenxp | 0:667d2b410f9a | 78 | union u_tag { |
vincenxp | 0:667d2b410f9a | 79 | char b[4]; |
vincenxp | 0:667d2b410f9a | 80 | float fval; |
vincenxp | 0:667d2b410f9a | 81 | int bobo; |
vincenxp | 0:667d2b410f9a | 82 | } volt[2], curr[2]; // voltage and current value from sensor |
vincenxp | 0:667d2b410f9a | 83 | |
vincenxp | 0:667d2b410f9a | 84 | |
vincenxp | 0:667d2b410f9a | 85 | |
vincenxp | 0:667d2b410f9a | 86 | // function that sends measurement trigger pulse to all sensors, singalling |
vincenxp | 0:667d2b410f9a | 87 | // them to take a measurement which will be subsequently and sequentially read... |
vincenxp | 0:667d2b410f9a | 88 | void send_trigger(){ |
vincenxp | 0:667d2b410f9a | 89 | interrupt = 1; |
vincenxp | 0:667d2b410f9a | 90 | wait_us(50); |
vincenxp | 0:667d2b410f9a | 91 | interrupt = 0; |
vincenxp | 0:667d2b410f9a | 92 | } |
vincenxp | 0:667d2b410f9a | 93 | |
vincenxp | 0:667d2b410f9a | 94 | |
vincenxp | 0:667d2b410f9a | 95 | |
vincenxp | 0:667d2b410f9a | 96 | // main code starts here... |
vincenxp | 0:667d2b410f9a | 97 | int main() { |
vincenxp | 0:667d2b410f9a | 98 | |
vincenxp | 0:667d2b410f9a | 99 | // set things up... |
vincenxp | 0:667d2b410f9a | 100 | reset = 0; // place sensors in reset |
vincenxp | 0:667d2b410f9a | 101 | interrupt = 0; // place trigger line low |
vincenxp | 0:667d2b410f9a | 102 | for (k=0; k<sensors; k++) select[k] = 1; // set each sensor's select line high |
vincenxp | 0:667d2b410f9a | 103 | |
vincenxp | 0:667d2b410f9a | 104 | i2c.frequency(400000); // set I2C frequency |
vincenxp | 0:667d2b410f9a | 105 | uart.baud(115200); // set UART baud rate |
vincenxp | 0:667d2b410f9a | 106 | uart.printf("\r\n\r\n\e[2J%s\r\nI'm here...\r\n ", version_info); // signal that we're off and running... |
vincenxp | 0:667d2b410f9a | 107 | // where \e[2J clears the screen... |
vincenxp | 0:667d2b410f9a | 108 | |
vincenxp | 0:667d2b410f9a | 109 | // loop forever (although, as code has evolved, this loop never completes...) |
vincenxp | 0:667d2b410f9a | 110 | while(1) { |
vincenxp | 0:667d2b410f9a | 111 | reset = 0; // issue a global reset |
vincenxp | 0:667d2b410f9a | 112 | wait(0.01); // wait a bit |
vincenxp | 0:667d2b410f9a | 113 | reset = 1; // release reset |
vincenxp | 0:667d2b410f9a | 114 | count++; // overall iteration count |
vincenxp | 0:667d2b410f9a | 115 | uart.printf("\r\n\r\nReleased reset... %d\r\n", count); |
vincenxp | 0:667d2b410f9a | 116 | |
vincenxp | 0:667d2b410f9a | 117 | wait(0.0005); // wait a little bit... |
vincenxp | 0:667d2b410f9a | 118 | |
vincenxp | 0:667d2b410f9a | 119 | // iterate to identify and configure each connected sensor... |
vincenxp | 0:667d2b410f9a | 120 | for (k=0; k<sensors; k++){ // loop over all sensors |
vincenxp | 0:667d2b410f9a | 121 | present[k] = false; // set presence to false before looking for sensor... |
vincenxp | 0:667d2b410f9a | 122 | |
vincenxp | 0:667d2b410f9a | 123 | select[k] = 0; // smake sensor select line low to start address reassignment |
vincenxp | 0:667d2b410f9a | 124 | uart.printf("Asserted select[%X] line low... \r\n", k); |
vincenxp | 0:667d2b410f9a | 125 | |
vincenxp | 0:667d2b410f9a | 126 | wait(0.001); // wait a bit... |
vincenxp | 0:667d2b410f9a | 127 | |
vincenxp | 0:667d2b410f9a | 128 | // write the new address to sensor and then read it back to verify... |
vincenxp | 0:667d2b410f9a | 129 | cmd[0] = address[k]; |
vincenxp | 0:667d2b410f9a | 130 | n = i2c.write( addr8bit, cmd, 1); |
vincenxp | 0:667d2b410f9a | 131 | uart.printf("Wrote: %x error %d \r\n", cmd[0], n); |
vincenxp | 0:667d2b410f9a | 132 | if (n==0) present[k] = true; // a sensor IS connected on this select line, since it ACKed |
vincenxp | 0:667d2b410f9a | 133 | if (present[k]){ |
vincenxp | 0:667d2b410f9a | 134 | cmd[0] = 0; // clear cmd... |
vincenxp | 0:667d2b410f9a | 135 | wait(0.0001); |
vincenxp | 0:667d2b410f9a | 136 | n = i2c.read( addr8bit, cmd, 1); |
vincenxp | 0:667d2b410f9a | 137 | uart.printf(" ===> Read back: %x error %d\r\n", cmd[0], n); |
vincenxp | 0:667d2b410f9a | 138 | // here we're reading it back but we're not actually checking the value... |
vincenxp | 0:667d2b410f9a | 139 | // just assuming that since we were able to write, we'll read the same |
vincenxp | 0:667d2b410f9a | 140 | // value back... |
vincenxp | 0:667d2b410f9a | 141 | } else i2c.stop(); // not present, error condition... |
vincenxp | 0:667d2b410f9a | 142 | |
vincenxp | 0:667d2b410f9a | 143 | wait(0.0001); |
vincenxp | 0:667d2b410f9a | 144 | select[k] = 1; // set sensor's select line high, telling it to change its I2C addr |
vincenxp | 0:667d2b410f9a | 145 | uart.printf("Sending select[%X] back high to change address... \r\n", k); |
vincenxp | 0:667d2b410f9a | 146 | |
vincenxp | 0:667d2b410f9a | 147 | if (present[k]) { |
vincenxp | 0:667d2b410f9a | 148 | // now check that the address change was successful... |
vincenxp | 0:667d2b410f9a | 149 | // write to the new address, there is currently no error out |
vincenxp | 0:667d2b410f9a | 150 | // if sensor does not respond... |
vincenxp | 0:667d2b410f9a | 151 | wait(0.0001); |
vincenxp | 0:667d2b410f9a | 152 | cmd[0]=0xff; |
vincenxp | 0:667d2b410f9a | 153 | n = i2c.write( address[k], cmd, 1); |
vincenxp | 0:667d2b410f9a | 154 | if (n==0) { uart.printf("\r\nSensor %X configured... now to test... \r\n\r\n", k); } |
vincenxp | 0:667d2b410f9a | 155 | else present[k]=false; |
vincenxp | 0:667d2b410f9a | 156 | } // endif |
vincenxp | 0:667d2b410f9a | 157 | |
vincenxp | 0:667d2b410f9a | 158 | if (present[k]) { |
vincenxp | 0:667d2b410f9a | 159 | // read parameters from sensor |
vincenxp | 0:667d2b410f9a | 160 | // Need to do this sequence without a trigger, since that'll cause an interrupt |
vincenxp | 0:667d2b410f9a | 161 | // and clobber any pre-loaded paramter data... |
vincenxp | 0:667d2b410f9a | 162 | cmd[0] = 99; // make a dummy write in order to pre-load parameter buffer... |
vincenxp | 0:667d2b410f9a | 163 | n = i2c.write( address[k], cmd, 2 ); |
vincenxp | 0:667d2b410f9a | 164 | wait(0.001); |
vincenxp | 0:667d2b410f9a | 165 | // here's where we actually read the parameters: |
vincenxp | 0:667d2b410f9a | 166 | n = i2c.read( address[k], params[k], 9 ); // select is already high from above, so we don't need to do it again... |
vincenxp | 0:667d2b410f9a | 167 | uart.printf("\r\n params %d %d %d %d %d %d \r\n", params[k][0], params[k][1]*8, params[k][2]*8, params[k][3]*8, params[k][4]*8, params[k][5]); |
vincenxp | 0:667d2b410f9a | 168 | |
vincenxp | 0:667d2b410f9a | 169 | #if (CUSTOM == 0) |
vincenxp | 0:667d2b410f9a | 170 | // now add one to each parameter to make sure we can write them all... |
vincenxp | 0:667d2b410f9a | 171 | // will see below if it worked... (we'll see it down below) |
vincenxp | 0:667d2b410f9a | 172 | for (i=0; i<6; i++){ |
vincenxp | 0:667d2b410f9a | 173 | cmd[0] = i; |
vincenxp | 0:667d2b410f9a | 174 | cmd[1] = params[k][i]+1; |
vincenxp | 0:667d2b410f9a | 175 | uart.printf(" %d, %d, %d %d \r\n", k, i, cmd[0], cmd[1]); |
vincenxp | 0:667d2b410f9a | 176 | n = i2c.write( address[k], cmd, 2 ); |
vincenxp | 0:667d2b410f9a | 177 | wait(0.01); |
vincenxp | 0:667d2b410f9a | 178 | } |
vincenxp | 0:667d2b410f9a | 179 | #endif |
vincenxp | 0:667d2b410f9a | 180 | |
vincenxp | 0:667d2b410f9a | 181 | } |
vincenxp | 0:667d2b410f9a | 182 | |
vincenxp | 0:667d2b410f9a | 183 | } // for k |
vincenxp | 0:667d2b410f9a | 184 | |
vincenxp | 0:667d2b410f9a | 185 | wait(0.0005); |
vincenxp | 0:667d2b410f9a | 186 | |
vincenxp | 0:667d2b410f9a | 187 | // ****************************************************************** |
vincenxp | 0:667d2b410f9a | 188 | // read data from all connected sensors... |
vincenxp | 0:667d2b410f9a | 189 | // ****************************************************************** |
vincenxp | 0:667d2b410f9a | 190 | while (1) { |
vincenxp | 0:667d2b410f9a | 191 | //if (!gui) uart.printf("\r\nTriggering measurement... \r\n"); |
vincenxp | 0:667d2b410f9a | 192 | //else uart.printf("\e[2J\r\n"); // # (A) (V)\r\n"); |
vincenxp | 0:667d2b410f9a | 193 | t.start(); |
vincenxp | 0:667d2b410f9a | 194 | send_trigger(); // trigger tells all connected sensors to make the measurements |
vincenxp | 0:667d2b410f9a | 195 | #if (CUSTOM == 0) |
vincenxp | 0:667d2b410f9a | 196 | wait_ms(8.75); // need to give enough time to make them... |
vincenxp | 0:667d2b410f9a | 197 | #endif |
vincenxp | 0:667d2b410f9a | 198 | for (k=0; k<sensors; k++){ // iterate over all sensors |
vincenxp | 0:667d2b410f9a | 199 | if (present[k]){ // if a sensor is present, read its data |
vincenxp | 0:667d2b410f9a | 200 | |
vincenxp | 0:667d2b410f9a | 201 | if (full){ |
vincenxp | 0:667d2b410f9a | 202 | // full floating point data tranfer... |
vincenxp | 0:667d2b410f9a | 203 | n = i2c.read( address[k], cmd, 9 ); |
vincenxp | 0:667d2b410f9a | 204 | if (deebug && !gui) uart.printf(" I2C adddr: 0x%X %X\r\n", address[k], k); |
vincenxp | 0:667d2b410f9a | 205 | // unstuff the bytes back into floating point values... |
vincenxp | 0:667d2b410f9a | 206 | for (j=0; j<4; j++) curr[k].b[j] = cmd[j]; |
vincenxp | 0:667d2b410f9a | 207 | for (j=0; j<4; j++) volt[k].b[j] = cmd[j+4]; |
vincenxp | 0:667d2b410f9a | 208 | v1 = volt[k].fval; i1 = curr[k].fval; |
vincenxp | 0:667d2b410f9a | 209 | if (!gui) uart.printf(" Sensor %X: ===> %4.2e %4.2e 0x%x err %d\r\n", k, volt[k].fval, curr[k].fval, cmd[8], n); |
vincenxp | 0:667d2b410f9a | 210 | } // if (full) |
vincenxp | 0:667d2b410f9a | 211 | |
vincenxp | 0:667d2b410f9a | 212 | // compressed data transfer with status nibble: 2 float values of 3 sig figs each + status nibble: |
vincenxp | 0:667d2b410f9a | 213 | // where each value is 3 digits, single digit exponent, and two status bits packed into 2 bytes |
vincenxp | 0:667d2b410f9a | 214 | // four bytes in total... |
vincenxp | 0:667d2b410f9a | 215 | select[k] = 0; // indicate that we want to read compressed data from sensor... |
vincenxp | 0:667d2b410f9a | 216 | n = i2c.read( address[k], cmd, 4 ); |
vincenxp | 0:667d2b410f9a | 217 | select[k] = 1; |
vincenxp | 0:667d2b410f9a | 218 | // pull out status bits from the four received bytes... |
vincenxp | 0:667d2b410f9a | 219 | status = (cmd[0]&(1<<7))>>4 | (cmd[1]&(1<<7))>>5 | (cmd[2]&(1<<7))>>6 | (cmd[3]&(1<<7))>>7 ; |
vincenxp | 0:667d2b410f9a | 220 | if (deebug && !gui) uart.printf(" %02d %02d %02d %02d %8.6f %d %8.6f %d\r\n", cmd[0]&0x7f, cmd[1]&0x7f, cmd[2]&0x7f, cmd[3]&0x7f, |
vincenxp | 0:667d2b410f9a | 221 | pow10[(int)(((cmd[1]&(0x7f)) % 10)+2)], (int) (((cmd[1]&(0x7f)) % 10)+2), |
vincenxp | 0:667d2b410f9a | 222 | pow10[(int)(((cmd[3]&(0x7f)) % 10)+2)], (int) (((cmd[3]&(0x7f)) % 10)+2)); |
vincenxp | 0:667d2b410f9a | 223 | // now reconstruct the two float values... |
vincenxp | 0:667d2b410f9a | 224 | curr[k].fval = (float) ( (cmd[0]&(0x7f))*10 + (cmd[1]&(0x7f))/10 ) * pow10[((cmd[1]&(0x7f)) % 10)+2]; |
vincenxp | 0:667d2b410f9a | 225 | volt[k].fval = (float) ( (cmd[2]&(0x7f))*10 + (cmd[3]&(0x7f))/10 ) * pow10[((cmd[3]&(0x7f)) % 10)+2]; |
vincenxp | 0:667d2b410f9a | 226 | v2 = volt[k].fval; i2 = curr[k].fval; |
vincenxp | 0:667d2b410f9a | 227 | if (!gui) uart.printf(" compd %X: ===> %4.2e V %4.2e A %d err %d\r\n", k, volt[k].fval, curr[k].fval, status, n); |
vincenxp | 0:667d2b410f9a | 228 | if (deebug && !gui) printf(" volt? %s current? %s \r\n", |
vincenxp | 0:667d2b410f9a | 229 | (abs(v1-v2)/v1 <0.05) ? "true" : "false", |
vincenxp | 0:667d2b410f9a | 230 | (abs(i1-i2)/i1 <0.05) ? "true" : "false"); |
vincenxp | 0:667d2b410f9a | 231 | |
vincenxp | 0:667d2b410f9a | 232 | // if we're in gui mode, this is the only line that'll print out for each attached sensor... |
vincenxp | 0:667d2b410f9a | 233 | if (gui && full) uart.printf(" %X %4.2e %4.2e %4.2e %4.2e \r\n", k, v1, v2, i1, i2); |
vincenxp | 0:667d2b410f9a | 234 | else { |
vincenxp | 0:667d2b410f9a | 235 | if (plot) uart.printf("%X %5.3f %8.6f\r\n", k , v2, i2); |
vincenxp | 0:667d2b410f9a | 236 | //uart.printf(" #%X %4.2e V %4.2e A ", k , v2, i2); |
vincenxp | 0:667d2b410f9a | 237 | if (barg) for (j=0; j<40*i2; j++) uart.printf("*"); |
vincenxp | 0:667d2b410f9a | 238 | uart.printf("\r"); |
vincenxp | 0:667d2b410f9a | 239 | } // else |
vincenxp | 0:667d2b410f9a | 240 | |
vincenxp | 0:667d2b410f9a | 241 | // parameter readback from sensor |
vincenxp | 0:667d2b410f9a | 242 | // !! Smart Sensor's selelct line needs to be high while doing this !! |
vincenxp | 0:667d2b410f9a | 243 | // Need to do this sequence without a trigger, since that'll cause an interrupt |
vincenxp | 0:667d2b410f9a | 244 | // and clobber any pre-loaded paramter data... |
vincenxp | 0:667d2b410f9a | 245 | if (deebug && !gui) { |
vincenxp | 0:667d2b410f9a | 246 | cmd[0] = 99; // dummy write to pre-load parameter buffer... |
vincenxp | 0:667d2b410f9a | 247 | n = i2c.write( address[k], cmd, 2 ); |
vincenxp | 0:667d2b410f9a | 248 | n = i2c.read( address[k], params[k], 9 ); // select is already high from above, so we don't need to do it again... |
vincenxp | 0:667d2b410f9a | 249 | uart.printf(" params %d %d %d %d %d %d \r\n", params[k][0], params[k][1]*8, params[k][2]*8, params[k][3]*8, params[k][4]*8, params[k][5]); |
vincenxp | 0:667d2b410f9a | 250 | } |
vincenxp | 0:667d2b410f9a | 251 | } |
vincenxp | 0:667d2b410f9a | 252 | else{ |
vincenxp | 0:667d2b410f9a | 253 | //uart.printf(" !!! device %d missing... \r\n", k); |
vincenxp | 0:667d2b410f9a | 254 | } //endif |
vincenxp | 0:667d2b410f9a | 255 | } // for k |
vincenxp | 0:667d2b410f9a | 256 | // wait_ms(250); |
vincenxp | 0:667d2b410f9a | 257 | while (t.read_us()<delay){ |
vincenxp | 0:667d2b410f9a | 258 | // wait until delay worth of time has elapsed... |
vincenxp | 0:667d2b410f9a | 259 | } |
vincenxp | 0:667d2b410f9a | 260 | t.stop(); |
vincenxp | 0:667d2b410f9a | 261 | t.reset(); |
vincenxp | 0:667d2b410f9a | 262 | |
vincenxp | 0:667d2b410f9a | 263 | if (!continuous) while (!uart.readable()); // wait here until we get text, if in triggered mode... |
vincenxp | 0:667d2b410f9a | 264 | while (uart.readable()){ |
vincenxp | 0:667d2b410f9a | 265 | temp = uart.getc(); |
vincenxp | 0:667d2b410f9a | 266 | if (deebug) printf ("%d\r\n", temp); |
vincenxp | 0:667d2b410f9a | 267 | if (temp==(int) '+') { |
vincenxp | 0:667d2b410f9a | 268 | delay += 100000; |
vincenxp | 0:667d2b410f9a | 269 | if (delay > 2000000) delay = 2000000; |
vincenxp | 0:667d2b410f9a | 270 | } |
vincenxp | 0:667d2b410f9a | 271 | if (temp==(int) '-') { |
vincenxp | 0:667d2b410f9a | 272 | delay -=100000; |
vincenxp | 0:667d2b410f9a | 273 | #if (CUSTOM == 0) |
vincenxp | 0:667d2b410f9a | 274 | if (delay < 14300) delay = 14300; |
vincenxp | 0:667d2b410f9a | 275 | #else |
vincenxp | 0:667d2b410f9a | 276 | if (delay < 0) delay = 0; |
vincenxp | 0:667d2b410f9a | 277 | #endif |
vincenxp | 0:667d2b410f9a | 278 | } |
vincenxp | 0:667d2b410f9a | 279 | if (temp==(int) 't') { |
vincenxp | 0:667d2b410f9a | 280 | uart.printf ("\r\nDelay value = %d\r\n", delay); |
vincenxp | 0:667d2b410f9a | 281 | } |
vincenxp | 0:667d2b410f9a | 282 | if (temp==(int) '_') { |
vincenxp | 0:667d2b410f9a | 283 | delay = 500000; |
vincenxp | 0:667d2b410f9a | 284 | } |
vincenxp | 0:667d2b410f9a | 285 | if (temp==(int) 'c') { |
vincenxp | 0:667d2b410f9a | 286 | continuous = !continuous; |
vincenxp | 0:667d2b410f9a | 287 | } |
vincenxp | 0:667d2b410f9a | 288 | if (temp==(int) 'd') { |
vincenxp | 0:667d2b410f9a | 289 | deebug = !deebug; |
vincenxp | 0:667d2b410f9a | 290 | } |
vincenxp | 0:667d2b410f9a | 291 | if (temp==(int) 'g') { |
vincenxp | 0:667d2b410f9a | 292 | gui = false; |
vincenxp | 0:667d2b410f9a | 293 | } |
vincenxp | 0:667d2b410f9a | 294 | if (temp==(int) 'G') { |
vincenxp | 0:667d2b410f9a | 295 | gui = true; |
vincenxp | 0:667d2b410f9a | 296 | } |
vincenxp | 0:667d2b410f9a | 297 | if (temp==(int) 'p') { |
vincenxp | 0:667d2b410f9a | 298 | plot = true; |
vincenxp | 0:667d2b410f9a | 299 | } |
vincenxp | 0:667d2b410f9a | 300 | if (temp==(int) 'b') { |
vincenxp | 0:667d2b410f9a | 301 | barg = !barg; |
vincenxp | 0:667d2b410f9a | 302 | } |
vincenxp | 0:667d2b410f9a | 303 | |
vincenxp | 0:667d2b410f9a | 304 | if (temp==(int) 'h') { |
vincenxp | 0:667d2b410f9a | 305 | uart.printf("\r\n\r\n"); |
vincenxp | 0:667d2b410f9a | 306 | uart.printf("+/- add/remove update time\r\n"); |
vincenxp | 0:667d2b410f9a | 307 | uart.printf("_ half second update rate\r\n"); |
vincenxp | 0:667d2b410f9a | 308 | uart.printf("b toggle bar graph in gui mode\r\n"); |
vincenxp | 0:667d2b410f9a | 309 | uart.printf("c toggle continuous/single trigger\r\n"); |
vincenxp | 0:667d2b410f9a | 310 | uart.printf("t trigger and print current delay value\r\n"); |
vincenxp | 0:667d2b410f9a | 311 | uart.printf("d toggle debug flag\r\n"); |
vincenxp | 0:667d2b410f9a | 312 | uart.printf("g turn off gui mode\r\n"); |
vincenxp | 0:667d2b410f9a | 313 | uart.printf("G turn on gui mode\r\n"); |
vincenxp | 0:667d2b410f9a | 314 | uart.printf("p plot data\r\n"); |
vincenxp | 0:667d2b410f9a | 315 | uart.printf("h print this help\r\n"); |
vincenxp | 0:667d2b410f9a | 316 | uart.printf("\r\n"); |
vincenxp | 0:667d2b410f9a | 317 | wait(5); |
vincenxp | 0:667d2b410f9a | 318 | } |
vincenxp | 0:667d2b410f9a | 319 | |
vincenxp | 0:667d2b410f9a | 320 | |
vincenxp | 0:667d2b410f9a | 321 | } // while uart.readable... |
vincenxp | 0:667d2b410f9a | 322 | |
vincenxp | 0:667d2b410f9a | 323 | } // while read from sensors... |
vincenxp | 0:667d2b410f9a | 324 | // ***************************************************************** |
vincenxp | 0:667d2b410f9a | 325 | // end data read |
vincenxp | 0:667d2b410f9a | 326 | // ***************************************************************** |
vincenxp | 0:667d2b410f9a | 327 | } // while main, should never actually fall out to here... |
vincenxp | 0:667d2b410f9a | 328 | |
vincenxp | 0:667d2b410f9a | 329 | } // main |