Committer:
saloutos
Date:
Wed Jan 19 19:32:40 2022 +0000
Revision:
6:12ff056ab2c1
Parent:
5:e4e96d1b446f
added rezeroing of the ATI sensor ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adimmit 0:63fac75e5afc 1 /* mbed Microcontroller Library
adimmit 0:63fac75e5afc 2 * Copyright (c) 2019 ARM Limited
adimmit 0:63fac75e5afc 3 * SPDX-License-Identifier: Apache-2.0
adimmit 0:63fac75e5afc 4 */
adimmit 0:63fac75e5afc 5
adimmit 0:63fac75e5afc 6 #include "mbed.h"
adimmit 0:63fac75e5afc 7 #include "platform/mbed_thread.h"
adimmit 1:466049963f1f 8 #include "ltc_message.h"
adimmit 0:63fac75e5afc 9 #include <SPI.h>
adimmit 1:466049963f1f 10 #include "EthernetInterface.h"
saloutos 2:bdfce41aae53 11 #include "bmp3.h"
saloutos 2:bdfce41aae53 12
saloutos 3:4dcadafb89a2 13 /*---------------------- Initial setup ----------------------*/
saloutos 3:4dcadafb89a2 14 // Serial port
saloutos 3:4dcadafb89a2 15 Serial pc(USBTX, USBRX);
saloutos 4:ab834eebd496 16 // Ticker for logging from LTC at a fixed frequency
saloutos 4:ab834eebd496 17 Ticker LTC_log;
saloutos 4:ab834eebd496 18 // Ticker for logging from force sensor, sending ethernet message at a fixed frequency
saloutos 4:ab834eebd496 19 Ticker eth_send;
saloutos 4:ab834eebd496 20 bool LTC_ticker_activated = false;
saloutos 4:ab834eebd496 21 bool eth_ticker_activated = false;
saloutos 4:ab834eebd496 22 void log_LTC_data(){
saloutos 4:ab834eebd496 23 LTC_ticker_activated = true;
saloutos 3:4dcadafb89a2 24 }
saloutos 4:ab834eebd496 25 void send_eth_data(){
saloutos 4:ab834eebd496 26 eth_ticker_activated = true;
saloutos 4:ab834eebd496 27 }
adimmit 0:63fac75e5afc 28
saloutos 3:4dcadafb89a2 29 /*---------------------- Ethernet setup ----------------------*/
saloutos 5:e4e96d1b446f 30 const int SERVER_PORT = 11223;
saloutos 6:12ff056ab2c1 31 const char* SERVER_ADDRESS = "192.168.1.200"; // Adress of the other Mbed (Mbed B)
saloutos 5:e4e96d1b446f 32 const int LOCAL_PORT = 11223;
saloutos 3:4dcadafb89a2 33 const char* ip = "192.168.1.1"; // Mbed A = 1; Mbed B = 2
saloutos 3:4dcadafb89a2 34 const char* mask = "255.255.255.0";
saloutos 3:4dcadafb89a2 35 const char* gateway = "192.168.1.10";
saloutos 3:4dcadafb89a2 36 EthernetInterface eth; // network stack
saloutos 3:4dcadafb89a2 37 SocketAddress local; // local address
saloutos 3:4dcadafb89a2 38 SocketAddress client; // client address (connection to other board)
saloutos 3:4dcadafb89a2 39 UDPSocket server; // UDP socket (peripheral on this board)
saloutos 3:4dcadafb89a2 40
saloutos 3:4dcadafb89a2 41 // Messages to fill and send over ethernet
saloutos 3:4dcadafb89a2 42 // buffer length is 6*6 + 11*8 + 14 = 138
saloutos 3:4dcadafb89a2 43 char send_buf[138];
saloutos 3:4dcadafb89a2 44
saloutos 5:e4e96d1b446f 45 // timer to include dt in messages
saloutos 5:e4e96d1b446f 46 Timer msg_timer;
saloutos 5:e4e96d1b446f 47
saloutos 5:e4e96d1b446f 48
saloutos 3:4dcadafb89a2 49 /*---------------------- IMU setup ----------------------*/
saloutos 6:12ff056ab2c1 50 // TODO: add this so that we can collect hand-held data
saloutos 6:12ff056ab2c1 51
saloutos 3:4dcadafb89a2 52
saloutos 3:4dcadafb89a2 53
saloutos 3:4dcadafb89a2 54 /*---------------------- LTC chip setup ----------------------*/
adimmit 0:63fac75e5afc 55 #define LTC_MOSI PB_2
adimmit 0:63fac75e5afc 56 #define LTC_MISO PC_11
adimmit 0:63fac75e5afc 57 #define LTC_CLK PC_10
adimmit 0:63fac75e5afc 58 #define LTC_CS PA_15
adimmit 0:63fac75e5afc 59 #define BSY PB_5
adimmit 0:63fac75e5afc 60 #define CNV PB_6
adimmit 0:63fac75e5afc 61
saloutos 2:bdfce41aae53 62 #define BUFF_SIZE 18 //24 // 24, 8-bit words will come through
saloutos 2:bdfce41aae53 63 #define NUM_CHANNELS 6 //8 // 8 total channels
adimmit 1:466049963f1f 64 #define CH_SIZE 3 // 3 words / channel
adimmit 0:63fac75e5afc 65
saloutos 3:4dcadafb89a2 66 SPI LTC_chip(LTC_MOSI, LTC_MISO, LTC_CLK);
adimmit 0:63fac75e5afc 67 DigitalOut cs_LTC(LTC_CS);
adimmit 0:63fac75e5afc 68 DigitalIn bsy_LTC(BSY);
adimmit 0:63fac75e5afc 69 DigitalOut CNV_PIN(CNV);
adimmit 0:63fac75e5afc 70
saloutos 2:bdfce41aae53 71 float CONV_FACTOR = 0.00031294782f; //--> for -10.24 --> 10.24V
saloutos 3:4dcadafb89a2 72 // receive and store data from LTC chip
adimmit 1:466049963f1f 73 uint8_t rx_buff[BUFF_SIZE]; //each is an 8-bit word
adimmit 1:466049963f1f 74 ltc_spi adc_data;
saloutos 3:4dcadafb89a2 75 int16_t ati_data[6];
saloutos 4:ab834eebd496 76 float ati_filt[6];
saloutos 6:12ff056ab2c1 77 float FILT_COEF = 1.0f; //0.10f;
adimmit 0:63fac75e5afc 78
saloutos 3:4dcadafb89a2 79 // calibration matrix for ATI sensor
saloutos 3:4dcadafb89a2 80 float Fxc[6] = {-0.1971322934773, -0.04349257334311, 2.298051028435, -80.35044049387, 1.362983909976, 78.23673392118};
saloutos 3:4dcadafb89a2 81 float Fyc[6] = {-0.855555082028, 90.04004739944, -0.2236363056212, -46.22515556189, 0.4634720862657, -45.33866366008};
saloutos 3:4dcadafb89a2 82 float Fzc[6] = {126.0118743229, -3.400673797001, 125.6239720415, -3.58428375801, 124.6128824882, -3.121863244239};
saloutos 3:4dcadafb89a2 83 float Mxc[6] = {-0.03257086475743, 1.078228404461, -4.281073433774, -0.4388170286617, 4.26206973335, 7 - 0.6391561102933}; // check that these rows are x,y,z too
saloutos 3:4dcadafb89a2 84 float Myc[6] = {5.013689449541, -0.1348267445261, -2.487858919058, 1.036624778844, -2.465023328927, -0.8776820303935};
saloutos 3:4dcadafb89a2 85 float Mzc[6] = {0.03045090196646, -2.681788264229, 0.06994993822276, -2.787067635975, -0.04822780843519, -2.696991001959};
saloutos 3:4dcadafb89a2 86 // bias terms
saloutos 3:4dcadafb89a2 87 float bias[6];
saloutos 3:4dcadafb89a2 88 // convert forces and torques
saloutos 3:4dcadafb89a2 89 float ft_data[6];
saloutos 3:4dcadafb89a2 90
saloutos 3:4dcadafb89a2 91 // send 6 configuration words with the 6 channel numbers, still the default softspan 7 conversion
saloutos 3:4dcadafb89a2 92 void config_LTC(){
saloutos 3:4dcadafb89a2 93 uint8_t discard;
saloutos 3:4dcadafb89a2 94 cs_LTC=0;
saloutos 3:4dcadafb89a2 95 // set sampling order for channels 0-5
saloutos 3:4dcadafb89a2 96 discard = LTC_chip.write(0b10000111); // byte is 7:V, 6:0, 5-3:ID, 2-0:mode
saloutos 3:4dcadafb89a2 97 discard = LTC_chip.write(0b10001111);
saloutos 3:4dcadafb89a2 98 discard = LTC_chip.write(0b10010111);
saloutos 3:4dcadafb89a2 99 discard = LTC_chip.write(0b10011111);
saloutos 3:4dcadafb89a2 100 discard = LTC_chip.write(0b10100111);
saloutos 3:4dcadafb89a2 101 discard = LTC_chip.write(0b10101111);
saloutos 3:4dcadafb89a2 102 cs_LTC=1;
saloutos 3:4dcadafb89a2 103 }
adimmit 0:63fac75e5afc 104
saloutos 3:4dcadafb89a2 105 void read_LTC_data() {
saloutos 3:4dcadafb89a2 106
saloutos 3:4dcadafb89a2 107 // right now, programmed LTC chip to only sample 6 channels, starting at channel 0 on next conversion (in config_LTC)...also changed number of channels variables
saloutos 3:4dcadafb89a2 108 // TODO: could also decode channel ID from bits 4-6 of the info byte in message packet, assign to correct adc channel
saloutos 3:4dcadafb89a2 109 // TODO: could also include next channel for sampling in each conversion message
saloutos 3:4dcadafb89a2 110
saloutos 3:4dcadafb89a2 111 // sample from all channels
saloutos 3:4dcadafb89a2 112 for (int i = 0; i<NUM_CHANNELS; i++) {
saloutos 3:4dcadafb89a2 113 //request conversion
saloutos 3:4dcadafb89a2 114 CNV_PIN=1;
saloutos 3:4dcadafb89a2 115 wait_ns(60); // wait for 60ns
saloutos 3:4dcadafb89a2 116 CNV_PIN=0;
saloutos 3:4dcadafb89a2 117 //WAIT FOR BSY --> bsy_LTC
saloutos 3:4dcadafb89a2 118 while(bsy_LTC==1){}
saloutos 3:4dcadafb89a2 119 //debugging ONLY
saloutos 3:4dcadafb89a2 120 wait_us(1);
saloutos 3:4dcadafb89a2 121 //then ask for data
saloutos 3:4dcadafb89a2 122 cs_LTC=0;
saloutos 3:4dcadafb89a2 123 //read data
saloutos 3:4dcadafb89a2 124 int bytecount = CH_SIZE*i;
saloutos 3:4dcadafb89a2 125 while(bytecount < CH_SIZE*(1+i)){
saloutos 3:4dcadafb89a2 126 rx_buff[bytecount] = LTC_chip.write(0x00);
saloutos 3:4dcadafb89a2 127 bytecount++;
saloutos 3:4dcadafb89a2 128 }
saloutos 3:4dcadafb89a2 129 cs_LTC=1; //lift CS
saloutos 3:4dcadafb89a2 130 }
saloutos 3:4dcadafb89a2 131 // fill adc data struct with received bytes
saloutos 3:4dcadafb89a2 132 for(int i = 0; i < BUFF_SIZE; i++){
saloutos 3:4dcadafb89a2 133 ((uint8_t*)(&adc_data))[i] = rx_buff[i];
saloutos 3:4dcadafb89a2 134 }
saloutos 3:4dcadafb89a2 135 // pull out voltage data here
saloutos 3:4dcadafb89a2 136 ati_data[0] = adc_data.channel[0].cnv_upper<<8 | adc_data.channel[0].cnv_lower;
saloutos 3:4dcadafb89a2 137 ati_data[1] = adc_data.channel[1].cnv_upper<<8 | adc_data.channel[1].cnv_lower;
saloutos 3:4dcadafb89a2 138 ati_data[2] = adc_data.channel[2].cnv_upper<<8 | adc_data.channel[2].cnv_lower;
saloutos 3:4dcadafb89a2 139 ati_data[3] = adc_data.channel[3].cnv_upper<<8 | adc_data.channel[3].cnv_lower;
saloutos 3:4dcadafb89a2 140 ati_data[4] = adc_data.channel[4].cnv_upper<<8 | adc_data.channel[4].cnv_lower;
saloutos 3:4dcadafb89a2 141 ati_data[5] = adc_data.channel[5].cnv_upper<<8 | adc_data.channel[5].cnv_lower;
saloutos 3:4dcadafb89a2 142 }
saloutos 3:4dcadafb89a2 143
saloutos 4:ab834eebd496 144 void filter_LTC_data(){
saloutos 4:ab834eebd496 145 // filter the incoming LTC data
saloutos 4:ab834eebd496 146 for(int i=0; i<6; i++){
saloutos 4:ab834eebd496 147 ati_filt[i] = FILT_COEF*(float)ati_data[i] + (1.0-FILT_COEF)*ati_filt[i];
saloutos 4:ab834eebd496 148 }
saloutos 4:ab834eebd496 149 }
saloutos 4:ab834eebd496 150
saloutos 3:4dcadafb89a2 151 // convert integer readings to voltages to f/t values
saloutos 3:4dcadafb89a2 152 void convert_LTC_data(){
saloutos 3:4dcadafb89a2 153 // dummy buffer to store converted ADC vals
saloutos 3:4dcadafb89a2 154 float buff[6];
saloutos 3:4dcadafb89a2 155 for(int i=0; i<6; i++){
saloutos 4:ab834eebd496 156 //buff[i] = CONV_FACTOR*((float)ati_data[i]-bias[i]); // bias[] is in same units as msg[] // for non-filtered LTC data
saloutos 4:ab834eebd496 157 buff[i] = CONV_FACTOR*(ati_filt[i]-bias[i]); // for filtered data
saloutos 3:4dcadafb89a2 158 ft_data[i] = 0; // also zero out ft_data here
saloutos 3:4dcadafb89a2 159 }
saloutos 3:4dcadafb89a2 160 // convert each f/t value separately
saloutos 3:4dcadafb89a2 161 for(int i=0; i<6; i++){
saloutos 3:4dcadafb89a2 162 ft_data[0] += Fxc[i]*buff[i];
saloutos 3:4dcadafb89a2 163 ft_data[1] += Fyc[i]*buff[i];
saloutos 3:4dcadafb89a2 164 ft_data[2] += Fzc[i]*buff[i];
saloutos 3:4dcadafb89a2 165 ft_data[3] += Mxc[i]*buff[i];
saloutos 3:4dcadafb89a2 166 ft_data[4] += Myc[i]*buff[i];
saloutos 3:4dcadafb89a2 167 ft_data[5] += Mzc[i]*buff[i];
saloutos 3:4dcadafb89a2 168 }
saloutos 3:4dcadafb89a2 169 }
saloutos 2:bdfce41aae53 170
saloutos 2:bdfce41aae53 171
saloutos 3:4dcadafb89a2 172 /*---------------------- Force sensor setup ----------------------*/
saloutos 3:4dcadafb89a2 173 #define SN_MOSI PC_3
saloutos 3:4dcadafb89a2 174 #define SN_MISO PC_2
saloutos 3:4dcadafb89a2 175 #define SN_CLK PB_10
saloutos 3:4dcadafb89a2 176 #define SN_CS PB_12
saloutos 3:4dcadafb89a2 177 #define SN_A PG_15
saloutos 3:4dcadafb89a2 178 #define SN_B PG_10
saloutos 3:4dcadafb89a2 179 #define SN_C PG_12
saloutos 2:bdfce41aae53 180
saloutos 3:4dcadafb89a2 181 SPI sn_spi(SN_MOSI, SN_MISO, SN_CLK); //Sensor SPI - mosi, miso, sclk
saloutos 3:4dcadafb89a2 182 DigitalOut dec_enable(SN_CS);
saloutos 3:4dcadafb89a2 183 DigitalOut dec_bit0(SN_A);
saloutos 3:4dcadafb89a2 184 DigitalOut dec_bit1(SN_B);
saloutos 3:4dcadafb89a2 185 DigitalOut dec_bit2(SN_C);
saloutos 2:bdfce41aae53 186
saloutos 3:4dcadafb89a2 187 // structs for individual sensor devices
saloutos 2:bdfce41aae53 188 struct bmp3_dev s1; // sets up dev as a 'bmp3_dev structure' w/ associated variables
saloutos 2:bdfce41aae53 189 struct bmp3_dev s2;
saloutos 2:bdfce41aae53 190 struct bmp3_dev s3;
saloutos 2:bdfce41aae53 191 struct bmp3_dev s4;
saloutos 2:bdfce41aae53 192 struct bmp3_dev s5;
saloutos 2:bdfce41aae53 193 struct bmp3_dev s6;
saloutos 2:bdfce41aae53 194 struct bmp3_dev s7;
saloutos 2:bdfce41aae53 195 struct bmp3_dev s8;
saloutos 3:4dcadafb89a2 196 // Structs for sensor data
saloutos 3:4dcadafb89a2 197 struct bmp3_data sn_data1;
saloutos 3:4dcadafb89a2 198 struct bmp3_data sn_data2;
saloutos 3:4dcadafb89a2 199 struct bmp3_data sn_data3;
saloutos 3:4dcadafb89a2 200 struct bmp3_data sn_data4;
saloutos 3:4dcadafb89a2 201 struct bmp3_data sn_data5;
saloutos 3:4dcadafb89a2 202 struct bmp3_data sn_data6;
saloutos 3:4dcadafb89a2 203 struct bmp3_data sn_data7;
saloutos 3:4dcadafb89a2 204 struct bmp3_data sn_data8;
saloutos 3:4dcadafb89a2 205 // Store sensor output data (pressures)
saloutos 3:4dcadafb89a2 206 int pr_data[8];
saloutos 3:4dcadafb89a2 207 // Configure data from sensor
saloutos 3:4dcadafb89a2 208 uint8_t sensor_comp = uint8_t(1)| uint8_t(1<<1); // sensor_comp = BMP3_PRESS | BMP3_TEMP;
saloutos 3:4dcadafb89a2 209
saloutos 2:bdfce41aae53 210 void writeLow(uint8_t pin){ // modified for just 2 sensors
saloutos 2:bdfce41aae53 211 dec_enable = 0;
saloutos 2:bdfce41aae53 212 if (pin == 1){
saloutos 2:bdfce41aae53 213 dec_bit0 = 0;
saloutos 2:bdfce41aae53 214 dec_bit1 = 0;
saloutos 2:bdfce41aae53 215 dec_bit2 = 0;
saloutos 2:bdfce41aae53 216 }
saloutos 2:bdfce41aae53 217 else if (pin == 2){
saloutos 2:bdfce41aae53 218 dec_bit0 = 1;
saloutos 2:bdfce41aae53 219 dec_bit1 = 0;
saloutos 2:bdfce41aae53 220 dec_bit2 = 0;
saloutos 2:bdfce41aae53 221 }
saloutos 2:bdfce41aae53 222 else if (pin == 3){
saloutos 2:bdfce41aae53 223 dec_bit0 = 0;
saloutos 2:bdfce41aae53 224 dec_bit1 = 1;
saloutos 2:bdfce41aae53 225 dec_bit2 = 0;
saloutos 2:bdfce41aae53 226 }
saloutos 2:bdfce41aae53 227 else if (pin == 4){
saloutos 2:bdfce41aae53 228 dec_bit0 = 1;
saloutos 2:bdfce41aae53 229 dec_bit1 = 1;
saloutos 2:bdfce41aae53 230 dec_bit2 = 0;
saloutos 2:bdfce41aae53 231 }
saloutos 2:bdfce41aae53 232 else if (pin == 5){
saloutos 2:bdfce41aae53 233 dec_bit0 = 0;
saloutos 2:bdfce41aae53 234 dec_bit1 = 0;
saloutos 2:bdfce41aae53 235 dec_bit2 = 1;
saloutos 2:bdfce41aae53 236 }
saloutos 2:bdfce41aae53 237 else if (pin == 6){
saloutos 2:bdfce41aae53 238 dec_bit0 = 1;
saloutos 2:bdfce41aae53 239 dec_bit1 = 0;
saloutos 2:bdfce41aae53 240 dec_bit2 = 1;
saloutos 2:bdfce41aae53 241 }
saloutos 2:bdfce41aae53 242 else if (pin == 7){
saloutos 2:bdfce41aae53 243 dec_bit0 = 0;
saloutos 2:bdfce41aae53 244 dec_bit1 = 1;
saloutos 2:bdfce41aae53 245 dec_bit2 = 1;
saloutos 2:bdfce41aae53 246 }
saloutos 2:bdfce41aae53 247 else if (pin == 8){
saloutos 2:bdfce41aae53 248 dec_bit0 = 1;
saloutos 2:bdfce41aae53 249 dec_bit1 = 1;
saloutos 2:bdfce41aae53 250 dec_bit2 = 1;
saloutos 2:bdfce41aae53 251 }
saloutos 2:bdfce41aae53 252 }
saloutos 2:bdfce41aae53 253
saloutos 2:bdfce41aae53 254 void writeHigh(){
saloutos 2:bdfce41aae53 255 dec_enable = 1; // write all pins high by disabling the decoder
saloutos 2:bdfce41aae53 256 }
adimmit 1:466049963f1f 257
saloutos 2:bdfce41aae53 258 // General Read and Write functions
saloutos 2:bdfce41aae53 259 // read function: |0x80 done in library, dummy byte taken care of in library
saloutos 2:bdfce41aae53 260 static int8_t user_spi_read(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) {
saloutos 2:bdfce41aae53 261 writeLow(cspin);
saloutos 2:bdfce41aae53 262 sn_spi.write(reg_addr); // send read command to chip_id register (reg 0x00)
saloutos 2:bdfce41aae53 263 for(int i = 0; i < len; i++){
saloutos 2:bdfce41aae53 264 *(reg_data+i) = sn_spi.write(0x00); // read in 2nd byte = chip_id
saloutos 2:bdfce41aae53 265 }
saloutos 2:bdfce41aae53 266 writeHigh();
saloutos 2:bdfce41aae53 267 return 0;
saloutos 2:bdfce41aae53 268 }
saloutos 2:bdfce41aae53 269
saloutos 2:bdfce41aae53 270 static int8_t user_spi_write(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) {
saloutos 2:bdfce41aae53 271 writeLow(cspin);
saloutos 2:bdfce41aae53 272 sn_spi.write(reg_addr);
saloutos 2:bdfce41aae53 273 if (len>1) {
saloutos 2:bdfce41aae53 274 for(int i = 0; i < len-1; i++){
saloutos 2:bdfce41aae53 275 sn_spi.write(*(reg_data+i)); // send alternating register address and register bytes in multi write
saloutos 2:bdfce41aae53 276 }
saloutos 2:bdfce41aae53 277 }
saloutos 2:bdfce41aae53 278 else{
saloutos 2:bdfce41aae53 279 sn_spi.write(reg_data[0]);
saloutos 2:bdfce41aae53 280 }
saloutos 2:bdfce41aae53 281 writeHigh();
saloutos 2:bdfce41aae53 282 return 0;
saloutos 2:bdfce41aae53 283 }
saloutos 2:bdfce41aae53 284
saloutos 2:bdfce41aae53 285 void user_delay_ms(uint32_t msec){ //delay in milliseconds
saloutos 2:bdfce41aae53 286 wait_ms(msec);
saloutos 2:bdfce41aae53 287 }
saloutos 2:bdfce41aae53 288
saloutos 3:4dcadafb89a2 289 void config_bmp_dev(struct bmp3_dev *dev){
saloutos 2:bdfce41aae53 290 int8_t rslt=0;//BMP3_OK; // get error with rslt = BMP3_OK;
saloutos 2:bdfce41aae53 291
saloutos 2:bdfce41aae53 292 dev -> intf = BMP3_SPI_INTF;
saloutos 2:bdfce41aae53 293 dev -> read = &user_spi_read; // what to set here??? should be pointer to read function? &spi_read
saloutos 2:bdfce41aae53 294 dev -> write = &user_spi_write;// what to set here??? should be pointer to write function? &spi_write
saloutos 2:bdfce41aae53 295 dev -> delay_ms = &user_delay_ms;// what to set here??? delay in ms
saloutos 2:bdfce41aae53 296 rslt = bmp3_init(dev);
saloutos 2:bdfce41aae53 297 pc.printf("* initialize sensor result = 0x%x *\r\n", rslt);
saloutos 2:bdfce41aae53 298 wait(0.25);
saloutos 2:bdfce41aae53 299
saloutos 2:bdfce41aae53 300 // ***** Configuring settings of sensor
saloutos 2:bdfce41aae53 301 // Normal Mode - bmp3_set_op_mode
saloutos 2:bdfce41aae53 302 // Temp En, Press En
saloutos 2:bdfce41aae53 303 // OSR = no oversampling temp, press
saloutos 2:bdfce41aae53 304 // ODR = 200Hz temp, press
saloutos 2:bdfce41aae53 305 // IRR = no IRR filter
saloutos 2:bdfce41aae53 306 // ^^^all 4 above = bmp3_set_sensor_settings
saloutos 2:bdfce41aae53 307
saloutos 2:bdfce41aae53 308 // Set sensor settings (press en, temp en, OSR, ODR, IRR)
saloutos 2:bdfce41aae53 309 dev -> settings.press_en = 0x01; // BMP3_ENABLE
saloutos 2:bdfce41aae53 310 dev -> settings.temp_en = 0x01; //BMP3_ENABLE
saloutos 2:bdfce41aae53 311 dev -> settings.odr_filter.press_os = 0x00; //BMP3_NO_OVERSAMPLING
saloutos 2:bdfce41aae53 312 dev -> settings.odr_filter.temp_os = 0x00; //BMP3_NO_OVERSAMPLING
saloutos 2:bdfce41aae53 313 dev -> settings.odr_filter.odr = 0x00; //BMP3_ODR_200_HZ
saloutos 2:bdfce41aae53 314 dev -> settings.odr_filter.iir_filter = 0x00; //BMP3_IIR_Filter_disable
saloutos 2:bdfce41aae53 315
saloutos 2:bdfce41aae53 316 uint16_t settings_sel;
saloutos 2:bdfce41aae53 317 //settings_sel = BMP3_PRESS_EN_SEL | BMP3_TEMP_EN_SEL | BMP3_PRESS_OS_SEL | BMP3_TEMP_OS_SEL | BMP3_IIR_FILTER_SEL | BMP3_ODR_SEL;
saloutos 2:bdfce41aae53 318 settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2) | uint16_t(1 << 4) | uint16_t(1 << 5) | uint16_t(1 << 6) | uint16_t(1 << 7);
saloutos 2:bdfce41aae53 319 //settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2);
saloutos 2:bdfce41aae53 320 rslt = bmp3_set_sensor_settings(settings_sel, dev);
saloutos 2:bdfce41aae53 321
saloutos 2:bdfce41aae53 322 // Set operating (power) mode
saloutos 2:bdfce41aae53 323 dev -> settings.op_mode = 0x03; /// normal mode = 0x03
saloutos 2:bdfce41aae53 324 rslt = bmp3_set_op_mode(dev);
saloutos 2:bdfce41aae53 325
saloutos 2:bdfce41aae53 326 // Check settings
saloutos 2:bdfce41aae53 327 rslt = bmp3_get_sensor_settings(dev);
saloutos 2:bdfce41aae53 328 }
saloutos 2:bdfce41aae53 329
saloutos 3:4dcadafb89a2 330 void read_bmp_data(){
saloutos 3:4dcadafb89a2 331 // read data from sensors
saloutos 5:e4e96d1b446f 332 bmp3_get_sensor_data(sensor_comp, &sn_data1, &s1);
saloutos 3:4dcadafb89a2 333 bmp3_get_sensor_data(sensor_comp, &sn_data2, &s2);
saloutos 3:4dcadafb89a2 334 bmp3_get_sensor_data(sensor_comp, &sn_data3, &s3);
saloutos 3:4dcadafb89a2 335 bmp3_get_sensor_data(sensor_comp, &sn_data4, &s4);
saloutos 3:4dcadafb89a2 336 bmp3_get_sensor_data(sensor_comp, &sn_data5, &s5);
saloutos 3:4dcadafb89a2 337 bmp3_get_sensor_data(sensor_comp, &sn_data6, &s6);
saloutos 3:4dcadafb89a2 338 bmp3_get_sensor_data(sensor_comp, &sn_data7, &s7);
saloutos 3:4dcadafb89a2 339 bmp3_get_sensor_data(sensor_comp, &sn_data8, &s8);
saloutos 3:4dcadafb89a2 340 }
saloutos 2:bdfce41aae53 341
saloutos 2:bdfce41aae53 342
saloutos 5:e4e96d1b446f 343 /*---------------------- Neural Network Evaluation ----------------------*/
saloutos 5:e4e96d1b446f 344
saloutos 5:e4e96d1b446f 345 // TODO: add this to test fingertip sensor
saloutos 5:e4e96d1b446f 346 /*
saloutos 5:e4e96d1b446f 347 // sensor data
saloutos 5:e4e96d1b446f 348 uint16_t sense_data_raw[8];
saloutos 5:e4e96d1b446f 349 float sense_data_decode[5];
saloutos 5:e4e96d1b446f 350
saloutos 5:e4e96d1b446f 351 // internal layers to be evaluated on-line
saloutos 5:e4e96d1b446f 352 float l1[12];
saloutos 5:e4e96d1b446f 353 float l2[25];
saloutos 5:e4e96d1b446f 354
saloutos 5:e4e96d1b446f 355 // weights and biases for NN (constant)...add more digits here to improve prediction accuracy?
saloutos 5:e4e96d1b446f 356 const float b1[12] = {};
saloutos 5:e4e96d1b446f 357 const float b2[25] = {};
saloutos 5:e4e96d1b446f 358 const float b3[5] = {};
saloutos 5:e4e96d1b446f 359 const float w1[8][12] = { { }, { }, { }, { }, { }, { }, { }, { } };
saloutos 5:e4e96d1b446f 360 const float w2[12][25] = {{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { } };
saloutos 5:e4e96d1b446f 361 const float w3[25][5] = { { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { },
saloutos 5:e4e96d1b446f 362 { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { } };
saloutos 5:e4e96d1b446f 363
saloutos 5:e4e96d1b446f 364 // values for scaling sensor readings and NN outputs
saloutos 5:e4e96d1b446f 365 const float minims[] = { -79.14952894807573f, -59.34503867427718f, -190.91288f, -0.7863755477785648f, -0.7863755477785648f, -831.0f, -997.0f, -974.0f, -986.0f, -998.0f, -964.0f, -136.0f, -881.0f};
saloutos 5:e4e96d1b446f 366 const float maxims[] = { 145.75214841512442f, 147.80758667427716f, 194.5331016f, 1.5781267096532723f, 1.5765908199115173f, 4079.0f, 3156.0f, 3734.0f, 4001.0f, 3463.0f, 3463.0f, 2621.0f, 3370.0f};
saloutos 5:e4e96d1b446f 367 const float maxS = 4079.0;
saloutos 5:e4e96d1b446f 368 float in_vec[8];
saloutos 5:e4e96d1b446f 369 float out_vec[5];
saloutos 5:e4e96d1b446f 370 int out_vec_pr[5];
saloutos 5:e4e96d1b446f 371 uint16_t offsets[8];
saloutos 5:e4e96d1b446f 372
saloutos 5:e4e96d1b446f 373 // sensor workflow from before
saloutos 5:e4e96d1b446f 374 //// get sensor data
saloutos 5:e4e96d1b446f 375 //readSensor(sense_data_raw);
saloutos 5:e4e96d1b446f 376 //
saloutos 5:e4e96d1b446f 377 //// scale sensor data
saloutos 5:e4e96d1b446f 378 //for (int i=0; i<8; i++){
saloutos 5:e4e96d1b446f 379 // in_vec[i] = 0.0f;
saloutos 5:e4e96d1b446f 380 // in_vec[i] = (((float)(sense_data_raw[i]-offsets[i])) + abs(minims[i+5])) / maxS;
saloutos 5:e4e96d1b446f 381 //}
saloutos 5:e4e96d1b446f 382 //
saloutos 5:e4e96d1b446f 383 //// evaluate NN
saloutos 5:e4e96d1b446f 384 //decodeSensor(in_vec,sense_data_decode);
saloutos 5:e4e96d1b446f 385 //
saloutos 5:e4e96d1b446f 386 //// post-process, re-scale decoded data
saloutos 5:e4e96d1b446f 387 //for (int i=0; i<5; i++) {
saloutos 5:e4e96d1b446f 388 // out_vec[i] = 0.0f;
saloutos 5:e4e96d1b446f 389 // out_vec[i] = (sense_data_decode[i]*maxims[i]) - abs(minims[i]);
saloutos 5:e4e96d1b446f 390 // out_vec_pr[i] = (int)(out_vec[i]*100.0f);
saloutos 5:e4e96d1b446f 391 //}
saloutos 5:e4e96d1b446f 392
saloutos 5:e4e96d1b446f 393
saloutos 5:e4e96d1b446f 394 void calibrateSensor(uint16_t* offsets){ // not sure if this is still necessary?
saloutos 5:e4e96d1b446f 395 // calculate sensor offsets
saloutos 5:e4e96d1b446f 396 float temp_offsets[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
saloutos 5:e4e96d1b446f 397 int samps = 10;
saloutos 5:e4e96d1b446f 398 for (int i=0; i<samps; i++){
saloutos 5:e4e96d1b446f 399 for (int j=0; j<8; j++){
saloutos 5:e4e96d1b446f 400 temp_offsets[j] += (float)spi3.binary(j);
saloutos 5:e4e96d1b446f 401 }
saloutos 5:e4e96d1b446f 402 wait_ms(1);
saloutos 5:e4e96d1b446f 403 }
saloutos 5:e4e96d1b446f 404 for (int i=0; i<8; i++){
saloutos 5:e4e96d1b446f 405 temp_offsets[i] = temp_offsets[i]/((float)samps); // get overall offset
saloutos 5:e4e96d1b446f 406 offsets[i] = (uint16_t)temp_offsets[i]; // convert to int
saloutos 5:e4e96d1b446f 407 }
saloutos 5:e4e96d1b446f 408 }
saloutos 5:e4e96d1b446f 409
saloutos 5:e4e96d1b446f 410 void decodeSensor(float input[8], float* output) {
saloutos 5:e4e96d1b446f 411 // decode sensor data here....521*4 operations (multiply,add,activation,add)
saloutos 5:e4e96d1b446f 412
saloutos 5:e4e96d1b446f 413 // TODO: do normalization here? would need to change input[8] to raw sensor data for function input
saloutos 5:e4e96d1b446f 414
saloutos 5:e4e96d1b446f 415
saloutos 5:e4e96d1b446f 416 // reset values
saloutos 5:e4e96d1b446f 417 for (int i = 0; i<12; i++){
saloutos 5:e4e96d1b446f 418 l1[i] = 0.0f;
saloutos 5:e4e96d1b446f 419 }
saloutos 5:e4e96d1b446f 420 for (int i = 0; i<25; i++){
saloutos 5:e4e96d1b446f 421 l2[i] = 0.0f;
saloutos 5:e4e96d1b446f 422 }
saloutos 5:e4e96d1b446f 423 for (int i = 0; i<5; i++){
saloutos 5:e4e96d1b446f 424 output[i] = 0.0f;
saloutos 5:e4e96d1b446f 425 }
saloutos 5:e4e96d1b446f 426
saloutos 5:e4e96d1b446f 427 // layer 1
saloutos 5:e4e96d1b446f 428 for(int i = 0; i<12; i++){ // for each node in the next layer
saloutos 5:e4e96d1b446f 429 for(int j = 0; j<8; j++){ // add contribution of node in prev. layer
saloutos 5:e4e96d1b446f 430 l1[i] += (w1[j][i]*input[j]);
saloutos 5:e4e96d1b446f 431 }
saloutos 5:e4e96d1b446f 432 l1[i] += b1[i]; // add bias
saloutos 5:e4e96d1b446f 433 l1[i] = fmaxf(0.0f, l1[i]); // relu activation
saloutos 5:e4e96d1b446f 434 }
saloutos 5:e4e96d1b446f 435
saloutos 5:e4e96d1b446f 436 // layer 2
saloutos 5:e4e96d1b446f 437 for(int i = 0; i<25; i++){ // for each node in the next layer
saloutos 5:e4e96d1b446f 438 for(int j = 0; j<12; j++){ // add contribution of node in prev. layer
saloutos 5:e4e96d1b446f 439 l2[i] += (w2[j][i]*l1[j]);
saloutos 5:e4e96d1b446f 440 }
saloutos 5:e4e96d1b446f 441 l2[i] += b2[i]; // add bias
saloutos 5:e4e96d1b446f 442 if (l2[i]<0.0f) { // elu activation
saloutos 5:e4e96d1b446f 443 l2[i] = exp(l2[i]) - 1.0f; // alpha implicitly set to 1.0 here
saloutos 5:e4e96d1b446f 444 }
saloutos 5:e4e96d1b446f 445 }
saloutos 5:e4e96d1b446f 446
saloutos 5:e4e96d1b446f 447 // layer 3
saloutos 5:e4e96d1b446f 448 for(int i = 0; i<5; i++){ // for each node in the next layer
saloutos 5:e4e96d1b446f 449 for(int j = 0; j<25; j++){ // add contribution of node in prev. layer
saloutos 5:e4e96d1b446f 450 output[i] += w3[j][i]*l2[j];
saloutos 5:e4e96d1b446f 451
saloutos 5:e4e96d1b446f 452 }
saloutos 5:e4e96d1b446f 453 output[i] += b3[i];// add bias
saloutos 5:e4e96d1b446f 454 output[i] = 1.0f/(1.0f + exp(-output[i])); // sigmoid activation
saloutos 5:e4e96d1b446f 455 }
saloutos 5:e4e96d1b446f 456
saloutos 5:e4e96d1b446f 457 // TODO: undo normalization here
saloutos 5:e4e96d1b446f 458
saloutos 5:e4e96d1b446f 459 }
saloutos 5:e4e96d1b446f 460 */
saloutos 5:e4e96d1b446f 461
saloutos 5:e4e96d1b446f 462
saloutos 2:bdfce41aae53 463
saloutos 3:4dcadafb89a2 464 /*---------------------- Main function ----------------------*/
adimmit 0:63fac75e5afc 465 int main()
adimmit 0:63fac75e5afc 466 {
adimmit 0:63fac75e5afc 467 // Initialise the digital pin LED1 as an output
adimmit 0:63fac75e5afc 468 DigitalOut led(LED1);
adimmit 0:63fac75e5afc 469 CNV_PIN=0;
adimmit 0:63fac75e5afc 470
saloutos 3:4dcadafb89a2 471 // Set up serial port
adimmit 0:63fac75e5afc 472 pc.baud(115200);
saloutos 5:e4e96d1b446f 473 pc.printf("Initializing.\n\r");
adimmit 0:63fac75e5afc 474
saloutos 3:4dcadafb89a2 475 // Set up LTC chip
saloutos 3:4dcadafb89a2 476 LTC_chip.format(8, 0);
saloutos 3:4dcadafb89a2 477 LTC_chip.frequency(10000); //10MHz? //60Mhz clock frequency
saloutos 2:bdfce41aae53 478 wait_ms(1);
saloutos 3:4dcadafb89a2 479 config_LTC(); // programs sample order
saloutos 2:bdfce41aae53 480 wait_ms(1);
adimmit 1:466049963f1f 481
saloutos 3:4dcadafb89a2 482 // Set up ethernet
saloutos 3:4dcadafb89a2 483 eth.set_network(ip, mask, gateway);
saloutos 3:4dcadafb89a2 484 eth.connect();
saloutos 3:4dcadafb89a2 485 wait_ms(1);
saloutos 3:4dcadafb89a2 486 client.set_port(SERVER_PORT);
saloutos 3:4dcadafb89a2 487 client.set_ip_address(SERVER_ADDRESS);
saloutos 3:4dcadafb89a2 488 local.set_port(LOCAL_PORT);
saloutos 3:4dcadafb89a2 489 local.set_ip_address(ip);
saloutos 3:4dcadafb89a2 490 int code = server.open(&eth);
saloutos 3:4dcadafb89a2 491 if(code!=0) { pc.printf("Error from opening server = %d\n\r",code); }
saloutos 3:4dcadafb89a2 492 code = server.bind(local);
saloutos 3:4dcadafb89a2 493 if(code!=0) { pc.printf("Error from binding socket = %d\n\r",code); }
adimmit 1:466049963f1f 494
saloutos 3:4dcadafb89a2 495 // Set up force sensor and decoder
saloutos 2:bdfce41aae53 496 dec_enable = 1;
saloutos 3:4dcadafb89a2 497 // Initialize bmp device 1
saloutos 2:bdfce41aae53 498 s1.dev_id = 1; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 499 config_bmp_dev(&s1);
saloutos 3:4dcadafb89a2 500 //Initialize bmp device 2
saloutos 2:bdfce41aae53 501 s2.dev_id = 2; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 502 config_bmp_dev(&s2);
saloutos 3:4dcadafb89a2 503 //Initialize bmp device 3
saloutos 2:bdfce41aae53 504 s3.dev_id = 3; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 505 config_bmp_dev(&s3);
saloutos 3:4dcadafb89a2 506 //Initialize bmp device 4
saloutos 2:bdfce41aae53 507 s4.dev_id = 4; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 508 config_bmp_dev(&s4);
saloutos 3:4dcadafb89a2 509 //Initialize bmp device 5
saloutos 2:bdfce41aae53 510 s5.dev_id = 5; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 511 config_bmp_dev(&s5);
saloutos 3:4dcadafb89a2 512 //Initialize bmp device 6
saloutos 2:bdfce41aae53 513 s6.dev_id = 6; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 514 config_bmp_dev(&s6);
saloutos 3:4dcadafb89a2 515 //Initialize bmp device 7
saloutos 2:bdfce41aae53 516 s7.dev_id = 7; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 517 config_bmp_dev(&s7);
saloutos 3:4dcadafb89a2 518 //Initialize bmp device 8
saloutos 2:bdfce41aae53 519 s8.dev_id = 8; // tells which cs pin associated with device
saloutos 3:4dcadafb89a2 520 config_bmp_dev(&s8);
saloutos 2:bdfce41aae53 521
saloutos 3:4dcadafb89a2 522 // Calculate bias voltages for ATI sensor
saloutos 3:4dcadafb89a2 523 for(int i=0; i<100; i++){ // read 100 times and take average
saloutos 3:4dcadafb89a2 524 read_LTC_data();
saloutos 2:bdfce41aae53 525 for(int j=0; j<6; j++){
saloutos 3:4dcadafb89a2 526 bias[j] += 0.01*(float)ati_data[j];
saloutos 2:bdfce41aae53 527 }
saloutos 3:4dcadafb89a2 528 wait_ms(1);
saloutos 2:bdfce41aae53 529 }
saloutos 3:4dcadafb89a2 530 pc.printf("ATI sensor is calibrated with biases of: %.2f, %.2f, %.2f, %.2f, %.2f, %.2f \n\r", bias[0],bias[1],bias[2],bias[3],bias[4],bias[5]);
saloutos 6:12ff056ab2c1 531
saloutos 5:e4e96d1b446f 532 // TODO: Add calibration for force sensor? Only necessary if the force sensor neural network is being evaluated online
saloutos 5:e4e96d1b446f 533 //calibrateSensor(offsets);
saloutos 5:e4e96d1b446f 534
saloutos 5:e4e96d1b446f 535
saloutos 4:ab834eebd496 536 // Attach sampling and sending interrupts
saloutos 5:e4e96d1b446f 537 pc.printf("Beginning to sample.\n\r");
saloutos 5:e4e96d1b446f 538 LTC_log.attach_us(&log_LTC_data,1000); // 1kHz // 1000us = 1ms (10000 = 10 ms = 100 Hz)
saloutos 5:e4e96d1b446f 539 eth_send.attach_us(&send_eth_data,10000); // 100Hz
saloutos 5:e4e96d1b446f 540 msg_timer.start();
adimmit 1:466049963f1f 541
adimmit 0:63fac75e5afc 542 while (true) {
adimmit 1:466049963f1f 543
saloutos 6:12ff056ab2c1 544 /*if(LTC_ticker_activated == true) {
saloutos 4:ab834eebd496 545 // Clear flag
saloutos 4:ab834eebd496 546 LTC_ticker_activated = false;
saloutos 5:e4e96d1b446f 547 // Sample from LTC chip, filter data
saloutos 4:ab834eebd496 548 read_LTC_data();
saloutos 4:ab834eebd496 549 filter_LTC_data();
saloutos 4:ab834eebd496 550 }
saloutos 4:ab834eebd496 551
saloutos 4:ab834eebd496 552 if(eth_ticker_activated == true) {
saloutos 4:ab834eebd496 553 // Clear flag
saloutos 4:ab834eebd496 554 eth_ticker_activated = false;
saloutos 2:bdfce41aae53 555
saloutos 5:e4e96d1b446f 556 convert_LTC_data(); // TODO: maybe remove this eventually, if we convert the data after sending over ethernet
saloutos 3:4dcadafb89a2 557 // Print received data
saloutos 3:4dcadafb89a2 558 //pc.printf("%6d,%6d,%6d,%6d,%6d,%6d\n\r", ati_data[0],ati_data[1],ati_data[2],ati_data[3],ati_data[4],ati_data[5]);
saloutos 4:ab834eebd496 559 // Print converted LTC data
saloutos 5:e4e96d1b446f 560 // pc.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f, ", ft_data[0],ft_data[1],ft_data[2],ft_data[3],ft_data[4],ft_data[5]);
saloutos 2:bdfce41aae53 561
saloutos 3:4dcadafb89a2 562 // Sample from force sensor
saloutos 3:4dcadafb89a2 563 read_bmp_data();
saloutos 3:4dcadafb89a2 564 // Convert to relative pressures
saloutos 3:4dcadafb89a2 565 pr_data[0] = int(sn_data1.pressure)-100000; // pressure is returned in Pa, could subtract actual sea level pressure here
saloutos 3:4dcadafb89a2 566 pr_data[1] = int(sn_data2.pressure)-100000;
saloutos 3:4dcadafb89a2 567 pr_data[2] = int(sn_data3.pressure)-100000;
saloutos 3:4dcadafb89a2 568 pr_data[3] = int(sn_data4.pressure)-100000;
saloutos 3:4dcadafb89a2 569 pr_data[4] = int(sn_data5.pressure)-100000;
saloutos 3:4dcadafb89a2 570 pr_data[5] = int(sn_data6.pressure)-100000;
saloutos 3:4dcadafb89a2 571 pr_data[6] = int(sn_data7.pressure)-100000;
saloutos 3:4dcadafb89a2 572 pr_data[7] = int(sn_data8.pressure)-100000;
saloutos 3:4dcadafb89a2 573 // Print received data
saloutos 5:e4e96d1b446f 574 // pc.printf("%d,%d,%d,%d,%d,%d,%d,%d\n\r", pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]);
saloutos 2:bdfce41aae53 575
saloutos 3:4dcadafb89a2 576 // Pack and send the ethernet message
saloutos 6:12ff056ab2c1 577 //sprintf(send_buf, "%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n", msg_timer.read(),ft_data[0],ft_data[1],ft_data[2], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]);
saloutos 6:12ff056ab2c1 578 // sprintf(send_buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", ati_data[0],ati_data[1],ati_data[2],ati_data[3],ati_data[4],ati_data[5], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]);
saloutos 6:12ff056ab2c1 579 //server.sendto(client, send_buf, sizeof(send_buf)); // send message, look for '\n' character when decoding the string
saloutos 6:12ff056ab2c1 580
saloutos 6:12ff056ab2c1 581 }*/
saloutos 6:12ff056ab2c1 582
saloutos 6:12ff056ab2c1 583 // Receive a message from server (Mbed B)
saloutos 6:12ff056ab2c1 584 char buf[256];
saloutos 6:12ff056ab2c1 585 int n = server.recvfrom(&client, buf, 256); // could also use server.recv(buf, 256)?
saloutos 6:12ff056ab2c1 586 buf[n] = '\0';
saloutos 6:12ff056ab2c1 587 //pc.printf("Received message back from server: '%s'\n\r", buf);
saloutos 6:12ff056ab2c1 588
saloutos 6:12ff056ab2c1 589 if (buf[0]=='z') { // re-zero ATI sensor
saloutos 6:12ff056ab2c1 590 for(int i=0; i<100; i++){ // read 100 times and take average
saloutos 6:12ff056ab2c1 591 read_LTC_data();
saloutos 6:12ff056ab2c1 592 for(int j=0; j<6; j++){
saloutos 6:12ff056ab2c1 593 bias[j] += 0.01*(float)ati_data[j];
saloutos 6:12ff056ab2c1 594 }
saloutos 6:12ff056ab2c1 595 wait_ms(1);
saloutos 6:12ff056ab2c1 596 }
saloutos 6:12ff056ab2c1 597 }
saloutos 6:12ff056ab2c1 598
saloutos 6:12ff056ab2c1 599 if (buf[0]=='r') {
saloutos 6:12ff056ab2c1 600 read_LTC_data();
saloutos 6:12ff056ab2c1 601 filter_LTC_data();
saloutos 6:12ff056ab2c1 602 convert_LTC_data();
saloutos 6:12ff056ab2c1 603 read_bmp_data();
saloutos 6:12ff056ab2c1 604 pr_data[0] = int(sn_data1.pressure)-100000; // pressure is returned in Pa, could subtract actual sea level pressure here
saloutos 6:12ff056ab2c1 605 pr_data[1] = int(sn_data2.pressure)-100000;
saloutos 6:12ff056ab2c1 606 pr_data[2] = int(sn_data3.pressure)-100000;
saloutos 6:12ff056ab2c1 607 pr_data[3] = int(sn_data4.pressure)-100000;
saloutos 6:12ff056ab2c1 608 pr_data[4] = int(sn_data5.pressure)-100000;
saloutos 6:12ff056ab2c1 609 pr_data[5] = int(sn_data6.pressure)-100000;
saloutos 6:12ff056ab2c1 610 pr_data[6] = int(sn_data7.pressure)-100000;
saloutos 6:12ff056ab2c1 611 pr_data[7] = int(sn_data8.pressure)-100000;
saloutos 5:e4e96d1b446f 612 sprintf(send_buf, "%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n", msg_timer.read(),ft_data[0],ft_data[1],ft_data[2], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]);
saloutos 3:4dcadafb89a2 613 server.sendto(client, send_buf, sizeof(send_buf)); // send message, look for '\n' character when decoding the string
saloutos 6:12ff056ab2c1 614 }
adimmit 1:466049963f1f 615
adimmit 0:63fac75e5afc 616 }
saloutos 3:4dcadafb89a2 617
saloutos 3:4dcadafb89a2 618 // Terminate connection (if you want)
saloutos 3:4dcadafb89a2 619 server.close();
saloutos 3:4dcadafb89a2 620 eth.disconnect();
adimmit 1:466049963f1f 621
adimmit 0:63fac75e5afc 622 }