![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Final MEMBITT Code
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed
Fork of reminder_main by
Diff: main.cpp
- Revision:
- 1:29de429a7e15
- Parent:
- 0:fef6b4d65600
- Child:
- 2:f5f8c11849a2
--- a/main.cpp Fri Oct 28 18:29:23 2016 +0000 +++ b/main.cpp Mon Dec 05 20:06:56 2016 +0000 @@ -1,37 +1,55 @@ #include "mbed.h" #include <string> #include <vector> - #include "utils.h" - +#include "SDFileSystem.h" +#include "uLCD_4DGL.h" DigitalOut myled(LED1); +uLCD_4DGL uLCD(p28,p27,p29); +SDFileSystem sd(p5, p6, p7, p8, "sd"); +//PinDetect pb1(p21); // receive new schedule Serial pc(USBTX, USBRX); // tx, rx .... for testing purposes (remove later) +//Serial blue(p13, p14, 9600); +Serial easyVR(p13,p14); // Global vars time_t ct_time; struct tm * timeinfo; +schedule myschedule; +// Function declares void clock_main(struct reminder *current_reminder); int estimate_time(struct reminder current_reminder); - -enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; - -struct schedule { - - // will be ordered by time - should do this processing on the desktop - vector<struct reminder> reminder_list; -}; +void write_schedule_sd(char *buffer, int size); +void speak(int num); +void synthesis(reminder x); +void synTimes(reminder x); +int schedule_read(); +void writetest(); +void packdata(int send); // if send == 1 send data to pc +//void pb1_hit_callback (void); +void receive_schedule(); -int main() { - - +int main() +{ // in real project, we will set the time via the internet - set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37 - time_t clock; + //uLCD.printf("Hello world\n"); // localtime( + //pb1.mode(PullUp); + //pb1.attach_deasserted(&pb1_hit_callback); + //wait(.01); + //pb1.setSampleFrequency(); + //writetest(); + /* + int i = 0; + while(1) + { - + uLCD.printf("%i",i); + wait(1); + }*/ + /* reminder test_reminder; // test_reminder.tm_time.tm_sec = 0; test_reminder.tm_time.tm_min = 36; @@ -39,77 +57,525 @@ for (int i = 0; i < 7; i++) { if (i == 1 || i == 3 || i == 4 || i == 5) test_reminder.reminder_days[i] = 1; // set MWHF else test_reminder.reminder_days[i] = 0; - } - - + }*/ // test_reminder.tm_time.tm_mday = 1; // day of the month // test_reminder.tm_time.tm_mon = 0; // months since January // test_reminder.tm_time.tm_year = 0; // years since 1970 - schedule myschedule; - myschedule.reminder_list.push_back(test_reminder); - + //myschedule.addReminder(test_reminder); + receive_schedule(); + int current_time = schedule_read(); + //uLCD.printf("current time set to: %i", current_time); + + set_time(current_time); // Set RTC time to Wed, 28 Oct 2009 14:24:30 + time_t clock; + time_t seconds = time(NULL); + uLCD.printf("Time as a basic string = %s", ctime(&seconds)); + //packdata(1); + wait(1); + int flag = 0; - - Day currentDay = Wednesday; - int sleep_time; + + //Day currentDay = Wednesday; + uLCD.printf("current day is %i\n",timeinfo->tm_wday); + int time_diff; while(1) { - - for (int i = 0; i < myschedule.reminder_list.size(); i++) { + for (int i = 0; i < myschedule.getSize(); i++) { timeinfo = localtime (&clock); // ct_time not set right now time(&clock); pc.printf("Time as a basic string = %s\n\r", ctime(&clock)); - + reminder tmpReminder = myschedule.getCurrentReminder(); + // CHANGE TO POTENTAILLY NOT INCREMENTING CURRENT REMINDER? + flag = 0; while (!flag) { - if (myschedule.reminder_list[i].reminder_days[currentDay] != 1) { + if (tmpReminder.reminder_days[timeinfo->tm_wday] != 1) { // pc.printf("%i\n\r", myschedule.reminder_list[i].reminder_days[currentDay]); i++; // current reminder not set to go off today; go to next reminder + tmpReminder = myschedule.nextReminder(); } // may need to check if the current reminder is not last one, otherwise out of bounds ERROR else { - sleep_time = estimate_time(myschedule.reminder_list[i]); - - pc.printf("sleep_time is %i\n\r", sleep_time); - flag = 1; + time_diff = estimate_time(tmpReminder); + //uLCD.locate(0,0); + uLCD.printf("time_diff is %i\n\r", time_diff); + if (time_diff < 0) { + i++; + tmpReminder = myschedule.nextReminder(); + } else flag = 1; // sleep(sleep_time); // try and sleep here // wait(sleep_time); // replace this wait function with a smart sleep to save power and then poll after that } //wait(1); } - - - if (timeinfo->tm_min == myschedule.reminder_list[i].tm_time.tm_min && timeinfo->tm_hour == myschedule.reminder_list[i].tm_time.tm_hour) { - myled = true; + uLCD.printf("%s\n", tmpReminder.notification); + if (tmpReminder.notification == "App") { + uLCD.printf("checking app\n"); + //if (timeinfo->tm_min == tmpReminder.min && timeinfo->tm_hour == tmpReminder.hour - 1) { + //if (tmpReminder.hour - timeinfo->tm_hour <= 1) { + if (time_diff <= 60) { + + myled = true; + synthesis(tmpReminder); + uLCD.printf("moving to next reminder\n"); + myschedule.nextReminder(); + uLCD.printf("moved to next reminder\n"); + flag = 0; + } + } else { + if (timeinfo->tm_min == tmpReminder.min && timeinfo->tm_hour == tmpReminder.hour) { + myled = true; + synthesis(tmpReminder); + uLCD.printf("moving to next reminder\n"); + myschedule.nextReminder(); + uLCD.printf("moved to next reminder\n"); + flag = 0; + } } wait(1); } - /* - myled = 1; - wait(0.2); - myled = 0; - wait(0.2); - */ - - + wait(5); } } -int estimate_time(struct reminder current_reminder) { +int estimate_time(struct reminder current_reminder) +{ // estimates the remaining time until the next reminder so program can sleep till then to save battery - - int estimated_time = (60*timeinfo->tm_hour) - (60*current_reminder.tm_time.tm_hour) + - (timeinfo->tm_min - current_reminder.tm_time.tm_min) + 60; - // convert hours to min, find estimated time before reminder plus 1 hour (60 min) - + //uLCD.printf("current hour: %i note hour %i\n\r", timeinfo->tm_hour, current_reminder.hour); + int estimated_time = (60*current_reminder.hour) - (60*timeinfo->tm_hour) + + (current_reminder.min - timeinfo->tm_min); + // convert hours to min, find estimated time before reminder plus 1 hour (60 min) + return estimated_time; - - - //if (current_reminder.reminder_days[currentDay] == 1) // - + + + //if (current_reminder.reminder_days[currentDay] == 1) // + +} + +// use pushbutton to do this +void receive_schedule() +{ + pc.baud(9600); + char buff[1000]; + int i = 0; + bool flag = false; + while(!flag) { + buff[i] = pc.getc(); + uLCD.printf("%c", buff[i]); + //blue.putc(buff[i]); + flag = buff[i] == '^'; + if (flag) uLCD.printf("flag detected"); + i++; + } + write_schedule_sd(buff, i); +} + +void write_schedule_sd(char *buffer, int size) +{ + mkdir("/sd/mydir", 0777); + FILE *fp = fopen("/sd/mydir/schedule.txt", "w"); + if(fp == NULL) { + error("Could not open file for write\n"); + } + fprintf(fp, buffer); + fclose(fp); +} + +int schedule_read() +{ + char time_read[1]; + int set_time = 0;; + //uLCD.locate(0,0); + //uLCD.printf("reading schedule\r\n"); + FILE *fp = fopen("/sd/mydir/schedule.txt", "r"); + if(fp == NULL) { + error("Could not open file to read\n"); + } + + // get time + fread(time_read,1,1,fp); + if (time_read[0] != '[') { + uLCD.locate(0,0); + uLCD.printf("[ not found, instead found %s\r\n",time_read[0]); + error("Time in incorrect format, expected [, got %s\n",time_read[0]); + } + while (time_read[0] != ']') { + fread(time_read,1,1,fp); + if (time_read[0] != ']') set_time = (set_time*10)+(time_read[0] - '0'); + } + + //set_time(set_time); + + + + + //uLCD.locate(0,0); + //uLCD.printf("opened successfully\r\n"); + char reminder_size[1]; + int header = 1; + int reminder_count = 0; + //fgets(reminder_size, sizeof(reminder_size), fp); + fread(reminder_size,1,1,fp); + if (reminder_size[0] != '{') { + uLCD.locate(0,0); + uLCD.printf("{ not found, instead found %s\r\n",reminder_size[0]); + error("Schedule in incorrect format, expected {, got %s\n",reminder_size[0]); + } + while (header) { + char test[1]; + //fgets(reminder_size, sizeof(reminder_size), fp); + fread(test,1,1,fp); + if (test[0] == '|') header = 0; + else { + //uLCD.printf("%s %i",reminder_size[0], (int)reminder_size[0]); + uLCD.printf("%c",test[0]); + //wait(4); + reminder_count = (reminder_count*10)+(test[0] - '0'); + } + } + uLCD.cls(); + //uLCD.locate(0,0); + //uLCD.printf("parsing schedule reminder count is %i\r\n", reminder_count); + //wait(5); + reminder tmp; + + char buf[REMINDER_SIZE]; + //int days; + for (int i = 0; i < reminder_count; i++) { + //fgets(buf, sizeof(buf), fp); + fread(buf,sizeof(buf),1,fp); + uLCD.cls(); + uLCD.locate(0,0); + uLCD.printf("buf is %s\r\n",buf); + wait(.1); + char *pch; + pch = strtok (buf,"+"); + tmp.notification = pch; + uLCD.printf("%s\n", pch); + wait(.1); + pch = strtok (NULL,"+"); + //uLCD.printf("%s\n", pch); + if (strlen(pch) == 1) tmp.hour = (int) (pch[0] - '0'); + else tmp.hour = (int) ((pch[0] - '0') * 10 + (pch[1] - '0')); + //if (tmp.hour > 24 + uLCD.printf("%i\n", tmp.hour); + //wait(1); + pch = strtok (NULL,"+"); + if (strlen(pch) == 1) tmp.min = (int) (pch[0] - '0'); + else tmp.min = (int) ((pch[0] - '0') * 10 + (pch[1] - '0')); + uLCD.printf("%i\n", tmp.min); + wait(.1); + pch = strtok (NULL,"+"); + for (int i = 0; i < 7; i++) { + tmp.reminder_days[i] = (int) pch[i] - '0'; + //days = days/10; + uLCD.printf("%i\n", tmp.reminder_days[i]); + //wait(.1); + } + + //add to the (schedule) vector here + myschedule.addReminder(tmp); + wait(5); + } + fclose(fp); + uLCD.cls(); + uLCD.printf("returned time here"); + + return set_time; +} +/* +void clock_main(struct reminder *current_reminder) { + +} +*/ + +void packdata(int send) +{ + + dateTime testdt; + testdt.month = 1; + testdt.day = 2; + testdt.year = 2009; + myschedule.updateRecord(testdt, 1); + myschedule.updateRecord(testdt, 0); + + int rem_num = 0; // number of reminders + char con[2]; + string record_str = ""; + string part; + int data_entries; + record tmpr; + dateTime tmpd; + uLCD.printf("test start\r\n"); + for (int i = 0; i < myschedule.getSize(); i++) { + uLCD.printf("schedule entries exist\r\n"); + data_entries = myschedule.getNumRecords(i); + if (data_entries) { // more than 1 data entry + rem_num++; + char de[2]; + sprintf(con, "%d", i); + sprintf(de, "%d", data_entries); + record_str += "|r" + (string)con + "(" + (string)de + ")"; + tmpr = myschedule.getRecord(i); + for (int j = 0; j < data_entries; j++) { + tmpd = tmpr.date[j]; + char tmpmon[2], tmpday[2], tmpyear[2]; + sprintf(tmpmon, "%d", tmpd.month); + sprintf(tmpday, "%d", tmpd.day); + sprintf(tmpyear, "%d", tmpd.year); + part = "["; + if (tmpd.month < 10) part += "0"; + part += (string) tmpmon + "-"; + if (tmpd.day < 10) part += "0"; + part += (string)tmpday + "-" + (string)tmpyear + "]"; + char tmpval[1]; + sprintf(tmpval, "%d", tmpr.data[j]); + part += tmpval; + uLCD.printf("%s\r\n", part.c_str()); + //part = "[" + tmpd.month + "-" + tmpd.day + "-" + tmpd.year + "]"; + record_str += part; + } + } + } + char remnum[2]; + sprintf(remnum, "%d", rem_num); + record_str = "{" + (string)remnum + record_str + "}"; + uLCD.printf("%s\r\n", record_str.c_str()); + uLCD.printf("starting data record write\r\n"); + + + // save data to buffer + const char *buffer = record_str.c_str(); + mkdir("/sd/mydir", 0777); + FILE *fp = fopen("/sd/mydir/data.txt", "w"); + if(fp == NULL) { + error("Could not open file for write\n"); + } + fprintf(fp, buffer); + fclose(fp); + + // if send is 1, send to desktop + if (send) { + pc.printf("%s", buffer); + } + } +void writetest() +{ + uLCD.printf("starting test\r\n"); + char *buffer = "hello1"; + mkdir("/sd/mydir", 0777); + FILE *fp = fopen("/sd/mydir/data.txt", "w"); + if(fp == NULL) { + error("Could not open file for write\n"); + } + fprintf(fp, buffer); + fclose(fp); + uLCD.printf("first opened\r\n"); + char *buffer2 = "good2"; + FILE *fq = fopen("/sd/mydir/data.txt", "w"); + if(fq == NULL) { + error("Could not open file for write\n"); + } + fprintf(fq, buffer2); + fclose(fq); + uLCD.printf("second opened\r\n"); + + + char open[10]; + FILE *fw = fopen("/sd/mydir/data.txt", "r"); + if(fw == NULL) { + error("Could not open file to read\n"); + } + fread(open,sizeof(open),8,fw); + uLCD.printf("%s", open); + uLCD.printf("should have printed\r\n"); + +} + +// Function to play a sound file on speaker +void speak(int num) +{ + + // Send Play Sound command + easyVR.putc('w'); + // small delay is needed between characters + wait(.002); + // Sound table index + easyVR.putc('A' + num/32); + wait(.002); + easyVR.putc('A' + num%32); + wait(.002); + // max volume + easyVR.putc('P'); + // Wait for response of 'o' as playback ends + while (easyVR.getc()!='o') {} + wait(.25); +} + +void synthesis(reminder x) +{ + uLCD.printf("speaking syn\n"); + if(x.notification == "App") { + speak(synWords[3]); + wait(0.001); + synTimes(x); + } else { + //reminder + int asking = 1; + int result; + int repeat = 0; + int response = 0; + while (asking) { + speak(synWords[2]); + wait(0.001); + //ask if they've taken their medication + speak(synWords[6]); + wait(0.001); + //intake and process yes/no response + easyVR.putc('d'); + wait(.001); + easyVR.putc('B'); + clock_t endwait; + endwait = clock() + 60 * CLOCKS_PER_SEC ; + while (easyVR.readable()!=0 && clock() < endwait) {} + if (clock() < endwait) { + response = 1; + //asking = 0; + } else { + repeat++; + if (repeat > 2) { + result = -1; + asking = 0; + } + } + if (response) { + char rchar=easyVR.getc(); + pc.putc(rchar); + if (rchar == 'r') { + easyVR.putc(' '); + rchar = easyVR.getc(); + //for a yes response + if (rchar=='A' || rchar=='C' || rchar=='E' || rchar=='G' || rchar == 'I' || rchar == 'K') { + uLCD.printf("yes"); + //yes++; + //response++; + result = 1; + } else if (rchar == 'B' || rchar=='D' || rchar=='F' || rchar=='H' || rchar=='J' || rchar=='K') { + uLCD.printf("no"); + result = 0; + //no++; + //response++; + } + asking = 0; + uLCD.printf("asking = 0\n"); + + } else if (rchar == 'e') { + uLCD.printf("error"); + result = -1; + repeat++; + if (repeat > 2) { + result = -1; + asking = 0; + // try again + } + } else uLCD.printf("%c ",rchar); + } + } + + uLCD.printf("done\n"); + dateTime dt_record; + dt_record.month = timeinfo->tm_mday; + dt_record.day = timeinfo->tm_mon+1; // days since january (0-11) so add 1 + dt_record.year = timeinfo->tm_year + 1990; // years since 1990 + myschedule.updateRecord(dt_record, result); + // do error checking for no response + //thank the user + speak(synWords[7]); + } + + myled = 0; + wait(0.001); + +} + +void synTimes(reminder x) +{ + uLCD.printf("speaking time\n"); + // schedule.reminder_list.... + // x is selected reminder + //two switch case statements: one for if the second number is a 5, one if it's a 0 + int ampm = 0; + int hour = x.hour; + if(x.hour > 12) { + hour = x.hour % 12; + ampm = 24; + } else + ampm = 22; + + // need to add speaking hours? + speak(synTime[hour-1]); + wait(0.002); + + int minutes[2]; + minutes[0] = x.min/10; + minutes[1] = x.min%10; + + switch(minutes[0]) { + case 0: + // say "OH" + speak(synWords[1]); + wait(0.002); + if (minutes[1] == 0) { + // say "clock" + speak(synWords[0]); + wait(0.002); + } + break; + case 1: + if (minutes[1] == 0) { + speak(synTime[10-1]); + wait(0.002); + } else { + //say "fifteen" + speak(synTime[13-1]); + wait(0.002); + } + break; + case 2: + //say "twenty" + speak(synTime[17-1]); + wait(0.002); + break; + case 3: + //say "thirty" + speak(synTime[16-1]); + wait(0.002); + break; + case 4: + //say "forty" + speak(synTime[15-1]); + wait(0.002); + break; + case 5: + //say "fifty" + speak(synTime[14-1]); + wait(0.002); + break; + } + if (minutes[0] != 1) { + if (minutes[1] == 5) { + //say "5" + speak(synTime[5-1]); + wait(0.002); + } + } + speak(ampm); + uLCD.printf("done speaking\n"); +} /* -void clock_main(struct reminder *current_reminder) { - -} -*/ \ No newline at end of file +void pb1_hit_callback (void) { + uLCD.printf("push button pressed - receive schedule\n"); + receive_schedule(); +}*/ \ No newline at end of file