AccelerationFileNV

Dependencies:   BSP_B-L475E-IOT01

Committer:
redona
Date:
Thu Dec 06 22:02:53 2018 +0000
Revision:
0:6f54a96333fd
AccelerationFileNV

Who changed what in which revision?

UserRevisionLine numberNew contents of line
redona 0:6f54a96333fd 1 #include "mbed.h"
redona 0:6f54a96333fd 2
redona 0:6f54a96333fd 3 #include "stm32l475e_iot01_accelero.h"
redona 0:6f54a96333fd 4
redona 0:6f54a96333fd 5 #include <stdio.h>
redona 0:6f54a96333fd 6 #include <errno.h>
redona 0:6f54a96333fd 7 #include "nvstore.h"
redona 0:6f54a96333fd 8
redona 0:6f54a96333fd 9 // Block devices
redona 0:6f54a96333fd 10 #if COMPONENT_SPIF
redona 0:6f54a96333fd 11 #include "SPIFBlockDevice.h"
redona 0:6f54a96333fd 12 #endif
redona 0:6f54a96333fd 13
redona 0:6f54a96333fd 14 #if COMPONENT_DATAFLASH
redona 0:6f54a96333fd 15 #include "DataFlashBlockDevice.h"
redona 0:6f54a96333fd 16 #endif
redona 0:6f54a96333fd 17
redona 0:6f54a96333fd 18 #if COMPONENT_SD
redona 0:6f54a96333fd 19 #include "SDBlockDevice.h"
redona 0:6f54a96333fd 20 #endif
redona 0:6f54a96333fd 21
redona 0:6f54a96333fd 22 #include "HeapBlockDevice.h"
redona 0:6f54a96333fd 23
redona 0:6f54a96333fd 24 // File systems
redona 0:6f54a96333fd 25 #include "LittleFileSystem.h"
redona 0:6f54a96333fd 26 #include "FATFileSystem.h"
redona 0:6f54a96333fd 27
redona 0:6f54a96333fd 28 // Physical block device, can be any device that supports the BlockDevice API
redona 0:6f54a96333fd 29 /*SPIFBlockDevice bd(
redona 0:6f54a96333fd 30 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
redona 0:6f54a96333fd 31 MBED_CONF_SPIF_DRIVER_SPI_MISO,
redona 0:6f54a96333fd 32 MBED_CONF_SPIF_DRIVER_SPI_CLK,
redona 0:6f54a96333fd 33 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
redona 0:6f54a96333fd 34
redona 0:6f54a96333fd 35 #define BLOCK_SIZE 512
redona 0:6f54a96333fd 36 HeapBlockDevice bd(16384, BLOCK_SIZE);
redona 0:6f54a96333fd 37
redona 0:6f54a96333fd 38 // File system declaration
redona 0:6f54a96333fd 39 LittleFileSystem fs("fs");
redona 0:6f54a96333fd 40
redona 0:6f54a96333fd 41 DigitalOut led1(LED1);
redona 0:6f54a96333fd 42 DigitalOut led2(LED2);
redona 0:6f54a96333fd 43 DigitalOut led3(LED3);
redona 0:6f54a96333fd 44
redona 0:6f54a96333fd 45 Ticker ticker;
redona 0:6f54a96333fd 46 Thread t;
redona 0:6f54a96333fd 47
redona 0:6f54a96333fd 48 uint16_t key_led1 = 1;
redona 0:6f54a96333fd 49 uint32_t value_led1;
redona 0:6f54a96333fd 50 uint16_t key_led2 = 2;
redona 0:6f54a96333fd 51 uint32_t value_led2;
redona 0:6f54a96333fd 52 uint16_t key_led3 = 3;
redona 0:6f54a96333fd 53 uint32_t value_led3;
redona 0:6f54a96333fd 54
redona 0:6f54a96333fd 55 static FILE *f;
redona 0:6f54a96333fd 56 volatile int counter = 0;
redona 0:6f54a96333fd 57 EventQueue queue(16 * EVENTS_EVENT_SIZE);
redona 0:6f54a96333fd 58 InterruptIn button(USER_BUTTON);
redona 0:6f54a96333fd 59 int16_t pDataXYZ[3] = {0};
redona 0:6f54a96333fd 60
redona 0:6f54a96333fd 61
redona 0:6f54a96333fd 62 void save_accelero() {
redona 0:6f54a96333fd 63 int16_t pDataXYZ[3] = {0};
redona 0:6f54a96333fd 64 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
redona 0:6f54a96333fd 65 if ((pDataXYZ[0] < -950 && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950)){
redona 0:6f54a96333fd 66 fprintf(f, "%d\n", 0);
redona 0:6f54a96333fd 67 } else if ((pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030)) {
redona 0:6f54a96333fd 68 fprintf(f, "%d\n", 1);
redona 0:6f54a96333fd 69 } else if ((pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030)) {
redona 0:6f54a96333fd 70 fprintf(f, "%d\n", 2);
redona 0:6f54a96333fd 71 } else {
redona 0:6f54a96333fd 72 fprintf(f, "%d\n", -1);
redona 0:6f54a96333fd 73 }
redona 0:6f54a96333fd 74 fflush(f);
redona 0:6f54a96333fd 75 fflush(stdout);
redona 0:6f54a96333fd 76 }
redona 0:6f54a96333fd 77
redona 0:6f54a96333fd 78 void toggle_led_accelero() {
redona 0:6f54a96333fd 79 int horizontal_count = 0;
redona 0:6f54a96333fd 80 int long_count = 0;
redona 0:6f54a96333fd 81 int short_count = 0;
redona 0:6f54a96333fd 82 fflush(stdout);
redona 0:6f54a96333fd 83 fflush(f);
redona 0:6f54a96333fd 84
redona 0:6f54a96333fd 85 fseek(f, 0, SEEK_SET);
redona 0:6f54a96333fd 86 int position;
redona 0:6f54a96333fd 87 while (!feof(f)) {
redona 0:6f54a96333fd 88 fscanf(f, "%d", &position);
redona 0:6f54a96333fd 89 if (position == 0) {
redona 0:6f54a96333fd 90 short_count +=1;
redona 0:6f54a96333fd 91 } else if(position == 1) {
redona 0:6f54a96333fd 92 long_count +=1;
redona 0:6f54a96333fd 93 } else if(position == 2) {
redona 0:6f54a96333fd 94 horizontal_count +=1;
redona 0:6f54a96333fd 95 }
redona 0:6f54a96333fd 96 }
redona 0:6f54a96333fd 97 NVStore &nvstore = NVStore::get_instance();
redona 0:6f54a96333fd 98 if (short_count >= horizontal_count && short_count >= long_count) {
redona 0:6f54a96333fd 99 led1 = 0;
redona 0:6f54a96333fd 100 led2 = 0;
redona 0:6f54a96333fd 101 led3 = 1;
redona 0:6f54a96333fd 102 value_led3+=1;
redona 0:6f54a96333fd 103 nvstore.set(key_led3, sizeof(value_led3), &value_led3);
redona 0:6f54a96333fd 104 printf("The board stayed on the short edge for most time: %d \n",short_count);
redona 0:6f54a96333fd 105 } else if (long_count >= horizontal_count && long_count >= short_count ) {
redona 0:6f54a96333fd 106 led1 = 0;
redona 0:6f54a96333fd 107 led2 = 1;
redona 0:6f54a96333fd 108 led3 = 0;
redona 0:6f54a96333fd 109 value_led2+=1;
redona 0:6f54a96333fd 110 nvstore.set(key_led2, sizeof(value_led2), &value_led2);
redona 0:6f54a96333fd 111 printf("The board stayed on the long edge for most time: %d \n",long_count);
redona 0:6f54a96333fd 112 } else if (horizontal_count >= long_count && horizontal_count >= short_count) {
redona 0:6f54a96333fd 113 led1 = 1;
redona 0:6f54a96333fd 114 led2 = 0;
redona 0:6f54a96333fd 115 led3 = 0;
redona 0:6f54a96333fd 116 value_led3+=1;
redona 0:6f54a96333fd 117 nvstore.set(key_led3, sizeof(value_led3), &value_led3);
redona 0:6f54a96333fd 118 printf("The board stayed horizontal for most time: %d \n",horizontal_count);
redona 0:6f54a96333fd 119 }
redona 0:6f54a96333fd 120
redona 0:6f54a96333fd 121 fflush(stdout);
redona 0:6f54a96333fd 122 int err = fclose(f);
redona 0:6f54a96333fd 123 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 124 if (err < 0) {
redona 0:6f54a96333fd 125 error("error: %s (%d)\n", strerror(err), -err);
redona 0:6f54a96333fd 126 }
redona 0:6f54a96333fd 127 err = fs.unmount();
redona 0:6f54a96333fd 128 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 129 if (err < 0) {
redona 0:6f54a96333fd 130 error("error: %s (%d)\n", strerror(-err), err);
redona 0:6f54a96333fd 131 }
redona 0:6f54a96333fd 132
redona 0:6f54a96333fd 133 }
redona 0:6f54a96333fd 134
redona 0:6f54a96333fd 135 void toggle() {
redona 0:6f54a96333fd 136 int16_t pDataXYZ[3] = {0};
redona 0:6f54a96333fd 137 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
redona 0:6f54a96333fd 138 printf("ACCELERO_X = %d\n", pDataXYZ[0]);
redona 0:6f54a96333fd 139 printf("ACCELERO_Y = %d\n", pDataXYZ[1]);
redona 0:6f54a96333fd 140 printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]);
redona 0:6f54a96333fd 141 }
redona 0:6f54a96333fd 142
redona 0:6f54a96333fd 143 void ticker_call() {
redona 0:6f54a96333fd 144 queue.call(save_accelero);
redona 0:6f54a96333fd 145 counter++;
redona 0:6f54a96333fd 146 if (counter == 1000) {
redona 0:6f54a96333fd 147 ticker.detach();
redona 0:6f54a96333fd 148 queue.call(toggle_led_accelero);
redona 0:6f54a96333fd 149 counter = 0;
redona 0:6f54a96333fd 150 }
redona 0:6f54a96333fd 151 }
redona 0:6f54a96333fd 152
redona 0:6f54a96333fd 153 int main(){
redona 0:6f54a96333fd 154 t.start(callback(&queue, &EventQueue::dispatch_forever));
redona 0:6f54a96333fd 155 BSP_ACCELERO_Init();
redona 0:6f54a96333fd 156
redona 0:6f54a96333fd 157 //Setting up NVStore
redona 0:6f54a96333fd 158 NVStore &nvstore = NVStore::get_instance();
redona 0:6f54a96333fd 159
redona 0:6f54a96333fd 160 uint16_t actual_len_bytes = 0;
redona 0:6f54a96333fd 161 int rc;
redona 0:6f54a96333fd 162
redona 0:6f54a96333fd 163 rc = nvstore.init();
redona 0:6f54a96333fd 164 printf("Init NVStore. \n");
redona 0:6f54a96333fd 165
redona 0:6f54a96333fd 166 rc = nvstore.get(key_led1, sizeof(value_led1), &value_led1, actual_len_bytes);
redona 0:6f54a96333fd 167 if (rc == NVSTORE_NOT_FOUND) {
redona 0:6f54a96333fd 168 value_led1 = 0;
redona 0:6f54a96333fd 169 value_led2 = 0;
redona 0:6f54a96333fd 170 value_led3 = 0;
redona 0:6f54a96333fd 171 nvstore.set(key_led1, sizeof(value_led1), &value_led1);
redona 0:6f54a96333fd 172 nvstore.set(key_led2, sizeof(value_led2), &value_led2);
redona 0:6f54a96333fd 173 nvstore.set(key_led3, sizeof(value_led3), &value_led3);
redona 0:6f54a96333fd 174 } else {
redona 0:6f54a96333fd 175 nvstore.get(key_led2, sizeof(value_led2), &value_led2, actual_len_bytes);
redona 0:6f54a96333fd 176 nvstore.get(key_led3, sizeof(value_led3), &value_led3, actual_len_bytes);
redona 0:6f54a96333fd 177 }
redona 0:6f54a96333fd 178
redona 0:6f54a96333fd 179 printf("LED1 switched on: %d times\n",value_led1);
redona 0:6f54a96333fd 180 printf("LED2 switched on: %d times\n",value_led2);
redona 0:6f54a96333fd 181 printf("LED3 switched on: %d times\n",value_led3);
redona 0:6f54a96333fd 182
redona 0:6f54a96333fd 183 // Try to mount the filesystem
redona 0:6f54a96333fd 184 printf("Mounting the filesystem... ");
redona 0:6f54a96333fd 185 fflush(stdout);
redona 0:6f54a96333fd 186 int err = fs.mount(&bd);
redona 0:6f54a96333fd 187 printf("%s\n", (err ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 188 if (err) {
redona 0:6f54a96333fd 189 // Reformat if we can't mount the filesystem
redona 0:6f54a96333fd 190 // this should only happen on the first boot
redona 0:6f54a96333fd 191 printf("No filesystem found, formatting... ");
redona 0:6f54a96333fd 192 fflush(stdout);
redona 0:6f54a96333fd 193 err = fs.reformat(&bd);
redona 0:6f54a96333fd 194 printf("%s\n", (err ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 195 if (err) {
redona 0:6f54a96333fd 196 error("error: %s (%d)\n", strerror(-err), err);
redona 0:6f54a96333fd 197 }
redona 0:6f54a96333fd 198 }
redona 0:6f54a96333fd 199
redona 0:6f54a96333fd 200 // Open the numbers file
redona 0:6f54a96333fd 201 printf("Opening \"/fs/numbers.txt\"... ");
redona 0:6f54a96333fd 202 fflush(stdout);
redona 0:6f54a96333fd 203 f = fopen("/fs/numbers.txt", "r+");
redona 0:6f54a96333fd 204 printf("%s\n", (!f ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 205 if (!f) {
redona 0:6f54a96333fd 206 // Create the numbers file if it doesn't exist
redona 0:6f54a96333fd 207 printf("No file found, creating a new file... ");
redona 0:6f54a96333fd 208 fflush(stdout);
redona 0:6f54a96333fd 209 f = fopen("/fs/numbers.txt", "w+");
redona 0:6f54a96333fd 210 printf("%s\n", (!f ? "Fail :(" : "OK"));
redona 0:6f54a96333fd 211 if (!f) {
redona 0:6f54a96333fd 212 error("error: %s (%d)\n", strerror(errno), -errno);
redona 0:6f54a96333fd 213 }
redona 0:6f54a96333fd 214 }
redona 0:6f54a96333fd 215
redona 0:6f54a96333fd 216 ticker.attach(&ticker_call, 0.01);
redona 0:6f54a96333fd 217 }