assignment

Dependencies:   BSP_B-L475E-IOT01

Committer:
alessioburatti
Date:
Thu Dec 06 16:48:01 2018 +0000
Revision:
27:bab23d82832b
Parent:
26:130bb1173866
Child:
28:cd6b9e13b1fe
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:bab23d82832b 3
alessioburatti 27:bab23d82832b 4 #include "stm32l475e_iot01_accelero.h"
alessioburatti 27:bab23d82832b 5
mbed_official 0:8e251d9511b8 6 #include <stdio.h>
mbed_official 0:8e251d9511b8 7 #include <errno.h>
mbed_official 0:8e251d9511b8 8
alessioburatti 27:bab23d82832b 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:bab23d82832b 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:bab23d82832b 20 #endif
mbed_official 25:65a9183a2178 21
mbed_official 0:8e251d9511b8 22 #include "HeapBlockDevice.h"
mbed_official 0:8e251d9511b8 23
alessioburatti 27:bab23d82832b 24 // File systems
mbed_official 0:8e251d9511b8 25 #include "LittleFileSystem.h"
mbed_official 0:8e251d9511b8 26 #include "FATFileSystem.h"
alessioburatti 27:bab23d82832b 27 #include "nvstore.h"
mbed_official 0:8e251d9511b8 28
alessioburatti 27:bab23d82832b 29 // Physical block device, can be any device that supports the BlockDevice API
lmottola 26:130bb1173866 30 /*SPIFBlockDevice bd(
alessioburatti 27:bab23d82832b 31 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
alessioburatti 27:bab23d82832b 32 MBED_CONF_SPIF_DRIVER_SPI_MISO,
alessioburatti 27:bab23d82832b 33 MBED_CONF_SPIF_DRIVER_SPI_CLK,
alessioburatti 27:bab23d82832b 34 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
alessioburatti 27:bab23d82832b 35
alessioburatti 27:bab23d82832b 36 #define X_VALUE pDataXYZ[0]
alessioburatti 27:bab23d82832b 37 #define Y_VALUE pDataXYZ[1]
alessioburatti 27:bab23d82832b 38 #define Z_VALUE pDataXYZ[2]
alessioburatti 27:bab23d82832b 39
alessioburatti 27:bab23d82832b 40 #define HORIZONTAL_INDEX 0
alessioburatti 27:bab23d82832b 41 #define LONG_VERTICAL_INDEX 1
alessioburatti 27:bab23d82832b 42 #define SHORT_VERTICAL_INDEX 2
lmottola 26:130bb1173866 43
lmottola 26:130bb1173866 44 #define BLOCK_SIZE 512
alessioburatti 27:bab23d82832b 45 HeapBlockDevice bd(16384, BLOCK_SIZE);
mbed_official 0:8e251d9511b8 46
alessioburatti 27:bab23d82832b 47 // File system declaration
mbed_official 0:8e251d9511b8 48 LittleFileSystem fs("fs");
mbed_official 0:8e251d9511b8 49
alessioburatti 27:bab23d82832b 50 DigitalOut led1(LED1);
alessioburatti 27:bab23d82832b 51 DigitalOut led2(LED2);
alessioburatti 27:bab23d82832b 52 DigitalOut led3(LED3);
alessioburatti 27:bab23d82832b 53
alessioburatti 27:bab23d82832b 54 Ticker tTicker;
alessioburatti 27:bab23d82832b 55 Thread t;
alessioburatti 27:bab23d82832b 56
alessioburatti 27:bab23d82832b 57 uint32_t horizontalCount;
alessioburatti 27:bab23d82832b 58 uint32_t longVerticalCount;
alessioburatti 27:bab23d82832b 59 uint32_t shortVerticalCount;
alessioburatti 27:bab23d82832b 60
alessioburatti 27:bab23d82832b 61 static FILE *f;
alessioburatti 27:bab23d82832b 62 volatile int countedPositionsd = 0;
alessioburatti 27:bab23d82832b 63 EventQueue queue(32 * EVENTS_EVENT_SIZE);
alessioburatti 27:bab23d82832b 64
alessioburatti 27:bab23d82832b 65 InterruptIn button(USER_BUTTON);
alessioburatti 27:bab23d82832b 66
alessioburatti 27:bab23d82832b 67 int max3(int a, int b, int c) {
alessioburatti 27:bab23d82832b 68 if (a > b) {
alessioburatti 27:bab23d82832b 69 return a > c ? HORIZONTAL_INDEX : SHORT_VERTICAL_INDEX;
mbed_official 0:8e251d9511b8 70 }
alessioburatti 27:bab23d82832b 71 return b > c ? LONG_VERTICAL_INDEX : SHORT_VERTICAL_INDEX;
alessioburatti 27:bab23d82832b 72 }
alessioburatti 27:bab23d82832b 73
alessioburatti 27:bab23d82832b 74 void turnOffLeds() {
alessioburatti 27:bab23d82832b 75 led1 = 0;
alessioburatti 27:bab23d82832b 76 led2 = 0;
alessioburatti 27:bab23d82832b 77 led3 = 0;
alessioburatti 27:bab23d82832b 78 }
alessioburatti 27:bab23d82832b 79
alessioburatti 27:bab23d82832b 80 void turnOnLedAndUpdateStore(DigitalOut * led, int key, uint32_t * currentCount) {
alessioburatti 27:bab23d82832b 81 *led = 1;
alessioburatti 27:bab23d82832b 82 NVStore &nvstore = NVStore::get_instance();
alessioburatti 27:bab23d82832b 83 *currentCount++;
alessioburatti 27:bab23d82832b 84 nvstore.set(key, sizeof(*currentCount), currentCount);
alessioburatti 27:bab23d82832b 85 }
mbed_official 0:8e251d9511b8 86
alessioburatti 27:bab23d82832b 87 void toggleLed() {
alessioburatti 27:bab23d82832b 88 int16_t occurencies[3] = {0};
mbed_official 0:8e251d9511b8 89 fflush(stdout);
alessioburatti 27:bab23d82832b 90 fflush(f);
alessioburatti 27:bab23d82832b 91
alessioburatti 27:bab23d82832b 92 fseek(f, 0, SEEK_SET);
alessioburatti 27:bab23d82832b 93
alessioburatti 27:bab23d82832b 94 printf("Start reading\n");
alessioburatti 27:bab23d82832b 95
alessioburatti 27:bab23d82832b 96 int number;
alessioburatti 27:bab23d82832b 97 while (!feof(f)) {
alessioburatti 27:bab23d82832b 98 fscanf(f, "%d", &number);
alessioburatti 27:bab23d82832b 99 if (number == HORIZONTAL_INDEX || number == LONG_VERTICAL_INDEX || number == SHORT_VERTICAL_INDEX) {
alessioburatti 27:bab23d82832b 100 occurencies[number] = occurencies[number] + 1;
alessioburatti 27:bab23d82832b 101 }
mbed_official 0:8e251d9511b8 102 }
alessioburatti 27:bab23d82832b 103
alessioburatti 27:bab23d82832b 104 printf("%d %d %d\n", occurencies[HORIZONTAL_INDEX], occurencies[LONG_VERTICAL_INDEX], occurencies[SHORT_VERTICAL_INDEX]);
alessioburatti 27:bab23d82832b 105
alessioburatti 27:bab23d82832b 106 int mostOccurentValue = max3(occurencies[0], occurencies[1], occurencies[2]);
alessioburatti 27:bab23d82832b 107
alessioburatti 27:bab23d82832b 108 printf("Max %d\n", mostOccurentValue);
alessioburatti 27:bab23d82832b 109
alessioburatti 27:bab23d82832b 110 turnOffLeds();
alessioburatti 27:bab23d82832b 111
alessioburatti 27:bab23d82832b 112 if (mostOccurentValue == HORIZONTAL_INDEX) {
alessioburatti 27:bab23d82832b 113 turnOnLedAndUpdateStore(&led1, HORIZONTAL_INDEX, &horizontalCount);
alessioburatti 27:bab23d82832b 114 } else if (mostOccurentValue == LONG_VERTICAL_INDEX) {
alessioburatti 27:bab23d82832b 115 turnOnLedAndUpdateStore(&led2, LONG_VERTICAL_INDEX, &longVerticalCount);
alessioburatti 27:bab23d82832b 116 } else if (mostOccurentValue == SHORT_VERTICAL_INDEX) {
alessioburatti 27:bab23d82832b 117 turnOnLedAndUpdateStore(&led3, SHORT_VERTICAL_INDEX, &shortVerticalCount);
alessioburatti 27:bab23d82832b 118 }
alessioburatti 27:bab23d82832b 119
mbed_official 0:8e251d9511b8 120 fflush(stdout);
alessioburatti 27:bab23d82832b 121 int err = fclose(f);
alessioburatti 27:bab23d82832b 122 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
alessioburatti 27:bab23d82832b 123 if (err < 0) {
alessioburatti 27:bab23d82832b 124 error("error: %s (%d)\n", strerror(err), -err);
alessioburatti 27:bab23d82832b 125 }
alessioburatti 27:bab23d82832b 126 err = fs.unmount();
alessioburatti 27:bab23d82832b 127 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
alessioburatti 27:bab23d82832b 128 if (err < 0) {
mbed_official 0:8e251d9511b8 129 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 130 }
mbed_official 0:8e251d9511b8 131 }
mbed_official 0:8e251d9511b8 132
alessioburatti 27:bab23d82832b 133 bool isInRange100(int val) {
alessioburatti 27:bab23d82832b 134 return val < 100 && val > -100;
alessioburatti 27:bab23d82832b 135 }
mbed_official 0:8e251d9511b8 136
alessioburatti 27:bab23d82832b 137 bool isInRange900_1000(int val) {
alessioburatti 27:bab23d82832b 138 return (val < 1050 && val > 950) || (val < -950 && val > -1050);
alessioburatti 27:bab23d82832b 139 }
alessioburatti 27:bab23d82832b 140
alessioburatti 27:bab23d82832b 141 void savePosition() {
alessioburatti 27:bab23d82832b 142 int16_t pDataXYZ[3] = {0};
alessioburatti 27:bab23d82832b 143 BSP_ACCELERO_AccGetXYZ(pDataXYZ);
alessioburatti 27:bab23d82832b 144 if (isInRange100(X_VALUE) && isInRange100(Y_VALUE) && isInRange900_1000(Z_VALUE)) {
alessioburatti 27:bab23d82832b 145 fprintf(f, "%d\n", HORIZONTAL_INDEX);
alessioburatti 27:bab23d82832b 146 } else if (isInRange100(X_VALUE) && isInRange900_1000(Y_VALUE) && isInRange100(Z_VALUE)) {
alessioburatti 27:bab23d82832b 147 fprintf(f, "%d\n", LONG_VERTICAL_INDEX);
alessioburatti 27:bab23d82832b 148 } else if (isInRange900_1000(X_VALUE) && isInRange100(Y_VALUE) && isInRange100(Z_VALUE)) {
alessioburatti 27:bab23d82832b 149 fprintf(f, "%d\n", SHORT_VERTICAL_INDEX);
alessioburatti 27:bab23d82832b 150 }
alessioburatti 27:bab23d82832b 151 fflush(f);
alessioburatti 27:bab23d82832b 152 fflush(stdout);
alessioburatti 27:bab23d82832b 153 }
alessioburatti 27:bab23d82832b 154
mbed_official 0:8e251d9511b8 155
alessioburatti 27:bab23d82832b 156 void tickerBlock() {
alessioburatti 27:bab23d82832b 157 queue.call(savePosition);
alessioburatti 27:bab23d82832b 158 countedPositionsd++;
alessioburatti 27:bab23d82832b 159 if (countedPositionsd == 1000) {
alessioburatti 27:bab23d82832b 160 tTicker.detach();
alessioburatti 27:bab23d82832b 161 queue.call(toggleLed);
alessioburatti 27:bab23d82832b 162 countedPositionsd = 0;
alessioburatti 27:bab23d82832b 163 }
alessioburatti 27:bab23d82832b 164 }
mbed_official 0:8e251d9511b8 165
alessioburatti 27:bab23d82832b 166 int main(){
alessioburatti 27:bab23d82832b 167 t.start(callback(&queue, &EventQueue::dispatch_forever));
alessioburatti 27:bab23d82832b 168 BSP_ACCELERO_Init();
alessioburatti 27:bab23d82832b 169
alessioburatti 27:bab23d82832b 170 NVStore &nvstore = NVStore::get_instance();
alessioburatti 27:bab23d82832b 171 uint16_t actual_len_bytes = 0;
alessioburatti 27:bab23d82832b 172 int rc;
alessioburatti 27:bab23d82832b 173
alessioburatti 27:bab23d82832b 174 rc = nvstore.init();
alessioburatti 27:bab23d82832b 175
alessioburatti 27:bab23d82832b 176 rc = nvstore.get(HORIZONTAL_INDEX, sizeof(horizontalCount), &horizontalCount, actual_len_bytes);
alessioburatti 27:bab23d82832b 177 if (rc == NVSTORE_NOT_FOUND) {
alessioburatti 27:bab23d82832b 178 horizontalCount = 0;
alessioburatti 27:bab23d82832b 179 shortVerticalCount = 0;
alessioburatti 27:bab23d82832b 180 longVerticalCount = 0;
alessioburatti 27:bab23d82832b 181 nvstore.set(HORIZONTAL_INDEX, sizeof(horizontalCount), &horizontalCount);
alessioburatti 27:bab23d82832b 182 nvstore.set(SHORT_VERTICAL_INDEX, sizeof(shortVerticalCount), &shortVerticalCount);
alessioburatti 27:bab23d82832b 183 nvstore.set(LONG_VERTICAL_INDEX, sizeof(longVerticalCount), &longVerticalCount);
alessioburatti 27:bab23d82832b 184 } else {
alessioburatti 27:bab23d82832b 185 nvstore.get(SHORT_VERTICAL_INDEX, sizeof(shortVerticalCount), &shortVerticalCount, actual_len_bytes);
alessioburatti 27:bab23d82832b 186 nvstore.get(LONG_VERTICAL_INDEX, sizeof(longVerticalCount), &longVerticalCount, actual_len_bytes);
alessioburatti 27:bab23d82832b 187 }
alessioburatti 27:bab23d82832b 188
alessioburatti 27:bab23d82832b 189 printf("Led 1: %d\nLed 2: %d\nLed 3: %d\n", horizontalCount, longVerticalCount, shortVerticalCount);
alessioburatti 27:bab23d82832b 190 // Try to mount the filesystem
mbed_official 0:8e251d9511b8 191 printf("Mounting the filesystem... ");
mbed_official 0:8e251d9511b8 192 fflush(stdout);
mbed_official 0:8e251d9511b8 193 int err = fs.mount(&bd);
mbed_official 0:8e251d9511b8 194 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 195 if (err) {
alessioburatti 27:bab23d82832b 196 // Reformat if we can't mount the filesystem
alessioburatti 27:bab23d82832b 197 // this should only happen on the first boot
mbed_official 0:8e251d9511b8 198 printf("No filesystem found, formatting... ");
mbed_official 0:8e251d9511b8 199 fflush(stdout);
mbed_official 0:8e251d9511b8 200 err = fs.reformat(&bd);
mbed_official 0:8e251d9511b8 201 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 202 if (err) {
mbed_official 0:8e251d9511b8 203 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 204 }
mbed_official 0:8e251d9511b8 205 }
alessioburatti 27:bab23d82832b 206
alessioburatti 27:bab23d82832b 207 // Open the numbers file
mbed_official 0:8e251d9511b8 208 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 209 fflush(stdout);
alessioburatti 27:bab23d82832b 210 f = fopen("/fs/numbers.txt", "r+");
mbed_official 0:8e251d9511b8 211 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 212 if (!f) {
alessioburatti 27:bab23d82832b 213 // Create the numbers file if it doesn't exist
mbed_official 0:8e251d9511b8 214 printf("No file found, creating a new file... ");
mbed_official 0:8e251d9511b8 215 fflush(stdout);
mbed_official 0:8e251d9511b8 216 f = fopen("/fs/numbers.txt", "w+");
mbed_official 0:8e251d9511b8 217 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 218 if (!f) {
mbed_official 0:8e251d9511b8 219 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 220 }
mbed_official 0:8e251d9511b8 221 }
mbed_official 0:8e251d9511b8 222
alessioburatti 27:bab23d82832b 223 tTicker.attach(&tickerBlock, 0.01);
mbed_official 0:8e251d9511b8 224 }