a

Dependencies:   BSP_B-L475E-IOT01

Committer:
lucaspennati
Date:
Fri Dec 07 12:12:07 2018 +0000
Revision:
1:0b0ad71808ed
Parent:
0:80a623acba5a
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iandil 0:80a623acba5a 1
iandil 0:80a623acba5a 2 #include "mbed.h"
iandil 0:80a623acba5a 3 #include <stdio.h>
iandil 0:80a623acba5a 4 #include <errno.h>
iandil 0:80a623acba5a 5 #include "stm32l475e_iot01_accelero.h"
iandil 0:80a623acba5a 6 #include "nvstore.h"
iandil 0:80a623acba5a 7
iandil 0:80a623acba5a 8 // Block devices
iandil 0:80a623acba5a 9 #if COMPONENT_SPIF
iandil 0:80a623acba5a 10 #include "SPIFBlockDevice.h"
iandil 0:80a623acba5a 11 #endif
iandil 0:80a623acba5a 12
iandil 0:80a623acba5a 13 #if COMPONENT_DATAFLASH
iandil 0:80a623acba5a 14 #include "DataFlashBlockDevice.h"
iandil 0:80a623acba5a 15 #endif
iandil 0:80a623acba5a 16
iandil 0:80a623acba5a 17 #if COMPONENT_SD
iandil 0:80a623acba5a 18 #include "SDBlockDevice.h"
iandil 0:80a623acba5a 19 #endif
iandil 0:80a623acba5a 20
iandil 0:80a623acba5a 21 #include "HeapBlockDevice.h"
iandil 0:80a623acba5a 22 // File systems
iandil 0:80a623acba5a 23 #include "LittleFileSystem.h"
iandil 0:80a623acba5a 24 #include "FATFileSystem.h"
iandil 0:80a623acba5a 25
iandil 0:80a623acba5a 26 DigitalOut led1(LED1);
iandil 0:80a623acba5a 27 DigitalOut led2(LED2);
iandil 0:80a623acba5a 28 DigitalOut led3(LED3);
iandil 0:80a623acba5a 29 Ticker toggle_led;
iandil 0:80a623acba5a 30
iandil 0:80a623acba5a 31 EventQueue queue(32 * EVENTS_EVENT_SIZE);
iandil 0:80a623acba5a 32 Thread thread;
iandil 0:80a623acba5a 33 int maximum( int, int, int);
iandil 0:80a623acba5a 34 //int maximum( int a, int b, int c );
iandil 0:80a623acba5a 35
iandil 0:80a623acba5a 36 // Physical block device, can be any device that supports the BlockDevice API
iandil 0:80a623acba5a 37 /*SPIFBlockDevice bd(
iandil 0:80a623acba5a 38 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
iandil 0:80a623acba5a 39 MBED_CONF_SPIF_DRIVER_SPI_MISO,
iandil 0:80a623acba5a 40 MBED_CONF_SPIF_DRIVER_SPI_CLK,
iandil 0:80a623acba5a 41 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
iandil 0:80a623acba5a 42
iandil 0:80a623acba5a 43 #define BLOCK_SIZE 512
iandil 0:80a623acba5a 44 HeapBlockDevice bd(16384, BLOCK_SIZE);
iandil 0:80a623acba5a 45
iandil 0:80a623acba5a 46 // File system declaration
iandil 0:80a623acba5a 47 LittleFileSystem fs("fs");
iandil 0:80a623acba5a 48
iandil 0:80a623acba5a 49 // Set up the button to trigger an erase
iandil 0:80a623acba5a 50 InterruptIn irq(BUTTON1);
iandil 0:80a623acba5a 51 void erase() {
iandil 0:80a623acba5a 52 printf("Initializing the block device... ");
iandil 0:80a623acba5a 53 fflush(stdout);
iandil 0:80a623acba5a 54 int err = bd.init();
iandil 0:80a623acba5a 55 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 56 if (err) {
iandil 0:80a623acba5a 57 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 58 }
iandil 0:80a623acba5a 59
iandil 0:80a623acba5a 60 printf("Erasing the block device... ");
iandil 0:80a623acba5a 61 fflush(stdout);
iandil 0:80a623acba5a 62 err = bd.erase(0, bd.size());
iandil 0:80a623acba5a 63 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 64 if (err) {
iandil 0:80a623acba5a 65 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 66 }
iandil 0:80a623acba5a 67
iandil 0:80a623acba5a 68 printf("Deinitializing the block device... ");
iandil 0:80a623acba5a 69 fflush(stdout);
iandil 0:80a623acba5a 70 err = bd.deinit();
iandil 0:80a623acba5a 71 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 72 if (err) {
iandil 0:80a623acba5a 73 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 74 }
iandil 0:80a623acba5a 75 }
iandil 0:80a623acba5a 76
iandil 0:80a623acba5a 77 static FILE *file;
iandil 0:80a623acba5a 78 volatile int counter = 0;
iandil 0:80a623acba5a 79
iandil 0:80a623acba5a 80 int rc;
lucaspennati 1:0b0ad71808ed 81
iandil 0:80a623acba5a 82 uint16_t keyX = 1;
iandil 0:80a623acba5a 83 uint16_t keyY = 2;
iandil 0:80a623acba5a 84 uint16_t keyZ = 3;
iandil 0:80a623acba5a 85
lucaspennati 1:0b0ad71808ed 86 uint32_t valueX;
lucaspennati 1:0b0ad71808ed 87 uint32_t valueX;
lucaspennati 1:0b0ad71808ed 88 uint32_t valueZ;
lucaspennati 1:0b0ad71808ed 89 void getDataFromSensors() {
iandil 0:80a623acba5a 90 int16_t pDataXYZ[3] = {0};
iandil 0:80a623acba5a 91 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
lucaspennati 1:0b0ad71808ed 92
lucaspennati 1:0b0ad71808ed 93 bool isHorizontal = pDataXYZ[2] > 900 || pDataXYZ[2] < -900;
lucaspennati 1:0b0ad71808ed 94 bool isOnLongEdge = pDataXYZ[1] > 900 || pDataXYZ[1] < -900;
lucaspennati 1:0b0ad71808ed 95 bool isOnShortEdge = pDataXYZ[0] > 900 || pDataXYZ[0] < -900;
lucaspennati 1:0b0ad71808ed 96
lucaspennati 1:0b0ad71808ed 97 if(isHorizontal) {
lucaspennati 1:0b0ad71808ed 98 fprintf(file, "%d\n", 1);
lucaspennati 1:0b0ad71808ed 99 } else if(isOnLongEdge) {
lucaspennati 1:0b0ad71808ed 100 fprintf(file, "%d\n", 2);
lucaspennati 1:0b0ad71808ed 101 } else if(isOnShortEdge) {
lucaspennati 1:0b0ad71808ed 102 fprintf(file, "%d\n", 3);
lucaspennati 1:0b0ad71808ed 103 } else {
lucaspennati 1:0b0ad71808ed 104 fprintf(file, "%d\n", 4);
lucaspennati 1:0b0ad71808ed 105 }
iandil 0:80a623acba5a 106 fflush(file);
iandil 0:80a623acba5a 107 fflush(stdout);
iandil 0:80a623acba5a 108 }
iandil 0:80a623acba5a 109
iandil 0:80a623acba5a 110 void readFile() {
iandil 0:80a623acba5a 111
iandil 0:80a623acba5a 112 int countLed1 = 0;
iandil 0:80a623acba5a 113 int countLed2 = 0;
iandil 0:80a623acba5a 114 int countLed3 = 0;
iandil 0:80a623acba5a 115
iandil 0:80a623acba5a 116 fflush(stdout);
iandil 0:80a623acba5a 117 fflush(file);
iandil 0:80a623acba5a 118
iandil 0:80a623acba5a 119 fseek(file, 0, SEEK_SET);
iandil 0:80a623acba5a 120 int ledNumber;
iandil 0:80a623acba5a 121 while(!feof(file)) {
iandil 0:80a623acba5a 122 fscanf(file, "%d", &ledNumber);
iandil 0:80a623acba5a 123 if(ledNumber == 1){
iandil 0:80a623acba5a 124 countLed1 += 1;
iandil 0:80a623acba5a 125 } else if(ledNumber == 2){
iandil 0:80a623acba5a 126 countLed2 += 1;
iandil 0:80a623acba5a 127 } else if(ledNumber == 3){
iandil 0:80a623acba5a 128 countLed3 += 1;
iandil 0:80a623acba5a 129 }
iandil 0:80a623acba5a 130 }
lucaspennati 1:0b0ad71808ed 131
lucaspennati 1:0b0ad71808ed 132 bool isLed1 = led1 >= led2 && led1 >= led3;
lucaspennati 1:0b0ad71808ed 133 bool isLed2 = led2 >= led1 && led2 >= led3;
lucaspennati 1:0b0ad71808ed 134 bool isLed3 = led3 >= led1 && led3 >= led2;
iandil 0:80a623acba5a 135
iandil 0:80a623acba5a 136 NVStore &nvstore = NVStore::get_instance();
lucaspennati 1:0b0ad71808ed 137
lucaspennati 1:0b0ad71808ed 138 if(isLed1) {
iandil 0:80a623acba5a 139 led1 = 1;
iandil 0:80a623acba5a 140 led2 = 0;
iandil 0:80a623acba5a 141 led3 = 0;
iandil 0:80a623acba5a 142 valueX += 1;
iandil 0:80a623acba5a 143 nvstore.set(keyX, sizeof(valueX), &valueX);
lucaspennati 1:0b0ad71808ed 144 } else if (isLed2) {
iandil 0:80a623acba5a 145 led1 = 0;
iandil 0:80a623acba5a 146 led2 = 1;
iandil 0:80a623acba5a 147 led3 = 0;
iandil 0:80a623acba5a 148 valueY += 1;
iandil 0:80a623acba5a 149 nvstore.set(keyY, sizeof(valueY), &valueY);
lucaspennati 1:0b0ad71808ed 150 } else if (isLed3) {
iandil 0:80a623acba5a 151 led1 = 0;
iandil 0:80a623acba5a 152 led2 = 0;
iandil 0:80a623acba5a 153 led3 = 1;
iandil 0:80a623acba5a 154 valueZ += 1;
iandil 0:80a623acba5a 155 nvstore.set(keyZ, sizeof(valueZ), &valueZ);
iandil 0:80a623acba5a 156 }
iandil 0:80a623acba5a 157
lucaspennati 1:0b0ad71808ed 158
iandil 0:80a623acba5a 159 fflush(stdout);
iandil 0:80a623acba5a 160 int err = fclose(file);
iandil 0:80a623acba5a 161 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 162 if (err < 0) {
iandil 0:80a623acba5a 163 error("error: %s (%d)\n", strerror(err), -err);
iandil 0:80a623acba5a 164 }
iandil 0:80a623acba5a 165 err = fs.unmount();
iandil 0:80a623acba5a 166 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 167 if (err < 0) {
iandil 0:80a623acba5a 168 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 169 }
iandil 0:80a623acba5a 170
iandil 0:80a623acba5a 171 printf("Mbed OS filesystem example done!\n");
iandil 0:80a623acba5a 172 }
iandil 0:80a623acba5a 173
lucaspennati 1:0b0ad71808ed 174 void toggleLed() {
iandil 0:80a623acba5a 175 queue.call(readSensors);
iandil 0:80a623acba5a 176 counter += 1;
iandil 0:80a623acba5a 177 if(counter == 1000) {
iandil 0:80a623acba5a 178 toggle_led.detach();
iandil 0:80a623acba5a 179 queue.call(readFile);
iandil 0:80a623acba5a 180 }
iandil 0:80a623acba5a 181 }
iandil 0:80a623acba5a 182
iandil 0:80a623acba5a 183
iandil 0:80a623acba5a 184 // Entry point for the example
iandil 0:80a623acba5a 185 int main() {
iandil 0:80a623acba5a 186 thread.start(callback(&queue, &EventQueue::dispatch_forever));
iandil 0:80a623acba5a 187 BSP_ACCELERO_Init();
iandil 0:80a623acba5a 188
iandil 0:80a623acba5a 189 NVStore &nvstore = NVStore::get_instance();
iandil 0:80a623acba5a 190 rc = nvstore.init();
iandil 0:80a623acba5a 191 uint16_t actual_len_bytes = 0;
lucaspennati 1:0b0ad71808ed 192 rc = nvstore.get(keyX, sizeof(valueX), &valueX, actual_len_bytes);
iandil 0:80a623acba5a 193
iandil 0:80a623acba5a 194 if(rc == NVSTORE_NOT_FOUND) {
iandil 0:80a623acba5a 195 valueX = 0;
iandil 0:80a623acba5a 196 valueY = 0;
iandil 0:80a623acba5a 197 valueZ = 0;
iandil 0:80a623acba5a 198 nvstore.set(keyX, sizeof(valueX), &valueX);
iandil 0:80a623acba5a 199 nvstore.set(keyY, sizeof(valueY), &valueY);
iandil 0:80a623acba5a 200 nvstore.set(keyZ, sizeof(valueZ), &valueZ);
iandil 0:80a623acba5a 201 } else {
lucaspennati 1:0b0ad71808ed 202 nvstore.get(keyZ, sizeof(valueZ), &valueZ, actual_len_bytes);
iandil 0:80a623acba5a 203 nvstore.get(keyY, sizeof(valueY), &valueY, actual_len_bytes);
iandil 0:80a623acba5a 204 }
iandil 0:80a623acba5a 205
iandil 0:80a623acba5a 206 printf("Led1 Count: %d -- Led2 Count: %d -- Led3 Count: %d \n", valueX, valueY, valueZ);
iandil 0:80a623acba5a 207 printf("--- Mbed OS filesystem example ---\n");
iandil 0:80a623acba5a 208
iandil 0:80a623acba5a 209 // Setup the erase event on button press, use the event queue
iandil 0:80a623acba5a 210 // to avoid running in interrupt context
iandil 0:80a623acba5a 211 irq.fall(mbed_event_queue()->event(erase));
iandil 0:80a623acba5a 212
iandil 0:80a623acba5a 213 // Try to mount the filesystem
iandil 0:80a623acba5a 214 printf("Mounting the filesystem... ");
iandil 0:80a623acba5a 215 fflush(stdout);
iandil 0:80a623acba5a 216 int err = fs.mount(&bd);
iandil 0:80a623acba5a 217 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 218 if (err) {
iandil 0:80a623acba5a 219 // Reformat if we can't mount the filesystem
iandil 0:80a623acba5a 220 // this should only happen on the first boot
iandil 0:80a623acba5a 221 printf("No filesystem found, formatting... ");
iandil 0:80a623acba5a 222 fflush(stdout);
iandil 0:80a623acba5a 223 err = fs.reformat(&bd);
iandil 0:80a623acba5a 224 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 225 if (err) {
iandil 0:80a623acba5a 226 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 227 }
iandil 0:80a623acba5a 228 }
iandil 0:80a623acba5a 229
iandil 0:80a623acba5a 230 // Open the numbers file
iandil 0:80a623acba5a 231 printf("Opening \"/fs/numbers.txt\"... ");
iandil 0:80a623acba5a 232 fflush(stdout);
iandil 0:80a623acba5a 233 file = fopen("/fs/numbers.txt", "r+");
iandil 0:80a623acba5a 234 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 235 if (!file) {
iandil 0:80a623acba5a 236 // Create the numbers file if it doesn't exist
iandil 0:80a623acba5a 237 printf("No file found, creating a new file... ");
iandil 0:80a623acba5a 238 fflush(stdout);
iandil 0:80a623acba5a 239 file = fopen("/fs/numbers.txt", "w+");
iandil 0:80a623acba5a 240 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 241 if (!file) {
iandil 0:80a623acba5a 242 error("error: %s (%d)\n", strerror(errno), -errno);
iandil 0:80a623acba5a 243 }
iandil 0:80a623acba5a 244 }
iandil 0:80a623acba5a 245
lucaspennati 1:0b0ad71808ed 246 toggle_led.attach(&toggleLed, 0.01);
iandil 0:80a623acba5a 247
iandil 0:80a623acba5a 248
iandil 0:80a623acba5a 249 }