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