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. } } } } } }