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 14:55:07 2018 +0000
Revision:
0:2ce95bf1286f
Child:
1:164c6bd28b13
Acceleration File;

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 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 }