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
main.cpp@2:4cfbd0da7242, 2018-12-06 (annotated)
- Committer:
- vicara
- Date:
- Thu Dec 06 16:38:26 2018 +0000
- Revision:
- 2:4cfbd0da7242
- Parent:
- 1:288cdb94027a
fixed
Who changed what in which revision?
User | Revision | Line number | New 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 | } |