CSE477 / swimate_v2

Dependencies:   Adafruit_GFX_128x64 DS3231 PinDetect SDFileSystem USBDevice mbed RealtimeMath MODSERIAL

Committer:
ellingjp
Date:
Sat Jun 07 07:46:38 2014 +0000
Revision:
22:9350752f5414
Parent:
21:2fa676f214fe
Parent:
18:06b718f8e6fd
Child:
23:80083138d609
Another merge;

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
ellingjp 21:2fa676f214fe 119 uint8_t *d = new uint8_t[PACKET_MAX_DATA];
ellingjp 21:2fa676f214fe 120
briggsa 18:06b718f8e6fd 121 PC_PRINTLN("sendFile: created buffer");
briggsa 18:06b718f8e6fd 122 int len;
ellingjp 21:2fa676f214fe 123 int numPackets = 0;
ellingjp 22:9350752f5414 124
briggsa 18:06b718f8e6fd 125 while ( (len = fread(d, 1, PACKET_MAX_DATA, fp) ) > 0 ) {
ellingjp 21:2fa676f214fe 126 PC_PRINTLNF("sendFile: packet number: %d ", numPackets);
ellingjp 21:2fa676f214fe 127 PC_PRINTLNF("length: %d", len);
briggsa 18:06b718f8e6fd 128 PC_PRINTLNF("sendFile: sending packet of length %d", len);
briggsa 18:06b718f8e6fd 129
briggsa 18:06b718f8e6fd 130 Packet *p = Packet::create(CMD_SYNCOLDEST, 0x00, len, d);
ellingjp 21:2fa676f214fe 131 PC_PRINTLNF("sendFile: packet checksum = %x", p->checkSum);
briggsa 18:06b718f8e6fd 132 btComm.sendPacket(p);
briggsa 18:06b718f8e6fd 133 delete p;
paulbartell 13:227a6cfd2097 134
ellingjp 21:2fa676f214fe 135 for (int i = 0; i < len; i++) {
ellingjp 21:2fa676f214fe 136 PC_PRINTLNF("sendFile: packet[%d] = ", i);
ellingjp 21:2fa676f214fe 137 PC_PRINTLNF("%x", d[i]);
ellingjp 21:2fa676f214fe 138 }
ellingjp 21:2fa676f214fe 139
briggsa 18:06b718f8e6fd 140 PC_PRINTLNF("sendFile: sent packet of length %d", len);
ellingjp 21:2fa676f214fe 141 PC_PRINTLN("sendFile: waiting for ack...");
ellingjp 21:2fa676f214fe 142
ellingjp 21:2fa676f214fe 143 Packet *resp;
ellingjp 21:2fa676f214fe 144 int n = btComm.receivePacket(&resp, TIMEOUT);
ellingjp 21:2fa676f214fe 145 if (n <= 0) {
ellingjp 21:2fa676f214fe 146 PC_PRINTLN("sendFile: timeout waiting for ack!");
ellingjp 21:2fa676f214fe 147 fclose(fp);
ellingjp 21:2fa676f214fe 148 return false;
ellingjp 21:2fa676f214fe 149 }
ellingjp 21:2fa676f214fe 150
ellingjp 21:2fa676f214fe 151 if (resp->cmd != ACK) {
ellingjp 21:2fa676f214fe 152 PC_PRINTLN("sendFile: packet received was not an ack!");
ellingjp 21:2fa676f214fe 153 delete resp;
ellingjp 21:2fa676f214fe 154 fclose(fp);
ellingjp 21:2fa676f214fe 155 return false;
ellingjp 21:2fa676f214fe 156 }
ellingjp 21:2fa676f214fe 157
ellingjp 21:2fa676f214fe 158 delete resp;
ellingjp 21:2fa676f214fe 159
ellingjp 21:2fa676f214fe 160 PC_PRINTLN("sendFile: received ack!");
ellingjp 21:2fa676f214fe 161 numPackets++;
briggsa 18:06b718f8e6fd 162 }
briggsa 18:06b718f8e6fd 163 delete[] d;
briggsa 18:06b718f8e6fd 164
ellingjp 21:2fa676f214fe 165 PC_PRINTLNF("sendFile: done sending %s in ", filename.c_str());
ellingjp 21:2fa676f214fe 166 PC_PRINTLNF("%d packets.", numPackets);
briggsa 18:06b718f8e6fd 167 PC_PRINTLNF("sendFile: done sending %s", filename.c_str());
briggsa 18:06b718f8e6fd 168 // Appears to be a bug where feof isn't defined, so no error checking :(
briggsa 18:06b718f8e6fd 169 // if (!feof(fp)) {
briggsa 18:06b718f8e6fd 170 // PC_PRINTLNF("sendFile: Error reading file %s", absolute_filename.c_str());
briggsa 18:06b718f8e6fd 171 // return false;
briggsa 18:06b718f8e6fd 172 // }
briggsa 18:06b718f8e6fd 173
briggsa 18:06b718f8e6fd 174 fclose(fp);
briggsa 18:06b718f8e6fd 175 return true;
paulbartell 13:227a6cfd2097 176 }
paulbartell 13:227a6cfd2097 177
briggsa 18:06b718f8e6fd 178 /* Returns absolute filename of the oldest log file on the SD card */
briggsa 18:06b718f8e6fd 179 bool getOldestFile(string *oldest)
paulbartell 13:227a6cfd2097 180 {
briggsa 18:06b718f8e6fd 181
briggsa 18:06b718f8e6fd 182 PC_PRINTLN("Finding oldest file...");
paulbartell 13:227a6cfd2097 183
briggsa 18:06b718f8e6fd 184 // Ensure all fields get set to zero
briggsa 18:06b718f8e6fd 185 long long file_time = {0};
briggsa 18:06b718f8e6fd 186 long long oldest_time = LLONG_MAX; // ensures first file gets set to oldest
briggsa 18:06b718f8e6fd 187 string oldest_file;
briggsa 18:06b718f8e6fd 188
paulbartell 14:006d9087d76c 189 DIR *dp;
paulbartell 14:006d9087d76c 190 struct dirent *dirp;
paulbartell 14:006d9087d76c 191 dp = opendir("/sd/");
paulbartell 13:227a6cfd2097 192
briggsa 18:06b718f8e6fd 193 if (dp == NULL) {
briggsa 18:06b718f8e6fd 194 PC_PRINTLN("syncOldestSession: Error opening directory");
briggsa 18:06b718f8e6fd 195 return false;
briggsa 18:06b718f8e6fd 196 }
paulbartell 13:227a6cfd2097 197
briggsa 18:06b718f8e6fd 198 while((dirp = readdir(dp)) != NULL) {
briggsa 18:06b718f8e6fd 199 char *strp = dirp->d_name;
ellingjp 9:a711b5b34d73 200
briggsa 18:06b718f8e6fd 201 // Verify we are looking at a .log file
briggsa 18:06b718f8e6fd 202 char ext[5];
briggsa 18:06b718f8e6fd 203 memcpy(ext, strp+strlen(strp) - 4, 5);
briggsa 18:06b718f8e6fd 204 if (strncmp(ext, ".log", 4) == 0) {
briggsa 18:06b718f8e6fd 205 PC_PRINTLNF("syncOldestSession: reading file %s", dirp->d_name);
briggsa 18:06b718f8e6fd 206
briggsa 18:06b718f8e6fd 207 file_time = strtoll(strp, NULL, 10);
briggsa 18:06b718f8e6fd 208
briggsa 18:06b718f8e6fd 209 // If file time is older than oldest time, set the oldest file
briggsa 18:06b718f8e6fd 210 // to the current file
briggsa 18:06b718f8e6fd 211 if (file_time < oldest_time) {
briggsa 18:06b718f8e6fd 212 PC_PRINTLN("syncOldestSession: updating oldest file");
briggsa 18:06b718f8e6fd 213 oldest_time = file_time;
briggsa 18:06b718f8e6fd 214 oldest_file = strp;
paulbartell 13:227a6cfd2097 215 }
paulbartell 13:227a6cfd2097 216 }
ellingjp 9:a711b5b34d73 217 }
briggsa 18:06b718f8e6fd 218
briggsa 18:06b718f8e6fd 219 PC_PRINTLNF("getOldestFile: prepending /sd/ to %s", oldest_file.c_str());
briggsa 18:06b718f8e6fd 220 *oldest = "/sd/";
briggsa 18:06b718f8e6fd 221 *oldest += oldest_file;
briggsa 18:06b718f8e6fd 222
briggsa 18:06b718f8e6fd 223 closedir(dp);
briggsa 18:06b718f8e6fd 224 return true;
briggsa 18:06b718f8e6fd 225 }
briggsa 18:06b718f8e6fd 226
briggsa 18:06b718f8e6fd 227 bool syncOldestSession()
briggsa 18:06b718f8e6fd 228 {
briggsa 18:06b718f8e6fd 229 string oldest;
briggsa 18:06b718f8e6fd 230
briggsa 18:06b718f8e6fd 231 if (getOldestFile(&oldest))
briggsa 18:06b718f8e6fd 232 return sendFile(oldest);
briggsa 18:06b718f8e6fd 233
briggsa 18:06b718f8e6fd 234 return false;
briggsa 18:06b718f8e6fd 235 }
briggsa 18:06b718f8e6fd 236
briggsa 18:06b718f8e6fd 237 bool deleteOldestSession()
briggsa 18:06b718f8e6fd 238 {
briggsa 18:06b718f8e6fd 239 string oldest;
briggsa 18:06b718f8e6fd 240
briggsa 18:06b718f8e6fd 241 if (getOldestFile(&oldest)) {
briggsa 18:06b718f8e6fd 242 PC_PRINTLNF("deleteOldestSession: deleting %s", oldest.c_str());
briggsa 18:06b718f8e6fd 243
briggsa 18:06b718f8e6fd 244 if (remove(oldest.c_str()) == 0) {
briggsa 18:06b718f8e6fd 245 PC_PRINTLN("deleteOldestSession: delete success");
briggsa 18:06b718f8e6fd 246 // send ack
briggsa 18:06b718f8e6fd 247 return true;
briggsa 18:06b718f8e6fd 248 }
briggsa 18:06b718f8e6fd 249 }
briggsa 18:06b718f8e6fd 250
briggsa 18:06b718f8e6fd 251 // send ack
briggsa 18:06b718f8e6fd 252
briggsa 18:06b718f8e6fd 253 return false;
briggsa 18:06b718f8e6fd 254 }
briggsa 18:06b718f8e6fd 255
briggsa 18:06b718f8e6fd 256 void sync()
briggsa 18:06b718f8e6fd 257 {
briggsa 18:06b718f8e6fd 258 PC_PRINTLN("Entered sync mode...");
briggsa 18:06b718f8e6fd 259 while(State == SYNC) {
briggsa 18:06b718f8e6fd 260 PC_PRINTLN("Waiting for packet...")
briggsa 18:06b718f8e6fd 261 Packet *p;
ellingjp 22:9350752f5414 262
ellingjp 21:2fa676f214fe 263 int ret = btComm.receivePacket(&p, TIMEOUT);
briggsa 18:06b718f8e6fd 264 if (ret == 0) {
briggsa 18:06b718f8e6fd 265 PC_PRINTLN("Timeout!");
briggsa 18:06b718f8e6fd 266 continue;
briggsa 18:06b718f8e6fd 267 } else if (ret < 0) {
briggsa 18:06b718f8e6fd 268 PC_PRINTLN("Received bad packet :(");
briggsa 18:06b718f8e6fd 269 continue;
briggsa 18:06b718f8e6fd 270 }
briggsa 18:06b718f8e6fd 271
briggsa 18:06b718f8e6fd 272 PC_PRINTLNF("cmd: %x", p->cmd);
briggsa 18:06b718f8e6fd 273 PC_PRINTLNF("pnum: %x", p->packetNumber);
briggsa 18:06b718f8e6fd 274 PC_PRINTLNF("len: %x", p->dataLength);
briggsa 18:06b718f8e6fd 275 for (int i = 0; i < p->dataLength; i++) {
briggsa 18:06b718f8e6fd 276 PC_PRINTF("data[%d]: ", i);
briggsa 18:06b718f8e6fd 277 PC_PRINTLNF("%x", p->data[i]);
briggsa 18:06b718f8e6fd 278 }
briggsa 18:06b718f8e6fd 279 PC_PRINTLNF("check: %x", p->checkSum);
ellingjp 22:9350752f5414 280
briggsa 18:06b718f8e6fd 281 switch(p->cmd) {
briggsa 18:06b718f8e6fd 282 case CMD_SYNCOLDEST:
briggsa 18:06b718f8e6fd 283 if (!syncOldestSession())
briggsa 18:06b718f8e6fd 284 PC_PRINTLN("Sync oldest session failed!");
briggsa 18:06b718f8e6fd 285 break;
briggsa 18:06b718f8e6fd 286 case CMD_DELETEOLDEST:
briggsa 18:06b718f8e6fd 287 if (!deleteOldestSession())
briggsa 18:06b718f8e6fd 288 PC_PRINTLN("Delete oldest session failed!");
briggsa 18:06b718f8e6fd 289 break;
briggsa 18:06b718f8e6fd 290 // case CMD_RTCSET:
briggsa 18:06b718f8e6fd 291 // //setRtc(p);
briggsa 18:06b718f8e6fd 292 // break;
briggsa 18:06b718f8e6fd 293 // case CMD_LISTSESSIONS:
briggsa 18:06b718f8e6fd 294 // listSessions();
briggsa 18:06b718f8e6fd 295 // break;
briggsa 18:06b718f8e6fd 296 // case CMD_SYNCSESSION:
briggsa 18:06b718f8e6fd 297 // syncSession();
briggsa 18:06b718f8e6fd 298 // break;
briggsa 18:06b718f8e6fd 299 // case CMD_DELETESESSION:
briggsa 18:06b718f8e6fd 300 // deleteSession();
briggsa 18:06b718f8e6fd 301 // break;
briggsa 18:06b718f8e6fd 302 // case CMD_DONE:
briggsa 18:06b718f8e6fd 303 // bt.putc(CMD_DONE);
briggsa 18:06b718f8e6fd 304 // //sendResponse(CMD_DONE, ACK);
briggsa 18:06b718f8e6fd 305 // State = IDLE;
briggsa 18:06b718f8e6fd 306 // break;
briggsa 18:06b718f8e6fd 307 // default: break;
briggsa 18:06b718f8e6fd 308 }
briggsa 18:06b718f8e6fd 309
briggsa 18:06b718f8e6fd 310 PC_PRINTLN("Deleting received packet...");
briggsa 18:06b718f8e6fd 311 delete p;
briggsa 18:06b718f8e6fd 312 PC_PRINTLN("Ready for new packet");
briggsa 18:06b718f8e6fd 313 }
ellingjp 9:a711b5b34d73 314 }