CSE477 / swimate_v2

Dependencies:   Adafruit_GFX_128x64 DS3231 PinDetect SDFileSystem USBDevice mbed RealtimeMath MODSERIAL

Committer:
ellingjp
Date:
Sun Jun 08 04:08:41 2014 +0000
Revision:
23:80083138d609
Parent:
22:9350752f5414
Working with new oled using hacks

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ellingjp 9:a711b5b34d73 1 #include "mbed.h"
ellingjp 9:a711b5b34d73 2 #include "sync.h"
paulbartell 13:227a6cfd2097 3 #include "DS3231.h"
paulbartell 13:227a6cfd2097 4 #include "Timeout.h"
paulbartell 14:006d9087d76c 5 #include "SDFileSystem.h"
briggsa 18:06b718f8e6fd 6 #include "MODSERIAL.h"
briggsa 18:06b718f8e6fd 7 #include "debug.h"
briggsa 18:06b718f8e6fd 8 #include <string>
briggsa 18:06b718f8e6fd 9 #include <string.h>
briggsa 18:06b718f8e6fd 10 #include <stdlib.h>
briggsa 18:06b718f8e6fd 11 #include <stdio.h>
briggsa 18:06b718f8e6fd 12 #include <limits.h>
briggsa 18:06b718f8e6fd 13 #include "comms.h"
briggsa 18:06b718f8e6fd 14
paulbartell 13:227a6cfd2097 15 enum state {IDLE, CAPTURE, SYNC};
paulbartell 13:227a6cfd2097 16 extern enum state State;
paulbartell 13:227a6cfd2097 17 extern DS3231 rtc;
paulbartell 13:227a6cfd2097 18 Timeout t;
ellingjp 9:a711b5b34d73 19
briggsa 18:06b718f8e6fd 20 //MODSERIAL bt(P0_19, P0_18); // tx, rx
briggsa 18:06b718f8e6fd 21 Comms btComm;
paulbartell 13:227a6cfd2097 22 uint16_t packetSeq = 0;
ellingjp 9:a711b5b34d73 23
briggsa 18:06b718f8e6fd 24 bool sync_init()
briggsa 18:06b718f8e6fd 25 {
ellingjp 9:a711b5b34d73 26 return true;
ellingjp 9:a711b5b34d73 27 }
ellingjp 9:a711b5b34d73 28
paulbartell 13:227a6cfd2097 29
briggsa 18:06b718f8e6fd 30
briggsa 18:06b718f8e6fd 31 //void setRtc(packet *p)
briggsa 18:06b718f8e6fd 32 //{
briggsa 18:06b718f8e6fd 33 // int dayOfWeek=0, date, month, year, hours, minutes, seconds;
briggsa 18:06b718f8e6fd 34 // uint16_t len;
briggsa 18:06b718f8e6fd 35 // len = getLen();
briggsa 18:06b718f8e6fd 36 // int i = 0;
briggsa 18:06b718f8e6fd 37 // for(i = 0; i < len; i++)
briggsa 18:06b718f8e6fd 38 // {
briggsa 18:06b718f8e6fd 39 // buff[i] = bt.getc();
briggsa 18:06b718f8e6fd 40 // }
briggsa 18:06b718f8e6fd 41 // buff[i] = 0; // end the string with a zero
briggsa 18:06b718f8e6fd 42 // sscanf(buff, "%04d-%02d-%02d %02d:%02d:%02d",&year,&month,&date,&hours,&minutes,&seconds);
briggsa 18:06b718f8e6fd 43 // rtc.setDate(dayOfWeek, date, month, year);
briggsa 18:06b718f8e6fd 44 // rtc.setTime(hours, minutes, seconds);
briggsa 18:06b718f8e6fd 45 // //sendResponse(CMD_RTCSET, ACK);
briggsa 18:06b718f8e6fd 46 //}
paulbartell 13:227a6cfd2097 47
briggsa 18:06b718f8e6fd 48 //void listSessions()
briggsa 18:06b718f8e6fd 49 //{ //todo buffer this with buff
briggsa 18:06b718f8e6fd 50 // DIR *dp;
briggsa 18:06b718f8e6fd 51 // struct dirent *dirp;
briggsa 18:06b718f8e6fd 52 // dp = opendir("/sd/");
briggsa 18:06b718f8e6fd 53 // while((dirp = readdir(dp)) != NULL) {
briggsa 18:06b718f8e6fd 54 // bt.puts(dirp->d_name);
briggsa 18:06b718f8e6fd 55 // bt.putc(',');
briggsa 18:06b718f8e6fd 56 // //todo: put size here?
briggsa 18:06b718f8e6fd 57 // bt.puts("\r\\n");
briggsa 18:06b718f8e6fd 58 // }
briggsa 18:06b718f8e6fd 59 // closedir(dp);
briggsa 18:06b718f8e6fd 60 //}
briggsa 18:06b718f8e6fd 61
briggsa 18:06b718f8e6fd 62 //void syncSession()
briggsa 18:06b718f8e6fd 63 //{
briggsa 18:06b718f8e6fd 64 // //sendResponse(buf[0], resp);
briggsa 18:06b718f8e6fd 65 // //populate packet:
briggsa 18:06b718f8e6fd 66 // //1 byte CMD_SYNCSESSION 0x03
briggsa 18:06b718f8e6fd 67 // //2 bytes packet number
briggsa 18:06b718f8e6fd 68 // //2 bytes current packet's data's length
briggsa 18:06b718f8e6fd 69 // //2 bytes checksum
briggsa 18:06b718f8e6fd 70 //}
briggsa 18:06b718f8e6fd 71 //
briggsa 18:06b718f8e6fd 72
briggsa 18:06b718f8e6fd 73 /* Sends a file over BT stream. Returns
briggsa 18:06b718f8e6fd 74 * true on success, false on failure. */
briggsa 18:06b718f8e6fd 75 bool sendFile(string filename)
paulbartell 13:227a6cfd2097 76 {
briggsa 18:06b718f8e6fd 77 PC_PRINTLNF("sendFile: Trying to open file %s", filename.c_str());
briggsa 18:06b718f8e6fd 78 FILE *fp = fopen(filename.c_str(), "r");
briggsa 18:06b718f8e6fd 79 if (fp == NULL) {
briggsa 18:06b718f8e6fd 80 PC_PRINTLNF("sendFile: Error opening file %s", filename.c_str());
briggsa 18:06b718f8e6fd 81 return false;
briggsa 18:06b718f8e6fd 82 }
briggsa 18:06b718f8e6fd 83
briggsa 18:06b718f8e6fd 84 uint8_t *d = new uint8_t[PACKET_MAX_DATA];
paulbartell 13:227a6cfd2097 85
ellingjp 21:2fa676f214fe 86 if (fp == NULL) {
ellingjp 21:2fa676f214fe 87 PC_PRINTLNF("sendFile: Error opening file %s", filename.c_str());
ellingjp 21:2fa676f214fe 88 return false;
ellingjp 21:2fa676f214fe 89 }
ellingjp 21:2fa676f214fe 90
ellingjp 21:2fa676f214fe 91 fseek(fp, 0L, SEEK_END);
ellingjp 21:2fa676f214fe 92 int file_size = ftell(fp);
ellingjp 21:2fa676f214fe 93 fseek(fp, 0L, SEEK_SET);
ellingjp 21:2fa676f214fe 94
ellingjp 21:2fa676f214fe 95 Packet *firstPacket = Packet::create(CMD_SYNCOLDEST, 0x00, sizeof(file_size), (uint8_t *) &file_size);
ellingjp 21:2fa676f214fe 96 btComm.sendPacket(firstPacket);
ellingjp 21:2fa676f214fe 97
ellingjp 21:2fa676f214fe 98 PC_PRINTLNF("sendFile: first packet checksum = %x", firstPacket->checkSum);
ellingjp 21:2fa676f214fe 99
ellingjp 21:2fa676f214fe 100 delete firstPacket;
ellingjp 9:a711b5b34d73 101
ellingjp 21:2fa676f214fe 102 Packet *res;
ellingjp 21:2fa676f214fe 103 int n = btComm.receivePacket(&res, TIMEOUT);
ellingjp 21:2fa676f214fe 104 if (n <= 0) {
ellingjp 21:2fa676f214fe 105 PC_PRINTLN("sendFile: timeout waiting for ack!");
ellingjp 21:2fa676f214fe 106 fclose(fp);
ellingjp 21:2fa676f214fe 107 return false;
ellingjp 21:2fa676f214fe 108 }
ellingjp 21:2fa676f214fe 109
ellingjp 21:2fa676f214fe 110 if (res->cmd != ACK) {
ellingjp 21:2fa676f214fe 111 PC_PRINTLN("sendFile: packet received was not an ack!");
ellingjp 21:2fa676f214fe 112 delete res;
ellingjp 21:2fa676f214fe 113 fclose(fp);
ellingjp 21:2fa676f214fe 114 return false;
ellingjp 21:2fa676f214fe 115 }
ellingjp 21:2fa676f214fe 116
ellingjp 21:2fa676f214fe 117 delete res;
ellingjp 21:2fa676f214fe 118
briggsa 18:06b718f8e6fd 119 PC_PRINTLN("sendFile: created buffer");
briggsa 18:06b718f8e6fd 120 int len;
ellingjp 21:2fa676f214fe 121 int numPackets = 0;
ellingjp 22:9350752f5414 122
briggsa 18:06b718f8e6fd 123 while ( (len = fread(d, 1, PACKET_MAX_DATA, fp) ) > 0 ) {
ellingjp 21:2fa676f214fe 124 PC_PRINTLNF("sendFile: packet number: %d ", numPackets);
ellingjp 21:2fa676f214fe 125 PC_PRINTLNF("length: %d", len);
briggsa 18:06b718f8e6fd 126 PC_PRINTLNF("sendFile: sending packet of length %d", len);
briggsa 18:06b718f8e6fd 127
briggsa 18:06b718f8e6fd 128 Packet *p = Packet::create(CMD_SYNCOLDEST, 0x00, len, d);
ellingjp 21:2fa676f214fe 129 PC_PRINTLNF("sendFile: packet checksum = %x", p->checkSum);
briggsa 18:06b718f8e6fd 130 btComm.sendPacket(p);
briggsa 18:06b718f8e6fd 131 delete p;
paulbartell 13:227a6cfd2097 132
ellingjp 21:2fa676f214fe 133 for (int i = 0; i < len; i++) {
ellingjp 21:2fa676f214fe 134 PC_PRINTLNF("sendFile: packet[%d] = ", i);
ellingjp 21:2fa676f214fe 135 PC_PRINTLNF("%x", d[i]);
ellingjp 21:2fa676f214fe 136 }
ellingjp 21:2fa676f214fe 137
briggsa 18:06b718f8e6fd 138 PC_PRINTLNF("sendFile: sent packet of length %d", len);
ellingjp 21:2fa676f214fe 139 PC_PRINTLN("sendFile: waiting for ack...");
ellingjp 21:2fa676f214fe 140
ellingjp 21:2fa676f214fe 141 Packet *resp;
ellingjp 21:2fa676f214fe 142 int n = btComm.receivePacket(&resp, TIMEOUT);
ellingjp 21:2fa676f214fe 143 if (n <= 0) {
ellingjp 21:2fa676f214fe 144 PC_PRINTLN("sendFile: timeout waiting for ack!");
ellingjp 21:2fa676f214fe 145 fclose(fp);
ellingjp 21:2fa676f214fe 146 return false;
ellingjp 21:2fa676f214fe 147 }
ellingjp 21:2fa676f214fe 148
ellingjp 21:2fa676f214fe 149 if (resp->cmd != ACK) {
ellingjp 21:2fa676f214fe 150 PC_PRINTLN("sendFile: packet received was not an ack!");
ellingjp 21:2fa676f214fe 151 delete resp;
ellingjp 21:2fa676f214fe 152 fclose(fp);
ellingjp 21:2fa676f214fe 153 return false;
ellingjp 21:2fa676f214fe 154 }
ellingjp 21:2fa676f214fe 155
ellingjp 21:2fa676f214fe 156 delete resp;
ellingjp 21:2fa676f214fe 157
ellingjp 21:2fa676f214fe 158 PC_PRINTLN("sendFile: received ack!");
ellingjp 21:2fa676f214fe 159 numPackets++;
briggsa 18:06b718f8e6fd 160 }
briggsa 18:06b718f8e6fd 161 delete[] d;
briggsa 18:06b718f8e6fd 162
ellingjp 21:2fa676f214fe 163 PC_PRINTLNF("sendFile: done sending %s in ", filename.c_str());
ellingjp 21:2fa676f214fe 164 PC_PRINTLNF("%d packets.", numPackets);
briggsa 18:06b718f8e6fd 165 PC_PRINTLNF("sendFile: done sending %s", filename.c_str());
briggsa 18:06b718f8e6fd 166 // Appears to be a bug where feof isn't defined, so no error checking :(
briggsa 18:06b718f8e6fd 167 // if (!feof(fp)) {
briggsa 18:06b718f8e6fd 168 // PC_PRINTLNF("sendFile: Error reading file %s", absolute_filename.c_str());
briggsa 18:06b718f8e6fd 169 // return false;
briggsa 18:06b718f8e6fd 170 // }
briggsa 18:06b718f8e6fd 171
briggsa 18:06b718f8e6fd 172 fclose(fp);
briggsa 18:06b718f8e6fd 173 return true;
paulbartell 13:227a6cfd2097 174 }
paulbartell 13:227a6cfd2097 175
briggsa 18:06b718f8e6fd 176 /* Returns absolute filename of the oldest log file on the SD card */
briggsa 18:06b718f8e6fd 177 bool getOldestFile(string *oldest)
paulbartell 13:227a6cfd2097 178 {
briggsa 18:06b718f8e6fd 179
briggsa 18:06b718f8e6fd 180 PC_PRINTLN("Finding oldest file...");
paulbartell 13:227a6cfd2097 181
briggsa 18:06b718f8e6fd 182 // Ensure all fields get set to zero
briggsa 18:06b718f8e6fd 183 long long file_time = {0};
briggsa 18:06b718f8e6fd 184 long long oldest_time = LLONG_MAX; // ensures first file gets set to oldest
briggsa 18:06b718f8e6fd 185 string oldest_file;
briggsa 18:06b718f8e6fd 186
paulbartell 14:006d9087d76c 187 DIR *dp;
paulbartell 14:006d9087d76c 188 struct dirent *dirp;
paulbartell 14:006d9087d76c 189 dp = opendir("/sd/");
paulbartell 13:227a6cfd2097 190
briggsa 18:06b718f8e6fd 191 if (dp == NULL) {
briggsa 18:06b718f8e6fd 192 PC_PRINTLN("syncOldestSession: Error opening directory");
briggsa 18:06b718f8e6fd 193 return false;
briggsa 18:06b718f8e6fd 194 }
paulbartell 13:227a6cfd2097 195
briggsa 18:06b718f8e6fd 196 while((dirp = readdir(dp)) != NULL) {
briggsa 18:06b718f8e6fd 197 char *strp = dirp->d_name;
ellingjp 9:a711b5b34d73 198
briggsa 18:06b718f8e6fd 199 // Verify we are looking at a .log file
briggsa 18:06b718f8e6fd 200 char ext[5];
briggsa 18:06b718f8e6fd 201 memcpy(ext, strp+strlen(strp) - 4, 5);
briggsa 18:06b718f8e6fd 202 if (strncmp(ext, ".log", 4) == 0) {
briggsa 18:06b718f8e6fd 203 PC_PRINTLNF("syncOldestSession: reading file %s", dirp->d_name);
briggsa 18:06b718f8e6fd 204
briggsa 18:06b718f8e6fd 205 file_time = strtoll(strp, NULL, 10);
briggsa 18:06b718f8e6fd 206
briggsa 18:06b718f8e6fd 207 // If file time is older than oldest time, set the oldest file
briggsa 18:06b718f8e6fd 208 // to the current file
briggsa 18:06b718f8e6fd 209 if (file_time < oldest_time) {
briggsa 18:06b718f8e6fd 210 PC_PRINTLN("syncOldestSession: updating oldest file");
briggsa 18:06b718f8e6fd 211 oldest_time = file_time;
briggsa 18:06b718f8e6fd 212 oldest_file = strp;
paulbartell 13:227a6cfd2097 213 }
paulbartell 13:227a6cfd2097 214 }
ellingjp 9:a711b5b34d73 215 }
briggsa 18:06b718f8e6fd 216
briggsa 18:06b718f8e6fd 217 PC_PRINTLNF("getOldestFile: prepending /sd/ to %s", oldest_file.c_str());
briggsa 18:06b718f8e6fd 218 *oldest = "/sd/";
briggsa 18:06b718f8e6fd 219 *oldest += oldest_file;
briggsa 18:06b718f8e6fd 220
briggsa 18:06b718f8e6fd 221 closedir(dp);
briggsa 18:06b718f8e6fd 222 return true;
briggsa 18:06b718f8e6fd 223 }
briggsa 18:06b718f8e6fd 224
briggsa 18:06b718f8e6fd 225 bool syncOldestSession()
briggsa 18:06b718f8e6fd 226 {
briggsa 18:06b718f8e6fd 227 string oldest;
briggsa 18:06b718f8e6fd 228
briggsa 18:06b718f8e6fd 229 if (getOldestFile(&oldest))
briggsa 18:06b718f8e6fd 230 return sendFile(oldest);
briggsa 18:06b718f8e6fd 231
briggsa 18:06b718f8e6fd 232 return false;
briggsa 18:06b718f8e6fd 233 }
briggsa 18:06b718f8e6fd 234
briggsa 18:06b718f8e6fd 235 bool deleteOldestSession()
briggsa 18:06b718f8e6fd 236 {
briggsa 18:06b718f8e6fd 237 string oldest;
briggsa 18:06b718f8e6fd 238
briggsa 18:06b718f8e6fd 239 if (getOldestFile(&oldest)) {
briggsa 18:06b718f8e6fd 240 PC_PRINTLNF("deleteOldestSession: deleting %s", oldest.c_str());
briggsa 18:06b718f8e6fd 241
briggsa 18:06b718f8e6fd 242 if (remove(oldest.c_str()) == 0) {
briggsa 18:06b718f8e6fd 243 PC_PRINTLN("deleteOldestSession: delete success");
briggsa 18:06b718f8e6fd 244 // send ack
briggsa 18:06b718f8e6fd 245 return true;
briggsa 18:06b718f8e6fd 246 }
briggsa 18:06b718f8e6fd 247 }
briggsa 18:06b718f8e6fd 248
briggsa 18:06b718f8e6fd 249 // send ack
briggsa 18:06b718f8e6fd 250
briggsa 18:06b718f8e6fd 251 return false;
briggsa 18:06b718f8e6fd 252 }
briggsa 18:06b718f8e6fd 253
briggsa 18:06b718f8e6fd 254 void sync()
briggsa 18:06b718f8e6fd 255 {
briggsa 18:06b718f8e6fd 256 PC_PRINTLN("Entered sync mode...");
briggsa 18:06b718f8e6fd 257 while(State == SYNC) {
briggsa 18:06b718f8e6fd 258 PC_PRINTLN("Waiting for packet...")
briggsa 18:06b718f8e6fd 259 Packet *p;
ellingjp 22:9350752f5414 260
ellingjp 21:2fa676f214fe 261 int ret = btComm.receivePacket(&p, TIMEOUT);
briggsa 18:06b718f8e6fd 262 if (ret == 0) {
briggsa 18:06b718f8e6fd 263 PC_PRINTLN("Timeout!");
briggsa 18:06b718f8e6fd 264 continue;
briggsa 18:06b718f8e6fd 265 } else if (ret < 0) {
briggsa 18:06b718f8e6fd 266 PC_PRINTLN("Received bad packet :(");
briggsa 18:06b718f8e6fd 267 continue;
briggsa 18:06b718f8e6fd 268 }
ellingjp 23:80083138d609 269 #ifdef DEBUG
briggsa 18:06b718f8e6fd 270 PC_PRINTLNF("cmd: %x", p->cmd);
briggsa 18:06b718f8e6fd 271 PC_PRINTLNF("pnum: %x", p->packetNumber);
briggsa 18:06b718f8e6fd 272 PC_PRINTLNF("len: %x", p->dataLength);
briggsa 18:06b718f8e6fd 273 for (int i = 0; i < p->dataLength; i++) {
briggsa 18:06b718f8e6fd 274 PC_PRINTF("data[%d]: ", i);
briggsa 18:06b718f8e6fd 275 PC_PRINTLNF("%x", p->data[i]);
briggsa 18:06b718f8e6fd 276 }
briggsa 18:06b718f8e6fd 277 PC_PRINTLNF("check: %x", p->checkSum);
ellingjp 23:80083138d609 278 #endif
ellingjp 22:9350752f5414 279
briggsa 18:06b718f8e6fd 280 switch(p->cmd) {
briggsa 18:06b718f8e6fd 281 case CMD_SYNCOLDEST:
briggsa 18:06b718f8e6fd 282 if (!syncOldestSession())
briggsa 18:06b718f8e6fd 283 PC_PRINTLN("Sync oldest session failed!");
briggsa 18:06b718f8e6fd 284 break;
briggsa 18:06b718f8e6fd 285 case CMD_DELETEOLDEST:
briggsa 18:06b718f8e6fd 286 if (!deleteOldestSession())
briggsa 18:06b718f8e6fd 287 PC_PRINTLN("Delete oldest session failed!");
briggsa 18:06b718f8e6fd 288 break;
briggsa 18:06b718f8e6fd 289 // case CMD_RTCSET:
briggsa 18:06b718f8e6fd 290 // //setRtc(p);
briggsa 18:06b718f8e6fd 291 // break;
briggsa 18:06b718f8e6fd 292 // case CMD_LISTSESSIONS:
briggsa 18:06b718f8e6fd 293 // listSessions();
briggsa 18:06b718f8e6fd 294 // break;
briggsa 18:06b718f8e6fd 295 // case CMD_SYNCSESSION:
briggsa 18:06b718f8e6fd 296 // syncSession();
briggsa 18:06b718f8e6fd 297 // break;
briggsa 18:06b718f8e6fd 298 // case CMD_DELETESESSION:
briggsa 18:06b718f8e6fd 299 // deleteSession();
briggsa 18:06b718f8e6fd 300 // break;
ellingjp 23:80083138d609 301 case CMD_DONE:
ellingjp 23:80083138d609 302 Packet *p = Packet::create(ACK, 0, 0, NULL);
ellingjp 23:80083138d609 303 btComm.sendPacket(p);
ellingjp 23:80083138d609 304 State = IDLE;
ellingjp 23:80083138d609 305 break;
briggsa 18:06b718f8e6fd 306 // default: break;
briggsa 18:06b718f8e6fd 307 }
briggsa 18:06b718f8e6fd 308
briggsa 18:06b718f8e6fd 309 PC_PRINTLN("Deleting received packet...");
briggsa 18:06b718f8e6fd 310 delete p;
briggsa 18:06b718f8e6fd 311 PC_PRINTLN("Ready for new packet");
briggsa 18:06b718f8e6fd 312 }
ellingjp 9:a711b5b34d73 313 }