Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

main.cpp

Committer:
dexterg
Date:
2015-12-03
Revision:
5:159a0b7172c8
Parent:
4:3b055e2a9f4e
Child:
6:facc3b44ab4e

File content as of revision 5:159a0b7172c8:

#include "mbed.h"
#include "SDFileSystem.h"
#include "SoftSerial.h"
#include "Serial.h"
#include "ds3231.h"
#include <string>
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

SoftSerial serial_t0(P0_11,P0_12);

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

Timer t;
int timeStart;
int timeCurrent;

SDFileSystem sd(P0_9, P0_8, P0_10, P0_2, "sd");

float lifeTime = 0;
float oTwo = 0;
float peak = 0;
float trough = 0;
float ancil = 0;
float label = 0;
float pressure = 0;
float temperature = 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;

char softBuffer[buffer_size+1];
char rBuffer[255];
volatile int rxSoftIn=0;
volatile int rxSoftOut=0;
int newSoftData=0;

int setT0 = 0;
int setPre0=0;
int setM=0;
int setC=0;

void serial_t0_RxInt()
{
    while ((serial_t0.readable()) && (((rxSoftIn + 1) % buffer_size) != rxSoftOut)) {
        softBuffer[rxSoftIn] = serial_t0.getc();
        rxSoftIn = (rxSoftIn + 1) % buffer_size;
    }
    softBuffer[rxSoftIn]='\0';
    newSoftData=1;
}

void fpga_Rx_interrupt()
{
    wait(0.1);
    while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
        fpgaBuffer[rx_in] = fpga.getc();
        rx_in = (rx_in + 1) % buffer_size;
    }


    ///convert to Shijie datagram
    if(rx_in<14) {
        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);
            // DEBUG 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);
            // DEBUG 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]);
        }
    } else {

        if(rx_in<18) {

            label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
            lifeTime = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
            oTwo = (10 * (fpgaBuffer[4] >> 4)) + (fpgaBuffer[4] & 15)+(((10.0 * (fpgaBuffer[5] >> 4)) + 1.0*(fpgaBuffer[5] & 15))/100.0);
            peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
            trough = (256 * (fpgaBuffer[8]))+fpgaBuffer[9];
            pressure = (256 * (fpgaBuffer[10]))+fpgaBuffer[11];
            temperature = (10 * (fpgaBuffer[12] & 15)) + (fpgaBuffer[13] >> 4) + (1.0*(fpgaBuffer[13] & 15)/10 );

        } else {

            label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
            lifeTime = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
            oTwo = (10 * (fpgaBuffer[6] >> 4)) + (fpgaBuffer[6] & 15)+(((10.0 * (fpgaBuffer[7] >> 4)) + 1.0*(fpgaBuffer[7] & 15))/100.0);
            peak = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
            trough = (256 * (fpgaBuffer[12]))+fpgaBuffer[13];
            pressure = (256 * (fpgaBuffer[15]))+fpgaBuffer[16];
            temperature = (10 * (fpgaBuffer[18] & 15)) + (fpgaBuffer[19] >> 4) + (1.0*(fpgaBuffer[19] & 15)/10 );
        }
    }

    newData=1;
    rx_in=0;
    return;
}
int createFile=0;
char* strings;
string s1;
string s2;
int r;
int msgCode;
int msgValue;
int lineN;
int main()
{
    //Comment below to test without RTC and SD
    externalTrig=0;
    button.mode(PullUp);
    button.fall(&bPush);
    button2.mode(PullUp);
    button2.fall(&bPush2);

    fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq);
    FILE *fpo = fopen("/sd/d.txt", "r");
    if(fpo == NULL) {
        createFile=1;
    }
    fclose(fpo);
    
    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();
    //Comment above to test without RTC and SD


    fpga.baud(9600);
    fpga.printf("start v2 \r\n");

    serial_t0.baud(4800);
    serial_t0.printf("start soft serial\r\n");//DEBUG
    serial_t0.attach(&serial_t0_RxInt,SoftSerial::RxIrq);
    serial_t0.printf("entering loop\r\n"); ///DEBUG

    while(1) {
        //serial_t0.printf("looping \r\n");
        //fpga.printf("Im looping too");

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

        ///print data to file
        if(newData==1) {
            sprintf(pbuff,"%f,%f,%f,%f,%f,%f,%f",label,lifeTime,oTwo,peak,trough,pressure,temperature);
            //serial_t0.printf("%s",pbuff);
            //sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil);
            //fpga.printf("%s",pbuff);
            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,%s\r\n",tbuff,pbuff);
            }
            serial_t0.printf("%s,%s\r\n",tbuff,pbuff);
            fclose(fp);
            newData=0;
        }

        if(newSoftData==1) {
            rxSoftIn=0;
            newSoftData=0;

            //serial_t0.printf(softBuffer);

            string str(softBuffer);

            if(softBuffer[0]=='S'&&softBuffer[1]=='D') {
             FILE *fr  = fopen("/sd/d.txt", "r");
                if(fr == NULL) {
                    serial_t0.printf("Could not open file for read");
                } else {
                    lineN=0;
                    while( fgets(rBuffer , 200 , fr) != NULL && !( rBuffer[0]=='D' && lineN==1) ) {
                        if(rBuffer[0]=='D') {
                            lineN++;
                        } else {
                            serial_t0.printf("%s",rBuffer);
                            wait(0.040);
                        }
                    }
                }
            } else {

                s1="";
                s2="";
                strings = strtok(softBuffer,",");
                if(strings!=NULL) {
                    s1 = strings;
                    strings = strtok(NULL,",");
                    if(strings!=NULL) {
                        s2= strings;
                        serial_t0.printf("Received code %s, value %s ",s1,s2);
                        msgCode = atoi(s1.c_str());
                        if(msgCode==1||msgCode==2||msgCode==3||msgCode==4) {
                            msgValue = atoi(s2.c_str());
                            softBuffer[0] = msgCode;
                            softBuffer[1] = msgValue/255; //LSB
                            softBuffer[2] = msgValue%255; //MSB
                            softBuffer[3] = '\0';
                            serial_t0.printf("Relayed datagram: %x %x %x",softBuffer[0],softBuffer[1],softBuffer[2]); //DEBUG
                            //fpga.printf(softBuffer[0]);fpga.printf(softBuffer[1]);fpga.printf(softBuffer[3]);
                            fpga.putc(softBuffer[0]);
                            fpga.putc(softBuffer[1]);
                            fpga.putc(softBuffer[2]);///sned the datagram to fpga

                        } else if(msgCode==5) {
                            ///Parse date time write to rtc.
                        }
                    }
                }
            }
            
        }
        
    }
}