Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

Committer:
dexterg
Date:
Thu Nov 26 17:52:13 2015 +0000
Revision:
3:f1287f5fde38
Parent:
2:e0b3cb47b4ff
Child:
4:3b055e2a9f4e
Fix to packet

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dexterg 0:e0a8ea9b571e 1 #include "mbed.h"
dexterg 0:e0a8ea9b571e 2 #include "SDFileSystem.h"
dexterg 0:e0a8ea9b571e 3 #include "SoftSerial.h"
dexterg 1:ab74071de2c8 4 #include "Serial.h"
dexterg 0:e0a8ea9b571e 5 #include "ds3231.h"
dexterg 1:ab74071de2c8 6 #include <string>
dexterg 0:e0a8ea9b571e 7 DigitalOut externalTrig(P0_17);
dexterg 0:e0a8ea9b571e 8 DigitalOut myled(LED1);
dexterg 1:ab74071de2c8 9
dexterg 1:ab74071de2c8 10
dexterg 0:e0a8ea9b571e 11 //Serial usbPC(P0_19, P0_18);
dexterg 0:e0a8ea9b571e 12
dexterg 0:e0a8ea9b571e 13 InterruptIn button(P0_23);
dexterg 0:e0a8ea9b571e 14 InterruptIn button2(P0_16);
dexterg 0:e0a8ea9b571e 15
dexterg 0:e0a8ea9b571e 16 Serial fpga(P0_19, P0_18);//must change to new pins
dexterg 0:e0a8ea9b571e 17
dexterg 1:ab74071de2c8 18 SoftSerial serial_t0(P0_11,P0_12);
dexterg 1:ab74071de2c8 19
dexterg 0:e0a8ea9b571e 20 Ds3231 rtc(P0_5, P0_4);///must change to new pins
dexterg 0:e0a8ea9b571e 21
dexterg 1:ab74071de2c8 22 Timer t;
dexterg 1:ab74071de2c8 23 int timeStart;
dexterg 1:ab74071de2c8 24 int timeCurrent;
dexterg 1:ab74071de2c8 25
dexterg 1:ab74071de2c8 26 SDFileSystem sd(P0_9, P0_8, P0_10, P0_2, "sd");
dexterg 2:e0b3cb47b4ff 27
dexterg 0:e0a8ea9b571e 28 float lifeTime = 0;
dexterg 0:e0a8ea9b571e 29 float oTwo = 0;
dexterg 0:e0a8ea9b571e 30 float peak = 0;
dexterg 0:e0a8ea9b571e 31 float trough = 0;
dexterg 0:e0a8ea9b571e 32 float ancil = 0;
dexterg 2:e0b3cb47b4ff 33 float label = 0;
dexterg 2:e0b3cb47b4ff 34 float pressure = 0;
dexterg 2:e0b3cb47b4ff 35 float temperature = 0;
dexterg 2:e0b3cb47b4ff 36
dexterg 0:e0a8ea9b571e 37 char tbuff[32];
dexterg 0:e0a8ea9b571e 38 char pbuff[250];
dexterg 0:e0a8ea9b571e 39 void bPush()
dexterg 0:e0a8ea9b571e 40 {
dexterg 0:e0a8ea9b571e 41 time_t epoch_time;
dexterg 0:e0a8ea9b571e 42 epoch_time = rtc.get_epoch();
dexterg 0:e0a8ea9b571e 43
dexterg 0:e0a8ea9b571e 44 strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time));
dexterg 0:e0a8ea9b571e 45
dexterg 0:e0a8ea9b571e 46 FILE *fp = fopen("/sd/d.txt", "a");
dexterg 0:e0a8ea9b571e 47 if(fp == NULL) {
dexterg 0:e0a8ea9b571e 48 } else {
dexterg 0:e0a8ea9b571e 49 fprintf(fp, "%s,%f,%f,%f,%f,%f\r\n",tbuff,lifeTime,oTwo,peak,trough,ancil);
dexterg 0:e0a8ea9b571e 50 }
dexterg 0:e0a8ea9b571e 51 fclose(fp);
dexterg 0:e0a8ea9b571e 52 fpga.printf("lifetime: %f o2: %f peak: %f trough: %f ancil: %f ",lifeTime,oTwo,peak,trough,ancil);
dexterg 0:e0a8ea9b571e 53 }
dexterg 0:e0a8ea9b571e 54
dexterg 0:e0a8ea9b571e 55 void bPush2()
dexterg 0:e0a8ea9b571e 56 {
dexterg 0:e0a8ea9b571e 57 time_t epoch_time;
dexterg 0:e0a8ea9b571e 58 epoch_time = rtc.get_epoch();
dexterg 0:e0a8ea9b571e 59
dexterg 0:e0a8ea9b571e 60 externalTrig=1;
dexterg 0:e0a8ea9b571e 61 wait(0.1);
dexterg 0:e0a8ea9b571e 62 externalTrig=0;
dexterg 0:e0a8ea9b571e 63
dexterg 0:e0a8ea9b571e 64 //strftime(tbuff, 32, "%X %x", localtime(&epoch_time));
dexterg 0:e0a8ea9b571e 65 //printf("%s", tbuff);
dexterg 0:e0a8ea9b571e 66 }
dexterg 0:e0a8ea9b571e 67 const int buffer_size = 255;
dexterg 0:e0a8ea9b571e 68 char fpgaBuffer[buffer_size+1];
dexterg 0:e0a8ea9b571e 69 volatile int rx_in=0;
dexterg 0:e0a8ea9b571e 70 volatile int rx_out=0;
dexterg 0:e0a8ea9b571e 71 int newData=0;
dexterg 0:e0a8ea9b571e 72
dexterg 1:ab74071de2c8 73 char softBuffer[buffer_size+1];
dexterg 1:ab74071de2c8 74 volatile int rxSoftIn=0;
dexterg 1:ab74071de2c8 75 volatile int rxSoftOut=0;
dexterg 1:ab74071de2c8 76 int newSoftData=0;
dexterg 1:ab74071de2c8 77
dexterg 1:ab74071de2c8 78 int setT0 = 0;
dexterg 1:ab74071de2c8 79 int setPre0=0;
dexterg 1:ab74071de2c8 80 int setM=0;
dexterg 1:ab74071de2c8 81 int setC=0;
dexterg 1:ab74071de2c8 82
dexterg 1:ab74071de2c8 83 void serial_t0_RxInt(){
dexterg 1:ab74071de2c8 84 while ((serial_t0.readable()) && (((rxSoftIn + 1) % buffer_size) != rxSoftOut)) {
dexterg 1:ab74071de2c8 85 softBuffer[rxSoftIn] = serial_t0.getc();
dexterg 1:ab74071de2c8 86 rxSoftIn = (rxSoftIn + 1) % buffer_size;
dexterg 1:ab74071de2c8 87 }
dexterg 1:ab74071de2c8 88 softBuffer[rxSoftIn]='\0';
dexterg 1:ab74071de2c8 89 newSoftData=1;
dexterg 1:ab74071de2c8 90 }
dexterg 1:ab74071de2c8 91
dexterg 0:e0a8ea9b571e 92 void fpga_Rx_interrupt()
dexterg 0:e0a8ea9b571e 93 {
dexterg 0:e0a8ea9b571e 94 wait(0.1);
dexterg 0:e0a8ea9b571e 95 while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
dexterg 0:e0a8ea9b571e 96 fpgaBuffer[rx_in] = fpga.getc();
dexterg 0:e0a8ea9b571e 97 rx_in = (rx_in + 1) % buffer_size;
dexterg 0:e0a8ea9b571e 98 }
dexterg 0:e0a8ea9b571e 99
dexterg 0:e0a8ea9b571e 100
dexterg 0:e0a8ea9b571e 101 ///convert to Shijie datagram
dexterg 2:e0b3cb47b4ff 102 if(rx_in<14){
dexterg 2:e0b3cb47b4ff 103 if(fpgaBuffer[2]!=0xFF) {
dexterg 2:e0b3cb47b4ff 104 lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 105 oTwo = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 106 peak = (256 * (fpgaBuffer[4]))+fpgaBuffer[5];
dexterg 2:e0b3cb47b4ff 107 trough = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 2:e0b3cb47b4ff 108 ancil = (10 * (fpgaBuffer[8] >> 4)) + (fpgaBuffer[8] & 15)+(((10.0 * (fpgaBuffer[9] >> 4)) + 1.0*(fpgaBuffer[9] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 109 // 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]);
dexterg 2:e0b3cb47b4ff 110 } else {
dexterg 2:e0b3cb47b4ff 111 lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 112 oTwo = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 113 peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 2:e0b3cb47b4ff 114 trough = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
dexterg 2:e0b3cb47b4ff 115 ancil = (10 * (fpgaBuffer[12] >> 4)) + (fpgaBuffer[12] & 15)+(((10.0 * (fpgaBuffer[13] >> 4)) + 1.0*(fpgaBuffer[13] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 116 // 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]);
dexterg 2:e0b3cb47b4ff 117 }
dexterg 2:e0b3cb47b4ff 118 }else{
dexterg 2:e0b3cb47b4ff 119 label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
dexterg 2:e0b3cb47b4ff 120 lifeTime = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 121 oTwo = (10 * (fpgaBuffer[4] >> 4)) + (fpgaBuffer[4] & 15)+(((10.0 * (fpgaBuffer[5] >> 4)) + 1.0*(fpgaBuffer[5] & 15))/100.0);
dexterg 0:e0a8ea9b571e 122 peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 2:e0b3cb47b4ff 123 trough = (256 * (fpgaBuffer[8]))+fpgaBuffer[9];
dexterg 2:e0b3cb47b4ff 124 pressure = (256 * (fpgaBuffer[10]))+fpgaBuffer[11];
dexterg 2:e0b3cb47b4ff 125 temperature = (10 * (fpgaBuffer[12] & 15)) + (fpgaBuffer[13] >> 4) + (1.0*(fpgaBuffer[13] & 15)/10 );
dexterg 0:e0a8ea9b571e 126 }
dexterg 2:e0b3cb47b4ff 127
dexterg 0:e0a8ea9b571e 128 newData=1;
dexterg 0:e0a8ea9b571e 129 rx_in=0;
dexterg 0:e0a8ea9b571e 130 return;
dexterg 0:e0a8ea9b571e 131 }
dexterg 0:e0a8ea9b571e 132 int createFile=0;
dexterg 1:ab74071de2c8 133 char* strings;
dexterg 1:ab74071de2c8 134 string s1;
dexterg 1:ab74071de2c8 135 string s2;
dexterg 1:ab74071de2c8 136 int msgCode;
dexterg 1:ab74071de2c8 137 int msgValue;
dexterg 0:e0a8ea9b571e 138 int main()
dexterg 0:e0a8ea9b571e 139 {
dexterg 1:ab74071de2c8 140 //Comment below to test without RTC and SD
dexterg 0:e0a8ea9b571e 141 externalTrig=0;
dexterg 0:e0a8ea9b571e 142 button.mode(PullUp);
dexterg 0:e0a8ea9b571e 143 button.fall(&bPush);
dexterg 0:e0a8ea9b571e 144 button2.mode(PullUp);
dexterg 0:e0a8ea9b571e 145 button2.fall(&bPush2);
dexterg 1:ab74071de2c8 146
dexterg 0:e0a8ea9b571e 147 fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq);
dexterg 0:e0a8ea9b571e 148 FILE *fpo = fopen("/sd/d.txt", "r");
dexterg 0:e0a8ea9b571e 149 if(fpo == NULL) {
dexterg 0:e0a8ea9b571e 150 createFile=1;
dexterg 0:e0a8ea9b571e 151 }
dexterg 0:e0a8ea9b571e 152
dexterg 0:e0a8ea9b571e 153 FILE *fp = fopen("/sd/d.txt", "a");
dexterg 0:e0a8ea9b571e 154 if(fp == NULL) {
dexterg 0:e0a8ea9b571e 155 fpga.printf("file system failed\r\n");
dexterg 0:e0a8ea9b571e 156 } else {
dexterg 0:e0a8ea9b571e 157 fpga.printf("file system active\r\n");
dexterg 1:ab74071de2c8 158 if(createFile==1) {
dexterg 1:ab74071de2c8 159 fprintf(fp, "DateTime,Lifetime,02,Peak,Trough,Ancil\r\n");
dexterg 1:ab74071de2c8 160 }
dexterg 0:e0a8ea9b571e 161 }
dexterg 0:e0a8ea9b571e 162 fclose(fp);
dexterg 0:e0a8ea9b571e 163 ds3231_cntl_stat_t rtc_control_status = {1,1};
dexterg 0:e0a8ea9b571e 164 rtc.set_cntl_stat_reg(rtc_control_status);
dexterg 0:e0a8ea9b571e 165 time_t epoch_time;
dexterg 0:e0a8ea9b571e 166 epoch_time = rtc.get_epoch();
dexterg 1:ab74071de2c8 167 //Comment above to test without RTC and SD
dexterg 0:e0a8ea9b571e 168
dexterg 0:e0a8ea9b571e 169
dexterg 1:ab74071de2c8 170 fpga.baud(9600);
dexterg 1:ab74071de2c8 171 fpga.printf("start v2 \r\n");
dexterg 1:ab74071de2c8 172
dexterg 1:ab74071de2c8 173 serial_t0.baud(4800);
dexterg 1:ab74071de2c8 174 serial_t0.printf("start soft serial\r\n");//DEBUG
dexterg 1:ab74071de2c8 175 serial_t0.attach(&serial_t0_RxInt,SoftSerial::RxIrq);
dexterg 1:ab74071de2c8 176 serial_t0.printf("entering loop\r\n"); ///DEBUG
dexterg 0:e0a8ea9b571e 177
dexterg 0:e0a8ea9b571e 178 while(1) {
dexterg 1:ab74071de2c8 179 //serial_t0.printf("looping \r\n");
dexterg 1:ab74071de2c8 180 //fpga.printf("Im looping too");
dexterg 1:ab74071de2c8 181
dexterg 0:e0a8ea9b571e 182 myled = 1;
dexterg 0:e0a8ea9b571e 183 wait(0.2);
dexterg 0:e0a8ea9b571e 184 myled = 0;
dexterg 0:e0a8ea9b571e 185 wait(0.2);
dexterg 1:ab74071de2c8 186
dexterg 1:ab74071de2c8 187 ///print data to file
dexterg 0:e0a8ea9b571e 188 if(newData==1) {
dexterg 3:f1287f5fde38 189 sprintf(pbuff,"%f,%f,%f,%f,%f,%f,%f",label,lifeTime,oTwo,peak,trough,pressure,temperature);
dexterg 3:f1287f5fde38 190 //serial_t0.printf("%s",pbuff);
dexterg 2:e0b3cb47b4ff 191 //sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil);
dexterg 2:e0b3cb47b4ff 192 //fpga.printf("%s",pbuff);
dexterg 0:e0a8ea9b571e 193 time_t epoch_time;
dexterg 0:e0a8ea9b571e 194 epoch_time = rtc.get_epoch();
dexterg 0:e0a8ea9b571e 195 strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time));
dexterg 0:e0a8ea9b571e 196 FILE *fp = fopen("/sd/d.txt", "a");
dexterg 0:e0a8ea9b571e 197 if(fp == NULL) {
dexterg 0:e0a8ea9b571e 198 } else {
dexterg 0:e0a8ea9b571e 199 fprintf(fp, "%s,%s\r\n",tbuff,pbuff);
dexterg 0:e0a8ea9b571e 200 }
dexterg 3:f1287f5fde38 201 serial_t0.printf("%s,%s\r\n",tbuff,pbuff);
dexterg 0:e0a8ea9b571e 202 fclose(fp);
dexterg 0:e0a8ea9b571e 203 newData=0;
dexterg 1:ab74071de2c8 204 }
dexterg 1:ab74071de2c8 205
dexterg 1:ab74071de2c8 206 if(newSoftData==1){
dexterg 1:ab74071de2c8 207 rxSoftIn=0;
dexterg 1:ab74071de2c8 208 newSoftData=0;
dexterg 1:ab74071de2c8 209
dexterg 1:ab74071de2c8 210 //serial_t0.printf(softBuffer);
dexterg 1:ab74071de2c8 211
dexterg 1:ab74071de2c8 212 string str(softBuffer);
dexterg 1:ab74071de2c8 213 s1="";
dexterg 1:ab74071de2c8 214 s2="";
dexterg 1:ab74071de2c8 215 strings = strtok(softBuffer,",");
dexterg 1:ab74071de2c8 216 if(strings!=NULL){
dexterg 1:ab74071de2c8 217 s1 = strings;
dexterg 1:ab74071de2c8 218 strings = strtok(NULL,",");
dexterg 1:ab74071de2c8 219 if(strings!=NULL){
dexterg 1:ab74071de2c8 220 s2= strings;
dexterg 1:ab74071de2c8 221 serial_t0.printf("Received code %s, value %s ",s1,s2);
dexterg 1:ab74071de2c8 222 msgCode = atoi(s1.c_str());
dexterg 1:ab74071de2c8 223 if(msgCode==1||msgCode==2||msgCode==3||msgCode==4){
dexterg 1:ab74071de2c8 224 msgValue = atoi(s2.c_str());
dexterg 1:ab74071de2c8 225 softBuffer[0] = msgCode;
dexterg 1:ab74071de2c8 226 softBuffer[1] = msgValue/255; //LSB
dexterg 1:ab74071de2c8 227 softBuffer[2] = msgValue%255; //MSB
dexterg 1:ab74071de2c8 228 softBuffer[3] = '\0';
dexterg 1:ab74071de2c8 229 serial_t0.printf("Relayed datagram: %x %x %x",softBuffer[0],softBuffer[1],softBuffer[2]); //DEBUG
dexterg 1:ab74071de2c8 230 //fpga.printf(softBuffer[0]);fpga.printf(softBuffer[1]);fpga.printf(softBuffer[3]);
dexterg 1:ab74071de2c8 231 fpga.putc(softBuffer[0]);fpga.putc(softBuffer[1]);fpga.putc(softBuffer[2]);///sned the datagram to fpga
dexterg 1:ab74071de2c8 232
dexterg 1:ab74071de2c8 233 }else if(msgCode==5){
dexterg 1:ab74071de2c8 234 ///Parse date time write to rtc.
dexterg 1:ab74071de2c8 235 }
dexterg 1:ab74071de2c8 236 }
dexterg 1:ab74071de2c8 237 }
dexterg 1:ab74071de2c8 238
dexterg 1:ab74071de2c8 239
dexterg 0:e0a8ea9b571e 240 }
dexterg 1:ab74071de2c8 241
dexterg 0:e0a8ea9b571e 242 }
dexterg 0:e0a8ea9b571e 243 }