acceleration file system

Dependencies:   BSP_B-L475E-IOT01

Committer:
iandil
Date:
Thu Dec 06 14:48:01 2018 +0000
Revision:
0:ba1f47c7fdd2
an;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iandil 0:ba1f47c7fdd2 1
iandil 0:ba1f47c7fdd2 2 #include "mbed.h"
iandil 0:ba1f47c7fdd2 3 #include <stdio.h>
iandil 0:ba1f47c7fdd2 4 #include <errno.h>
iandil 0:ba1f47c7fdd2 5 #include "stm32l475e_iot01_accelero.h"
iandil 0:ba1f47c7fdd2 6
iandil 0:ba1f47c7fdd2 7 // Block devices
iandil 0:ba1f47c7fdd2 8 #if COMPONENT_SPIF
iandil 0:ba1f47c7fdd2 9 #include "SPIFBlockDevice.h"
iandil 0:ba1f47c7fdd2 10 #endif
iandil 0:ba1f47c7fdd2 11
iandil 0:ba1f47c7fdd2 12 #if COMPONENT_DATAFLASH
iandil 0:ba1f47c7fdd2 13 #include "DataFlashBlockDevice.h"
iandil 0:ba1f47c7fdd2 14 #endif
iandil 0:ba1f47c7fdd2 15
iandil 0:ba1f47c7fdd2 16 #if COMPONENT_SD
iandil 0:ba1f47c7fdd2 17 #include "SDBlockDevice.h"
iandil 0:ba1f47c7fdd2 18 #endif
iandil 0:ba1f47c7fdd2 19
iandil 0:ba1f47c7fdd2 20 #include "HeapBlockDevice.h"
iandil 0:ba1f47c7fdd2 21 // File systems
iandil 0:ba1f47c7fdd2 22 #include "LittleFileSystem.h"
iandil 0:ba1f47c7fdd2 23 #include "FATFileSystem.h"
iandil 0:ba1f47c7fdd2 24
iandil 0:ba1f47c7fdd2 25 DigitalOut led1(LED1);
iandil 0:ba1f47c7fdd2 26 DigitalOut led2(LED2);
iandil 0:ba1f47c7fdd2 27 DigitalOut led3(LED3);
iandil 0:ba1f47c7fdd2 28 Ticker toggle_led;
iandil 0:ba1f47c7fdd2 29
iandil 0:ba1f47c7fdd2 30 EventQueue queue(32 * EVENTS_EVENT_SIZE);
iandil 0:ba1f47c7fdd2 31 Thread thread;
iandil 0:ba1f47c7fdd2 32 int maximum( int, int, int);
iandil 0:ba1f47c7fdd2 33 //int maximum( int a, int b, int c );
iandil 0:ba1f47c7fdd2 34
iandil 0:ba1f47c7fdd2 35 // Physical block device, can be any device that supports the BlockDevice API
iandil 0:ba1f47c7fdd2 36 /*SPIFBlockDevice bd(
iandil 0:ba1f47c7fdd2 37 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
iandil 0:ba1f47c7fdd2 38 MBED_CONF_SPIF_DRIVER_SPI_MISO,
iandil 0:ba1f47c7fdd2 39 MBED_CONF_SPIF_DRIVER_SPI_CLK,
iandil 0:ba1f47c7fdd2 40 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
iandil 0:ba1f47c7fdd2 41
iandil 0:ba1f47c7fdd2 42 #define BLOCK_SIZE 512
iandil 0:ba1f47c7fdd2 43 HeapBlockDevice bd(16384, BLOCK_SIZE);
iandil 0:ba1f47c7fdd2 44
iandil 0:ba1f47c7fdd2 45 // File system declaration
iandil 0:ba1f47c7fdd2 46 LittleFileSystem fs("fs");
iandil 0:ba1f47c7fdd2 47
iandil 0:ba1f47c7fdd2 48 // Set up the button to trigger an erase
iandil 0:ba1f47c7fdd2 49 InterruptIn irq(BUTTON1);
iandil 0:ba1f47c7fdd2 50 void erase() {
iandil 0:ba1f47c7fdd2 51 printf("Initializing the block device... ");
iandil 0:ba1f47c7fdd2 52 fflush(stdout);
iandil 0:ba1f47c7fdd2 53 int err = bd.init();
iandil 0:ba1f47c7fdd2 54 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 55 if (err) {
iandil 0:ba1f47c7fdd2 56 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 57 }
iandil 0:ba1f47c7fdd2 58
iandil 0:ba1f47c7fdd2 59 printf("Erasing the block device... ");
iandil 0:ba1f47c7fdd2 60 fflush(stdout);
iandil 0:ba1f47c7fdd2 61 err = bd.erase(0, bd.size());
iandil 0:ba1f47c7fdd2 62 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 63 if (err) {
iandil 0:ba1f47c7fdd2 64 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 65 }
iandil 0:ba1f47c7fdd2 66
iandil 0:ba1f47c7fdd2 67 printf("Deinitializing the block device... ");
iandil 0:ba1f47c7fdd2 68 fflush(stdout);
iandil 0:ba1f47c7fdd2 69 err = bd.deinit();
iandil 0:ba1f47c7fdd2 70 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 71 if (err) {
iandil 0:ba1f47c7fdd2 72 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 73 }
iandil 0:ba1f47c7fdd2 74 }
iandil 0:ba1f47c7fdd2 75
iandil 0:ba1f47c7fdd2 76 static FILE *file;
iandil 0:ba1f47c7fdd2 77 volatile int counter = 0;
iandil 0:ba1f47c7fdd2 78
iandil 0:ba1f47c7fdd2 79 int maximum( int a, int b, int c ) {
iandil 0:ba1f47c7fdd2 80 int max = ( a < b ) ? b : a;
iandil 0:ba1f47c7fdd2 81 return ( ( max < c ) ? c : max );
iandil 0:ba1f47c7fdd2 82 }
iandil 0:ba1f47c7fdd2 83
iandil 0:ba1f47c7fdd2 84 void readSensors() {
iandil 0:ba1f47c7fdd2 85 int16_t pDataXYZ[3] = {0};
iandil 0:ba1f47c7fdd2 86 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
iandil 0:ba1f47c7fdd2 87 if(pDataXYZ[2] > 900 || pDataXYZ[2] < -900) { //Horizontal State
iandil 0:ba1f47c7fdd2 88 fprintf(file, "%d\n", 1);
iandil 0:ba1f47c7fdd2 89 } else if(pDataXYZ[1] > 900 || pDataXYZ[1] < -900) { //Long Edge State
iandil 0:ba1f47c7fdd2 90 fprintf(file, "%d\n", 2);
iandil 0:ba1f47c7fdd2 91 } else if(pDataXYZ[0] > 900 || pDataXYZ[0] < -900) { // Short Edge State
iandil 0:ba1f47c7fdd2 92 fprintf(file, "%d\n", 3);
iandil 0:ba1f47c7fdd2 93 } else { // all other positions
iandil 0:ba1f47c7fdd2 94 fprintf(file, "%d\n", 4);
iandil 0:ba1f47c7fdd2 95 }
iandil 0:ba1f47c7fdd2 96 fflush(file);
iandil 0:ba1f47c7fdd2 97 fflush(stdout);
iandil 0:ba1f47c7fdd2 98 }
iandil 0:ba1f47c7fdd2 99
iandil 0:ba1f47c7fdd2 100 void readFile() {
iandil 0:ba1f47c7fdd2 101
iandil 0:ba1f47c7fdd2 102 int countLed1 = 0;
iandil 0:ba1f47c7fdd2 103 int countLed2 = 0;
iandil 0:ba1f47c7fdd2 104 int countLed3 = 0;
iandil 0:ba1f47c7fdd2 105
iandil 0:ba1f47c7fdd2 106 fflush(stdout);
iandil 0:ba1f47c7fdd2 107 fflush(file);
iandil 0:ba1f47c7fdd2 108
iandil 0:ba1f47c7fdd2 109 fseek(file, 0, SEEK_SET);
iandil 0:ba1f47c7fdd2 110 int ledNumber;
iandil 0:ba1f47c7fdd2 111 while(!feof(file)) {
iandil 0:ba1f47c7fdd2 112 fscanf(file, "%d", &ledNumber);
iandil 0:ba1f47c7fdd2 113 if(ledNumber == 1){
iandil 0:ba1f47c7fdd2 114 countLed1 += 1;
iandil 0:ba1f47c7fdd2 115 } else if(ledNumber == 2){
iandil 0:ba1f47c7fdd2 116 countLed2 += 1;
iandil 0:ba1f47c7fdd2 117 } else if(ledNumber == 3){
iandil 0:ba1f47c7fdd2 118 countLed3 += 1;
iandil 0:ba1f47c7fdd2 119 }
iandil 0:ba1f47c7fdd2 120 }
iandil 0:ba1f47c7fdd2 121 int maxLed = maximum(countLed1, countLed2, countLed3);
iandil 0:ba1f47c7fdd2 122 printf("MAX LED = %d\n", maxLed);
iandil 0:ba1f47c7fdd2 123 if(maxLed == countLed1) {
iandil 0:ba1f47c7fdd2 124 led1 = 1;
iandil 0:ba1f47c7fdd2 125 led2 = 0;
iandil 0:ba1f47c7fdd2 126 led3 = 0;
iandil 0:ba1f47c7fdd2 127 } else if (maxLed == countLed2) {
iandil 0:ba1f47c7fdd2 128 led1 = 0;
iandil 0:ba1f47c7fdd2 129 led2 = 1;
iandil 0:ba1f47c7fdd2 130 led3 = 0;
iandil 0:ba1f47c7fdd2 131 } else if (maxLed == countLed3) {
iandil 0:ba1f47c7fdd2 132 led1 = 0;
iandil 0:ba1f47c7fdd2 133 led2 = 0;
iandil 0:ba1f47c7fdd2 134 led3 = 1;
iandil 0:ba1f47c7fdd2 135 }
iandil 0:ba1f47c7fdd2 136
iandil 0:ba1f47c7fdd2 137 fflush(stdout);
iandil 0:ba1f47c7fdd2 138 int err = fclose(file);
iandil 0:ba1f47c7fdd2 139 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 140 if (err < 0) {
iandil 0:ba1f47c7fdd2 141 error("error: %s (%d)\n", strerror(err), -err);
iandil 0:ba1f47c7fdd2 142 }
iandil 0:ba1f47c7fdd2 143 err = fs.unmount();
iandil 0:ba1f47c7fdd2 144 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 145 if (err < 0) {
iandil 0:ba1f47c7fdd2 146 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 147 }
iandil 0:ba1f47c7fdd2 148
iandil 0:ba1f47c7fdd2 149 printf("Mbed OS filesystem example done!\n");
iandil 0:ba1f47c7fdd2 150 }
iandil 0:ba1f47c7fdd2 151
iandil 0:ba1f47c7fdd2 152 void turnOnLed() {
iandil 0:ba1f47c7fdd2 153 queue.call(readSensors);
iandil 0:ba1f47c7fdd2 154 counter += 1;
iandil 0:ba1f47c7fdd2 155 if(counter == 1000) {
iandil 0:ba1f47c7fdd2 156 toggle_led.detach();
iandil 0:ba1f47c7fdd2 157 queue.call(readFile);
iandil 0:ba1f47c7fdd2 158 }
iandil 0:ba1f47c7fdd2 159 }
iandil 0:ba1f47c7fdd2 160
iandil 0:ba1f47c7fdd2 161
iandil 0:ba1f47c7fdd2 162 // Entry point for the example
iandil 0:ba1f47c7fdd2 163 int main() {
iandil 0:ba1f47c7fdd2 164 thread.start(callback(&queue, &EventQueue::dispatch_forever));
iandil 0:ba1f47c7fdd2 165 BSP_ACCELERO_Init();
iandil 0:ba1f47c7fdd2 166 printf("--- Mbed OS filesystem example ---\n");
iandil 0:ba1f47c7fdd2 167
iandil 0:ba1f47c7fdd2 168 // Setup the erase event on button press, use the event queue
iandil 0:ba1f47c7fdd2 169 // to avoid running in interrupt context
iandil 0:ba1f47c7fdd2 170 irq.fall(mbed_event_queue()->event(erase));
iandil 0:ba1f47c7fdd2 171
iandil 0:ba1f47c7fdd2 172 // Try to mount the filesystem
iandil 0:ba1f47c7fdd2 173 printf("Mounting the filesystem... ");
iandil 0:ba1f47c7fdd2 174 fflush(stdout);
iandil 0:ba1f47c7fdd2 175 int err = fs.mount(&bd);
iandil 0:ba1f47c7fdd2 176 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 177 if (err) {
iandil 0:ba1f47c7fdd2 178 // Reformat if we can't mount the filesystem
iandil 0:ba1f47c7fdd2 179 // this should only happen on the first boot
iandil 0:ba1f47c7fdd2 180 printf("No filesystem found, formatting... ");
iandil 0:ba1f47c7fdd2 181 fflush(stdout);
iandil 0:ba1f47c7fdd2 182 err = fs.reformat(&bd);
iandil 0:ba1f47c7fdd2 183 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 184 if (err) {
iandil 0:ba1f47c7fdd2 185 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 186 }
iandil 0:ba1f47c7fdd2 187 }
iandil 0:ba1f47c7fdd2 188
iandil 0:ba1f47c7fdd2 189 // Open the numbers file
iandil 0:ba1f47c7fdd2 190 printf("Opening \"/fs/numbers.txt\"... ");
iandil 0:ba1f47c7fdd2 191 fflush(stdout);
iandil 0:ba1f47c7fdd2 192 file = fopen("/fs/numbers.txt", "r+");
iandil 0:ba1f47c7fdd2 193 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 194 if (!file) {
iandil 0:ba1f47c7fdd2 195 // Create the numbers file if it doesn't exist
iandil 0:ba1f47c7fdd2 196 printf("No file found, creating a new file... ");
iandil 0:ba1f47c7fdd2 197 fflush(stdout);
iandil 0:ba1f47c7fdd2 198 file = fopen("/fs/numbers.txt", "w+");
iandil 0:ba1f47c7fdd2 199 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 200 if (!file) {
iandil 0:ba1f47c7fdd2 201 error("error: %s (%d)\n", strerror(errno), -errno);
iandil 0:ba1f47c7fdd2 202 }
iandil 0:ba1f47c7fdd2 203 }
iandil 0:ba1f47c7fdd2 204
iandil 0:ba1f47c7fdd2 205 toggle_led.attach(&turnOnLed, 0.01);
iandil 0:ba1f47c7fdd2 206
iandil 0:ba1f47c7fdd2 207
iandil 0:ba1f47c7fdd2 208 }