Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

main.cpp

Committer:
dexterg
Date:
2015-11-22
Revision:
1:ab74071de2c8
Parent:
0:e0a8ea9b571e
Child:
2:e0b3cb47b4ff

File content as of revision 1:ab74071de2c8:

#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;
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];
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(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]);
    }
    newData=1;
    rx_in=0;
    return;
}
int createFile=0;
char* strings;
string s1;
string s2;
int msgCode;
int msgValue;
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;
    }

    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",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);
            }
            fclose(fp);
            newData=0;
        }  
        
        if(newSoftData==1){
            rxSoftIn=0;
            newSoftData=0;
            
            //serial_t0.printf(softBuffer);
            
            string str(softBuffer);
            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.
                    }
                }
            }
            
            
        }
        
    }
}