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();
}
}
}