AccelerationFileNV

Dependencies:   BSP_B-L475E-IOT01

Revision:
0:6f54a96333fd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 06 22:02:53 2018 +0000
@@ -0,0 +1,217 @@
+#include "mbed.h"
+
+#include "stm32l475e_iot01_accelero.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include "nvstore.h"
+
+// Block devices
+#if COMPONENT_SPIF
+#include "SPIFBlockDevice.h"
+#endif
+
+#if COMPONENT_DATAFLASH
+#include "DataFlashBlockDevice.h"
+#endif 
+
+#if COMPONENT_SD
+#include "SDBlockDevice.h"
+#endif 
+
+#include "HeapBlockDevice.h"
+
+// File systems
+#include "LittleFileSystem.h"
+#include "FATFileSystem.h"
+
+// Physical block device, can be any device that supports the BlockDevice API
+/*SPIFBlockDevice bd(
+        MBED_CONF_SPIF_DRIVER_SPI_MOSI,
+        MBED_CONF_SPIF_DRIVER_SPI_MISO,
+        MBED_CONF_SPIF_DRIVER_SPI_CLK,
+        MBED_CONF_SPIF_DRIVER_SPI_CS);*/
+
+#define BLOCK_SIZE 512
+HeapBlockDevice bd(16384, BLOCK_SIZE);
+
+// File system declaration
+LittleFileSystem fs("fs");
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+
+Ticker ticker;
+Thread t;
+
+uint16_t key_led1 = 1; 
+uint32_t value_led1;
+uint16_t key_led2 = 2; 
+uint32_t value_led2;
+uint16_t key_led3 = 3;
+uint32_t value_led3;
+
+static FILE *f;
+volatile int counter = 0;
+EventQueue queue(16 * EVENTS_EVENT_SIZE);
+InterruptIn button(USER_BUTTON);
+int16_t pDataXYZ[3] = {0};
+
+
+void save_accelero() {
+    int16_t pDataXYZ[3] = {0};
+    BSP_ACCELERO_AccGetXYZ(pDataXYZ);
+    if ((pDataXYZ[0] < -950  && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950)){
+            fprintf(f, "%d\n", 0);
+        } else if ((pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030)) {
+            fprintf(f, "%d\n", 1);
+        } else if ((pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030)) {
+             fprintf(f, "%d\n", 2);
+        } else {
+             fprintf(f, "%d\n", -1);
+        }
+    fflush(f);
+    fflush(stdout);
+}
+
+void toggle_led_accelero() {
+      int horizontal_count = 0;
+      int long_count = 0;
+      int short_count = 0;
+      fflush(stdout);
+      fflush(f);
+      
+      fseek(f, 0, SEEK_SET);
+      int position;
+      while (!feof(f)) {
+        fscanf(f, "%d", &position); 
+        if (position == 0) {
+            short_count +=1;
+        } else if(position == 1) {
+            long_count +=1;
+        } else if(position == 2) {
+            horizontal_count +=1;
+        }
+      }
+     NVStore &nvstore = NVStore::get_instance();
+      if (short_count >= horizontal_count && short_count >= long_count) {
+            led1 = 0;
+            led2 = 0;
+            led3 = 1;
+            value_led3+=1;
+            nvstore.set(key_led3, sizeof(value_led3), &value_led3);
+            printf("The board stayed on the short edge for most time: %d \n",short_count);
+        }  else if (long_count >= horizontal_count && long_count >= short_count ) {
+            led1 = 0;
+            led2 = 1;
+            led3 = 0;
+            value_led2+=1;
+            nvstore.set(key_led2, sizeof(value_led2), &value_led2);
+            printf("The board stayed on the long edge for most time: %d \n",long_count);
+        } else if (horizontal_count >= long_count && horizontal_count >= short_count) {
+            led1 = 1;
+            led2 = 0;
+            led3 = 0;
+            value_led3+=1;
+            nvstore.set(key_led3, sizeof(value_led3), &value_led3);
+            printf("The board stayed horizontal for most time: %d \n",horizontal_count);
+        }
+    
+      fflush(stdout);
+      int err = fclose(f);
+      printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+      if (err < 0) {
+        error("error: %s (%d)\n", strerror(err), -err);
+      }
+      err = fs.unmount();
+      printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+      if (err < 0) {
+          error("error: %s (%d)\n", strerror(-err), err);
+      }    
+      
+}
+
+void toggle() {
+    int16_t pDataXYZ[3] = {0};
+    BSP_ACCELERO_AccGetXYZ(pDataXYZ);
+    printf("ACCELERO_X = %d\n", pDataXYZ[0]);
+    printf("ACCELERO_Y = %d\n", pDataXYZ[1]);
+    printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]);
+}
+
+void ticker_call() {    
+    queue.call(save_accelero);
+    counter++;
+    if (counter == 1000) {
+        ticker.detach();
+      queue.call(toggle_led_accelero);
+      counter = 0;
+    }
+}
+
+int main(){
+    t.start(callback(&queue, &EventQueue::dispatch_forever));
+    BSP_ACCELERO_Init();
+    
+    //Setting up NVStore
+    NVStore &nvstore = NVStore::get_instance();
+   
+    uint16_t actual_len_bytes = 0;
+    int rc;
+    
+    rc = nvstore.init();
+    printf("Init NVStore. \n");
+    
+    rc = nvstore.get(key_led1, sizeof(value_led1), &value_led1, actual_len_bytes);
+    if (rc == NVSTORE_NOT_FOUND) {
+        value_led1 = 0;
+        value_led2 = 0;
+        value_led3 = 0;
+        nvstore.set(key_led1, sizeof(value_led1), &value_led1);
+        nvstore.set(key_led2, sizeof(value_led2), &value_led2);
+        nvstore.set(key_led3, sizeof(value_led3), &value_led3);
+    } else {
+        nvstore.get(key_led2, sizeof(value_led2), &value_led2, actual_len_bytes);
+        nvstore.get(key_led3, sizeof(value_led3), &value_led3, actual_len_bytes);    
+    }
+ 
+    printf("LED1 switched on: %d times\n",value_led1);
+    printf("LED2 switched on: %d times\n",value_led2);
+    printf("LED3 switched on: %d times\n",value_led3);    
+    
+    // Try to mount the filesystem
+    printf("Mounting the filesystem... ");
+    fflush(stdout);
+    int err = fs.mount(&bd);
+    printf("%s\n", (err ? "Fail :(" : "OK"));
+    if (err) {
+        // Reformat if we can't mount the filesystem
+        // this should only happen on the first boot
+        printf("No filesystem found, formatting... ");
+        fflush(stdout);
+        err = fs.reformat(&bd);
+        printf("%s\n", (err ? "Fail :(" : "OK"));
+        if (err) {
+            error("error: %s (%d)\n", strerror(-err), err);
+        }
+    }
+    
+    // Open the numbers file
+    printf("Opening \"/fs/numbers.txt\"... ");
+    fflush(stdout);
+    f = fopen("/fs/numbers.txt", "r+");
+    printf("%s\n", (!f ? "Fail :(" : "OK"));
+    if (!f) {
+        // Create the numbers file if it doesn't exist
+        printf("No file found, creating a new file... ");
+        fflush(stdout);
+        f = fopen("/fs/numbers.txt", "w+");
+        printf("%s\n", (!f ? "Fail :(" : "OK"));
+        if (!f) {
+            error("error: %s (%d)\n", strerror(errno), -errno);
+        }
+    }
+
+    ticker.attach(&ticker_call, 0.01);
+}
\ No newline at end of file