Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

main.cpp

Committer:
dexterg
Date:
2015-09-29
Revision:
0:e0a8ea9b571e
Child:
1:ab74071de2c8

File content as of revision 0:e0a8ea9b571e:

#include "mbed.h"
#include "SDFileSystem.h"
#include "SoftSerial.h"
#include "ds3231.h"
DigitalOut externalTrig(P0_17);
DigitalOut myled(LED1);
//Serial usbPC(P0_19, P0_18);

InterruptIn button(P0_23);
InterruptIn button2(P0_16);

Serial fpga(P0_19, P0_18);//must change to new pins

Ds3231 rtc(P0_5, P0_4);///must change to new pins

SDFileSystem sd(P0_9, P0_8, P0_10, P0_2, "sd");//must change to new pins
float lifeTime = 0;
float oTwo = 0;
float peak = 0;
float trough = 0;
float ancil = 0;
char tbuff[32];
char pbuff[250];
void bPush()
{
    time_t epoch_time;
    epoch_time = rtc.get_epoch();

    strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time));

    FILE *fp  = fopen("/sd/d.txt", "a");
    if(fp == NULL) {
    } else {
        fprintf(fp, "%s,%f,%f,%f,%f,%f\r\n",tbuff,lifeTime,oTwo,peak,trough,ancil);
    }
    fclose(fp);
    fpga.printf("lifetime: %f  o2: %f  peak: %f  trough: %f  ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
}

void bPush2()
{
    time_t epoch_time;
    epoch_time = rtc.get_epoch();

    externalTrig=1;
    wait(0.1);
    externalTrig=0;

    //strftime(tbuff, 32, "%X %x", localtime(&epoch_time));
    //printf("%s", tbuff);
}
const int buffer_size = 255;
char fpgaBuffer[buffer_size+1];
volatile int rx_in=0;
volatile int rx_out=0;
int newData=0;

void fpga_Rx_interrupt()
{
    wait(0.1);
    while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
        fpgaBuffer[rx_in] = fpga.getc();
// Uncomment to Echo to USB serial to watch data flow
        rx_in = (rx_in + 1) % buffer_size;
    }


    ///convert to Shijie datagram
    if(fpgaBuffer[2]!=0xFF) {
        lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
        oTwo = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
        peak = (256 * (fpgaBuffer[4]))+fpgaBuffer[5];
        trough = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
        ancil = (10 * (fpgaBuffer[8] >> 4)) + (fpgaBuffer[8] & 15)+(((10.0 * (fpgaBuffer[9] >> 4)) + 1.0*(fpgaBuffer[9] & 15))/100.0);
        fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[2],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[5],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[8],fpgaBuffer[9]);
    } else {
        lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
        oTwo = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
        peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
        trough = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
        ancil = (10 * (fpgaBuffer[12] >> 4)) + (fpgaBuffer[12] & 15)+(((10.0 * (fpgaBuffer[13] >> 4)) + 1.0*(fpgaBuffer[13] & 15))/100.0);
        fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[9],fpgaBuffer[10],fpgaBuffer[12],fpgaBuffer[13]);
    }
    //fpga.printf("lifetime: %f  o2: %f  peak: %f  trough: %f  ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
    //fpga.printf(fpgaBuffer);

    //fpga.printf("%x %x %x %x %x %x %x %x %x %x",fpgaBuffer[0],fpgaBuffer[1],fpgaBuffer[2],fpgaBuffer[3],fpgaBuffer[4],fpgaBuffer[5],fpgaBuffer[6],fpgaBuffer[7],fpgaBuffer[8],fpgaBuffer[9]);

    newData=1;

    rx_in=0;





    //fpga.printf("rx received\r\n");
    return;
}
int createFile=0;
int main()
{
    externalTrig=0;
    button.mode(PullUp);
    button.fall(&bPush);
    button2.mode(PullUp);
    button2.fall(&bPush2);


    fpga.baud(9600);
    fpga.printf("start");

    fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq);

    FILE *fpo = fopen("/sd/d.txt", "r");
    if(fpo == NULL) {
        createFile=1;
    }

    FILE *fp  = fopen("/sd/d.txt", "a");
    if(fp == NULL) {
        fpga.printf("file system failed\r\n");
    } else {
        fpga.printf("file system active\r\n");
        if(createFile==1){
             fprintf(fp, "DateTime,Lifetime,02,Peak,Trough,Ancil\r\n");
            }
    }
    fclose(fp);

    ds3231_cntl_stat_t rtc_control_status = {1,1};
    rtc.set_cntl_stat_reg(rtc_control_status);

    time_t epoch_time;
    epoch_time = rtc.get_epoch();



    //ds3231_calendar_t rtc_calendar={1,11,8,15};
    //fpga.printf("set calendar:%d",rtc.set_calendar(rtc_calendar));
    //wait(1);
    //ds3231_time_t rtc_time={0,26,20,0,0};
    //rtc.set_time(rtc_time);




    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);


        if(newData==1) {
            //fpga.printf("lifetime: %f  o2: %f  peak: %f  trough: %f  ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
            //sprintf(pbuff,"lifetime: %f  o2: %f  peak: %f  trough: %f  ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
            sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil);
            fpga.printf("%s",pbuff);

            //fpga.printf("Data Rxd\r\n");

            time_t epoch_time;
            epoch_time = rtc.get_epoch();
            strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time));
            FILE *fp  = fopen("/sd/d.txt", "a");
            if(fp == NULL) {
            } else {
                //fprintf(fp, "%s,%f,%f,%f,%f,%f\r\n",tbuff,lifeTime,oTwo,peak,trough,ancil);
                fprintf(fp, "%s,%s\r\n",tbuff,pbuff);
            }
            fclose(fp);

            newData=0;
        }

        //fpga.printf("ee\r\n");

        //time_t epoch_time;
        //epoch_time = rtc.get_epoch();
        //fpga.printf("\nTime as seconds since January 1, 1970 = %d\r\n", epoch_time);

        //fpga.printf("\nTime as a basic string = %s\r\n", ctime(&epoch_time));

        //if(fpga.readable()) {
        //   wait(1);
        //}


    }
}