Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem SoftSerial ds3231 mbed
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 }
Generated on Fri Jul 15 2022 07:00:54 by
1.7.2