Declan Gordon / Mbed 2 deprecated LPC-SD-35

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "SDFileSystem.h"
00003 #include "SoftSerial.h"
00004 #include "Serial.h"
00005 #include "ds3231.h"
00006 #include <string>
00007 DigitalOut externalTrig(P0_17);
00008 DigitalOut myled(LED1);
00009 
00010 
00011 //Serial usbPC(P0_19, P0_18);
00012 
00013 InterruptIn button(P0_23);
00014 InterruptIn button2(P0_16);
00015 
00016 Serial fpga(P0_19, P0_18);//must change to new pins
00017 
00018 SoftSerial serial_t0(P0_11,P0_12);
00019 
00020 Ds3231 rtc(P0_5, P0_4);///must change to new pins
00021 
00022 Timer t;
00023 int timeStart;
00024 int timeCurrent;
00025 
00026 SDFileSystem sd(P0_9, P0_8, P0_10, P0_2, "sd");
00027 
00028 float lifeTime = 0;
00029 float oTwo = 0;
00030 float peak = 0;
00031 float trough = 0;
00032 float ancil = 0;
00033 float label = 0;
00034 float pressure = 0;
00035 float temperature = 0;
00036 
00037 
00038 char dayStr[2+1];
00039 char monthStr[2+1];
00040 char yearStr[4+1];
00041 char hourStr[2+1];
00042 char minStr[2+1];
00043 char secStr[2+1];
00044 
00045 char tbuff[200];
00046 char pbuff[250];
00047 void bPush()
00048 {
00049     time_t epoch_time;
00050     epoch_time = rtc.get_epoch();
00051 
00052     strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S", localtime(&epoch_time));
00053 
00054     FILE *fp  = fopen("/sd/d.txt", "a");
00055     if(fp == NULL) {
00056     } else {
00057         fprintf(fp, "%s, %f,%f,%f,%f,%f \r\n",tbuff,lifeTime,oTwo,peak,trough,ancil);
00058     }
00059     fclose(fp);
00060     fpga.printf("lifetime: %f  o2: %f  peak: %f  trough: %f  ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
00061 }
00062 
00063 void bPush2()
00064 {
00065     time_t epoch_time;
00066     epoch_time = rtc.get_epoch();
00067 
00068     externalTrig=1;
00069     wait(0.1);
00070     externalTrig=0;
00071 
00072     //strftime(tbuff, 32, "%X %x", localtime(&epoch_time));
00073     //printf("%s", tbuff);
00074 }
00075 const int buffer_size = 255;
00076 char fpgaBuffer[buffer_size+1];
00077 volatile int rx_in=0;
00078 volatile int rx_out=0;
00079 int newData=0;
00080 
00081 char softBuffer[buffer_size+1];
00082 char rBuffer[255];
00083 volatile int rxSoftIn=0;
00084 volatile int rxSoftOut=0;
00085 int newSoftData=0;
00086 
00087 int setT0 = 0;
00088 int setPre0=0;
00089 int setM=0;
00090 int setC=0;
00091 int strN;
00092 int setSend=0;
00093 void serial_t0_RxInt()
00094 {
00095     while ((serial_t0.readable()) && (((rxSoftIn + 1) % buffer_size) != rxSoftOut)) {
00096         softBuffer[rxSoftIn] = serial_t0.getc();
00097         rxSoftIn = (rxSoftIn + 1) % buffer_size;
00098     }
00099     softBuffer[rxSoftIn]='\0';
00100     newSoftData=1;
00101 }
00102 
00103 void fpga_Rx_interrupt()
00104 {
00105     wait(0.1);
00106     while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
00107         fpgaBuffer[rx_in] = fpga.getc();
00108         rx_in = (rx_in + 1) % buffer_size;
00109     }
00110 
00111 
00112     ///convert to Shijie datagram
00113     if(rx_in<14) {
00114         if(fpgaBuffer[2]!=0xFF) {
00115             lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
00116             oTwo = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
00117             peak = (256 * (fpgaBuffer[4]))+fpgaBuffer[5];
00118             trough = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
00119             ancil = (10 * (fpgaBuffer[8] >> 4)) + (fpgaBuffer[8] & 15)+(((10.0 * (fpgaBuffer[9] >> 4)) + 1.0*(fpgaBuffer[9] & 15))/100.0);
00120             // 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]);
00121         } else {
00122             lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
00123             oTwo = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
00124             peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
00125             trough = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
00126             ancil = (10 * (fpgaBuffer[12] >> 4)) + (fpgaBuffer[12] & 15)+(((10.0 * (fpgaBuffer[13] >> 4)) + 1.0*(fpgaBuffer[13] & 15))/100.0);
00127             // 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]);
00128         }
00129     } else {
00130 
00131         if(rx_in<18) {
00132 
00133             label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
00134             lifeTime = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
00135             oTwo = (10 * (fpgaBuffer[4] >> 4)) + (fpgaBuffer[4] & 15)+(((10.0 * (fpgaBuffer[5] >> 4)) + 1.0*(fpgaBuffer[5] & 15))/100.0);
00136             peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
00137             trough = (256 * (fpgaBuffer[8]))+fpgaBuffer[9];
00138             pressure = (256 * (fpgaBuffer[10]))+fpgaBuffer[11];
00139             temperature = (10 * (fpgaBuffer[12] & 15)) + (fpgaBuffer[13] >> 4) + (1.0*(fpgaBuffer[13] & 15)/10 );
00140 
00141         } else {
00142 
00143             label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
00144             lifeTime = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
00145             oTwo = (10 * (fpgaBuffer[6] >> 4)) + (fpgaBuffer[6] & 15)+(((10.0 * (fpgaBuffer[7] >> 4)) + 1.0*(fpgaBuffer[7] & 15))/100.0);
00146             peak = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
00147             trough = (256 * (fpgaBuffer[12]))+fpgaBuffer[13];
00148             pressure = (256 * (fpgaBuffer[15]))+fpgaBuffer[16];
00149             temperature = (10 * (fpgaBuffer[18] & 15)) + (fpgaBuffer[19] >> 4) + (1.0*(fpgaBuffer[19] & 15)/10 );
00150         }
00151     }
00152 
00153     newData=1;
00154     rx_in=0;
00155     return;
00156 }
00157 int createFile=0;
00158 char* strings;
00159 string s1;
00160 string s2;
00161 int r;
00162 int msgCode;
00163 int msgValue;
00164 int lineN;
00165 char * pch;
00166 
00167 
00168 void SendSet()
00169 {
00170     FILE *fr  = fopen("/sd/set.txt", "r");
00171     if(fr == NULL) {
00172         serial_t0.printf("Could not open file for read");
00173     } else {
00174         lineN=0;
00175         if( fgets(rBuffer , 200 , fr) != NULL ) {
00176             pch = strtok (rBuffer,",");
00177             strN=0;
00178             while (pch != NULL) {
00179                 if(strN==0) {
00180                     setT0 = atoi(pch);
00181                 }
00182                 if(strN==1) {
00183                     setPre0 =atoi(pch);
00184                 }
00185                 if(strN==2) {
00186                     setM=atoi(pch);
00187                 }
00188                 if(strN==3) {
00189                     setC =atoi(pch);
00190                 }
00191                 pch = strtok (NULL, ",");
00192                 strN++;
00193             }
00194             //serial_t0.printf("%d,%d,%d,%d\n",setT0,setPre0,setM,setC);
00195             rBuffer[0] = setT0/255; //LSB
00196             rBuffer[1] = setT0%255; //MSB
00197             rBuffer[2] = setPre0/255; //LSB
00198             rBuffer[3] = setPre0%255; //MSB
00199             rBuffer[4] = setM/255; //LSB
00200             rBuffer[5] = setM%255; //MSB
00201             rBuffer[6] = setC/255; //LSB
00202             rBuffer[7] = setC%255; //MSB
00203             rBuffer[8] = '\0';
00204             fpga.putc(rBuffer[0]);
00205             fpga.putc(rBuffer[1]);
00206             fpga.putc(rBuffer[2]);
00207             fpga.putc(rBuffer[3]);
00208             fpga.putc(rBuffer[4]);
00209             fpga.putc(rBuffer[5]);
00210             fpga.putc(rBuffer[6]);
00211             fpga.putc(rBuffer[7]);
00212         }
00213     }
00214     fclose(fr);
00215 
00216 }
00217 
00218 int main()
00219 {
00220     //Comment below to test without RTC and SD
00221     externalTrig=0;
00222     //button.mode(PullUp);
00223     //button.fall(&bPush);
00224     button2.mode(PullUp);
00225     button2.fall(&bPush2);
00226 
00227     fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq);
00228     FILE *fpo = fopen("/sd/d.txt", "r");
00229     if(fpo == NULL) {
00230         createFile=1;
00231     }
00232     fclose(fpo);
00233 
00234     FILE *fp  = fopen("/sd/d.txt", "a");
00235     if(fp == NULL) {
00236         fpga.printf("file system failed\r\n");
00237     } else {
00238         fpga.printf("file system active\r\n");
00239         if(createFile==1) {
00240             //fprintf(fp, "DateTime,Lifetime,02,Peak,Trough,Ancil\r\n");
00241         }
00242     }
00243     fclose(fp);
00244     ds3231_cntl_stat_t rtc_control_status = {0,0};
00245     rtc.set_cntl_stat_reg(rtc_control_status);
00246     time_t epoch_time;
00247     epoch_time = rtc.get_epoch();
00248     //Comment above to test without RTC and SD
00249 
00250 
00251     fpga.baud(9600);
00252     fpga.printf("start v2 \r\n");
00253 
00254     serial_t0.baud(4800);
00255     serial_t0.printf("start soft serial\r\n");//DEBUG
00256     serial_t0.attach(&serial_t0_RxInt,SoftSerial::RxIrq);
00257     serial_t0.printf("entering loop\r\n"); ///DEBUG
00258 
00259     while(1) {
00260         //serial_t0.printf("looping \r\n");
00261         //fpga.printf("Im looping too");
00262 
00263         myled = 1;
00264         wait(0.2);
00265         myled = 0;
00266         wait(0.2);
00267 
00268         ///print data to file
00269         if(newData==1) {
00270             sprintf(pbuff,"%f,%f,%f,%f,%f,%f,%f",label,lifeTime,oTwo,peak,trough,pressure,temperature);
00271             //serial_t0.printf("%s",pbuff);
00272             //sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil);
00273             //fpga.printf("%s",pbuff);
00274             time_t epoch_time;
00275             epoch_time = rtc.get_epoch();
00276             
00277             strftime(tbuff, 32, "%Y %m %d %H:%M:%S", localtime(&epoch_time));
00278             FILE *fp  = fopen("/sd/d.txt", "a");
00279             if(fp == NULL) {
00280             } else {
00281                 fprintf(fp, "%s, %s \r\n",tbuff, pbuff);
00282             }
00283             serial_t0.printf("%s, %s \r\n",tbuff,pbuff);
00284             fclose(fp);
00285             newData=0;
00286         }
00287 
00288         if(newSoftData==1) {
00289             rxSoftIn=0;
00290             newSoftData=0;
00291 
00292             //serial_t0.printf(softBuffer);
00293 
00294             string str(softBuffer);
00295 
00296             if(softBuffer[0]=='S'&&softBuffer[1]=='D') {
00297                 FILE *fr  = fopen("/sd/d.txt", "r");
00298                 if(fr == NULL) {
00299                     serial_t0.printf("Could not open file for read");
00300                 } else {
00301                     lineN=0;
00302                     while( fgets(rBuffer , 200 , fr) != NULL && !( rBuffer[0]=='D' && lineN==1) ) {
00303                         if(rBuffer[0]=='D') {
00304                             lineN++;
00305                         } else {
00306                             serial_t0.printf("%s",rBuffer);
00307                             //wait(0.040);
00308                         }
00309                     }
00310                 }
00311             } else if(softBuffer[0]=='T'&&softBuffer[1]=='I') {
00312 
00313                 yearStr[0]=softBuffer[2];
00314                 yearStr[1]=softBuffer[3];
00315                 yearStr[2]=softBuffer[4];
00316                 yearStr[3]=softBuffer[5];
00317                 yearStr[4]='\0';
00318 
00319                 monthStr[0]=softBuffer[6];
00320                 monthStr[1]=softBuffer[7];
00321                 monthStr[2]='\0';
00322 
00323                 dayStr[0]=softBuffer[8];
00324                 dayStr[1]=softBuffer[9];
00325                 dayStr[2]='\0';
00326 
00327                 hourStr[0]=softBuffer[10];
00328                 hourStr[1]=softBuffer[11];
00329                 hourStr[2]='\0';
00330 
00331                 minStr[0]=softBuffer[12];
00332                 minStr[1]=softBuffer[13];
00333                 minStr[2]='\0';
00334 
00335                 secStr[0]=softBuffer[14];
00336                 secStr[1]=softBuffer[15];
00337                 secStr[2]='\0';
00338 
00339                 //serial_t0.printf("%s %s %s %s %s %s",yearStr,monthStr,dayStr,hourStr,minStr,secStr);
00340 
00341                 ds3231_time_t rtc_time2 = {atoi(secStr),atoi(minStr),atoi(hourStr),0,0};
00342                 ds3231_calendar_t rtc_calendar2= {3,atoi(dayStr),atoi(monthStr),atoi(yearStr)};
00343                 rtc.set_time(rtc_time2);
00344                 rtc.set_calendar(rtc_calendar2);
00345                 
00346             } else if(softBuffer[0]=='P'&&softBuffer[1]=='A') {
00347 
00348                 pch = strtok (softBuffer,",");
00349                 strN=0;
00350                 while (pch != NULL) {
00351                     if(strN==1) {
00352                         setT0 = atoi(pch);
00353                     }
00354                     if(strN==2) {
00355                         setPre0 =atoi(pch);
00356                     }
00357                     if(strN==3) {
00358                         setM=atoi(pch);
00359                     }
00360                     if(strN==4) {
00361                         setC =atoi(pch);
00362                     }
00363                     pch = strtok (NULL, ",");
00364                     strN++;
00365                 }
00366                 ///serial_t0.printf (" setT0: %d Pre0 %d M %d C %d  \n",setT0,setPre0,setM,setC);
00367 
00368                 FILE *fpo = fopen("/sd/set.txt", "w");
00369                 if(fpo != NULL) {
00370                     fprintf(fpo,"%d,%d,%d,%d\n",setT0,setPre0,setM,setC);
00371                 }
00372                 fclose(fpo);
00373 
00374                 SendSet();
00375 
00376             }
00377 
00378         }
00379 
00380         setSend++;
00381 
00382         if(setSend>20) {
00383             setSend=0;
00384             SendSet();
00385         }
00386 
00387     }
00388 }