c

Dependencies:   BSP_B-L475E-IOT01

Committer:
lucaspennati
Date:
Fri Dec 07 12:01:49 2018 +0000
Revision:
1:32ac16f1945a
Parent:
0:ba1f47c7fdd2
a

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
lucaspennati 1:32ac16f1945a 79 void getDataFromSensors() {
iandil 0:ba1f47c7fdd2 80 int16_t pDataXYZ[3] = {0};
iandil 0:ba1f47c7fdd2 81 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
lucaspennati 1:32ac16f1945a 82
lucaspennati 1:32ac16f1945a 83 bool isHorizontal = pDataXYZ[2] > 900 || pDataXYZ[2] < -900;
lucaspennati 1:32ac16f1945a 84 bool isOnLongEdge = pDataXYZ[1] > 900 || pDataXYZ[1] < -900;
lucaspennati 1:32ac16f1945a 85 bool isOnShortEdge = pDataXYZ[0] > 900 || pDataXYZ[0] < -900;
lucaspennati 1:32ac16f1945a 86
lucaspennati 1:32ac16f1945a 87 if(isHorizontal) {
lucaspennati 1:32ac16f1945a 88 fprintf(file, "%d\n", 1);
lucaspennati 1:32ac16f1945a 89 } else if(isOnLongEdge) {
lucaspennati 1:32ac16f1945a 90 fprintf(file, "%d\n", 2);
lucaspennati 1:32ac16f1945a 91 } else if(isOnShortEdge) {
lucaspennati 1:32ac16f1945a 92 fprintf(file, "%d\n", 3);
lucaspennati 1:32ac16f1945a 93 } else {
lucaspennati 1:32ac16f1945a 94 fprintf(file, "%d\n", 4);
lucaspennati 1:32ac16f1945a 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 }
lucaspennati 1:32ac16f1945a 121
lucaspennati 1:32ac16f1945a 122 bool isLed1 = led1 >= led2 && led1 >= led3;
lucaspennati 1:32ac16f1945a 123 bool isLed2 = led2 >= led1 && led2 >= led3;
lucaspennati 1:32ac16f1945a 124 bool isLed3 = led3 >= led1 && led3 >= led2;
lucaspennati 1:32ac16f1945a 125
lucaspennati 1:32ac16f1945a 126 if(isLed1) {
iandil 0:ba1f47c7fdd2 127 led1 = 1;
iandil 0:ba1f47c7fdd2 128 led2 = 0;
iandil 0:ba1f47c7fdd2 129 led3 = 0;
lucaspennati 1:32ac16f1945a 130 } else if (isLed2) {
iandil 0:ba1f47c7fdd2 131 led1 = 0;
iandil 0:ba1f47c7fdd2 132 led2 = 1;
iandil 0:ba1f47c7fdd2 133 led3 = 0;
lucaspennati 1:32ac16f1945a 134 } else if (isLed3) {
iandil 0:ba1f47c7fdd2 135 led1 = 0;
iandil 0:ba1f47c7fdd2 136 led2 = 0;
iandil 0:ba1f47c7fdd2 137 led3 = 1;
iandil 0:ba1f47c7fdd2 138 }
iandil 0:ba1f47c7fdd2 139
iandil 0:ba1f47c7fdd2 140 fflush(stdout);
iandil 0:ba1f47c7fdd2 141 int err = fclose(file);
iandil 0:ba1f47c7fdd2 142 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 143 if (err < 0) {
iandil 0:ba1f47c7fdd2 144 error("error: %s (%d)\n", strerror(err), -err);
iandil 0:ba1f47c7fdd2 145 }
iandil 0:ba1f47c7fdd2 146 err = fs.unmount();
iandil 0:ba1f47c7fdd2 147 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 148 if (err < 0) {
iandil 0:ba1f47c7fdd2 149 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 150 }
iandil 0:ba1f47c7fdd2 151
iandil 0:ba1f47c7fdd2 152 printf("Mbed OS filesystem example done!\n");
iandil 0:ba1f47c7fdd2 153 }
iandil 0:ba1f47c7fdd2 154
lucaspennati 1:32ac16f1945a 155 void toggleLed() {
lucaspennati 1:32ac16f1945a 156 queue.call(getDataFromSensors);
iandil 0:ba1f47c7fdd2 157 counter += 1;
iandil 0:ba1f47c7fdd2 158 if(counter == 1000) {
iandil 0:ba1f47c7fdd2 159 toggle_led.detach();
iandil 0:ba1f47c7fdd2 160 queue.call(readFile);
iandil 0:ba1f47c7fdd2 161 }
iandil 0:ba1f47c7fdd2 162 }
iandil 0:ba1f47c7fdd2 163
iandil 0:ba1f47c7fdd2 164
iandil 0:ba1f47c7fdd2 165 // Entry point for the example
iandil 0:ba1f47c7fdd2 166 int main() {
iandil 0:ba1f47c7fdd2 167 thread.start(callback(&queue, &EventQueue::dispatch_forever));
iandil 0:ba1f47c7fdd2 168 BSP_ACCELERO_Init();
iandil 0:ba1f47c7fdd2 169 printf("--- Mbed OS filesystem example ---\n");
iandil 0:ba1f47c7fdd2 170
iandil 0:ba1f47c7fdd2 171 // Setup the erase event on button press, use the event queue
iandil 0:ba1f47c7fdd2 172 // to avoid running in interrupt context
iandil 0:ba1f47c7fdd2 173 irq.fall(mbed_event_queue()->event(erase));
iandil 0:ba1f47c7fdd2 174
iandil 0:ba1f47c7fdd2 175 // Try to mount the filesystem
iandil 0:ba1f47c7fdd2 176 printf("Mounting the filesystem... ");
iandil 0:ba1f47c7fdd2 177 fflush(stdout);
iandil 0:ba1f47c7fdd2 178 int err = fs.mount(&bd);
iandil 0:ba1f47c7fdd2 179 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 180 if (err) {
iandil 0:ba1f47c7fdd2 181 // Reformat if we can't mount the filesystem
iandil 0:ba1f47c7fdd2 182 // this should only happen on the first boot
iandil 0:ba1f47c7fdd2 183 printf("No filesystem found, formatting... ");
iandil 0:ba1f47c7fdd2 184 fflush(stdout);
iandil 0:ba1f47c7fdd2 185 err = fs.reformat(&bd);
iandil 0:ba1f47c7fdd2 186 printf("%s\n", (err ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 187 if (err) {
iandil 0:ba1f47c7fdd2 188 error("error: %s (%d)\n", strerror(-err), err);
iandil 0:ba1f47c7fdd2 189 }
iandil 0:ba1f47c7fdd2 190 }
iandil 0:ba1f47c7fdd2 191
iandil 0:ba1f47c7fdd2 192 // Open the numbers file
iandil 0:ba1f47c7fdd2 193 printf("Opening \"/fs/numbers.txt\"... ");
iandil 0:ba1f47c7fdd2 194 fflush(stdout);
iandil 0:ba1f47c7fdd2 195 file = fopen("/fs/numbers.txt", "r+");
iandil 0:ba1f47c7fdd2 196 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 197 if (!file) {
iandil 0:ba1f47c7fdd2 198 // Create the numbers file if it doesn't exist
iandil 0:ba1f47c7fdd2 199 printf("No file found, creating a new file... ");
iandil 0:ba1f47c7fdd2 200 fflush(stdout);
iandil 0:ba1f47c7fdd2 201 file = fopen("/fs/numbers.txt", "w+");
iandil 0:ba1f47c7fdd2 202 printf("%s\n", (!file ? "Fail :(" : "OK"));
iandil 0:ba1f47c7fdd2 203 if (!file) {
iandil 0:ba1f47c7fdd2 204 error("error: %s (%d)\n", strerror(errno), -errno);
iandil 0:ba1f47c7fdd2 205 }
iandil 0:ba1f47c7fdd2 206 }
iandil 0:ba1f47c7fdd2 207
lucaspennati 1:32ac16f1945a 208 toggle_led.attach(&toggleLed, 0.01);
iandil 0:ba1f47c7fdd2 209
iandil 0:ba1f47c7fdd2 210
iandil 0:ba1f47c7fdd2 211 }