Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

Committer:
dexterg
Date:
Sun Nov 22 22:39:17 2015 +0000
Revision:
1:ab74071de2c8
Parent:
0:e0a8ea9b571e
Child:
2:e0b3cb47b4ff
Implemented datagram tx from PC-UC-FPGA

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