AccelerationFile

Dependencies:   BSP_B-L475E-IOT01

Committer:
redona
Date:
Thu Dec 06 22:01:33 2018 +0000
Revision:
0:33b15e3113c3
AccelerationFile

Who changed what in which revision?

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