Samples temperature once per minute - Stores the time series on a file - Displays the time series on STDout, from the beginning of the file up to current time, when pressing the button

Dependencies:   BSP_B-L475E-IOT01

main.cpp

Committer:
vicara
Date:
2018-12-06
Revision:
0:e53ff6cb04fd

File content as of revision 0:e53ff6cb04fd:

#include "mbed.h"

#include <stdio.h>
#include <errno.h>

// Block devices
#if COMPONENT_SPIF
#include "SPIFBlockDevice.h"
#endif

#if COMPONENT_DATAFLASH
#include "DataFlashBlockDevice.h"
#endif 

#if COMPONENT_SD
#include "SDBlockDevice.h"
#endif 

#include "HeapBlockDevice.h"

// File systems
#include "LittleFileSystem.h"
#include "FATFileSystem.h"

// Physical block device, can be any device that supports the BlockDevice API
/*SPIFBlockDevice bd(
        MBED_CONF_SPIF_DRIVER_SPI_MOSI,
        MBED_CONF_SPIF_DRIVER_SPI_MISO,
        MBED_CONF_SPIF_DRIVER_SPI_CLK,
        MBED_CONF_SPIF_DRIVER_SPI_CS);*/

#define BLOCK_SIZE 512
HeapBlockDevice bd(16384, BLOCK_SIZE);
#include "stm32l475e_iot01_tsensor.h"


// File system declaration
LittleFileSystem fs("fs");

Ticker timeout_ticker;
Thread t;

static FILE *f;
volatile int seconds_passed = 0;
EventQueue queue(32 * EVENTS_EVENT_SIZE);

void write_temperature_on_file() {
    float temperature = 0;
    temperature = BSP_TSENSOR_ReadTemp();
    fprintf(f, "%f\n", temperature);
    fflush(f);
    fflush(stdout);
    printf("New temperature stored in the file\n");
}

void print_temperature_from_file() {
    printf("\n====== PRINTING TEMPERATURE RECORDED SO FAR ======\n");
    int order = 1;
    fflush(stdout);
    fflush(f);
    fseek(f, 0, SEEK_SET);
    float value;
    while (!feof(f)) {
        fscanf(f, "%f", &value); 
        printf("  %d: %f\n", order, value);
        order++;
    }
    fflush(stdout);
    printf("\n");
}

InterruptIn button(USER_BUTTON);

void toggle() {
    queue.call(print_temperature_from_file);
}

void ticker_attach() {    
    queue.call(write_temperature_on_file);
}

int main(){
    t.start(callback(&queue, &EventQueue::dispatch_forever));
    BSP_TSENSOR_Init();
    button.rise(&toggle);
    
    // Try to mount the filesystem
    printf("Mounting the filesystem... ");
    fflush(stdout);
    int err = fs.mount(&bd);
    printf("%s\n", (err ? "Fail :(" : "OK"));
    if (err) {
        // Reformat if we can't mount the filesystem
        // this should only happen on the first boot
        printf("No filesystem found, formatting... ");
        fflush(stdout);
        err = fs.reformat(&bd);
        printf("%s\n", (err ? "Fail :(" : "OK"));
        if (err) {
            error("error: %s (%d)\n", strerror(-err), err);
        }
    }
    
    // Open the numbers file
    printf("Opening \"/fs/numbers.txt\"... ");
    fflush(stdout);
    f = fopen("/fs/numbers.txt", "r+");
    printf("%s\n", (!f ? "Fail :(" : "OK"));
    if (!f) {
        // Create the numbers file if it doesn't exist
        printf("No file found, creating a new file... ");
        fflush(stdout);
        f = fopen("/fs/numbers.txt", "w+");
        printf("%s\n", (!f ? "Fail :(" : "OK"));
        if (!f) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    }

    timeout_ticker.attach(&ticker_attach, 60);
}