AccelerationFileNV
Dependencies: BSP_B-L475E-IOT01
main.cpp@0:6f54a96333fd, 2018-12-06 (annotated)
- Committer:
- redona
- Date:
- Thu Dec 06 22:02:53 2018 +0000
- Revision:
- 0:6f54a96333fd
AccelerationFileNV
Who changed what in which revision?
User | Revision | Line number | New 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 | } |