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 16:38:26 2018 +0000
Revision:
2:4cfbd0da7242
Parent:
1:288cdb94027a
fixed

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 2:4cfbd0da7242 69
vicara 2:4cfbd0da7242 70 bool is_board_horizontal(int16_t pDataXYZ[3]) {
vicara 2:4cfbd0da7242 71 return (pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030);
vicara 2:4cfbd0da7242 72 }
vicara 2:4cfbd0da7242 73
vicara 2:4cfbd0da7242 74 bool is_board_vertical_short(int16_t pDataXYZ[3]) {
vicara 2:4cfbd0da7242 75 return (pDataXYZ[0] < -950 && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950);
vicara 2:4cfbd0da7242 76 }
vicara 2:4cfbd0da7242 77
vicara 2:4cfbd0da7242 78 bool is_board_vertical_long(int16_t pDataXYZ[3]) {
vicara 2:4cfbd0da7242 79 return (pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030);
vicara 2:4cfbd0da7242 80 }
vicara 2:4cfbd0da7242 81
vicara 0:063b251c6aed 82 void write_positions_on_file() {
vicara 0:063b251c6aed 83 int16_t pDataXYZ[3] = {0};
vicara 0:063b251c6aed 84 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
vicara 2:4cfbd0da7242 85 if (is_board_vertical_short(pDataXYZ)) {
vicara 0:063b251c6aed 86 fprintf(f, "%d\n", 0);
vicara 2:4cfbd0da7242 87 } else if (is_board_vertical_long(pDataXYZ)) {
vicara 0:063b251c6aed 88 fprintf(f, "%d\n", 1);
vicara 2:4cfbd0da7242 89 } else if (is_board_horizontal(pDataXYZ)) {
vicara 0:063b251c6aed 90 fprintf(f, "%d\n", 2);
vicara 0:063b251c6aed 91 } else {
vicara 0:063b251c6aed 92 fprintf(f, "%d\n", -1);
vicara 0:063b251c6aed 93 }
vicara 0:063b251c6aed 94 fflush(f);
vicara 0:063b251c6aed 95 fflush(stdout);
vicara 0:063b251c6aed 96 }
vicara 0:063b251c6aed 97
vicara 0:063b251c6aed 98 void toggle_led_based_on_position() {
vicara 0:063b251c6aed 99 int horizontal_occurrencies = 0;
vicara 0:063b251c6aed 100 int long_vertical_occurrencies = 0;
vicara 0:063b251c6aed 101 int short_vertical_occurrencies = 0;
vicara 0:063b251c6aed 102 fflush(stdout);
vicara 0:063b251c6aed 103 fflush(f);
vicara 0:063b251c6aed 104
vicara 0:063b251c6aed 105 fseek(f, 0, SEEK_SET);
vicara 0:063b251c6aed 106 int position;
vicara 0:063b251c6aed 107 while (!feof(f)) {
vicara 0:063b251c6aed 108 fscanf(f, "%d", &position);
vicara 0:063b251c6aed 109 if (position == 0) {
vicara 0:063b251c6aed 110 short_vertical_occurrencies +=1;
vicara 0:063b251c6aed 111 } else if(position == 1) {
vicara 0:063b251c6aed 112 long_vertical_occurrencies +=1;
vicara 0:063b251c6aed 113 } else if(position == 2) {
vicara 0:063b251c6aed 114 horizontal_occurrencies +=1;
vicara 0:063b251c6aed 115 }
vicara 0:063b251c6aed 116 }
vicara 0:063b251c6aed 117 printf("horizontal occ: %d \n",horizontal_occurrencies);
vicara 0:063b251c6aed 118 printf("long vert occ: %d \n",long_vertical_occurrencies);
vicara 0:063b251c6aed 119 printf("short vert occ: %d \n",short_vertical_occurrencies);
vicara 0:063b251c6aed 120 NVStore &nvstore = NVStore::get_instance();
vicara 0:063b251c6aed 121 if (horizontal_occurrencies >= long_vertical_occurrencies && horizontal_occurrencies >= short_vertical_occurrencies) {
vicara 0:063b251c6aed 122 toggle_led(1,0,0);
vicara 0:063b251c6aed 123 value_1+=1;
vicara 0:063b251c6aed 124 nvstore.set(key_1, sizeof(value_1), &value_1);
vicara 0:063b251c6aed 125 } else if (long_vertical_occurrencies >= horizontal_occurrencies && long_vertical_occurrencies >= short_vertical_occurrencies ) {
vicara 0:063b251c6aed 126 toggle_led(0,1,0);
vicara 0:063b251c6aed 127 value_2+=1;
vicara 0:063b251c6aed 128 nvstore.set(key_2, sizeof(value_2), &value_2);
vicara 0:063b251c6aed 129 } else if (short_vertical_occurrencies >= horizontal_occurrencies && short_vertical_occurrencies >= long_vertical_occurrencies) {
vicara 0:063b251c6aed 130 toggle_led(0,0,1);
vicara 0:063b251c6aed 131 value_3+=1;
vicara 0:063b251c6aed 132 nvstore.set(key_3, sizeof(value_3), &value_3);
vicara 0:063b251c6aed 133 }
vicara 1:288cdb94027a 134 printf("Press the restart button to sample again.\n");
vicara 0:063b251c6aed 135
vicara 0:063b251c6aed 136 fflush(stdout);
vicara 0:063b251c6aed 137 int err = fclose(f);
vicara 0:063b251c6aed 138 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 139 if (err < 0) {
vicara 0:063b251c6aed 140 error("error: %s (%d)\n", strerror(err), -err);
vicara 0:063b251c6aed 141 }
vicara 0:063b251c6aed 142 err = fs.unmount();
vicara 0:063b251c6aed 143 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 144 if (err < 0) {
vicara 0:063b251c6aed 145 error("error: %s (%d)\n", strerror(-err), err);
vicara 0:063b251c6aed 146 }
vicara 0:063b251c6aed 147
vicara 0:063b251c6aed 148 }
vicara 0:063b251c6aed 149
vicara 0:063b251c6aed 150 void toggle() {
vicara 0:063b251c6aed 151 int16_t pDataXYZ[3] = {0};
vicara 0:063b251c6aed 152 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
vicara 0:063b251c6aed 153 printf("ACCELERO_X = %d\n", pDataXYZ[0]);
vicara 0:063b251c6aed 154 printf("ACCELERO_Y = %d\n", pDataXYZ[1]);
vicara 0:063b251c6aed 155 printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]);
vicara 0:063b251c6aed 156 }
vicara 0:063b251c6aed 157
vicara 0:063b251c6aed 158
vicara 0:063b251c6aed 159
vicara 0:063b251c6aed 160 void ticker_attach() {
vicara 0:063b251c6aed 161 queue.call(write_positions_on_file);
vicara 0:063b251c6aed 162 seconds_passed++;
vicara 0:063b251c6aed 163 // Blink correct led after 10 seconds
vicara 0:063b251c6aed 164 if (seconds_passed == 1000) {
vicara 0:063b251c6aed 165 timeout_ticker.detach();
vicara 0:063b251c6aed 166 queue.call(toggle_led_based_on_position);
vicara 0:063b251c6aed 167 seconds_passed = 0;
vicara 0:063b251c6aed 168 }
vicara 0:063b251c6aed 169 }
vicara 0:063b251c6aed 170
vicara 0:063b251c6aed 171 int main(){
vicara 0:063b251c6aed 172 t.start(callback(&queue, &EventQueue::dispatch_forever));
vicara 0:063b251c6aed 173 BSP_ACCELERO_Init();
vicara 0:063b251c6aed 174
vicara 0:063b251c6aed 175 NVStore &nvstore = NVStore::get_instance();
vicara 0:063b251c6aed 176
vicara 0:063b251c6aed 177 uint16_t actual_len_bytes = 0;
vicara 0:063b251c6aed 178 int rc;
vicara 0:063b251c6aed 179
vicara 0:063b251c6aed 180 rc = nvstore.init();
vicara 0:063b251c6aed 181 printf("Init NVStore. \n");
vicara 0:063b251c6aed 182
vicara 0:063b251c6aed 183 rc = nvstore.get(key_1, sizeof(value_1), &value_1, actual_len_bytes);
vicara 0:063b251c6aed 184 if (rc == NVSTORE_NOT_FOUND) {
vicara 0:063b251c6aed 185 value_1 = 0;
vicara 0:063b251c6aed 186 value_2 = 0;
vicara 0:063b251c6aed 187 value_3 = 0;
vicara 0:063b251c6aed 188 nvstore.set(key_1, sizeof(value_1), &value_1);
vicara 0:063b251c6aed 189 nvstore.set(key_2, sizeof(value_2), &value_2);
vicara 0:063b251c6aed 190 nvstore.set(key_3, sizeof(value_3), &value_3);
vicara 0:063b251c6aed 191 } else {
vicara 0:063b251c6aed 192 nvstore.get(key_2, sizeof(value_2), &value_2, actual_len_bytes);
vicara 0:063b251c6aed 193 nvstore.get(key_3, sizeof(value_3), &value_3, actual_len_bytes);
vicara 0:063b251c6aed 194 }
vicara 0:063b251c6aed 195
vicara 0:063b251c6aed 196 printf("LED_1: %d\nLED_2: %d\nLED_3: %d\n", value_1, value_2, value_3);
vicara 0:063b251c6aed 197
vicara 0:063b251c6aed 198 // Try to mount the filesystem
vicara 0:063b251c6aed 199 printf("Mounting the filesystem... ");
vicara 0:063b251c6aed 200 fflush(stdout);
vicara 0:063b251c6aed 201 int err = fs.mount(&bd);
vicara 0:063b251c6aed 202 printf("%s\n", (err ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 203 if (err) {
vicara 0:063b251c6aed 204 // Reformat if we can't mount the filesystem
vicara 0:063b251c6aed 205 // this should only happen on the first boot
vicara 0:063b251c6aed 206 printf("No filesystem found, formatting... ");
vicara 0:063b251c6aed 207 fflush(stdout);
vicara 0:063b251c6aed 208 err = fs.reformat(&bd);
vicara 0:063b251c6aed 209 printf("%s\n", (err ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 210 if (err) {
vicara 0:063b251c6aed 211 error("error: %s (%d)\n", strerror(-err), err);
vicara 0:063b251c6aed 212 }
vicara 0:063b251c6aed 213 }
vicara 0:063b251c6aed 214
vicara 0:063b251c6aed 215 // Open the numbers file
vicara 0:063b251c6aed 216 printf("Opening \"/fs/numbers.txt\"... ");
vicara 0:063b251c6aed 217 fflush(stdout);
vicara 0:063b251c6aed 218 f = fopen("/fs/numbers.txt", "r+");
vicara 0:063b251c6aed 219 printf("%s\n", (!f ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 220 if (!f) {
vicara 0:063b251c6aed 221 // Create the numbers file if it doesn't exist
vicara 0:063b251c6aed 222 printf("No file found, creating a new file... ");
vicara 0:063b251c6aed 223 fflush(stdout);
vicara 0:063b251c6aed 224 f = fopen("/fs/numbers.txt", "w+");
vicara 0:063b251c6aed 225 printf("%s\n", (!f ? "Fail :(" : "OK"));
vicara 0:063b251c6aed 226 if (!f) {
vicara 0:063b251c6aed 227 error("error: %s (%d)\n", strerror(errno), -errno);
vicara 0:063b251c6aed 228 }
vicara 0:063b251c6aed 229 }
vicara 0:063b251c6aed 230
vicara 0:063b251c6aed 231 timeout_ticker.attach(&ticker_attach, 0.01);
vicara 0:063b251c6aed 232 }