Modify the previous example to use NVStore for keeping track of how many times every different LED turned on This information must persist across system reboots! Print this information on STDout at every boot before running the application

Dependencies:   BSP_B-L475E-IOT01

Committer:
vicara
Date:
Thu Dec 06 15:54:33 2018 +0000
Revision:
1:288cdb94027a
Parent:
0:063b251c6aed
Child:
2:4cfbd0da7242
use NVStore for keeping track of how many; times every different LED turned on

Who changed what in which revision?

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