assignment

Dependencies:   BSP_B-L475E-IOT01

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