Data logger with SD card storage and RTC
Dependencies: SDFileSystem SoftSerial ds3231 mbed
main.cpp
- Committer:
- dexterg
- Date:
- 2016-03-07
- Revision:
- 12:aea46fad46b4
- Parent:
- 11:ce12856c2a51
File content as of revision 12:aea46fad46b4:
#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 dayStr[2+1]; char monthStr[2+1]; char yearStr[4+1]; char hourStr[2+1]; char minStr[2+1]; char secStr[2+1]; char tbuff[200]; char pbuff[250]; void bPush() { time_t epoch_time; epoch_time = rtc.get_epoch(); strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S", 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; int strN; int setSend=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; char * pch; void SendSet() { FILE *fr = fopen("/sd/set.txt", "r"); if(fr == NULL) { serial_t0.printf("Could not open file for read"); } else { lineN=0; if( fgets(rBuffer , 200 , fr) != NULL ) { pch = strtok (rBuffer,","); strN=0; while (pch != NULL) { if(strN==0) { setT0 = atoi(pch); } if(strN==1) { setPre0 =atoi(pch); } if(strN==2) { setM=atoi(pch); } if(strN==3) { setC =atoi(pch); } pch = strtok (NULL, ","); strN++; } //serial_t0.printf("%d,%d,%d,%d\n",setT0,setPre0,setM,setC); rBuffer[0] = setT0/255; //LSB rBuffer[1] = setT0%255; //MSB rBuffer[2] = setPre0/255; //LSB rBuffer[3] = setPre0%255; //MSB rBuffer[4] = setM/255; //LSB rBuffer[5] = setM%255; //MSB rBuffer[6] = setC/255; //LSB rBuffer[7] = setC%255; //MSB rBuffer[8] = '\0'; fpga.putc(rBuffer[0]); fpga.putc(rBuffer[1]); fpga.putc(rBuffer[2]); fpga.putc(rBuffer[3]); fpga.putc(rBuffer[4]); fpga.putc(rBuffer[5]); fpga.putc(rBuffer[6]); fpga.putc(rBuffer[7]); } } fclose(fr); } 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 = {0,0}; 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", 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 if(softBuffer[0]=='T'&&softBuffer[1]=='I') { yearStr[0]=softBuffer[2]; yearStr[1]=softBuffer[3]; yearStr[2]=softBuffer[4]; yearStr[3]=softBuffer[5]; yearStr[4]='\0'; monthStr[0]=softBuffer[6]; monthStr[1]=softBuffer[7]; monthStr[2]='\0'; dayStr[0]=softBuffer[8]; dayStr[1]=softBuffer[9]; dayStr[2]='\0'; hourStr[0]=softBuffer[10]; hourStr[1]=softBuffer[11]; hourStr[2]='\0'; minStr[0]=softBuffer[12]; minStr[1]=softBuffer[13]; minStr[2]='\0'; secStr[0]=softBuffer[14]; secStr[1]=softBuffer[15]; secStr[2]='\0'; //serial_t0.printf("%s %s %s %s %s %s",yearStr,monthStr,dayStr,hourStr,minStr,secStr); ds3231_time_t rtc_time2 = {atoi(secStr),atoi(minStr),atoi(hourStr),0,0}; ds3231_calendar_t rtc_calendar2= {3,atoi(dayStr),atoi(monthStr),atoi(yearStr)}; rtc.set_time(rtc_time2); rtc.set_calendar(rtc_calendar2); } else if(softBuffer[0]=='P'&&softBuffer[1]=='A') { pch = strtok (softBuffer,","); strN=0; while (pch != NULL) { if(strN==1) { setT0 = atoi(pch); } if(strN==2) { setPre0 =atoi(pch); } if(strN==3) { setM=atoi(pch); } if(strN==4) { setC =atoi(pch); } pch = strtok (NULL, ","); strN++; } ///serial_t0.printf (" setT0: %d Pre0 %d M %d C %d \n",setT0,setPre0,setM,setC); FILE *fpo = fopen("/sd/set.txt", "w"); if(fpo != NULL) { fprintf(fpo,"%d,%d,%d,%d\n",setT0,setPre0,setM,setC); } fclose(fpo); SendSet(); } } setSend++; if(setSend>20) { setSend=0; SendSet(); } } }