AccelerationFileNV

Dependencies:   BSP_B-L475E-IOT01

main.cpp

Committer:
redona
Date:
2018-12-06
Revision:
0:6f54a96333fd

File content as of revision 0:6f54a96333fd:

#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);
}