Samples acceleration at 100 Hz for 10 seconds. At the end of the 10 seconds, turns on: - LED1 if the board stayed horizontal for most time - LED2 if the board stayed on the long edge for most time - LED3 if the board stayed on the short edge for most time
Dependencies: BSP_B-L475E-IOT01
main.cpp@0:2ce95bf1286f, 2018-12-06 (annotated)
- Committer:
- vicara
- Date:
- Thu Dec 06 14:55:07 2018 +0000
- Revision:
- 0:2ce95bf1286f
- Child:
- 1:164c6bd28b13
Acceleration File;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vicara | 0:2ce95bf1286f | 1 | #include "mbed.h" |
vicara | 0:2ce95bf1286f | 2 | |
vicara | 0:2ce95bf1286f | 3 | #include "stm32l475e_iot01_accelero.h" |
vicara | 0:2ce95bf1286f | 4 | |
vicara | 0:2ce95bf1286f | 5 | #include <stdio.h> |
vicara | 0:2ce95bf1286f | 6 | #include <errno.h> |
vicara | 0:2ce95bf1286f | 7 | |
vicara | 0:2ce95bf1286f | 8 | // Block devices |
vicara | 0:2ce95bf1286f | 9 | #if COMPONENT_SPIF |
vicara | 0:2ce95bf1286f | 10 | #include "SPIFBlockDevice.h" |
vicara | 0:2ce95bf1286f | 11 | #endif |
vicara | 0:2ce95bf1286f | 12 | |
vicara | 0:2ce95bf1286f | 13 | #if COMPONENT_DATAFLASH |
vicara | 0:2ce95bf1286f | 14 | #include "DataFlashBlockDevice.h" |
vicara | 0:2ce95bf1286f | 15 | #endif |
vicara | 0:2ce95bf1286f | 16 | |
vicara | 0:2ce95bf1286f | 17 | #if COMPONENT_SD |
vicara | 0:2ce95bf1286f | 18 | #include "SDBlockDevice.h" |
vicara | 0:2ce95bf1286f | 19 | #endif |
vicara | 0:2ce95bf1286f | 20 | |
vicara | 0:2ce95bf1286f | 21 | #include "HeapBlockDevice.h" |
vicara | 0:2ce95bf1286f | 22 | |
vicara | 0:2ce95bf1286f | 23 | // File systems |
vicara | 0:2ce95bf1286f | 24 | #include "LittleFileSystem.h" |
vicara | 0:2ce95bf1286f | 25 | #include "FATFileSystem.h" |
vicara | 0:2ce95bf1286f | 26 | |
vicara | 0:2ce95bf1286f | 27 | // Physical block device, can be any device that supports the BlockDevice API |
vicara | 0:2ce95bf1286f | 28 | /*SPIFBlockDevice bd( |
vicara | 0:2ce95bf1286f | 29 | MBED_CONF_SPIF_DRIVER_SPI_MOSI, |
vicara | 0:2ce95bf1286f | 30 | MBED_CONF_SPIF_DRIVER_SPI_MISO, |
vicara | 0:2ce95bf1286f | 31 | MBED_CONF_SPIF_DRIVER_SPI_CLK, |
vicara | 0:2ce95bf1286f | 32 | MBED_CONF_SPIF_DRIVER_SPI_CS);*/ |
vicara | 0:2ce95bf1286f | 33 | |
vicara | 0:2ce95bf1286f | 34 | #define BLOCK_SIZE 512 |
vicara | 0:2ce95bf1286f | 35 | HeapBlockDevice bd(16384, BLOCK_SIZE); |
vicara | 0:2ce95bf1286f | 36 | |
vicara | 0:2ce95bf1286f | 37 | // File system declaration |
vicara | 0:2ce95bf1286f | 38 | LittleFileSystem fs("fs"); |
vicara | 0:2ce95bf1286f | 39 | |
vicara | 0:2ce95bf1286f | 40 | DigitalOut led1(LED1); |
vicara | 0:2ce95bf1286f | 41 | DigitalOut led2(LED2); |
vicara | 0:2ce95bf1286f | 42 | DigitalOut led3(LED3); |
vicara | 0:2ce95bf1286f | 43 | |
vicara | 0:2ce95bf1286f | 44 | Ticker timeout_ticker; |
vicara | 0:2ce95bf1286f | 45 | Thread t; |
vicara | 0:2ce95bf1286f | 46 | |
vicara | 0:2ce95bf1286f | 47 | static FILE *f; |
vicara | 0:2ce95bf1286f | 48 | volatile int seconds_passed = 0; |
vicara | 0:2ce95bf1286f | 49 | EventQueue queue(32 * EVENTS_EVENT_SIZE); |
vicara | 0:2ce95bf1286f | 50 | |
vicara | 0:2ce95bf1286f | 51 | InterruptIn button(USER_BUTTON); |
vicara | 0:2ce95bf1286f | 52 | int16_t pDataXYZ[3] = {0}; |
vicara | 0:2ce95bf1286f | 53 | |
vicara | 0:2ce95bf1286f | 54 | void toggle_led(int led1_status, int led2_status, int led3_status){ |
vicara | 0:2ce95bf1286f | 55 | led1 = led1_status; |
vicara | 0:2ce95bf1286f | 56 | led2 = led2_status; |
vicara | 0:2ce95bf1286f | 57 | led3 = led3_status; |
vicara | 0:2ce95bf1286f | 58 | } |
vicara | 0:2ce95bf1286f | 59 | |
vicara | 0:2ce95bf1286f | 60 | void write_positions_on_file() { |
vicara | 0:2ce95bf1286f | 61 | int16_t pDataXYZ[3] = {0}; |
vicara | 0:2ce95bf1286f | 62 | BSP_ACCELERO_AccGetXYZ(pDataXYZ); |
vicara | 0:2ce95bf1286f | 63 | if ((pDataXYZ[0] < -950 && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950)) { |
vicara | 0:2ce95bf1286f | 64 | fprintf(f, "%d\n", 0); |
vicara | 0:2ce95bf1286f | 65 | } else if ((pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030)) { |
vicara | 0:2ce95bf1286f | 66 | fprintf(f, "%d\n", 1); |
vicara | 0:2ce95bf1286f | 67 | } else if ((pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030)) { |
vicara | 0:2ce95bf1286f | 68 | fprintf(f, "%d\n", 2); |
vicara | 0:2ce95bf1286f | 69 | } else { |
vicara | 0:2ce95bf1286f | 70 | fprintf(f, "%d\n", -1); |
vicara | 0:2ce95bf1286f | 71 | } |
vicara | 0:2ce95bf1286f | 72 | fflush(f); |
vicara | 0:2ce95bf1286f | 73 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 74 | } |
vicara | 0:2ce95bf1286f | 75 | |
vicara | 0:2ce95bf1286f | 76 | void toggle_led_based_on_position() { |
vicara | 0:2ce95bf1286f | 77 | int horizontal_occurrencies = 0; |
vicara | 0:2ce95bf1286f | 78 | int long_vertical_occurrencies = 0; |
vicara | 0:2ce95bf1286f | 79 | int short_vertical_occurrencies = 0; |
vicara | 0:2ce95bf1286f | 80 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 81 | fflush(f); |
vicara | 0:2ce95bf1286f | 82 | |
vicara | 0:2ce95bf1286f | 83 | fseek(f, 0, SEEK_SET); |
vicara | 0:2ce95bf1286f | 84 | int position; |
vicara | 0:2ce95bf1286f | 85 | while (!feof(f)) { |
vicara | 0:2ce95bf1286f | 86 | fscanf(f, "%d", &position); |
vicara | 0:2ce95bf1286f | 87 | if (position == 0) { |
vicara | 0:2ce95bf1286f | 88 | short_vertical_occurrencies +=1; |
vicara | 0:2ce95bf1286f | 89 | } else if(position == 1) { |
vicara | 0:2ce95bf1286f | 90 | long_vertical_occurrencies +=1; |
vicara | 0:2ce95bf1286f | 91 | } else if(position == 2) { |
vicara | 0:2ce95bf1286f | 92 | horizontal_occurrencies +=1; |
vicara | 0:2ce95bf1286f | 93 | } |
vicara | 0:2ce95bf1286f | 94 | } |
vicara | 0:2ce95bf1286f | 95 | printf("horizontal occ: %d \n",horizontal_occurrencies); |
vicara | 0:2ce95bf1286f | 96 | printf("long vert occ: %d \n",long_vertical_occurrencies); |
vicara | 0:2ce95bf1286f | 97 | printf("short vert occ: %d \n",short_vertical_occurrencies); |
vicara | 0:2ce95bf1286f | 98 | if (horizontal_occurrencies >= long_vertical_occurrencies && horizontal_occurrencies >= short_vertical_occurrencies) { |
vicara | 0:2ce95bf1286f | 99 | toggle_led(1,0,0); |
vicara | 0:2ce95bf1286f | 100 | } else if (long_vertical_occurrencies >= horizontal_occurrencies && long_vertical_occurrencies >= short_vertical_occurrencies ) { |
vicara | 0:2ce95bf1286f | 101 | toggle_led(0,1,0); |
vicara | 0:2ce95bf1286f | 102 | } else if (short_vertical_occurrencies >= horizontal_occurrencies && short_vertical_occurrencies >= long_vertical_occurrencies) { |
vicara | 0:2ce95bf1286f | 103 | toggle_led(0,0,1); |
vicara | 0:2ce95bf1286f | 104 | } |
vicara | 0:2ce95bf1286f | 105 | |
vicara | 0:2ce95bf1286f | 106 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 107 | int err = fclose(f); |
vicara | 0:2ce95bf1286f | 108 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 109 | if (err < 0) { |
vicara | 0:2ce95bf1286f | 110 | error("error: %s (%d)\n", strerror(err), -err); |
vicara | 0:2ce95bf1286f | 111 | } |
vicara | 0:2ce95bf1286f | 112 | err = fs.unmount(); |
vicara | 0:2ce95bf1286f | 113 | printf("%s\n", (err < 0 ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 114 | if (err < 0) { |
vicara | 0:2ce95bf1286f | 115 | error("error: %s (%d)\n", strerror(-err), err); |
vicara | 0:2ce95bf1286f | 116 | } |
vicara | 0:2ce95bf1286f | 117 | printf("Press the restart button to sample again."); |
vicara | 0:2ce95bf1286f | 118 | } |
vicara | 0:2ce95bf1286f | 119 | |
vicara | 0:2ce95bf1286f | 120 | void toggle() { |
vicara | 0:2ce95bf1286f | 121 | int16_t pDataXYZ[3] = {0}; |
vicara | 0:2ce95bf1286f | 122 | BSP_ACCELERO_AccGetXYZ(pDataXYZ); |
vicara | 0:2ce95bf1286f | 123 | printf("ACCELERO_X = %d\n", pDataXYZ[0]); |
vicara | 0:2ce95bf1286f | 124 | printf("ACCELERO_Y = %d\n", pDataXYZ[1]); |
vicara | 0:2ce95bf1286f | 125 | printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]); |
vicara | 0:2ce95bf1286f | 126 | } |
vicara | 0:2ce95bf1286f | 127 | |
vicara | 0:2ce95bf1286f | 128 | bool is_board_horizontal() { |
vicara | 0:2ce95bf1286f | 129 | return (pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030); |
vicara | 0:2ce95bf1286f | 130 | } |
vicara | 0:2ce95bf1286f | 131 | |
vicara | 0:2ce95bf1286f | 132 | bool is_board_vertical_short() { |
vicara | 0:2ce95bf1286f | 133 | return (pDataXYZ[0] < -950 && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950); |
vicara | 0:2ce95bf1286f | 134 | } |
vicara | 0:2ce95bf1286f | 135 | |
vicara | 0:2ce95bf1286f | 136 | bool is_board_vertical_long() { |
vicara | 0:2ce95bf1286f | 137 | return (pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030); |
vicara | 0:2ce95bf1286f | 138 | } |
vicara | 0:2ce95bf1286f | 139 | |
vicara | 0:2ce95bf1286f | 140 | void ticker_attach() { |
vicara | 0:2ce95bf1286f | 141 | queue.call(write_positions_on_file); |
vicara | 0:2ce95bf1286f | 142 | seconds_passed++; |
vicara | 0:2ce95bf1286f | 143 | // Blink correct led after 10 seconds |
vicara | 0:2ce95bf1286f | 144 | if (seconds_passed == 1000) { |
vicara | 0:2ce95bf1286f | 145 | timeout_ticker.detach(); |
vicara | 0:2ce95bf1286f | 146 | queue.call(toggle_led_based_on_position); |
vicara | 0:2ce95bf1286f | 147 | seconds_passed = 0; |
vicara | 0:2ce95bf1286f | 148 | } |
vicara | 0:2ce95bf1286f | 149 | } |
vicara | 0:2ce95bf1286f | 150 | |
vicara | 0:2ce95bf1286f | 151 | int main(){ |
vicara | 0:2ce95bf1286f | 152 | t.start(callback(&queue, &EventQueue::dispatch_forever)); |
vicara | 0:2ce95bf1286f | 153 | BSP_ACCELERO_Init(); |
vicara | 0:2ce95bf1286f | 154 | |
vicara | 0:2ce95bf1286f | 155 | // Try to mount the filesystem |
vicara | 0:2ce95bf1286f | 156 | printf("Mounting the filesystem... "); |
vicara | 0:2ce95bf1286f | 157 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 158 | int err = fs.mount(&bd); |
vicara | 0:2ce95bf1286f | 159 | printf("%s\n", (err ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 160 | if (err) { |
vicara | 0:2ce95bf1286f | 161 | // Reformat if we can't mount the filesystem |
vicara | 0:2ce95bf1286f | 162 | // this should only happen on the first boot |
vicara | 0:2ce95bf1286f | 163 | printf("No filesystem found, formatting... "); |
vicara | 0:2ce95bf1286f | 164 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 165 | err = fs.reformat(&bd); |
vicara | 0:2ce95bf1286f | 166 | printf("%s\n", (err ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 167 | if (err) { |
vicara | 0:2ce95bf1286f | 168 | error("error: %s (%d)\n", strerror(-err), err); |
vicara | 0:2ce95bf1286f | 169 | } |
vicara | 0:2ce95bf1286f | 170 | } |
vicara | 0:2ce95bf1286f | 171 | |
vicara | 0:2ce95bf1286f | 172 | // Open the numbers file |
vicara | 0:2ce95bf1286f | 173 | printf("Opening \"/fs/numbers.txt\"... "); |
vicara | 0:2ce95bf1286f | 174 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 175 | f = fopen("/fs/numbers.txt", "r+"); |
vicara | 0:2ce95bf1286f | 176 | printf("%s\n", (!f ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 177 | if (!f) { |
vicara | 0:2ce95bf1286f | 178 | // Create the numbers file if it doesn't exist |
vicara | 0:2ce95bf1286f | 179 | printf("No file found, creating a new file... "); |
vicara | 0:2ce95bf1286f | 180 | fflush(stdout); |
vicara | 0:2ce95bf1286f | 181 | f = fopen("/fs/numbers.txt", "w+"); |
vicara | 0:2ce95bf1286f | 182 | printf("%s\n", (!f ? "Fail :(" : "OK")); |
vicara | 0:2ce95bf1286f | 183 | if (!f) { |
vicara | 0:2ce95bf1286f | 184 | error("error: %s (%d)\n", strerror(errno), -errno); |
vicara | 0:2ce95bf1286f | 185 | } |
vicara | 0:2ce95bf1286f | 186 | } |
vicara | 0:2ce95bf1286f | 187 | |
vicara | 0:2ce95bf1286f | 188 | timeout_ticker.attach(&ticker_attach, 0.01); |
vicara | 0:2ce95bf1286f | 189 | } |