Data logger with SD card storage and RTC

Dependencies:   SDFileSystem SoftSerial ds3231 mbed

Committer:
dexterg
Date:
Thu Dec 03 10:30:23 2015 +0000
Revision:
5:159a0b7172c8
Parent:
4:3b055e2a9f4e
Child:
6:facc3b44ab4e
Updated SD card read

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 5:159a0b7172c8 74 char rBuffer[255];
dexterg 1:ab74071de2c8 75 volatile int rxSoftIn=0;
dexterg 1:ab74071de2c8 76 volatile int rxSoftOut=0;
dexterg 1:ab74071de2c8 77 int newSoftData=0;
dexterg 1:ab74071de2c8 78
dexterg 1:ab74071de2c8 79 int setT0 = 0;
dexterg 1:ab74071de2c8 80 int setPre0=0;
dexterg 1:ab74071de2c8 81 int setM=0;
dexterg 1:ab74071de2c8 82 int setC=0;
dexterg 1:ab74071de2c8 83
dexterg 5:159a0b7172c8 84 void serial_t0_RxInt()
dexterg 5:159a0b7172c8 85 {
dexterg 1:ab74071de2c8 86 while ((serial_t0.readable()) && (((rxSoftIn + 1) % buffer_size) != rxSoftOut)) {
dexterg 1:ab74071de2c8 87 softBuffer[rxSoftIn] = serial_t0.getc();
dexterg 1:ab74071de2c8 88 rxSoftIn = (rxSoftIn + 1) % buffer_size;
dexterg 1:ab74071de2c8 89 }
dexterg 1:ab74071de2c8 90 softBuffer[rxSoftIn]='\0';
dexterg 1:ab74071de2c8 91 newSoftData=1;
dexterg 1:ab74071de2c8 92 }
dexterg 1:ab74071de2c8 93
dexterg 0:e0a8ea9b571e 94 void fpga_Rx_interrupt()
dexterg 0:e0a8ea9b571e 95 {
dexterg 0:e0a8ea9b571e 96 wait(0.1);
dexterg 0:e0a8ea9b571e 97 while ((fpga.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
dexterg 0:e0a8ea9b571e 98 fpgaBuffer[rx_in] = fpga.getc();
dexterg 0:e0a8ea9b571e 99 rx_in = (rx_in + 1) % buffer_size;
dexterg 0:e0a8ea9b571e 100 }
dexterg 0:e0a8ea9b571e 101
dexterg 0:e0a8ea9b571e 102
dexterg 0:e0a8ea9b571e 103 ///convert to Shijie datagram
dexterg 5:159a0b7172c8 104 if(rx_in<14) {
dexterg 2:e0b3cb47b4ff 105 if(fpgaBuffer[2]!=0xFF) {
dexterg 2:e0b3cb47b4ff 106 lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 107 oTwo = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 108 peak = (256 * (fpgaBuffer[4]))+fpgaBuffer[5];
dexterg 2:e0b3cb47b4ff 109 trough = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 2:e0b3cb47b4ff 110 ancil = (10 * (fpgaBuffer[8] >> 4)) + (fpgaBuffer[8] & 15)+(((10.0 * (fpgaBuffer[9] >> 4)) + 1.0*(fpgaBuffer[9] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 111 // 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 112 } else {
dexterg 2:e0b3cb47b4ff 113 lifeTime = (10 * (fpgaBuffer[0] >> 4)) + (fpgaBuffer[0] & 15)+(((10.0 * (fpgaBuffer[1] >> 4)) + 1.0*(fpgaBuffer[1] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 114 oTwo = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 115 peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 2:e0b3cb47b4ff 116 trough = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
dexterg 2:e0b3cb47b4ff 117 ancil = (10 * (fpgaBuffer[12] >> 4)) + (fpgaBuffer[12] & 15)+(((10.0 * (fpgaBuffer[13] >> 4)) + 1.0*(fpgaBuffer[13] & 15))/100.0);
dexterg 2:e0b3cb47b4ff 118 // 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 119 }
dexterg 5:159a0b7172c8 120 } else {
dexterg 5:159a0b7172c8 121
dexterg 5:159a0b7172c8 122 if(rx_in<18) {
dexterg 5:159a0b7172c8 123
dexterg 5:159a0b7172c8 124 label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
dexterg 5:159a0b7172c8 125 lifeTime = (10 * (fpgaBuffer[2] >> 4)) + (fpgaBuffer[2] & 15)+(((10.0 * (fpgaBuffer[3] >> 4)) + 1.0*(fpgaBuffer[3] & 15))/100.0);
dexterg 5:159a0b7172c8 126 oTwo = (10 * (fpgaBuffer[4] >> 4)) + (fpgaBuffer[4] & 15)+(((10.0 * (fpgaBuffer[5] >> 4)) + 1.0*(fpgaBuffer[5] & 15))/100.0);
dexterg 5:159a0b7172c8 127 peak = (256 * (fpgaBuffer[6]))+fpgaBuffer[7];
dexterg 5:159a0b7172c8 128 trough = (256 * (fpgaBuffer[8]))+fpgaBuffer[9];
dexterg 5:159a0b7172c8 129 pressure = (256 * (fpgaBuffer[10]))+fpgaBuffer[11];
dexterg 5:159a0b7172c8 130 temperature = (10 * (fpgaBuffer[12] & 15)) + (fpgaBuffer[13] >> 4) + (1.0*(fpgaBuffer[13] & 15)/10 );
dexterg 5:159a0b7172c8 131
dexterg 5:159a0b7172c8 132 } else {
dexterg 5:159a0b7172c8 133
dexterg 5:159a0b7172c8 134 label = (256 * (fpgaBuffer[0]))+fpgaBuffer[1];
dexterg 5:159a0b7172c8 135 lifeTime = (10 * (fpgaBuffer[3] >> 4)) + (fpgaBuffer[3] & 15)+(((10.0 * (fpgaBuffer[4] >> 4)) + 1.0*(fpgaBuffer[4] & 15))/100.0);
dexterg 5:159a0b7172c8 136 oTwo = (10 * (fpgaBuffer[6] >> 4)) + (fpgaBuffer[6] & 15)+(((10.0 * (fpgaBuffer[7] >> 4)) + 1.0*(fpgaBuffer[7] & 15))/100.0);
dexterg 5:159a0b7172c8 137 peak = (256 * (fpgaBuffer[9]))+fpgaBuffer[10];
dexterg 5:159a0b7172c8 138 trough = (256 * (fpgaBuffer[12]))+fpgaBuffer[13];
dexterg 5:159a0b7172c8 139 pressure = (256 * (fpgaBuffer[15]))+fpgaBuffer[16];
dexterg 5:159a0b7172c8 140 temperature = (10 * (fpgaBuffer[18] & 15)) + (fpgaBuffer[19] >> 4) + (1.0*(fpgaBuffer[19] & 15)/10 );
dexterg 4:3b055e2a9f4e 141 }
dexterg 0:e0a8ea9b571e 142 }
dexterg 5:159a0b7172c8 143
dexterg 0:e0a8ea9b571e 144 newData=1;
dexterg 0:e0a8ea9b571e 145 rx_in=0;
dexterg 0:e0a8ea9b571e 146 return;
dexterg 0:e0a8ea9b571e 147 }
dexterg 0:e0a8ea9b571e 148 int createFile=0;
dexterg 1:ab74071de2c8 149 char* strings;
dexterg 1:ab74071de2c8 150 string s1;
dexterg 1:ab74071de2c8 151 string s2;
dexterg 5:159a0b7172c8 152 int r;
dexterg 1:ab74071de2c8 153 int msgCode;
dexterg 1:ab74071de2c8 154 int msgValue;
dexterg 5:159a0b7172c8 155 int lineN;
dexterg 0:e0a8ea9b571e 156 int main()
dexterg 0:e0a8ea9b571e 157 {
dexterg 1:ab74071de2c8 158 //Comment below to test without RTC and SD
dexterg 0:e0a8ea9b571e 159 externalTrig=0;
dexterg 0:e0a8ea9b571e 160 button.mode(PullUp);
dexterg 0:e0a8ea9b571e 161 button.fall(&bPush);
dexterg 0:e0a8ea9b571e 162 button2.mode(PullUp);
dexterg 0:e0a8ea9b571e 163 button2.fall(&bPush2);
dexterg 5:159a0b7172c8 164
dexterg 0:e0a8ea9b571e 165 fpga.attach(&fpga_Rx_interrupt,Serial::RxIrq);
dexterg 0:e0a8ea9b571e 166 FILE *fpo = fopen("/sd/d.txt", "r");
dexterg 0:e0a8ea9b571e 167 if(fpo == NULL) {
dexterg 0:e0a8ea9b571e 168 createFile=1;
dexterg 0:e0a8ea9b571e 169 }
dexterg 5:159a0b7172c8 170 fclose(fpo);
dexterg 5:159a0b7172c8 171
dexterg 0:e0a8ea9b571e 172 FILE *fp = fopen("/sd/d.txt", "a");
dexterg 0:e0a8ea9b571e 173 if(fp == NULL) {
dexterg 0:e0a8ea9b571e 174 fpga.printf("file system failed\r\n");
dexterg 0:e0a8ea9b571e 175 } else {
dexterg 0:e0a8ea9b571e 176 fpga.printf("file system active\r\n");
dexterg 1:ab74071de2c8 177 if(createFile==1) {
dexterg 5:159a0b7172c8 178 //fprintf(fp, "DateTime,Lifetime,02,Peak,Trough,Ancil\r\n");
dexterg 1:ab74071de2c8 179 }
dexterg 0:e0a8ea9b571e 180 }
dexterg 0:e0a8ea9b571e 181 fclose(fp);
dexterg 0:e0a8ea9b571e 182 ds3231_cntl_stat_t rtc_control_status = {1,1};
dexterg 0:e0a8ea9b571e 183 rtc.set_cntl_stat_reg(rtc_control_status);
dexterg 0:e0a8ea9b571e 184 time_t epoch_time;
dexterg 0:e0a8ea9b571e 185 epoch_time = rtc.get_epoch();
dexterg 1:ab74071de2c8 186 //Comment above to test without RTC and SD
dexterg 0:e0a8ea9b571e 187
dexterg 0:e0a8ea9b571e 188
dexterg 1:ab74071de2c8 189 fpga.baud(9600);
dexterg 1:ab74071de2c8 190 fpga.printf("start v2 \r\n");
dexterg 5:159a0b7172c8 191
dexterg 1:ab74071de2c8 192 serial_t0.baud(4800);
dexterg 1:ab74071de2c8 193 serial_t0.printf("start soft serial\r\n");//DEBUG
dexterg 1:ab74071de2c8 194 serial_t0.attach(&serial_t0_RxInt,SoftSerial::RxIrq);
dexterg 1:ab74071de2c8 195 serial_t0.printf("entering loop\r\n"); ///DEBUG
dexterg 0:e0a8ea9b571e 196
dexterg 0:e0a8ea9b571e 197 while(1) {
dexterg 1:ab74071de2c8 198 //serial_t0.printf("looping \r\n");
dexterg 1:ab74071de2c8 199 //fpga.printf("Im looping too");
dexterg 5:159a0b7172c8 200
dexterg 0:e0a8ea9b571e 201 myled = 1;
dexterg 0:e0a8ea9b571e 202 wait(0.2);
dexterg 0:e0a8ea9b571e 203 myled = 0;
dexterg 0:e0a8ea9b571e 204 wait(0.2);
dexterg 5:159a0b7172c8 205
dexterg 1:ab74071de2c8 206 ///print data to file
dexterg 0:e0a8ea9b571e 207 if(newData==1) {
dexterg 3:f1287f5fde38 208 sprintf(pbuff,"%f,%f,%f,%f,%f,%f,%f",label,lifeTime,oTwo,peak,trough,pressure,temperature);
dexterg 3:f1287f5fde38 209 //serial_t0.printf("%s",pbuff);
dexterg 2:e0b3cb47b4ff 210 //sprintf(pbuff,"%f, %f, %f, %f, %f",lifeTime,oTwo,peak,trough,ancil);
dexterg 2:e0b3cb47b4ff 211 //fpga.printf("%s",pbuff);
dexterg 0:e0a8ea9b571e 212 time_t epoch_time;
dexterg 0:e0a8ea9b571e 213 epoch_time = rtc.get_epoch();
dexterg 0:e0a8ea9b571e 214 strftime(tbuff, 32, "%Y-%m-%d %H:%M:%S %Z", localtime(&epoch_time));
dexterg 0:e0a8ea9b571e 215 FILE *fp = fopen("/sd/d.txt", "a");
dexterg 0:e0a8ea9b571e 216 if(fp == NULL) {
dexterg 0:e0a8ea9b571e 217 } else {
dexterg 0:e0a8ea9b571e 218 fprintf(fp, "%s,%s\r\n",tbuff,pbuff);
dexterg 0:e0a8ea9b571e 219 }
dexterg 3:f1287f5fde38 220 serial_t0.printf("%s,%s\r\n",tbuff,pbuff);
dexterg 0:e0a8ea9b571e 221 fclose(fp);
dexterg 0:e0a8ea9b571e 222 newData=0;
dexterg 5:159a0b7172c8 223 }
dexterg 5:159a0b7172c8 224
dexterg 5:159a0b7172c8 225 if(newSoftData==1) {
dexterg 1:ab74071de2c8 226 rxSoftIn=0;
dexterg 1:ab74071de2c8 227 newSoftData=0;
dexterg 5:159a0b7172c8 228
dexterg 1:ab74071de2c8 229 //serial_t0.printf(softBuffer);
dexterg 5:159a0b7172c8 230
dexterg 1:ab74071de2c8 231 string str(softBuffer);
dexterg 5:159a0b7172c8 232
dexterg 5:159a0b7172c8 233 if(softBuffer[0]=='S'&&softBuffer[1]=='D') {
dexterg 5:159a0b7172c8 234 FILE *fr = fopen("/sd/d.txt", "r");
dexterg 5:159a0b7172c8 235 if(fr == NULL) {
dexterg 5:159a0b7172c8 236 serial_t0.printf("Could not open file for read");
dexterg 5:159a0b7172c8 237 } else {
dexterg 5:159a0b7172c8 238 lineN=0;
dexterg 5:159a0b7172c8 239 while( fgets(rBuffer , 200 , fr) != NULL && !( rBuffer[0]=='D' && lineN==1) ) {
dexterg 5:159a0b7172c8 240 if(rBuffer[0]=='D') {
dexterg 5:159a0b7172c8 241 lineN++;
dexterg 5:159a0b7172c8 242 } else {
dexterg 5:159a0b7172c8 243 serial_t0.printf("%s",rBuffer);
dexterg 5:159a0b7172c8 244 wait(0.040);
dexterg 5:159a0b7172c8 245 }
dexterg 5:159a0b7172c8 246 }
dexterg 5:159a0b7172c8 247 }
dexterg 5:159a0b7172c8 248 } else {
dexterg 5:159a0b7172c8 249
dexterg 5:159a0b7172c8 250 s1="";
dexterg 5:159a0b7172c8 251 s2="";
dexterg 5:159a0b7172c8 252 strings = strtok(softBuffer,",");
dexterg 5:159a0b7172c8 253 if(strings!=NULL) {
dexterg 5:159a0b7172c8 254 s1 = strings;
dexterg 5:159a0b7172c8 255 strings = strtok(NULL,",");
dexterg 5:159a0b7172c8 256 if(strings!=NULL) {
dexterg 5:159a0b7172c8 257 s2= strings;
dexterg 5:159a0b7172c8 258 serial_t0.printf("Received code %s, value %s ",s1,s2);
dexterg 5:159a0b7172c8 259 msgCode = atoi(s1.c_str());
dexterg 5:159a0b7172c8 260 if(msgCode==1||msgCode==2||msgCode==3||msgCode==4) {
dexterg 5:159a0b7172c8 261 msgValue = atoi(s2.c_str());
dexterg 5:159a0b7172c8 262 softBuffer[0] = msgCode;
dexterg 5:159a0b7172c8 263 softBuffer[1] = msgValue/255; //LSB
dexterg 5:159a0b7172c8 264 softBuffer[2] = msgValue%255; //MSB
dexterg 5:159a0b7172c8 265 softBuffer[3] = '\0';
dexterg 5:159a0b7172c8 266 serial_t0.printf("Relayed datagram: %x %x %x",softBuffer[0],softBuffer[1],softBuffer[2]); //DEBUG
dexterg 5:159a0b7172c8 267 //fpga.printf(softBuffer[0]);fpga.printf(softBuffer[1]);fpga.printf(softBuffer[3]);
dexterg 5:159a0b7172c8 268 fpga.putc(softBuffer[0]);
dexterg 5:159a0b7172c8 269 fpga.putc(softBuffer[1]);
dexterg 5:159a0b7172c8 270 fpga.putc(softBuffer[2]);///sned the datagram to fpga
dexterg 5:159a0b7172c8 271
dexterg 5:159a0b7172c8 272 } else if(msgCode==5) {
dexterg 5:159a0b7172c8 273 ///Parse date time write to rtc.
dexterg 5:159a0b7172c8 274 }
dexterg 1:ab74071de2c8 275 }
dexterg 1:ab74071de2c8 276 }
dexterg 1:ab74071de2c8 277 }
dexterg 1:ab74071de2c8 278
dexterg 0:e0a8ea9b571e 279 }
dexterg 1:ab74071de2c8 280
dexterg 0:e0a8ea9b571e 281 }
dexterg 0:e0a8ea9b571e 282 }