Exercise2

Dependencies:   BSP_B-L475E-IOT01

Committer:
mcalzana
Date:
Thu Dec 06 16:11:10 2018 +0000
Revision:
0:2495ade12e03
Exrcise2

Who changed what in which revision?

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