accellaration stored in NV

Dependencies:   BSP_B-L475E-IOT01

Committer:
iandil
Date:
Thu Dec 06 15:33:42 2018 +0000
Revision:
0:80a623acba5a
finished assignment;

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;
iandil 0:80a623acba5a 81 uint16_t keyX = 1;
iandil 0:80a623acba5a 82 uint32_t valueX;
iandil 0:80a623acba5a 83 uint16_t keyY = 2;
iandil 0:80a623acba5a 84 uint32_t valueY;
iandil 0:80a623acba5a 85 uint16_t keyZ = 3;
iandil 0:80a623acba5a 86 uint32_t valueZ;
iandil 0:80a623acba5a 87
iandil 0:80a623acba5a 88 int maximum( int a, int b, int c ) {
iandil 0:80a623acba5a 89 int max = ( a < b ) ? b : a;
iandil 0:80a623acba5a 90 return ( ( max < c ) ? c : max );
iandil 0:80a623acba5a 91 }
iandil 0:80a623acba5a 92
iandil 0:80a623acba5a 93 void readSensors() {
iandil 0:80a623acba5a 94 int16_t pDataXYZ[3] = {0};
iandil 0:80a623acba5a 95 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
iandil 0:80a623acba5a 96 if(pDataXYZ[2] > 900 || pDataXYZ[2] < -900) { //Horizontal State
iandil 0:80a623acba5a 97 fprintf(file, "%d\n", 1);
iandil 0:80a623acba5a 98 } else if(pDataXYZ[1] > 900 || pDataXYZ[1] < -900) { //Long Edge State
iandil 0:80a623acba5a 99 fprintf(file, "%d\n", 2);
iandil 0:80a623acba5a 100 } else if(pDataXYZ[0] > 900 || pDataXYZ[0] < -900) { // Short Edge State
iandil 0:80a623acba5a 101 fprintf(file, "%d\n", 3);
iandil 0:80a623acba5a 102 } else { // all other positions
iandil 0:80a623acba5a 103 fprintf(file, "%d\n", 4);
iandil 0:80a623acba5a 104 }
iandil 0:80a623acba5a 105 fflush(file);
iandil 0:80a623acba5a 106 fflush(stdout);
iandil 0:80a623acba5a 107 }
iandil 0:80a623acba5a 108
iandil 0:80a623acba5a 109 void readFile() {
iandil 0:80a623acba5a 110
iandil 0:80a623acba5a 111 int countLed1 = 0;
iandil 0:80a623acba5a 112 int countLed2 = 0;
iandil 0:80a623acba5a 113 int countLed3 = 0;
iandil 0:80a623acba5a 114
iandil 0:80a623acba5a 115 fflush(stdout);
iandil 0:80a623acba5a 116 fflush(file);
iandil 0:80a623acba5a 117
iandil 0:80a623acba5a 118 fseek(file, 0, SEEK_SET);
iandil 0:80a623acba5a 119 int ledNumber;
iandil 0:80a623acba5a 120 while(!feof(file)) {
iandil 0:80a623acba5a 121 fscanf(file, "%d", &ledNumber);
iandil 0:80a623acba5a 122 if(ledNumber == 1){
iandil 0:80a623acba5a 123 countLed1 += 1;
iandil 0:80a623acba5a 124 } else if(ledNumber == 2){
iandil 0:80a623acba5a 125 countLed2 += 1;
iandil 0:80a623acba5a 126 } else if(ledNumber == 3){
iandil 0:80a623acba5a 127 countLed3 += 1;
iandil 0:80a623acba5a 128 }
iandil 0:80a623acba5a 129 }
iandil 0:80a623acba5a 130 int maxLed = maximum(countLed1, countLed2, countLed3);
iandil 0:80a623acba5a 131 printf("MAX LED = %d\n", maxLed);
iandil 0:80a623acba5a 132
iandil 0:80a623acba5a 133 NVStore &nvstore = NVStore::get_instance();
iandil 0:80a623acba5a 134 if(maxLed == countLed1) {
iandil 0:80a623acba5a 135 led1 = 1;
iandil 0:80a623acba5a 136 led2 = 0;
iandil 0:80a623acba5a 137 led3 = 0;
iandil 0:80a623acba5a 138 valueX += 1;
iandil 0:80a623acba5a 139 nvstore.set(keyX, sizeof(valueX), &valueX);
iandil 0:80a623acba5a 140 } else if (maxLed == countLed2) {
iandil 0:80a623acba5a 141 led1 = 0;
iandil 0:80a623acba5a 142 led2 = 1;
iandil 0:80a623acba5a 143 led3 = 0;
iandil 0:80a623acba5a 144 valueY += 1;
iandil 0:80a623acba5a 145 nvstore.set(keyY, sizeof(valueY), &valueY);
iandil 0:80a623acba5a 146 } else if (maxLed == countLed3) {
iandil 0:80a623acba5a 147 led1 = 0;
iandil 0:80a623acba5a 148 led2 = 0;
iandil 0:80a623acba5a 149 led3 = 1;
iandil 0:80a623acba5a 150 valueZ += 1;
iandil 0:80a623acba5a 151 nvstore.set(keyZ, sizeof(valueZ), &valueZ);
iandil 0:80a623acba5a 152 }
iandil 0:80a623acba5a 153
iandil 0:80a623acba5a 154 fflush(stdout);
iandil 0:80a623acba5a 155 int err = fclose(file);
iandil 0:80a623acba5a 156 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 157 if (err < 0) {
iandil 0:80a623acba5a 158 error("error: %s (%d)\n", strerror(err), -err);
iandil 0:80a623acba5a 159 }
iandil 0:80a623acba5a 160 err = fs.unmount();
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
iandil 0:80a623acba5a 166 printf("Mbed OS filesystem example done!\n");
iandil 0:80a623acba5a 167 }
iandil 0:80a623acba5a 168
iandil 0:80a623acba5a 169 void turnOnLed() {
iandil 0:80a623acba5a 170 queue.call(readSensors);
iandil 0:80a623acba5a 171 counter += 1;
iandil 0:80a623acba5a 172 if(counter == 1000) {
iandil 0:80a623acba5a 173 toggle_led.detach();
iandil 0:80a623acba5a 174 queue.call(readFile);
iandil 0:80a623acba5a 175 }
iandil 0:80a623acba5a 176 }
iandil 0:80a623acba5a 177
iandil 0:80a623acba5a 178
iandil 0:80a623acba5a 179 // Entry point for the example
iandil 0:80a623acba5a 180 int main() {
iandil 0:80a623acba5a 181 thread.start(callback(&queue, &EventQueue::dispatch_forever));
iandil 0:80a623acba5a 182 BSP_ACCELERO_Init();
iandil 0:80a623acba5a 183
iandil 0:80a623acba5a 184 NVStore &nvstore = NVStore::get_instance();
iandil 0:80a623acba5a 185 rc = nvstore.init();
iandil 0:80a623acba5a 186 uint16_t actual_len_bytes = 0;
iandil 0:80a623acba5a 187 rc = nvstore.get(keyZ, sizeof(valueZ), &valueZ, actual_len_bytes);
iandil 0:80a623acba5a 188
iandil 0:80a623acba5a 189 if(rc == NVSTORE_NOT_FOUND) {
iandil 0:80a623acba5a 190 valueX = 0;
iandil 0:80a623acba5a 191 valueY = 0;
iandil 0:80a623acba5a 192 valueZ = 0;
iandil 0:80a623acba5a 193 nvstore.set(keyX, sizeof(valueX), &valueX);
iandil 0:80a623acba5a 194 nvstore.set(keyY, sizeof(valueY), &valueY);
iandil 0:80a623acba5a 195 nvstore.set(keyZ, sizeof(valueZ), &valueZ);
iandil 0:80a623acba5a 196 } else {
iandil 0:80a623acba5a 197 nvstore.get(keyX, sizeof(valueX), &valueX, actual_len_bytes);
iandil 0:80a623acba5a 198 nvstore.get(keyY, sizeof(valueY), &valueY, actual_len_bytes);
iandil 0:80a623acba5a 199 }
iandil 0:80a623acba5a 200
iandil 0:80a623acba5a 201 printf("Led1 Count: %d -- Led2 Count: %d -- Led3 Count: %d \n", valueX, valueY, valueZ);
iandil 0:80a623acba5a 202 printf("--- Mbed OS filesystem example ---\n");
iandil 0:80a623acba5a 203
iandil 0:80a623acba5a 204 // Setup the erase event on button press, use the event queue
iandil 0:80a623acba5a 205 // to avoid running in interrupt context
iandil 0:80a623acba5a 206 irq.fall(mbed_event_queue()->event(erase));
iandil 0:80a623acba5a 207
iandil 0:80a623acba5a 208 // Try to mount the filesystem
iandil 0:80a623acba5a 209 printf("Mounting the filesystem... ");
iandil 0:80a623acba5a 210 fflush(stdout);
iandil 0:80a623acba5a 211 int err = fs.mount(&bd);
iandil 0:80a623acba5a 212 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 213 if (err) {
iandil 0:80a623acba5a 214 // Reformat if we can't mount the filesystem
iandil 0:80a623acba5a 215 // this should only happen on the first boot
iandil 0:80a623acba5a 216 printf("No filesystem found, formatting... ");
iandil 0:80a623acba5a 217 fflush(stdout);
iandil 0:80a623acba5a 218 err = fs.reformat(&bd);
iandil 0:80a623acba5a 219 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 220 if (err) {
iandil 0:80a623acba5a 221 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:80a623acba5a 222 }
iandil 0:80a623acba5a 223 }
iandil 0:80a623acba5a 224
iandil 0:80a623acba5a 225 // Open the numbers file
iandil 0:80a623acba5a 226 printf("Opening \"/fs/numbers.txt\"... ");
iandil 0:80a623acba5a 227 fflush(stdout);
iandil 0:80a623acba5a 228 file = fopen("/fs/numbers.txt", "r+");
iandil 0:80a623acba5a 229 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 230 if (!file) {
iandil 0:80a623acba5a 231 // Create the numbers file if it doesn't exist
iandil 0:80a623acba5a 232 printf("No file found, creating a new file... ");
iandil 0:80a623acba5a 233 fflush(stdout);
iandil 0:80a623acba5a 234 file = fopen("/fs/numbers.txt", "w+");
iandil 0:80a623acba5a 235 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:80a623acba5a 236 if (!file) {
iandil 0:80a623acba5a 237 error("error: %s (%d)\n", strerror(errno), -errno);
iandil 0:80a623acba5a 238 }
iandil 0:80a623acba5a 239 }
iandil 0:80a623acba5a 240
iandil 0:80a623acba5a 241 toggle_led.attach(&turnOnLed, 0.01);
iandil 0:80a623acba5a 242
iandil 0:80a623acba5a 243
iandil 0:80a623acba5a 244 }