Exercise 1
Dependencies: BSP_B-L475E-IOT01
main.cpp@0:bcd4eb707fcf, 2018-12-06 (annotated)
- Committer:
- mcalzana
- Date:
- Thu Dec 06 15:09:45 2018 +0000
- Revision:
- 0:bcd4eb707fcf
Exercise 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcalzana | 0:bcd4eb707fcf | 1 | |
mcalzana | 0:bcd4eb707fcf | 2 | #include "mbed.h" |
mcalzana | 0:bcd4eb707fcf | 3 | #include <stdio.h> |
mcalzana | 0:bcd4eb707fcf | 4 | #include <errno.h> |
mcalzana | 0:bcd4eb707fcf | 5 | |
mcalzana | 0:bcd4eb707fcf | 6 | // Block devices |
mcalzana | 0:bcd4eb707fcf | 7 | #if COMPONENT_SPIF |
mcalzana | 0:bcd4eb707fcf | 8 | #include "SPIFBlockDevice.h" |
mcalzana | 0:bcd4eb707fcf | 9 | #endif |
mcalzana | 0:bcd4eb707fcf | 10 | |
mcalzana | 0:bcd4eb707fcf | 11 | #if COMPONENT_DATAFLASH |
mcalzana | 0:bcd4eb707fcf | 12 | #include "DataFlashBlockDevice.h" |
mcalzana | 0:bcd4eb707fcf | 13 | #endif |
mcalzana | 0:bcd4eb707fcf | 14 | |
mcalzana | 0:bcd4eb707fcf | 15 | #if COMPONENT_SD |
mcalzana | 0:bcd4eb707fcf | 16 | #include "SDBlockDevice.h" |
mcalzana | 0:bcd4eb707fcf | 17 | #endif |
mcalzana | 0:bcd4eb707fcf | 18 | |
mcalzana | 0:bcd4eb707fcf | 19 | #include "HeapBlockDevice.h" |
mcalzana | 0:bcd4eb707fcf | 20 | |
mcalzana | 0:bcd4eb707fcf | 21 | // File systems |
mcalzana | 0:bcd4eb707fcf | 22 | #include "LittleFileSystem.h" |
mcalzana | 0:bcd4eb707fcf | 23 | #include "FATFileSystem.h" |
mcalzana | 0:bcd4eb707fcf | 24 | |
mcalzana | 0:bcd4eb707fcf | 25 | #include "stm32l475e_iot01_accelero.h" |
mcalzana | 0:bcd4eb707fcf | 26 | |
mcalzana | 0:bcd4eb707fcf | 27 | // Physical block device, can be any device that supports the BlockDevice API |
mcalzana | 0:bcd4eb707fcf | 28 | /*SPIFBlockDevice bd( |
mcalzana | 0:bcd4eb707fcf | 29 | MBED_CONF_SPIF_DRIVER_SPI_MOSI, |
mcalzana | 0:bcd4eb707fcf | 30 | MBED_CONF_SPIF_DRIVER_SPI_MISO, |
mcalzana | 0:bcd4eb707fcf | 31 | MBED_CONF_SPIF_DRIVER_SPI_CLK, |
mcalzana | 0:bcd4eb707fcf | 32 | MBED_CONF_SPIF_DRIVER_SPI_CS);*/ |
mcalzana | 0:bcd4eb707fcf | 33 | |
mcalzana | 0:bcd4eb707fcf | 34 | #define BLOCK_SIZE 512 |
mcalzana | 0:bcd4eb707fcf | 35 | HeapBlockDevice bd(4096, BLOCK_SIZE); |
mcalzana | 0:bcd4eb707fcf | 36 | |
mcalzana | 0:bcd4eb707fcf | 37 | // File system declaration |
mcalzana | 0:bcd4eb707fcf | 38 | LittleFileSystem fs("fs"); |
mcalzana | 0:bcd4eb707fcf | 39 | |
mcalzana | 0:bcd4eb707fcf | 40 | DigitalOut led1(LED1); |
mcalzana | 0:bcd4eb707fcf | 41 | DigitalOut led2(LED2); |
mcalzana | 0:bcd4eb707fcf | 42 | DigitalOut led3(LED3); |
mcalzana | 0:bcd4eb707fcf | 43 | |
mcalzana | 0:bcd4eb707fcf | 44 | // Set up the button to trigger an erase |
mcalzana | 0:bcd4eb707fcf | 45 | InterruptIn irq(BUTTON1); |
mcalzana | 0:bcd4eb707fcf | 46 | void erase() { |
mcalzana | 0:bcd4eb707fcf | 47 | printf("Initializing the block device... "); |
mcalzana | 0:bcd4eb707fcf | 48 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 49 | int err = bd.init(); |
mcalzana | 0:bcd4eb707fcf | 50 | printf("%s\n", (err ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 51 | if (err) { |
mcalzana | 0:bcd4eb707fcf | 52 | error("error: %s (%d)\n", strerror(-err), err); |
mcalzana | 0:bcd4eb707fcf | 53 | } |
mcalzana | 0:bcd4eb707fcf | 54 | |
mcalzana | 0:bcd4eb707fcf | 55 | printf("Erasing the block device... "); |
mcalzana | 0:bcd4eb707fcf | 56 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 57 | err = bd.erase(0, bd.size()); |
mcalzana | 0:bcd4eb707fcf | 58 | printf("%s\n", (err ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 59 | if (err) { |
mcalzana | 0:bcd4eb707fcf | 60 | error("error: %s (%d)\n", strerror(-err), err); |
mcalzana | 0:bcd4eb707fcf | 61 | } |
mcalzana | 0:bcd4eb707fcf | 62 | |
mcalzana | 0:bcd4eb707fcf | 63 | printf("Deinitializing the block device... "); |
mcalzana | 0:bcd4eb707fcf | 64 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 65 | err = bd.deinit(); |
mcalzana | 0:bcd4eb707fcf | 66 | printf("%s\n", (err ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 67 | if (err) { |
mcalzana | 0:bcd4eb707fcf | 68 | error("error: %s (%d)\n", strerror(-err), err); |
mcalzana | 0:bcd4eb707fcf | 69 | } |
mcalzana | 0:bcd4eb707fcf | 70 | } |
mcalzana | 0:bcd4eb707fcf | 71 | |
mcalzana | 0:bcd4eb707fcf | 72 | |
mcalzana | 0:bcd4eb707fcf | 73 | // Entry point for the example |
mcalzana | 0:bcd4eb707fcf | 74 | |
mcalzana | 0:bcd4eb707fcf | 75 | Ticker toggle_write_to_file; |
mcalzana | 0:bcd4eb707fcf | 76 | EventQueue queue(16 * EVENTS_EVENT_SIZE); |
mcalzana | 0:bcd4eb707fcf | 77 | Thread t; |
mcalzana | 0:bcd4eb707fcf | 78 | static FILE *f; |
mcalzana | 0:bcd4eb707fcf | 79 | volatile int counter = 0; |
mcalzana | 0:bcd4eb707fcf | 80 | time_t begin = time(NULL); |
mcalzana | 0:bcd4eb707fcf | 81 | |
mcalzana | 0:bcd4eb707fcf | 82 | |
mcalzana | 0:bcd4eb707fcf | 83 | |
mcalzana | 0:bcd4eb707fcf | 84 | void writeAccToFile(){ |
mcalzana | 0:bcd4eb707fcf | 85 | int16_t pDataXYZ[3] = {0}; |
mcalzana | 0:bcd4eb707fcf | 86 | BSP_ACCELERO_AccGetXYZ(pDataXYZ); |
mcalzana | 0:bcd4eb707fcf | 87 | int x = abs(pDataXYZ[0]); |
mcalzana | 0:bcd4eb707fcf | 88 | int y = abs(pDataXYZ[1]); |
mcalzana | 0:bcd4eb707fcf | 89 | int z = abs(pDataXYZ[2]); |
mcalzana | 0:bcd4eb707fcf | 90 | char c; |
mcalzana | 0:bcd4eb707fcf | 91 | if(z > 950 && z < 1050){ |
mcalzana | 0:bcd4eb707fcf | 92 | c = 'z'; |
mcalzana | 0:bcd4eb707fcf | 93 | } else if(y > 950 && y < 1050){ |
mcalzana | 0:bcd4eb707fcf | 94 | c = 'y'; |
mcalzana | 0:bcd4eb707fcf | 95 | }else if(x > 950 && x < 1050){ |
mcalzana | 0:bcd4eb707fcf | 96 | c = 'x'; |
mcalzana | 0:bcd4eb707fcf | 97 | }else{ |
mcalzana | 0:bcd4eb707fcf | 98 | c = 'o'; |
mcalzana | 0:bcd4eb707fcf | 99 | } |
mcalzana | 0:bcd4eb707fcf | 100 | fprintf(f, "%c", c); |
mcalzana | 0:bcd4eb707fcf | 101 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 102 | } |
mcalzana | 0:bcd4eb707fcf | 103 | |
mcalzana | 0:bcd4eb707fcf | 104 | void readAccFile(){ |
mcalzana | 0:bcd4eb707fcf | 105 | printf("end sampling \n"); |
mcalzana | 0:bcd4eb707fcf | 106 | |
mcalzana | 0:bcd4eb707fcf | 107 | // Close the file which also flushes any cached writes |
mcalzana | 0:bcd4eb707fcf | 108 | printf("Closing \"/fs/numbers.txt\"... "); |
mcalzana | 0:bcd4eb707fcf | 109 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 110 | int err = fclose(f); |
mcalzana | 0:bcd4eb707fcf | 111 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 112 | if (err < 0) { |
mcalzana | 0:bcd4eb707fcf | 113 | error("error: %s (%d)\n", strerror(errno), -errno); |
mcalzana | 0:bcd4eb707fcf | 114 | } |
mcalzana | 0:bcd4eb707fcf | 115 | |
mcalzana | 0:bcd4eb707fcf | 116 | printf("Opening \"/fs/numbers.txt\"... "); |
mcalzana | 0:bcd4eb707fcf | 117 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 118 | f = fopen("/fs/numbers.txt", "r"); |
mcalzana | 0:bcd4eb707fcf | 119 | printf("%s\n", (!f ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 120 | if (!f) { |
mcalzana | 0:bcd4eb707fcf | 121 | error("error: %s (%d)\n", strerror(errno), -errno); |
mcalzana | 0:bcd4eb707fcf | 122 | } |
mcalzana | 0:bcd4eb707fcf | 123 | |
mcalzana | 0:bcd4eb707fcf | 124 | int xCount = 0; |
mcalzana | 0:bcd4eb707fcf | 125 | int yCount = 0; |
mcalzana | 0:bcd4eb707fcf | 126 | int zCount = 0; |
mcalzana | 0:bcd4eb707fcf | 127 | |
mcalzana | 0:bcd4eb707fcf | 128 | while (!feof(f)) { |
mcalzana | 0:bcd4eb707fcf | 129 | char c = fgetc(f); |
mcalzana | 0:bcd4eb707fcf | 130 | if(c == 'x'){ |
mcalzana | 0:bcd4eb707fcf | 131 | xCount++; |
mcalzana | 0:bcd4eb707fcf | 132 | }else if(c == 'y'){ |
mcalzana | 0:bcd4eb707fcf | 133 | yCount++; |
mcalzana | 0:bcd4eb707fcf | 134 | }else if(c == 'z'){ |
mcalzana | 0:bcd4eb707fcf | 135 | zCount++; |
mcalzana | 0:bcd4eb707fcf | 136 | } |
mcalzana | 0:bcd4eb707fcf | 137 | } |
mcalzana | 0:bcd4eb707fcf | 138 | printf("Values: x: %d, y:%d, z: %d \n", xCount, yCount, zCount); |
mcalzana | 0:bcd4eb707fcf | 139 | |
mcalzana | 0:bcd4eb707fcf | 140 | //Switch on the LED. x is default Led. |
mcalzana | 0:bcd4eb707fcf | 141 | if(xCount >= yCount && xCount >= zCount){ |
mcalzana | 0:bcd4eb707fcf | 142 | led3 = 1; |
mcalzana | 0:bcd4eb707fcf | 143 | }else if(yCount > xCount && yCount > zCount){ |
mcalzana | 0:bcd4eb707fcf | 144 | led2 = 1; |
mcalzana | 0:bcd4eb707fcf | 145 | }else{ |
mcalzana | 0:bcd4eb707fcf | 146 | led1 = 1; |
mcalzana | 0:bcd4eb707fcf | 147 | } |
mcalzana | 0:bcd4eb707fcf | 148 | |
mcalzana | 0:bcd4eb707fcf | 149 | printf("\rClosing \"/fs/numbers.txt\"... "); |
mcalzana | 0:bcd4eb707fcf | 150 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 151 | err = fclose(f); |
mcalzana | 0:bcd4eb707fcf | 152 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 153 | if (err < 0) { |
mcalzana | 0:bcd4eb707fcf | 154 | error("error: %s (%d)\n", strerror(errno), -errno); |
mcalzana | 0:bcd4eb707fcf | 155 | } |
mcalzana | 0:bcd4eb707fcf | 156 | |
mcalzana | 0:bcd4eb707fcf | 157 | // Tidy up |
mcalzana | 0:bcd4eb707fcf | 158 | printf("Unmounting... "); |
mcalzana | 0:bcd4eb707fcf | 159 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 160 | err = fs.unmount(); |
mcalzana | 0:bcd4eb707fcf | 161 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 162 | if (err < 0) { |
mcalzana | 0:bcd4eb707fcf | 163 | error("error: %s (%d)\n", strerror(-err), err); |
mcalzana | 0:bcd4eb707fcf | 164 | } |
mcalzana | 0:bcd4eb707fcf | 165 | printf("Mbed OS filesystem example done!\n"); |
mcalzana | 0:bcd4eb707fcf | 166 | |
mcalzana | 0:bcd4eb707fcf | 167 | } |
mcalzana | 0:bcd4eb707fcf | 168 | |
mcalzana | 0:bcd4eb707fcf | 169 | void readSensorsInterupt() { |
mcalzana | 0:bcd4eb707fcf | 170 | queue.call(writeAccToFile); |
mcalzana | 0:bcd4eb707fcf | 171 | counter++; |
mcalzana | 0:bcd4eb707fcf | 172 | if (counter == 1000) { |
mcalzana | 0:bcd4eb707fcf | 173 | toggle_write_to_file.detach(); |
mcalzana | 0:bcd4eb707fcf | 174 | queue.call(readAccFile); |
mcalzana | 0:bcd4eb707fcf | 175 | } |
mcalzana | 0:bcd4eb707fcf | 176 | } |
mcalzana | 0:bcd4eb707fcf | 177 | |
mcalzana | 0:bcd4eb707fcf | 178 | int main() { |
mcalzana | 0:bcd4eb707fcf | 179 | // Setup the erase event on button press, use the event queue |
mcalzana | 0:bcd4eb707fcf | 180 | // to avoid running in interrupt context |
mcalzana | 0:bcd4eb707fcf | 181 | irq.fall(mbed_event_queue()->event(erase)); |
mcalzana | 0:bcd4eb707fcf | 182 | |
mcalzana | 0:bcd4eb707fcf | 183 | // Try to mount the filesystem |
mcalzana | 0:bcd4eb707fcf | 184 | printf("Mounting the filesystem... "); |
mcalzana | 0:bcd4eb707fcf | 185 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 186 | int err = fs.mount(&bd); |
mcalzana | 0:bcd4eb707fcf | 187 | printf("%s\n", (err ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 188 | if (err) { |
mcalzana | 0:bcd4eb707fcf | 189 | // Reformat if we can't mount the filesystem |
mcalzana | 0:bcd4eb707fcf | 190 | // this should only happen on the first boot |
mcalzana | 0:bcd4eb707fcf | 191 | printf("No filesystem found, formatting... "); |
mcalzana | 0:bcd4eb707fcf | 192 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 193 | err = fs.reformat(&bd); |
mcalzana | 0:bcd4eb707fcf | 194 | printf("%s\n", (err ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 195 | if (err) { |
mcalzana | 0:bcd4eb707fcf | 196 | error("error: %s (%d)\n", strerror(-err), err); |
mcalzana | 0:bcd4eb707fcf | 197 | } |
mcalzana | 0:bcd4eb707fcf | 198 | } |
mcalzana | 0:bcd4eb707fcf | 199 | |
mcalzana | 0:bcd4eb707fcf | 200 | // Open the numbers file |
mcalzana | 0:bcd4eb707fcf | 201 | printf("Opening \"/fs/numbers.txt\"... "); |
mcalzana | 0:bcd4eb707fcf | 202 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 203 | f = fopen("/fs/numbers.txt", "r +"); |
mcalzana | 0:bcd4eb707fcf | 204 | printf("%s\n", (!f ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 205 | if (!f) { |
mcalzana | 0:bcd4eb707fcf | 206 | // Create the numbers file if it doesn't exist |
mcalzana | 0:bcd4eb707fcf | 207 | printf("No file found, creating a new file... "); |
mcalzana | 0:bcd4eb707fcf | 208 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 209 | f = fopen("/fs/numbers.txt", "w+"); |
mcalzana | 0:bcd4eb707fcf | 210 | printf("%s\n", (!f ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 211 | if (!f) { |
mcalzana | 0:bcd4eb707fcf | 212 | error("error: %s (%d)\n", strerror(errno), -errno); |
mcalzana | 0:bcd4eb707fcf | 213 | } |
mcalzana | 0:bcd4eb707fcf | 214 | |
mcalzana | 0:bcd4eb707fcf | 215 | printf("Seeking file... "); |
mcalzana | 0:bcd4eb707fcf | 216 | fflush(stdout); |
mcalzana | 0:bcd4eb707fcf | 217 | err = fseek(f, 0, SEEK_SET); |
mcalzana | 0:bcd4eb707fcf | 218 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
mcalzana | 0:bcd4eb707fcf | 219 | if (err < 0) { |
mcalzana | 0:bcd4eb707fcf | 220 | error("error: %s (%d)\n", strerror(errno), -errno); |
mcalzana | 0:bcd4eb707fcf | 221 | } |
mcalzana | 0:bcd4eb707fcf | 222 | } |
mcalzana | 0:bcd4eb707fcf | 223 | |
mcalzana | 0:bcd4eb707fcf | 224 | t.start(callback(&queue, &EventQueue::dispatch_forever)); |
mcalzana | 0:bcd4eb707fcf | 225 | BSP_ACCELERO_Init(); |
mcalzana | 0:bcd4eb707fcf | 226 | led1 = 0; |
mcalzana | 0:bcd4eb707fcf | 227 | led2 = 0; |
mcalzana | 0:bcd4eb707fcf | 228 | led3 = 0; |
mcalzana | 0:bcd4eb707fcf | 229 | printf("Start sampling... \n"); |
mcalzana | 0:bcd4eb707fcf | 230 | begin = time(NULL); |
mcalzana | 0:bcd4eb707fcf | 231 | toggle_write_to_file.attach(&readSensorsInterupt, 0.01); |
mcalzana | 0:bcd4eb707fcf | 232 | } |
mcalzana | 0:bcd4eb707fcf | 233 | |
mcalzana | 0:bcd4eb707fcf | 234 | |
mcalzana | 0:bcd4eb707fcf | 235 | |
mcalzana | 0:bcd4eb707fcf | 236 | |
mcalzana | 0:bcd4eb707fcf | 237 | |
mcalzana | 0:bcd4eb707fcf | 238 | |
mcalzana | 0:bcd4eb707fcf | 239 | |
mcalzana | 0:bcd4eb707fcf | 240 | |
mcalzana | 0:bcd4eb707fcf | 241 | |
mcalzana | 0:bcd4eb707fcf | 242 | |
mcalzana | 0:bcd4eb707fcf | 243 | |
mcalzana | 0:bcd4eb707fcf | 244 |