Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FatFileSystemCpp mbed PowerControl USBHostLite
main.cpp@13:d00c8a6a2e8c, 2015-06-08 (annotated)
- Committer:
- jkaderka
- Date:
- Mon Jun 08 16:29:58 2015 +0000
- Revision:
- 13:d00c8a6a2e8c
- Parent:
- 12:e3cb430ec051
- Child:
- 14:6bd7d1fff6af
gyro data reduced to short
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jkaderka | 9:8839ecc02e0e | 1 | /* |
| jkaderka | 9:8839ecc02e0e | 2 | * Connects to wifi and listen on ip given by dhcp on port 2000 |
| jkaderka | 9:8839ecc02e0e | 3 | * |
| jkaderka | 9:8839ecc02e0e | 4 | * Commands are send in for #X where X is from {S,E,T,R}, all commands are |
| jkaderka | 9:8839ecc02e0e | 5 | * confirmed by mbed by sending #A |
| jkaderka | 9:8839ecc02e0e | 6 | * |
| jkaderka | 9:8839ecc02e0e | 7 | * Use #S to start saving data, #E to stop saving. This can be done repeatedly, |
| jkaderka | 9:8839ecc02e0e | 8 | * mbed saves the data into separated files and generates new swimmer id |
| jkaderka | 9:8839ecc02e0e | 9 | * At the end, use #T to start data transfer, the format of transmitted data is: |
| jkaderka | 9:8839ecc02e0e | 10 | * |
| jkaderka | 9:8839ecc02e0e | 11 | * Header for each swimmer: |
| jkaderka | 9:8839ecc02e0e | 12 | * (int) -1 (int) -1 (int) swimmer_id |
| jkaderka | 9:8839ecc02e0e | 13 | * Data itself |
| jkaderka | 9:8839ecc02e0e | 14 | * (char) 0xAA (int) count 3*(short) acc 3*(float) gyro |
| jkaderka | 9:8839ecc02e0e | 15 | * End of swimmer block |
| jkaderka | 9:8839ecc02e0e | 16 | * (int) -1 (int) -1 |
| jkaderka | 9:8839ecc02e0e | 17 | * |
| jkaderka | 9:8839ecc02e0e | 18 | * where count is number starting on 0, incremented on every packet |
| jkaderka | 9:8839ecc02e0e | 19 | * 0xAA is a sync byte used to avoid confusion when some bytes are lost during |
| jkaderka | 9:8839ecc02e0e | 20 | * transmission (UART on faster reates seems to be unstable) |
| jkaderka | 9:8839ecc02e0e | 21 | */ |
| jkaderka | 0:16fd37cf4a7c | 22 | #include "mbed.h" |
| jkaderka | 0:16fd37cf4a7c | 23 | #include "L3GD20_init.h" |
| jkaderka | 0:16fd37cf4a7c | 24 | #include "math.h" |
| jkaderka | 0:16fd37cf4a7c | 25 | #include "stdint.h" |
| jkaderka | 0:16fd37cf4a7c | 26 | #include "DirHandle.h" |
| jkaderka | 0:16fd37cf4a7c | 27 | #include "SDCard.h" |
| jkaderka | 0:16fd37cf4a7c | 28 | #include "L3GD20.h" |
| jkaderka | 0:16fd37cf4a7c | 29 | #include "adc.h" |
| jkaderka | 2:f623d1815dc4 | 30 | #include "utils.h" |
| jkaderka | 4:030c7726c7dc | 31 | #include "wifi.h" |
| jkaderka | 0:16fd37cf4a7c | 32 | #include <stdio.h> |
| jkaderka | 0:16fd37cf4a7c | 33 | |
| jkaderka | 9:8839ecc02e0e | 34 | /* credentials for wifi */ |
| jkaderka | 8:ae5319de2c33 | 35 | #define SSID "BRNET" |
| jkaderka | 8:ae5319de2c33 | 36 | #define PASS "Fuhu27che9" |
| jkaderka | 4:030c7726c7dc | 37 | #define SECURITY WPA |
| jkaderka | 9:8839ecc02e0e | 38 | |
| jkaderka | 9:8839ecc02e0e | 39 | |
| jkaderka | 0:16fd37cf4a7c | 40 | #define SAMPLE_RATE 750000 // S mple rate for ADC conversion |
| jkaderka | 0:16fd37cf4a7c | 41 | #define PERIOD 0.01 // Setting the period of measuring, 0.01 menas 100 times per second |
| jkaderka | 1:3ec5f7df2410 | 42 | #define SIZE 1000 // Setting number of instance in array - for saving to SD card |
| jkaderka | 13:d00c8a6a2e8c | 43 | #define BUFFER_SIZE (sizeof(int) + sizeof(short)*6) //size of one data block |
| jkaderka | 2:f623d1815dc4 | 44 | |
| jkaderka | 9:8839ecc02e0e | 45 | /* Command the mbed understands */ |
| jkaderka | 1:3ec5f7df2410 | 46 | #define SAVING_START 'S' |
| jkaderka | 1:3ec5f7df2410 | 47 | #define SAVING_STOP 'E' |
| jkaderka | 1:3ec5f7df2410 | 48 | #define TRANSFER_START 'T' |
| jkaderka | 1:3ec5f7df2410 | 49 | #define CHECK_READY 'R' //will be received when checking if device is alive |
| jkaderka | 1:3ec5f7df2410 | 50 | |
| jkaderka | 1:3ec5f7df2410 | 51 | #define leds_off() { led_measuring = led_sending = led_working = led_saving = 0; } |
| jkaderka | 1:3ec5f7df2410 | 52 | #define leds_error() { led_measuring = led_sending = led_working = led_saving = 1; } |
| jkaderka | 0:16fd37cf4a7c | 53 | |
| jkaderka | 0:16fd37cf4a7c | 54 | |
| jkaderka | 0:16fd37cf4a7c | 55 | class Watchdog { |
| jkaderka | 0:16fd37cf4a7c | 56 | public: |
| jkaderka | 0:16fd37cf4a7c | 57 | void kick(float s) { |
| jkaderka | 0:16fd37cf4a7c | 58 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
| jkaderka | 0:16fd37cf4a7c | 59 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
| jkaderka | 0:16fd37cf4a7c | 60 | LPC_WDT->WDTC = s * (float)clk; |
| jkaderka | 0:16fd37cf4a7c | 61 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
| jkaderka | 0:16fd37cf4a7c | 62 | kick(); |
| jkaderka | 0:16fd37cf4a7c | 63 | } |
| jkaderka | 0:16fd37cf4a7c | 64 | |
| jkaderka | 0:16fd37cf4a7c | 65 | void kick() { |
| jkaderka | 0:16fd37cf4a7c | 66 | LPC_WDT->WDFEED = 0xAA; |
| jkaderka | 0:16fd37cf4a7c | 67 | LPC_WDT->WDFEED = 0x55; |
| jkaderka | 0:16fd37cf4a7c | 68 | } |
| jkaderka | 0:16fd37cf4a7c | 69 | }; |
| jkaderka | 0:16fd37cf4a7c | 70 | |
| jkaderka | 0:16fd37cf4a7c | 71 | Watchdog w; |
| jkaderka | 0:16fd37cf4a7c | 72 | |
| jkaderka | 0:16fd37cf4a7c | 73 | SDCard Logger(p5, p6, p7, p8, "SDCard"); // Initialise the SD Card to SPI interface |
| jkaderka | 0:16fd37cf4a7c | 74 | ADC adc(SAMPLE_RATE, 1); // Initialise ADC to maximum SAMPLE_RATE and cclk divide set to 1 originally MMA7361L |
| jkaderka | 12:e3cb430ec051 | 75 | Wifi wifi(p13, p14, p11, p12, p23); // Wifly module |
| jkaderka | 11:137108e3403e | 76 | //Wifi wifi(p13, p14, p12, p23, p24, SSID, PASS); // Wifly module |
| jkaderka | 0:16fd37cf4a7c | 77 | Ticker Saving_Ticker; // Tickers for interrupts on measuring |
| jkaderka | 0:16fd37cf4a7c | 78 | I2C i2c(p28, p27); // NEW function GYRO connection originally L3G4200D |
| jkaderka | 0:16fd37cf4a7c | 79 | |
| jkaderka | 1:3ec5f7df2410 | 80 | DigitalOut led_measuring(LED1); |
| jkaderka | 1:3ec5f7df2410 | 81 | DigitalOut led_sending(LED2); |
| jkaderka | 1:3ec5f7df2410 | 82 | DigitalOut led_working(LED3); |
| jkaderka | 1:3ec5f7df2410 | 83 | DigitalOut led_saving(LED4); |
| jkaderka | 0:16fd37cf4a7c | 84 | |
| jkaderka | 2:f623d1815dc4 | 85 | static volatile uint64_t absolute = 0; // Variable for numbering saved data |
| jkaderka | 1:3ec5f7df2410 | 86 | volatile int relative = 0; |
| jkaderka | 1:3ec5f7df2410 | 87 | volatile short swimmer_id = 0; |
| jkaderka | 11:137108e3403e | 88 | volatile short last_send = 0; |
| jkaderka | 0:16fd37cf4a7c | 89 | |
| jkaderka | 1:3ec5f7df2410 | 90 | char fname[40]; // Variable for name of Text file saved on SDCard |
| jkaderka | 0:16fd37cf4a7c | 91 | |
| jkaderka | 5:83f69916e571 | 92 | short int acc_x[SIZE]; |
| jkaderka | 5:83f69916e571 | 93 | short int acc_y[SIZE]; |
| jkaderka | 5:83f69916e571 | 94 | short int acc_z[SIZE]; |
| jkaderka | 0:16fd37cf4a7c | 95 | |
| jkaderka | 13:d00c8a6a2e8c | 96 | short int gyro_x[SIZE]; |
| jkaderka | 13:d00c8a6a2e8c | 97 | short int gyro_y[SIZE]; |
| jkaderka | 13:d00c8a6a2e8c | 98 | short int gyro_z[SIZE]; |
| jkaderka | 0:16fd37cf4a7c | 99 | |
| jkaderka | 0:16fd37cf4a7c | 100 | char readByte(char address, char reg) |
| jkaderka | 0:16fd37cf4a7c | 101 | { |
| jkaderka | 0:16fd37cf4a7c | 102 | char result; |
| jkaderka | 0:16fd37cf4a7c | 103 | i2c.start(); |
| jkaderka | 0:16fd37cf4a7c | 104 | i2c.write(address); // Slave address with direction=write |
| jkaderka | 0:16fd37cf4a7c | 105 | i2c.write(reg); // Subaddress (register) |
| jkaderka | 0:16fd37cf4a7c | 106 | i2c.start(); // Break transmission to change bus direction |
| jkaderka | 0:16fd37cf4a7c | 107 | i2c.write(address + 1); // Slave address with direction=read [bit0=1] |
| jkaderka | 0:16fd37cf4a7c | 108 | result = i2c.read(0); |
| jkaderka | 0:16fd37cf4a7c | 109 | i2c.stop(); |
| jkaderka | 0:16fd37cf4a7c | 110 | return (result); |
| jkaderka | 0:16fd37cf4a7c | 111 | } |
| jkaderka | 0:16fd37cf4a7c | 112 | |
| jkaderka | 0:16fd37cf4a7c | 113 | void writeByte(char address, char reg,char value) // Sends 1 byte to an I2C address |
| jkaderka | 0:16fd37cf4a7c | 114 | { |
| jkaderka | 0:16fd37cf4a7c | 115 | i2c.start(); |
| jkaderka | 0:16fd37cf4a7c | 116 | i2c.write(address); // Slave address |
| jkaderka | 0:16fd37cf4a7c | 117 | i2c.write(reg); // Subaddress (register) |
| jkaderka | 0:16fd37cf4a7c | 118 | i2c.write(value); |
| jkaderka | 0:16fd37cf4a7c | 119 | i2c.stop(); |
| jkaderka | 0:16fd37cf4a7c | 120 | } |
| jkaderka | 0:16fd37cf4a7c | 121 | |
| jkaderka | 0:16fd37cf4a7c | 122 | void initSensors (void) |
| jkaderka | 0:16fd37cf4a7c | 123 | { |
| jkaderka | 0:16fd37cf4a7c | 124 | //pc.printf("\n L3GD20 init \n"); |
| jkaderka | 0:16fd37cf4a7c | 125 | //pc.printf("Ping L3GD20 (should reply 0xD4): %x \n",readByte(L3GD20_ADDR,gWHO_AM_I)); |
| jkaderka | 0:16fd37cf4a7c | 126 | writeByte(L3GD20_ADDR,gCTRL_REG1,0x0F); // Set ODR to 95Hz, BW to 12.5Hz, enable axes and turn on device |
| jkaderka | 0:16fd37cf4a7c | 127 | writeByte(L3GD20_ADDR,gCTRL_REG4,0x10); // Full scale selected at 500dps (degrees per second) |
| jkaderka | 0:16fd37cf4a7c | 128 | //pc.printf("L3GD20 gyro Temp: %x degrees C \n",readByte(L3GD20_ADDR,gOUT_TEMP)); |
| jkaderka | 0:16fd37cf4a7c | 129 | |
| jkaderka | 0:16fd37cf4a7c | 130 | wait(1); // Wait for settings to stabilize |
| jkaderka | 0:16fd37cf4a7c | 131 | } |
| jkaderka | 0:16fd37cf4a7c | 132 | |
| jkaderka | 0:16fd37cf4a7c | 133 | |
| jkaderka | 1:3ec5f7df2410 | 134 | /* |
| jkaderka | 1:3ec5f7df2410 | 135 | * Periodically called, make measurements |
| jkaderka | 1:3ec5f7df2410 | 136 | * save data into array and then into file |
| jkaderka | 1:3ec5f7df2410 | 137 | */ |
| jkaderka | 1:3ec5f7df2410 | 138 | void measuring(void) |
| jkaderka | 0:16fd37cf4a7c | 139 | { |
| jkaderka | 2:f623d1815dc4 | 140 | char buffer[BUFFER_SIZE]; |
| jkaderka | 2:f623d1815dc4 | 141 | int pos = 0; |
| jkaderka | 2:f623d1815dc4 | 142 | |
| jkaderka | 1:3ec5f7df2410 | 143 | // At the beginning, global variable i is set to 1 |
| jkaderka | 0:16fd37cf4a7c | 144 | // Accelerometr |
| jkaderka | 0:16fd37cf4a7c | 145 | // i is total order variable |
| jkaderka | 0:16fd37cf4a7c | 146 | // j is relative order variable in one measuring step |
| jkaderka | 0:16fd37cf4a7c | 147 | |
| jkaderka | 0:16fd37cf4a7c | 148 | adc.start(); // Starting ADC conversion |
| jkaderka | 0:16fd37cf4a7c | 149 | adc.select(p18); // Measure pin 20 |
| jkaderka | 1:3ec5f7df2410 | 150 | while(!adc.done(p18)) |
| jkaderka | 1:3ec5f7df2410 | 151 | ; // Wait for it to complete |
| jkaderka | 5:83f69916e571 | 152 | acc_x[relative] = (short) adc.read(p18); |
| jkaderka | 0:16fd37cf4a7c | 153 | |
| jkaderka | 0:16fd37cf4a7c | 154 | adc.start(); // Again ..... |
| jkaderka | 0:16fd37cf4a7c | 155 | adc.select(p19); // Measure pin 20 |
| jkaderka | 1:3ec5f7df2410 | 156 | while(!adc.done(p19)) |
| jkaderka | 1:3ec5f7df2410 | 157 | ; // Wait for it to complete |
| jkaderka | 5:83f69916e571 | 158 | acc_y[relative] = (short) adc.read(p19); |
| jkaderka | 0:16fd37cf4a7c | 159 | |
| jkaderka | 0:16fd37cf4a7c | 160 | adc.start(); |
| jkaderka | 0:16fd37cf4a7c | 161 | adc.select(p20); // Measure pin 20 |
| jkaderka | 1:3ec5f7df2410 | 162 | while(!adc.done(p20)) |
| jkaderka | 1:3ec5f7df2410 | 163 | ; // Wait for it to complete |
| jkaderka | 5:83f69916e571 | 164 | acc_z[relative] = (short) adc.read(p20); |
| jkaderka | 0:16fd37cf4a7c | 165 | |
| jkaderka | 0:16fd37cf4a7c | 166 | // Gyro |
| jkaderka | 0:16fd37cf4a7c | 167 | char xL, xH, yL, yH, zL, zH; |
| jkaderka | 0:16fd37cf4a7c | 168 | |
| jkaderka | 0:16fd37cf4a7c | 169 | xL=readByte(L3GD20_ADDR,gOUT_X_L); |
| jkaderka | 0:16fd37cf4a7c | 170 | xH=readByte(L3GD20_ADDR,gOUT_X_H); |
| jkaderka | 0:16fd37cf4a7c | 171 | yL=readByte(L3GD20_ADDR,gOUT_Y_L); |
| jkaderka | 0:16fd37cf4a7c | 172 | yH=readByte(L3GD20_ADDR,gOUT_Y_H); |
| jkaderka | 0:16fd37cf4a7c | 173 | zL=readByte(L3GD20_ADDR,gOUT_Z_L); |
| jkaderka | 0:16fd37cf4a7c | 174 | zH=readByte(L3GD20_ADDR,gOUT_Z_H); |
| jkaderka | 0:16fd37cf4a7c | 175 | |
| jkaderka | 13:d00c8a6a2e8c | 176 | gyro_x[relative] = (xH<<8) | (xL); // 16-bit 2's complement data |
| jkaderka | 13:d00c8a6a2e8c | 177 | gyro_y[relative] = (yH<<8) | (yL); |
| jkaderka | 13:d00c8a6a2e8c | 178 | gyro_z[relative] = (zH<<8) | (zL); |
| jkaderka | 0:16fd37cf4a7c | 179 | |
| jkaderka | 1:3ec5f7df2410 | 180 | absolute++; |
| jkaderka | 1:3ec5f7df2410 | 181 | relative++; |
| jkaderka | 1:3ec5f7df2410 | 182 | if ( absolute % (SIZE/20) == 0) |
| jkaderka | 1:3ec5f7df2410 | 183 | led_working = !led_working; |
| jkaderka | 0:16fd37cf4a7c | 184 | |
| jkaderka | 1:3ec5f7df2410 | 185 | if ( absolute % SIZE == 0 ) { |
| jkaderka | 1:3ec5f7df2410 | 186 | led_saving = !led_saving; |
| jkaderka | 2:f623d1815dc4 | 187 | FILE *fp = fopen(fname, "ab"); |
| jkaderka | 1:3ec5f7df2410 | 188 | if (fp == NULL) { |
| jkaderka | 1:3ec5f7df2410 | 189 | printf("\nUnable to append data to file %s\r\n", fname); |
| jkaderka | 1:3ec5f7df2410 | 190 | return; |
| jkaderka | 1:3ec5f7df2410 | 191 | } |
| jkaderka | 1:3ec5f7df2410 | 192 | |
| jkaderka | 1:3ec5f7df2410 | 193 | for (int k = 0; k < SIZE; k++) { |
| jkaderka | 2:f623d1815dc4 | 194 | pos = absolute-SIZE+k; |
| jkaderka | 2:f623d1815dc4 | 195 | toBytes(buffer, &pos, sizeof(int)); |
| jkaderka | 13:d00c8a6a2e8c | 196 | toBytes(buffer+sizeof(int), &acc_x[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 197 | toBytes(buffer+sizeof(int) + sizeof(short), &acc_y[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 198 | toBytes(buffer+sizeof(int) + sizeof(short)*2, &acc_z[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 199 | toBytes(buffer+sizeof(int) + sizeof(short)*3, &gyro_x[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 200 | toBytes(buffer+sizeof(int) + sizeof(short)*4, &gyro_y[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 201 | toBytes(buffer+sizeof(int) + sizeof(short)*5, &gyro_z[k], sizeof(short)); |
| jkaderka | 2:f623d1815dc4 | 202 | |
| jkaderka | 2:f623d1815dc4 | 203 | fwrite(buffer, 1, BUFFER_SIZE, fp); |
| jkaderka | 0:16fd37cf4a7c | 204 | } |
| jkaderka | 0:16fd37cf4a7c | 205 | fclose(fp); |
| jkaderka | 1:3ec5f7df2410 | 206 | relative = 0; |
| jkaderka | 0:16fd37cf4a7c | 207 | } |
| jkaderka | 0:16fd37cf4a7c | 208 | } |
| jkaderka | 1:3ec5f7df2410 | 209 | |
| jkaderka | 1:3ec5f7df2410 | 210 | /* |
| jkaderka | 1:3ec5f7df2410 | 211 | * Read data from sdcard and send them to pc |
| jkaderka | 1:3ec5f7df2410 | 212 | */ |
| jkaderka | 1:3ec5f7df2410 | 213 | void get_data(void) |
| jkaderka | 1:3ec5f7df2410 | 214 | { |
| jkaderka | 1:3ec5f7df2410 | 215 | int i; |
| jkaderka | 10:fdf9ca254549 | 216 | char name[30]; |
| jkaderka | 1:3ec5f7df2410 | 217 | |
| jkaderka | 1:3ec5f7df2410 | 218 | for (i = 0; i < swimmer_id; i++) { |
| jkaderka | 1:3ec5f7df2410 | 219 | sprintf(name, "/SDCard/swimmer%d.txt", i); |
| jkaderka | 10:fdf9ca254549 | 220 | printf("Sending %s\r\n", name); |
| jkaderka | 4:030c7726c7dc | 221 | if (wifi.sendFile(name, i)) { |
| jkaderka | 1:3ec5f7df2410 | 222 | leds_error(); |
| jkaderka | 13:d00c8a6a2e8c | 223 | printf("Unable to send data\n\r"); |
| jkaderka | 10:fdf9ca254549 | 224 | } else { |
| jkaderka | 13:d00c8a6a2e8c | 225 | printf("Swimmer %d finished\n\r\n", i); |
| jkaderka | 10:fdf9ca254549 | 226 | } |
| jkaderka | 0:16fd37cf4a7c | 227 | } |
| jkaderka | 0:16fd37cf4a7c | 228 | } |
| jkaderka | 0:16fd37cf4a7c | 229 | |
| jkaderka | 0:16fd37cf4a7c | 230 | int main() |
| jkaderka | 0:16fd37cf4a7c | 231 | { |
| jkaderka | 1:3ec5f7df2410 | 232 | FILE *fp; |
| jkaderka | 1:3ec5f7df2410 | 233 | |
| jkaderka | 1:3ec5f7df2410 | 234 | printf("Boot...\r\n"); |
| jkaderka | 0:16fd37cf4a7c | 235 | initSensors(); // INIT GYRO |
| jkaderka | 0:16fd37cf4a7c | 236 | Logger.SelectCRCMode(1); // I dont know / it was in example code |
| jkaderka | 0:16fd37cf4a7c | 237 | |
| jkaderka | 0:16fd37cf4a7c | 238 | adc.setup(p18,1); // Set up ADC on pin 18 |
| jkaderka | 0:16fd37cf4a7c | 239 | adc.setup(p19,1); // Set up ADC on pin 19 |
| jkaderka | 0:16fd37cf4a7c | 240 | adc.setup(p20,1); // Set up ADC on pin 20 |
| jkaderka | 0:16fd37cf4a7c | 241 | |
| jkaderka | 1:3ec5f7df2410 | 242 | sprintf(fname, "/SDCard/swimmer%d.txt", swimmer_id); |
| jkaderka | 4:030c7726c7dc | 243 | //remove(fname); //remove file to avoid reading old data |
| jkaderka | 10:fdf9ca254549 | 244 | |
| jkaderka | 10:fdf9ca254549 | 245 | |
| jkaderka | 1:3ec5f7df2410 | 246 | leds_off(); |
| jkaderka | 1:3ec5f7df2410 | 247 | printf("Ready...\n\r"); |
| jkaderka | 1:3ec5f7df2410 | 248 | |
| jkaderka | 1:3ec5f7df2410 | 249 | while (1) { |
| jkaderka | 4:030c7726c7dc | 250 | char cmd = wifi.getCmd(); |
| jkaderka | 1:3ec5f7df2410 | 251 | |
| jkaderka | 1:3ec5f7df2410 | 252 | switch (cmd) { |
| jkaderka | 1:3ec5f7df2410 | 253 | /* start measuring data periodically and save them info file */ |
| jkaderka | 1:3ec5f7df2410 | 254 | case SAVING_START: |
| jkaderka | 1:3ec5f7df2410 | 255 | leds_off(); |
| jkaderka | 1:3ec5f7df2410 | 256 | |
| jkaderka | 2:f623d1815dc4 | 257 | fp = fopen(fname, "wb"); |
| jkaderka | 1:3ec5f7df2410 | 258 | if(fp == NULL) { |
| jkaderka | 1:3ec5f7df2410 | 259 | leds_error(); |
| jkaderka | 1:3ec5f7df2410 | 260 | printf("Unable to open file %s for writing\r\n", fname); |
| jkaderka | 1:3ec5f7df2410 | 261 | break; |
| jkaderka | 1:3ec5f7df2410 | 262 | } |
| jkaderka | 12:e3cb430ec051 | 263 | |
| jkaderka | 12:e3cb430ec051 | 264 | //start of data label for sending |
| jkaderka | 12:e3cb430ec051 | 265 | fprintf(fp, "%c%c%c", -1, -1, swimmer_id); |
| jkaderka | 12:e3cb430ec051 | 266 | fclose(fp); |
| jkaderka | 2:f623d1815dc4 | 267 | absolute = 0; |
| jkaderka | 1:3ec5f7df2410 | 268 | relative = 0; |
| jkaderka | 1:3ec5f7df2410 | 269 | //run saving function |
| jkaderka | 1:3ec5f7df2410 | 270 | Saving_Ticker.attach(&measuring, PERIOD); |
| jkaderka | 1:3ec5f7df2410 | 271 | |
| jkaderka | 12:e3cb430ec051 | 272 | printf("Saving swimmer %d...\n\r", swimmer_id); |
| jkaderka | 1:3ec5f7df2410 | 273 | led_measuring = 1; |
| jkaderka | 1:3ec5f7df2410 | 274 | break; |
| jkaderka | 0:16fd37cf4a7c | 275 | |
| jkaderka | 1:3ec5f7df2410 | 276 | /* stop saving data */ |
| jkaderka | 1:3ec5f7df2410 | 277 | case SAVING_STOP: |
| jkaderka | 1:3ec5f7df2410 | 278 | leds_off(); |
| jkaderka | 1:3ec5f7df2410 | 279 | //stop saving |
| jkaderka | 1:3ec5f7df2410 | 280 | Saving_Ticker.detach(); |
| jkaderka | 1:3ec5f7df2410 | 281 | |
| jkaderka | 1:3ec5f7df2410 | 282 | //append End of file text |
| jkaderka | 12:e3cb430ec051 | 283 | fp = fopen(fname, "ab"); |
| jkaderka | 1:3ec5f7df2410 | 284 | if(fp == NULL) { |
| jkaderka | 1:3ec5f7df2410 | 285 | leds_error(); |
| jkaderka | 1:3ec5f7df2410 | 286 | printf("Unable to open file %s before sending data\n\r", fname); |
| jkaderka | 1:3ec5f7df2410 | 287 | break; |
| jkaderka | 1:3ec5f7df2410 | 288 | } |
| jkaderka | 1:3ec5f7df2410 | 289 | //append data left in buffers |
| jkaderka | 2:f623d1815dc4 | 290 | int base = ((absolute - (absolute%SIZE)) < 0) ? 0 : absolute - (absolute%SIZE); |
| jkaderka | 1:3ec5f7df2410 | 291 | for (int k = 0; k < relative; k++) { |
| jkaderka | 2:f623d1815dc4 | 292 | char buffer[BUFFER_SIZE]; |
| jkaderka | 13:d00c8a6a2e8c | 293 | int pos = base+k; |
| jkaderka | 5:83f69916e571 | 294 | toBytes(buffer, &pos, sizeof(int)); |
| jkaderka | 13:d00c8a6a2e8c | 295 | toBytes(buffer+sizeof(int), &acc_x[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 296 | toBytes(buffer+sizeof(int) + sizeof(short), &acc_y[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 297 | toBytes(buffer+sizeof(int) + sizeof(short)*2, &acc_z[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 298 | toBytes(buffer+sizeof(int) + sizeof(short)*3, &gyro_x[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 299 | toBytes(buffer+sizeof(int) + sizeof(short)*4, &gyro_y[k], sizeof(short)); |
| jkaderka | 13:d00c8a6a2e8c | 300 | toBytes(buffer+sizeof(int) + sizeof(short)*5, &gyro_z[k], sizeof(short)); |
| jkaderka | 2:f623d1815dc4 | 301 | |
| jkaderka | 2:f623d1815dc4 | 302 | fwrite(buffer, 1, BUFFER_SIZE, fp); |
| jkaderka | 1:3ec5f7df2410 | 303 | } |
| jkaderka | 12:e3cb430ec051 | 304 | fprintf(fp, "%c%c", -1,-1); |
| jkaderka | 1:3ec5f7df2410 | 305 | fclose(fp); |
| jkaderka | 0:16fd37cf4a7c | 306 | |
| jkaderka | 1:3ec5f7df2410 | 307 | //and finally, move to the next swimmer id |
| jkaderka | 1:3ec5f7df2410 | 308 | swimmer_id++; |
| jkaderka | 1:3ec5f7df2410 | 309 | sprintf(fname, "/SDCard/swimmer%d.txt", swimmer_id); |
| jkaderka | 1:3ec5f7df2410 | 310 | remove(fname); //remove file to avoid reading old data |
| jkaderka | 1:3ec5f7df2410 | 311 | printf("Stopped...\n\r"); |
| jkaderka | 0:16fd37cf4a7c | 312 | break; |
| jkaderka | 1:3ec5f7df2410 | 313 | |
| jkaderka | 1:3ec5f7df2410 | 314 | /* send all data */ |
| jkaderka | 1:3ec5f7df2410 | 315 | case TRANSFER_START: |
| jkaderka | 1:3ec5f7df2410 | 316 | leds_off(); |
| jkaderka | 1:3ec5f7df2410 | 317 | led_sending = 1; |
| jkaderka | 1:3ec5f7df2410 | 318 | printf("Sending data...\n\r"); |
| jkaderka | 1:3ec5f7df2410 | 319 | get_data(); |
| jkaderka | 13:d00c8a6a2e8c | 320 | printf("Sending finished...\n\r"); |
| jkaderka | 1:3ec5f7df2410 | 321 | leds_off(); |
| jkaderka | 1:3ec5f7df2410 | 322 | break; |
| jkaderka | 1:3ec5f7df2410 | 323 | |
| jkaderka | 1:3ec5f7df2410 | 324 | case CHECK_READY: |
| jkaderka | 1:3ec5f7df2410 | 325 | break; |
| jkaderka | 1:3ec5f7df2410 | 326 | |
| jkaderka | 0:16fd37cf4a7c | 327 | default : |
| jkaderka | 1:3ec5f7df2410 | 328 | leds_error(); |
| jkaderka | 1:3ec5f7df2410 | 329 | printf("\nCommand %c is unknown!\n\r", cmd); |
| jkaderka | 1:3ec5f7df2410 | 330 | break; |
| jkaderka | 0:16fd37cf4a7c | 331 | } |
| jkaderka | 1:3ec5f7df2410 | 332 | //end of while(1) |
| jkaderka | 0:16fd37cf4a7c | 333 | } |
| jkaderka | 0:16fd37cf4a7c | 334 | } |