Exercise3

Dependencies:   BSP_B-L475E-IOT01

Committer:
mcalzana
Date:
Thu Dec 06 16:58:39 2018 +0000
Revision:
0:40a58635c6be
Exercise3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcalzana 0:40a58635c6be 1
mcalzana 0:40a58635c6be 2 #include "mbed.h"
mcalzana 0:40a58635c6be 3 #include <stdio.h>
mcalzana 0:40a58635c6be 4 #include <errno.h>
mcalzana 0:40a58635c6be 5
mcalzana 0:40a58635c6be 6 // Block devices
mcalzana 0:40a58635c6be 7 #if COMPONENT_SPIF
mcalzana 0:40a58635c6be 8 #include "SPIFBlockDevice.h"
mcalzana 0:40a58635c6be 9 #endif
mcalzana 0:40a58635c6be 10
mcalzana 0:40a58635c6be 11 #if COMPONENT_DATAFLASH
mcalzana 0:40a58635c6be 12 #include "DataFlashBlockDevice.h"
mcalzana 0:40a58635c6be 13 #endif
mcalzana 0:40a58635c6be 14
mcalzana 0:40a58635c6be 15 #if COMPONENT_SD
mcalzana 0:40a58635c6be 16 #include "SDBlockDevice.h"
mcalzana 0:40a58635c6be 17 #endif
mcalzana 0:40a58635c6be 18
mcalzana 0:40a58635c6be 19 #include "HeapBlockDevice.h"
mcalzana 0:40a58635c6be 20
mcalzana 0:40a58635c6be 21 // File systems
mcalzana 0:40a58635c6be 22 #include "LittleFileSystem.h"
mcalzana 0:40a58635c6be 23 #include "FATFileSystem.h"
mcalzana 0:40a58635c6be 24
mcalzana 0:40a58635c6be 25 #include "stm32l475e_iot01_tsensor.h"
mcalzana 0:40a58635c6be 26
mcalzana 0:40a58635c6be 27 // Physical block device, can be any device that supports the BlockDevice API
mcalzana 0:40a58635c6be 28 /*SPIFBlockDevice bd(
mcalzana 0:40a58635c6be 29 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
mcalzana 0:40a58635c6be 30 MBED_CONF_SPIF_DRIVER_SPI_MISO,
mcalzana 0:40a58635c6be 31 MBED_CONF_SPIF_DRIVER_SPI_CLK,
mcalzana 0:40a58635c6be 32 MBED_CONF_SPIF_DRIVER_SPI_CS);*/
mcalzana 0:40a58635c6be 33
mcalzana 0:40a58635c6be 34 #define BLOCK_SIZE 512
mcalzana 0:40a58635c6be 35 HeapBlockDevice bd(4096, BLOCK_SIZE);
mcalzana 0:40a58635c6be 36
mcalzana 0:40a58635c6be 37 // File system declaration
mcalzana 0:40a58635c6be 38 LittleFileSystem fs("fs");
mcalzana 0:40a58635c6be 39
mcalzana 0:40a58635c6be 40 // Set up the button to trigger an erase
mcalzana 0:40a58635c6be 41 InterruptIn irq(BUTTON1);
mcalzana 0:40a58635c6be 42 void erase() {
mcalzana 0:40a58635c6be 43 printf("Initializing the block device... ");
mcalzana 0:40a58635c6be 44 fflush(stdout);
mcalzana 0:40a58635c6be 45 int err = bd.init();
mcalzana 0:40a58635c6be 46 printf("%s\n", (err ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 47 if (err) {
mcalzana 0:40a58635c6be 48 error("error: %s (%d)\n", strerror(-err), err);
mcalzana 0:40a58635c6be 49 }
mcalzana 0:40a58635c6be 50
mcalzana 0:40a58635c6be 51 printf("Erasing the block device... ");
mcalzana 0:40a58635c6be 52 fflush(stdout);
mcalzana 0:40a58635c6be 53 err = bd.erase(0, bd.size());
mcalzana 0:40a58635c6be 54 printf("%s\n", (err ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 55 if (err) {
mcalzana 0:40a58635c6be 56 error("error: %s (%d)\n", strerror(-err), err);
mcalzana 0:40a58635c6be 57 }
mcalzana 0:40a58635c6be 58
mcalzana 0:40a58635c6be 59 printf("Deinitializing the block device... ");
mcalzana 0:40a58635c6be 60 fflush(stdout);
mcalzana 0:40a58635c6be 61 err = bd.deinit();
mcalzana 0:40a58635c6be 62 printf("%s\n", (err ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 63 if (err) {
mcalzana 0:40a58635c6be 64 error("error: %s (%d)\n", strerror(-err), err);
mcalzana 0:40a58635c6be 65 }
mcalzana 0:40a58635c6be 66 }
mcalzana 0:40a58635c6be 67
mcalzana 0:40a58635c6be 68
mcalzana 0:40a58635c6be 69 // Entry point for the example
mcalzana 0:40a58635c6be 70
mcalzana 0:40a58635c6be 71 Ticker toggle_write_to_file;
mcalzana 0:40a58635c6be 72 EventQueue queue(16 * EVENTS_EVENT_SIZE);
mcalzana 0:40a58635c6be 73 Thread t;
mcalzana 0:40a58635c6be 74 static FILE *f;
mcalzana 0:40a58635c6be 75 InterruptIn button(USER_BUTTON);
mcalzana 0:40a58635c6be 76
mcalzana 0:40a58635c6be 77 void writeTemToFile(){
mcalzana 0:40a58635c6be 78 float temp = BSP_TSENSOR_ReadTemp();
mcalzana 0:40a58635c6be 79 printf("\nTEMPERATURE = %.2f degC\n", temp);
mcalzana 0:40a58635c6be 80
mcalzana 0:40a58635c6be 81 fprintf(f, "%f\n", temp);
mcalzana 0:40a58635c6be 82 fflush(stdout);
mcalzana 0:40a58635c6be 83 fflush(f);
mcalzana 0:40a58635c6be 84 }
mcalzana 0:40a58635c6be 85
mcalzana 0:40a58635c6be 86 void readTempFile(){
mcalzana 0:40a58635c6be 87 fflush(stdout);
mcalzana 0:40a58635c6be 88 fflush(f);
mcalzana 0:40a58635c6be 89 fseek(f, 0, SEEK_SET);
mcalzana 0:40a58635c6be 90 printf("Temperature time line: \n");
mcalzana 0:40a58635c6be 91 while (!feof(f)) {
mcalzana 0:40a58635c6be 92 float temp;
mcalzana 0:40a58635c6be 93 fscanf(f, "%f", &temp);
mcalzana 0:40a58635c6be 94 printf("%f degC ", temp);
mcalzana 0:40a58635c6be 95 }
mcalzana 0:40a58635c6be 96 printf("\n");
mcalzana 0:40a58635c6be 97 fflush(stdout);
mcalzana 0:40a58635c6be 98 }
mcalzana 0:40a58635c6be 99
mcalzana 0:40a58635c6be 100 void readSensorInterupt() {
mcalzana 0:40a58635c6be 101 queue.call(writeTemToFile);
mcalzana 0:40a58635c6be 102 }
mcalzana 0:40a58635c6be 103
mcalzana 0:40a58635c6be 104 void printSensorInterupt() {
mcalzana 0:40a58635c6be 105 queue.call(readTempFile);
mcalzana 0:40a58635c6be 106 }
mcalzana 0:40a58635c6be 107
mcalzana 0:40a58635c6be 108 int main() {
mcalzana 0:40a58635c6be 109 // Setup the erase event on button press, use the event queue
mcalzana 0:40a58635c6be 110 // to avoid running in interrupt context
mcalzana 0:40a58635c6be 111 irq.fall(mbed_event_queue()->event(erase));
mcalzana 0:40a58635c6be 112
mcalzana 0:40a58635c6be 113 // Try to mount the filesystem
mcalzana 0:40a58635c6be 114 printf("Mounting the filesystem... ");
mcalzana 0:40a58635c6be 115 fflush(stdout);
mcalzana 0:40a58635c6be 116 int err = fs.mount(&bd);
mcalzana 0:40a58635c6be 117 printf("%s\n", (err ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 118 if (err) {
mcalzana 0:40a58635c6be 119 // Reformat if we can't mount the filesystem
mcalzana 0:40a58635c6be 120 // this should only happen on the first boot
mcalzana 0:40a58635c6be 121 printf("No filesystem found, formatting... ");
mcalzana 0:40a58635c6be 122 fflush(stdout);
mcalzana 0:40a58635c6be 123 err = fs.reformat(&bd);
mcalzana 0:40a58635c6be 124 printf("%s\n", (err ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 125 if (err) {
mcalzana 0:40a58635c6be 126 error("error: %s (%d)\n", strerror(-err), err);
mcalzana 0:40a58635c6be 127 }
mcalzana 0:40a58635c6be 128 }
mcalzana 0:40a58635c6be 129
mcalzana 0:40a58635c6be 130 // Open the numbers file
mcalzana 0:40a58635c6be 131 printf("Opening \"/fs/numbers.txt\"... ");
mcalzana 0:40a58635c6be 132 fflush(stdout);
mcalzana 0:40a58635c6be 133 f = fopen("/fs/numbers.txt", "r +");
mcalzana 0:40a58635c6be 134 printf("%s\n", (!f ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 135 if (!f) {
mcalzana 0:40a58635c6be 136 // Create the numbers file if it doesn't exist
mcalzana 0:40a58635c6be 137 printf("No file found, creating a new file... ");
mcalzana 0:40a58635c6be 138 fflush(stdout);
mcalzana 0:40a58635c6be 139 f = fopen("/fs/numbers.txt", "w+");
mcalzana 0:40a58635c6be 140 printf("%s\n", (!f ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 141 if (!f) {
mcalzana 0:40a58635c6be 142 error("error: %s (%d)\n", strerror(errno), -errno);
mcalzana 0:40a58635c6be 143 }
mcalzana 0:40a58635c6be 144
mcalzana 0:40a58635c6be 145 printf("Seeking file... ");
mcalzana 0:40a58635c6be 146 fflush(stdout);
mcalzana 0:40a58635c6be 147 err = fseek(f, 0, SEEK_SET);
mcalzana 0:40a58635c6be 148 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mcalzana 0:40a58635c6be 149 if (err < 0) {
mcalzana 0:40a58635c6be 150 error("error: %s (%d)\n", strerror(errno), -errno);
mcalzana 0:40a58635c6be 151 }
mcalzana 0:40a58635c6be 152 }
mcalzana 0:40a58635c6be 153
mcalzana 0:40a58635c6be 154 t.start(callback(&queue, &EventQueue::dispatch_forever));
mcalzana 0:40a58635c6be 155 printf("Start sampling... \n");
mcalzana 0:40a58635c6be 156 BSP_TSENSOR_Init();
mcalzana 0:40a58635c6be 157 toggle_write_to_file.attach(&readSensorInterupt, 5);
mcalzana 0:40a58635c6be 158 button.rise(&printSensorInterupt);
mcalzana 0:40a58635c6be 159 }