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

Committer:
vicara
Date:
Thu Dec 06 16:36:32 2018 +0000
Revision:
2:52e9bb32964b
Parent:
1:164c6bd28b13
fixed

Who changed what in which revision?

UserRevisionLine numberNew 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 2:52e9bb32964b 60 bool is_board_horizontal(int16_t pDataXYZ[3]) {
vicara 1:164c6bd28b13 61 return (pDataXYZ[2] < 1030 && pDataXYZ[2] > 950) || (pDataXYZ[2] < -950 && pDataXYZ[2] > -1030);
vicara 1:164c6bd28b13 62 }
vicara 1:164c6bd28b13 63
vicara 2:52e9bb32964b 64 bool is_board_vertical_short(int16_t pDataXYZ[3]) {
vicara 1:164c6bd28b13 65 return (pDataXYZ[0] < -950 && pDataXYZ[0] > -1030) || (pDataXYZ[0] < 1030 && pDataXYZ[0] > 950);
vicara 1:164c6bd28b13 66 }
vicara 1:164c6bd28b13 67
vicara 2:52e9bb32964b 68 bool is_board_vertical_long(int16_t pDataXYZ[3]) {
vicara 1:164c6bd28b13 69 return (pDataXYZ[1] < 1030 && pDataXYZ[1] > 950) || (pDataXYZ[1] < -950 && pDataXYZ[1] > -1030);
vicara 1:164c6bd28b13 70 }
vicara 1:164c6bd28b13 71
vicara 0:2ce95bf1286f 72 void write_positions_on_file() {
vicara 0:2ce95bf1286f 73 int16_t pDataXYZ[3] = {0};
vicara 0:2ce95bf1286f 74 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
vicara 2:52e9bb32964b 75 if (is_board_vertical_short(pDataXYZ)) {
vicara 0:2ce95bf1286f 76 fprintf(f, "%d\n", 0);
vicara 2:52e9bb32964b 77 } else if (is_board_vertical_long(pDataXYZ)) {
vicara 0:2ce95bf1286f 78 fprintf(f, "%d\n", 1);
vicara 2:52e9bb32964b 79 } else if (is_board_horizontal(pDataXYZ)) {
vicara 0:2ce95bf1286f 80 fprintf(f, "%d\n", 2);
vicara 0:2ce95bf1286f 81 } else {
vicara 0:2ce95bf1286f 82 fprintf(f, "%d\n", -1);
vicara 0:2ce95bf1286f 83 }
vicara 0:2ce95bf1286f 84 fflush(f);
vicara 0:2ce95bf1286f 85 fflush(stdout);
vicara 0:2ce95bf1286f 86 }
vicara 0:2ce95bf1286f 87
vicara 0:2ce95bf1286f 88 void toggle_led_based_on_position() {
vicara 0:2ce95bf1286f 89 int horizontal_occurrencies = 0;
vicara 0:2ce95bf1286f 90 int long_vertical_occurrencies = 0;
vicara 0:2ce95bf1286f 91 int short_vertical_occurrencies = 0;
vicara 0:2ce95bf1286f 92 fflush(stdout);
vicara 0:2ce95bf1286f 93 fflush(f);
vicara 0:2ce95bf1286f 94
vicara 0:2ce95bf1286f 95 fseek(f, 0, SEEK_SET);
vicara 0:2ce95bf1286f 96 int position;
vicara 0:2ce95bf1286f 97 while (!feof(f)) {
vicara 0:2ce95bf1286f 98 fscanf(f, "%d", &position);
vicara 0:2ce95bf1286f 99 if (position == 0) {
vicara 0:2ce95bf1286f 100 short_vertical_occurrencies +=1;
vicara 0:2ce95bf1286f 101 } else if(position == 1) {
vicara 0:2ce95bf1286f 102 long_vertical_occurrencies +=1;
vicara 0:2ce95bf1286f 103 } else if(position == 2) {
vicara 0:2ce95bf1286f 104 horizontal_occurrencies +=1;
vicara 0:2ce95bf1286f 105 }
vicara 0:2ce95bf1286f 106 }
vicara 0:2ce95bf1286f 107 printf("horizontal occ: %d \n",horizontal_occurrencies);
vicara 0:2ce95bf1286f 108 printf("long vert occ: %d \n",long_vertical_occurrencies);
vicara 0:2ce95bf1286f 109 printf("short vert occ: %d \n",short_vertical_occurrencies);
vicara 0:2ce95bf1286f 110 if (horizontal_occurrencies >= long_vertical_occurrencies && horizontal_occurrencies >= short_vertical_occurrencies) {
vicara 0:2ce95bf1286f 111 toggle_led(1,0,0);
vicara 0:2ce95bf1286f 112 } else if (long_vertical_occurrencies >= horizontal_occurrencies && long_vertical_occurrencies >= short_vertical_occurrencies ) {
vicara 0:2ce95bf1286f 113 toggle_led(0,1,0);
vicara 0:2ce95bf1286f 114 } else if (short_vertical_occurrencies >= horizontal_occurrencies && short_vertical_occurrencies >= long_vertical_occurrencies) {
vicara 0:2ce95bf1286f 115 toggle_led(0,0,1);
vicara 0:2ce95bf1286f 116 }
vicara 0:2ce95bf1286f 117
vicara 2:52e9bb32964b 118 printf("Press the restart button to sample again.\n");
vicara 0:2ce95bf1286f 119 fflush(stdout);
vicara 0:2ce95bf1286f 120 int err = fclose(f);
vicara 0:2ce95bf1286f 121 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 122 if (err < 0) {
vicara 0:2ce95bf1286f 123 error("error: %s (%d)\n", strerror(err), -err);
vicara 0:2ce95bf1286f 124 }
vicara 0:2ce95bf1286f 125 err = fs.unmount();
vicara 0:2ce95bf1286f 126 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 127 if (err < 0) {
vicara 0:2ce95bf1286f 128 error("error: %s (%d)\n", strerror(-err), err);
vicara 0:2ce95bf1286f 129 }
vicara 1:164c6bd28b13 130
vicara 0:2ce95bf1286f 131 }
vicara 0:2ce95bf1286f 132
vicara 0:2ce95bf1286f 133 void toggle() {
vicara 0:2ce95bf1286f 134 int16_t pDataXYZ[3] = {0};
vicara 0:2ce95bf1286f 135 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
vicara 0:2ce95bf1286f 136 printf("ACCELERO_X = %d\n", pDataXYZ[0]);
vicara 0:2ce95bf1286f 137 printf("ACCELERO_Y = %d\n", pDataXYZ[1]);
vicara 0:2ce95bf1286f 138 printf("ACCELERO_Z = %d\n\n", pDataXYZ[2]);
vicara 0:2ce95bf1286f 139 }
vicara 0:2ce95bf1286f 140
vicara 0:2ce95bf1286f 141 void ticker_attach() {
vicara 0:2ce95bf1286f 142 queue.call(write_positions_on_file);
vicara 0:2ce95bf1286f 143 seconds_passed++;
vicara 0:2ce95bf1286f 144 // Blink correct led after 10 seconds
vicara 0:2ce95bf1286f 145 if (seconds_passed == 1000) {
vicara 0:2ce95bf1286f 146 timeout_ticker.detach();
vicara 0:2ce95bf1286f 147 queue.call(toggle_led_based_on_position);
vicara 0:2ce95bf1286f 148 seconds_passed = 0;
vicara 0:2ce95bf1286f 149 }
vicara 0:2ce95bf1286f 150 }
vicara 0:2ce95bf1286f 151
vicara 0:2ce95bf1286f 152 int main(){
vicara 0:2ce95bf1286f 153 t.start(callback(&queue, &EventQueue::dispatch_forever));
vicara 0:2ce95bf1286f 154 BSP_ACCELERO_Init();
vicara 0:2ce95bf1286f 155
vicara 0:2ce95bf1286f 156 // Try to mount the filesystem
vicara 0:2ce95bf1286f 157 printf("Mounting the filesystem... ");
vicara 0:2ce95bf1286f 158 fflush(stdout);
vicara 0:2ce95bf1286f 159 int err = fs.mount(&bd);
vicara 0:2ce95bf1286f 160 printf("%s\n", (err ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 161 if (err) {
vicara 0:2ce95bf1286f 162 // Reformat if we can't mount the filesystem
vicara 0:2ce95bf1286f 163 // this should only happen on the first boot
vicara 0:2ce95bf1286f 164 printf("No filesystem found, formatting... ");
vicara 0:2ce95bf1286f 165 fflush(stdout);
vicara 0:2ce95bf1286f 166 err = fs.reformat(&bd);
vicara 0:2ce95bf1286f 167 printf("%s\n", (err ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 168 if (err) {
vicara 0:2ce95bf1286f 169 error("error: %s (%d)\n", strerror(-err), err);
vicara 0:2ce95bf1286f 170 }
vicara 0:2ce95bf1286f 171 }
vicara 0:2ce95bf1286f 172
vicara 0:2ce95bf1286f 173 // Open the numbers file
vicara 0:2ce95bf1286f 174 printf("Opening \"/fs/numbers.txt\"... ");
vicara 0:2ce95bf1286f 175 fflush(stdout);
vicara 0:2ce95bf1286f 176 f = fopen("/fs/numbers.txt", "r+");
vicara 0:2ce95bf1286f 177 printf("%s\n", (!f ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 178 if (!f) {
vicara 0:2ce95bf1286f 179 // Create the numbers file if it doesn't exist
vicara 0:2ce95bf1286f 180 printf("No file found, creating a new file... ");
vicara 0:2ce95bf1286f 181 fflush(stdout);
vicara 0:2ce95bf1286f 182 f = fopen("/fs/numbers.txt", "w+");
vicara 0:2ce95bf1286f 183 printf("%s\n", (!f ? "Fail :(" : "OK"));
vicara 0:2ce95bf1286f 184 if (!f) {
vicara 0:2ce95bf1286f 185 error("error: %s (%d)\n", strerror(errno), -errno);
vicara 0:2ce95bf1286f 186 }
vicara 0:2ce95bf1286f 187 }
vicara 0:2ce95bf1286f 188
vicara 0:2ce95bf1286f 189 timeout_ticker.attach(&ticker_attach, 0.01);
vicara 0:2ce95bf1286f 190 }