assignment

Dependencies:   BSP_B-L475E-IOT01

Committer:
alessioburatti
Date:
Thu Dec 06 16:48:10 2018 +0000
Revision:
27:a2f73b18cbb0
Parent:
26:130bb1173866
done

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lmottola 26:130bb1173866 1
mbed_official 0:8e251d9511b8 2 #include "mbed.h"
alessioburatti 27:a2f73b18cbb0 3
alessioburatti 27:a2f73b18cbb0 4 #include "stm32l475e_iot01_accelero.h"
alessioburatti 27:a2f73b18cbb0 5
mbed_official 0:8e251d9511b8 6 #include <stdio.h>
mbed_official 0:8e251d9511b8 7 #include <errno.h>
mbed_official 0:8e251d9511b8 8
alessioburatti 27:a2f73b18cbb0 9 // Block devices
mbed_official 25:65a9183a2178 10 #if COMPONENT_SPIF
mbed_official 0:8e251d9511b8 11 #include "SPIFBlockDevice.h"
mbed_official 25:65a9183a2178 12 #endif
mbed_official 25:65a9183a2178 13
mbed_official 25:65a9183a2178 14 #if COMPONENT_DATAFLASH
mbed_official 1:2bfc377bcc2a 15 #include "DataFlashBlockDevice.h"
alessioburatti 27:a2f73b18cbb0 16 #endif
mbed_official 25:65a9183a2178 17
mbed_official 25:65a9183a2178 18 #if COMPONENT_SD
mbed_official 0:8e251d9511b8 19 #include "SDBlockDevice.h"
alessioburatti 27:a2f73b18cbb0 20 #endif
mbed_official 25:65a9183a2178 21
mbed_official 0:8e251d9511b8 22 #include "HeapBlockDevice.h"
mbed_official 0:8e251d9511b8 23
alessioburatti 27:a2f73b18cbb0 24 // File systems
mbed_official 0:8e251d9511b8 25 #include "LittleFileSystem.h"
mbed_official 0:8e251d9511b8 26 #include "FATFileSystem.h"
mbed_official 0:8e251d9511b8 27
alessioburatti 27:a2f73b18cbb0 28 // Physical block device, can be any device that supports the BlockDevice API
lmottola 26:130bb1173866 29 /*SPIFBlockDevice bd(
alessioburatti 27:a2f73b18cbb0 30 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
alessioburatti 27:a2f73b18cbb0 31 MBED_CONF_SPIF_DRIVER_SPI_MISO,
alessioburatti 27:a2f73b18cbb0 32 MBED_CONF_SPIF_DRIVER_SPI_CLK,
alessioburatti 27:a2f73b18cbb0 33 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
alessioburatti 27:a2f73b18cbb0 34
alessioburatti 27:a2f73b18cbb0 35 #define X_VALUE pDataXYZ[0]
alessioburatti 27:a2f73b18cbb0 36 #define Y_VALUE pDataXYZ[1]
alessioburatti 27:a2f73b18cbb0 37 #define Z_VALUE pDataXYZ[2]
alessioburatti 27:a2f73b18cbb0 38
alessioburatti 27:a2f73b18cbb0 39 #define HORIZONTAL_INDEX 0
alessioburatti 27:a2f73b18cbb0 40 #define LONG_VERTICAL_INDEX 1
alessioburatti 27:a2f73b18cbb0 41 #define SHORT_VERTICAL_INDEX 2
lmottola 26:130bb1173866 42
lmottola 26:130bb1173866 43 #define BLOCK_SIZE 512
alessioburatti 27:a2f73b18cbb0 44 HeapBlockDevice bd(16384, BLOCK_SIZE);
mbed_official 0:8e251d9511b8 45
alessioburatti 27:a2f73b18cbb0 46 // File system declaration
mbed_official 0:8e251d9511b8 47 LittleFileSystem fs("fs");
mbed_official 0:8e251d9511b8 48
alessioburatti 27:a2f73b18cbb0 49 DigitalOut led1(LED1);
alessioburatti 27:a2f73b18cbb0 50 DigitalOut led2(LED2);
alessioburatti 27:a2f73b18cbb0 51 DigitalOut led3(LED3);
alessioburatti 27:a2f73b18cbb0 52
alessioburatti 27:a2f73b18cbb0 53 Ticker tTicker;
alessioburatti 27:a2f73b18cbb0 54 Thread t;
alessioburatti 27:a2f73b18cbb0 55
alessioburatti 27:a2f73b18cbb0 56 static FILE *f;
alessioburatti 27:a2f73b18cbb0 57 volatile int countedPositionsd = 0;
alessioburatti 27:a2f73b18cbb0 58 EventQueue queue(32 * EVENTS_EVENT_SIZE);
alessioburatti 27:a2f73b18cbb0 59
alessioburatti 27:a2f73b18cbb0 60 InterruptIn button(USER_BUTTON);
alessioburatti 27:a2f73b18cbb0 61
alessioburatti 27:a2f73b18cbb0 62 int max3(int a, int b, int c) {
alessioburatti 27:a2f73b18cbb0 63 if (a > b) {
alessioburatti 27:a2f73b18cbb0 64 return a > c ? HORIZONTAL_INDEX : SHORT_VERTICAL_INDEX;
mbed_official 0:8e251d9511b8 65 }
alessioburatti 27:a2f73b18cbb0 66 return b > c ? LONG_VERTICAL_INDEX : SHORT_VERTICAL_INDEX;
alessioburatti 27:a2f73b18cbb0 67 }
alessioburatti 27:a2f73b18cbb0 68
alessioburatti 27:a2f73b18cbb0 69 void turnOffLeds() {
alessioburatti 27:a2f73b18cbb0 70 led1 = 0;
alessioburatti 27:a2f73b18cbb0 71 led2 = 0;
alessioburatti 27:a2f73b18cbb0 72 led3 = 0;
alessioburatti 27:a2f73b18cbb0 73 }
mbed_official 0:8e251d9511b8 74
alessioburatti 27:a2f73b18cbb0 75 void toggleLed() {
alessioburatti 27:a2f73b18cbb0 76 int16_t occurencies[3] = {0};
mbed_official 0:8e251d9511b8 77 fflush(stdout);
alessioburatti 27:a2f73b18cbb0 78 fflush(f);
alessioburatti 27:a2f73b18cbb0 79
alessioburatti 27:a2f73b18cbb0 80 fseek(f, 0, SEEK_SET);
alessioburatti 27:a2f73b18cbb0 81
alessioburatti 27:a2f73b18cbb0 82 printf("Start reading\n");
alessioburatti 27:a2f73b18cbb0 83
alessioburatti 27:a2f73b18cbb0 84 int number;
alessioburatti 27:a2f73b18cbb0 85 while (!feof(f)) {
alessioburatti 27:a2f73b18cbb0 86 fscanf(f, "%d", &number);
alessioburatti 27:a2f73b18cbb0 87 if (number == HORIZONTAL_INDEX || number == LONG_VERTICAL_INDEX || number == SHORT_VERTICAL_INDEX) {
alessioburatti 27:a2f73b18cbb0 88 occurencies[number] = occurencies[number] + 1;
alessioburatti 27:a2f73b18cbb0 89 }
mbed_official 0:8e251d9511b8 90 }
alessioburatti 27:a2f73b18cbb0 91
alessioburatti 27:a2f73b18cbb0 92 printf("%d %d %d\n", occurencies[HORIZONTAL_INDEX], occurencies[LONG_VERTICAL_INDEX], occurencies[SHORT_VERTICAL_INDEX]);
alessioburatti 27:a2f73b18cbb0 93
alessioburatti 27:a2f73b18cbb0 94 int mostOccurentValue = max3(occurencies[0], occurencies[1], occurencies[2]);
alessioburatti 27:a2f73b18cbb0 95
alessioburatti 27:a2f73b18cbb0 96 printf("Max %d\n", mostOccurentValue);
alessioburatti 27:a2f73b18cbb0 97
alessioburatti 27:a2f73b18cbb0 98 turnOffLeds();
alessioburatti 27:a2f73b18cbb0 99 if (mostOccurentValue == HORIZONTAL_INDEX) {
alessioburatti 27:a2f73b18cbb0 100 led1 = 1;
alessioburatti 27:a2f73b18cbb0 101 } else if (mostOccurentValue == LONG_VERTICAL_INDEX) {
alessioburatti 27:a2f73b18cbb0 102 led2 = 1;
alessioburatti 27:a2f73b18cbb0 103 } else if (mostOccurentValue == SHORT_VERTICAL_INDEX) {
alessioburatti 27:a2f73b18cbb0 104 led3 = 1;
alessioburatti 27:a2f73b18cbb0 105 }
alessioburatti 27:a2f73b18cbb0 106
mbed_official 0:8e251d9511b8 107 fflush(stdout);
alessioburatti 27:a2f73b18cbb0 108 int err = fclose(f);
alessioburatti 27:a2f73b18cbb0 109 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
alessioburatti 27:a2f73b18cbb0 110 if (err < 0) {
alessioburatti 27:a2f73b18cbb0 111 error("error: %s (%d)\n", strerror(err), -err);
alessioburatti 27:a2f73b18cbb0 112 }
alessioburatti 27:a2f73b18cbb0 113 err = fs.unmount();
alessioburatti 27:a2f73b18cbb0 114 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
alessioburatti 27:a2f73b18cbb0 115 if (err < 0) {
mbed_official 0:8e251d9511b8 116 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 117 }
mbed_official 0:8e251d9511b8 118 }
mbed_official 0:8e251d9511b8 119
alessioburatti 27:a2f73b18cbb0 120 bool isInRange100(int val) {
alessioburatti 27:a2f73b18cbb0 121 return val < 100 && val > -100;
alessioburatti 27:a2f73b18cbb0 122 }
mbed_official 0:8e251d9511b8 123
alessioburatti 27:a2f73b18cbb0 124 bool isInRange900_1000(int val) {
alessioburatti 27:a2f73b18cbb0 125 return (val < 1050 && val > 950) || (val < -950 && val > -1050);
alessioburatti 27:a2f73b18cbb0 126 }
mbed_official 0:8e251d9511b8 127
alessioburatti 27:a2f73b18cbb0 128 void savePosition() {
alessioburatti 27:a2f73b18cbb0 129 int16_t pDataXYZ[3] = {0};
alessioburatti 27:a2f73b18cbb0 130 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
alessioburatti 27:a2f73b18cbb0 131 if (isInRange100(X_VALUE) && isInRange100(Y_VALUE) && isInRange900_1000(Z_VALUE)) {
alessioburatti 27:a2f73b18cbb0 132 fprintf(f, "%d\n", HORIZONTAL_INDEX);
alessioburatti 27:a2f73b18cbb0 133 } else if (isInRange100(X_VALUE) && isInRange900_1000(Y_VALUE) && isInRange100(Z_VALUE)) {
alessioburatti 27:a2f73b18cbb0 134 fprintf(f, "%d\n", LONG_VERTICAL_INDEX);
alessioburatti 27:a2f73b18cbb0 135 } else if (isInRange900_1000(X_VALUE) && isInRange100(Y_VALUE) && isInRange100(Z_VALUE)) {
alessioburatti 27:a2f73b18cbb0 136 fprintf(f, "%d\n", SHORT_VERTICAL_INDEX);
alessioburatti 27:a2f73b18cbb0 137 }
alessioburatti 27:a2f73b18cbb0 138 fflush(f);
alessioburatti 27:a2f73b18cbb0 139 fflush(stdout);
alessioburatti 27:a2f73b18cbb0 140 }
alessioburatti 27:a2f73b18cbb0 141
mbed_official 0:8e251d9511b8 142
alessioburatti 27:a2f73b18cbb0 143 void tickerBlock() {
alessioburatti 27:a2f73b18cbb0 144 queue.call(savePosition);
alessioburatti 27:a2f73b18cbb0 145 countedPositionsd++;
alessioburatti 27:a2f73b18cbb0 146 if (countedPositionsd == 1000) {
alessioburatti 27:a2f73b18cbb0 147 tTicker.detach();
alessioburatti 27:a2f73b18cbb0 148 queue.call(toggleLed);
alessioburatti 27:a2f73b18cbb0 149 countedPositionsd = 0;
alessioburatti 27:a2f73b18cbb0 150 }
alessioburatti 27:a2f73b18cbb0 151 }
alessioburatti 27:a2f73b18cbb0 152
alessioburatti 27:a2f73b18cbb0 153 int main(){
alessioburatti 27:a2f73b18cbb0 154 t.start(callback(&queue, &EventQueue::dispatch_forever));
alessioburatti 27:a2f73b18cbb0 155 BSP_ACCELERO_Init();
alessioburatti 27:a2f73b18cbb0 156
alessioburatti 27:a2f73b18cbb0 157 // Try to mount the filesystem
mbed_official 0:8e251d9511b8 158 printf("Mounting the filesystem... ");
mbed_official 0:8e251d9511b8 159 fflush(stdout);
mbed_official 0:8e251d9511b8 160 int err = fs.mount(&bd);
mbed_official 0:8e251d9511b8 161 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 162 if (err) {
alessioburatti 27:a2f73b18cbb0 163 // Reformat if we can't mount the filesystem
alessioburatti 27:a2f73b18cbb0 164 // this should only happen on the first boot
mbed_official 0:8e251d9511b8 165 printf("No filesystem found, formatting... ");
mbed_official 0:8e251d9511b8 166 fflush(stdout);
mbed_official 0:8e251d9511b8 167 err = fs.reformat(&bd);
mbed_official 0:8e251d9511b8 168 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 169 if (err) {
mbed_official 0:8e251d9511b8 170 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 171 }
mbed_official 0:8e251d9511b8 172 }
alessioburatti 27:a2f73b18cbb0 173
alessioburatti 27:a2f73b18cbb0 174 // Open the numbers file
mbed_official 0:8e251d9511b8 175 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 176 fflush(stdout);
alessioburatti 27:a2f73b18cbb0 177 f = fopen("/fs/numbers.txt", "r+");
mbed_official 0:8e251d9511b8 178 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 179 if (!f) {
alessioburatti 27:a2f73b18cbb0 180 // Create the numbers file if it doesn't exist
mbed_official 0:8e251d9511b8 181 printf("No file found, creating a new file... ");
mbed_official 0:8e251d9511b8 182 fflush(stdout);
mbed_official 0:8e251d9511b8 183 f = fopen("/fs/numbers.txt", "w+");
mbed_official 0:8e251d9511b8 184 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 185 if (!f) {
mbed_official 0:8e251d9511b8 186 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 187 }
mbed_official 0:8e251d9511b8 188 }
mbed_official 0:8e251d9511b8 189
alessioburatti 27:a2f73b18cbb0 190 tTicker.attach(&tickerBlock, 0.01);
mbed_official 0:8e251d9511b8 191 }