Code written by Paul Rabbat, Angel Daruna, Jarel Hawkins, and Cordel Williams
Dependencies: 4DGL-uLCD-SE EthernetInterface HTTPClient NTPClient PinDetect SDFileSystem mbed-rpc mbed-rtos mbed wave_player
Fork of ECE4180_FinalProject by
main.cpp@0:0a99e3fc2a46, 2014-11-15 (annotated)
- Committer:
- prabbat3
- Date:
- Sat Nov 15 19:36:44 2014 +0000
- Revision:
- 0:0a99e3fc2a46
- Child:
- 1:d7f65be2640d
working with 01 and 00 min
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
prabbat3 | 0:0a99e3fc2a46 | 1 | // Includes |
prabbat3 | 0:0a99e3fc2a46 | 2 | #include "mbed.h" |
prabbat3 | 0:0a99e3fc2a46 | 3 | #include "NTPClient.h" |
prabbat3 | 0:0a99e3fc2a46 | 4 | #include "uLCD_4DGL.h" |
prabbat3 | 0:0a99e3fc2a46 | 5 | #include "EthernetInterface.h" |
prabbat3 | 0:0a99e3fc2a46 | 6 | #include <string> |
prabbat3 | 0:0a99e3fc2a46 | 7 | #include "mbed_rpc.h" |
prabbat3 | 0:0a99e3fc2a46 | 8 | #include "RPCCommand.h" |
prabbat3 | 0:0a99e3fc2a46 | 9 | #include "HTTPServer.h" |
prabbat3 | 0:0a99e3fc2a46 | 10 | #include "Formatter.h" |
prabbat3 | 0:0a99e3fc2a46 | 11 | #include "RequestHandler.h" |
prabbat3 | 0:0a99e3fc2a46 | 12 | #include "RPCType.h" |
prabbat3 | 0:0a99e3fc2a46 | 13 | #include "alarmContainer.h" |
prabbat3 | 0:0a99e3fc2a46 | 14 | |
prabbat3 | 0:0a99e3fc2a46 | 15 | // Defines |
prabbat3 | 0:0a99e3fc2a46 | 16 | #define SERVER_PORT 80 //HTTPSERVER |
prabbat3 | 0:0a99e3fc2a46 | 17 | |
prabbat3 | 0:0a99e3fc2a46 | 18 | // Global variables |
prabbat3 | 0:0a99e3fc2a46 | 19 | EthernetInterface eth; |
prabbat3 | 0:0a99e3fc2a46 | 20 | uLCD_4DGL uLCD(p28, p27, p29); // serial tx, serial rx, reset pin; |
prabbat3 | 0:0a99e3fc2a46 | 21 | NTPClient ntpClient; |
prabbat3 | 0:0a99e3fc2a46 | 22 | alarmModel _alarm; |
prabbat3 | 0:0a99e3fc2a46 | 23 | string dayOfWeek, month, dayNum, ampm; |
prabbat3 | 0:0a99e3fc2a46 | 24 | int hour, minute, sec; |
prabbat3 | 0:0a99e3fc2a46 | 25 | DigitalOut led1(LED1); |
prabbat3 | 0:0a99e3fc2a46 | 26 | DigitalOut led2(LED2); |
prabbat3 | 0:0a99e3fc2a46 | 27 | DigitalOut led3(LED3); |
prabbat3 | 0:0a99e3fc2a46 | 28 | DigitalOut led4(LED4); |
prabbat3 | 0:0a99e3fc2a46 | 29 | |
prabbat3 | 0:0a99e3fc2a46 | 30 | // Function prototypes |
prabbat3 | 0:0a99e3fc2a46 | 31 | HTTPServer create_simple_server(); |
prabbat3 | 0:0a99e3fc2a46 | 32 | HTTPServer create_interactive_server(); |
prabbat3 | 0:0a99e3fc2a46 | 33 | void parse(char[], int*, char*); |
prabbat3 | 0:0a99e3fc2a46 | 34 | void thread_server(void const *args); |
prabbat3 | 0:0a99e3fc2a46 | 35 | void thread_display(void const *args); |
prabbat3 | 0:0a99e3fc2a46 | 36 | void thread_alarm(void const *args); |
prabbat3 | 0:0a99e3fc2a46 | 37 | |
prabbat3 | 0:0a99e3fc2a46 | 38 | int main() { |
prabbat3 | 0:0a99e3fc2a46 | 39 | |
prabbat3 | 0:0a99e3fc2a46 | 40 | printf("Getting IP Address.. "); |
prabbat3 | 0:0a99e3fc2a46 | 41 | |
prabbat3 | 0:0a99e3fc2a46 | 42 | uLCD.baudrate(2000000); |
prabbat3 | 0:0a99e3fc2a46 | 43 | uLCD.cls(); |
prabbat3 | 0:0a99e3fc2a46 | 44 | uLCD.background_color(BLACK); |
prabbat3 | 0:0a99e3fc2a46 | 45 | uLCD.textbackground_color(BLACK); |
prabbat3 | 0:0a99e3fc2a46 | 46 | uLCD.locate(0,0); |
prabbat3 | 0:0a99e3fc2a46 | 47 | uLCD.color(BLUE); |
prabbat3 | 0:0a99e3fc2a46 | 48 | uLCD.text_height(2); |
prabbat3 | 0:0a99e3fc2a46 | 49 | uLCD.text_width(2); |
prabbat3 | 0:0a99e3fc2a46 | 50 | uLCD.printf("\n\nUniv Time\n Clock\n"); |
prabbat3 | 0:0a99e3fc2a46 | 51 | uLCD.text_height(1); |
prabbat3 | 0:0a99e3fc2a46 | 52 | uLCD.text_width(1); |
prabbat3 | 0:0a99e3fc2a46 | 53 | uLCD.printf(" Loading...\n"); |
prabbat3 | 0:0a99e3fc2a46 | 54 | uLCD.locate(0,0); |
prabbat3 | 0:0a99e3fc2a46 | 55 | |
prabbat3 | 0:0a99e3fc2a46 | 56 | if(eth.init()) |
prabbat3 | 0:0a99e3fc2a46 | 57 | { |
prabbat3 | 0:0a99e3fc2a46 | 58 | printf("Error while initializing the ethernet interface.\n"); |
prabbat3 | 0:0a99e3fc2a46 | 59 | return -1; |
prabbat3 | 0:0a99e3fc2a46 | 60 | } |
prabbat3 | 0:0a99e3fc2a46 | 61 | wait(5); |
prabbat3 | 0:0a99e3fc2a46 | 62 | if(eth.connect()) |
prabbat3 | 0:0a99e3fc2a46 | 63 | { |
prabbat3 | 0:0a99e3fc2a46 | 64 | printf("Error while starting the ethernet interface.\n"); |
prabbat3 | 0:0a99e3fc2a46 | 65 | return -1; |
prabbat3 | 0:0a99e3fc2a46 | 66 | } |
prabbat3 | 0:0a99e3fc2a46 | 67 | |
prabbat3 | 0:0a99e3fc2a46 | 68 | printf("IP Address is %s\n", eth.getIPAddress()); |
prabbat3 | 0:0a99e3fc2a46 | 69 | |
prabbat3 | 0:0a99e3fc2a46 | 70 | printf("Reading time..\n"); |
prabbat3 | 0:0a99e3fc2a46 | 71 | char* domainName="us.pool.ntp.org"; //SET TO DOMAIN NAME OF SERVER GETTING TIME FROM |
prabbat3 | 0:0a99e3fc2a46 | 72 | //GETS THE TIME FROM THE SERVER |
prabbat3 | 0:0a99e3fc2a46 | 73 | //setTime(DOMAIN_NAME,PORT_NUMBER,TIME_OUT) |
prabbat3 | 0:0a99e3fc2a46 | 74 | //DOMAIN_NAME= domain name |
prabbat3 | 0:0a99e3fc2a46 | 75 | //PORT NUMBER=port number (123 for NTP) |
prabbat3 | 0:0a99e3fc2a46 | 76 | //TIME_OUT= timeout value for request |
prabbat3 | 0:0a99e3fc2a46 | 77 | ntpClient.setTime(domainName,123,0x00005000); |
prabbat3 | 0:0a99e3fc2a46 | 78 | printf("Time set.\n"); |
prabbat3 | 0:0a99e3fc2a46 | 79 | |
prabbat3 | 0:0a99e3fc2a46 | 80 | Thread t1(thread_server); //start thread_server |
prabbat3 | 0:0a99e3fc2a46 | 81 | Thread t2(thread_display); |
prabbat3 | 0:0a99e3fc2a46 | 82 | Thread t3(thread_alarm); |
prabbat3 | 0:0a99e3fc2a46 | 83 | |
prabbat3 | 0:0a99e3fc2a46 | 84 | while(1){} |
prabbat3 | 0:0a99e3fc2a46 | 85 | } |
prabbat3 | 0:0a99e3fc2a46 | 86 | |
prabbat3 | 0:0a99e3fc2a46 | 87 | void thread_alarm(void const *args) |
prabbat3 | 0:0a99e3fc2a46 | 88 | { |
prabbat3 | 0:0a99e3fc2a46 | 89 | while(1){ |
prabbat3 | 0:0a99e3fc2a46 | 90 | if(_alarm.alarmSet){ |
prabbat3 | 0:0a99e3fc2a46 | 91 | led1 = 1; |
prabbat3 | 0:0a99e3fc2a46 | 92 | if(_alarm.hours == hour && _alarm.minutes == minute && _alarm.amPm == ampm){ |
prabbat3 | 0:0a99e3fc2a46 | 93 | led2 = 1; |
prabbat3 | 0:0a99e3fc2a46 | 94 | led3 = 1; |
prabbat3 | 0:0a99e3fc2a46 | 95 | led4 = 1; |
prabbat3 | 0:0a99e3fc2a46 | 96 | } |
prabbat3 | 0:0a99e3fc2a46 | 97 | } |
prabbat3 | 0:0a99e3fc2a46 | 98 | Thread::wait(100); |
prabbat3 | 0:0a99e3fc2a46 | 99 | } |
prabbat3 | 0:0a99e3fc2a46 | 100 | } |
prabbat3 | 0:0a99e3fc2a46 | 101 | |
prabbat3 | 0:0a99e3fc2a46 | 102 | void thread_display(void const *args){ |
prabbat3 | 0:0a99e3fc2a46 | 103 | time_t ctTime; //system time structure |
prabbat3 | 0:0a99e3fc2a46 | 104 | uLCD.cls(); |
prabbat3 | 0:0a99e3fc2a46 | 105 | uLCD.locate(0,0); |
prabbat3 | 0:0a99e3fc2a46 | 106 | uLCD.text_height(2); |
prabbat3 | 0:0a99e3fc2a46 | 107 | uLCD.text_width(1); |
prabbat3 | 0:0a99e3fc2a46 | 108 | char buffer[80]; //BUFFER TO HOLD FORMATTED TIME DATA |
prabbat3 | 0:0a99e3fc2a46 | 109 | uLCD.textbackground_color(BLACK); |
prabbat3 | 0:0a99e3fc2a46 | 110 | |
prabbat3 | 0:0a99e3fc2a46 | 111 | while (1) { |
prabbat3 | 0:0a99e3fc2a46 | 112 | |
prabbat3 | 0:0a99e3fc2a46 | 113 | uLCD.locate(0,0); |
prabbat3 | 0:0a99e3fc2a46 | 114 | uLCD.color(RED); |
prabbat3 | 0:0a99e3fc2a46 | 115 | // loop and periodically update the LCD's time display |
prabbat3 | 0:0a99e3fc2a46 | 116 | ctTime = time(NULL)-(3600*4); //TIME with offset for eastern time US |
prabbat3 | 0:0a99e3fc2a46 | 117 | |
prabbat3 | 0:0a99e3fc2a46 | 118 | //FORMAT TIME FOR DISPLAY AND STORE FORMATTED RESULT IN BUFFER |
prabbat3 | 0:0a99e3fc2a46 | 119 | strftime(buffer,80,"%a %b %d %T %p %z %Z",localtime(&ctTime)); |
prabbat3 | 0:0a99e3fc2a46 | 120 | |
prabbat3 | 0:0a99e3fc2a46 | 121 | int i=0; |
prabbat3 | 0:0a99e3fc2a46 | 122 | char* chars_array = strtok(buffer, " :"); |
prabbat3 | 0:0a99e3fc2a46 | 123 | //printf("Chars array: \n"); |
prabbat3 | 0:0a99e3fc2a46 | 124 | while(chars_array) |
prabbat3 | 0:0a99e3fc2a46 | 125 | { |
prabbat3 | 0:0a99e3fc2a46 | 126 | switch(i){ |
prabbat3 | 0:0a99e3fc2a46 | 127 | case 0: |
prabbat3 | 0:0a99e3fc2a46 | 128 | dayOfWeek = chars_array; |
prabbat3 | 0:0a99e3fc2a46 | 129 | break; |
prabbat3 | 0:0a99e3fc2a46 | 130 | case 1: |
prabbat3 | 0:0a99e3fc2a46 | 131 | month = chars_array; |
prabbat3 | 0:0a99e3fc2a46 | 132 | break; |
prabbat3 | 0:0a99e3fc2a46 | 133 | case 2: |
prabbat3 | 0:0a99e3fc2a46 | 134 | dayNum = chars_array; |
prabbat3 | 0:0a99e3fc2a46 | 135 | break; |
prabbat3 | 0:0a99e3fc2a46 | 136 | case 3: |
prabbat3 | 0:0a99e3fc2a46 | 137 | //chars_array = chars_array - 1; |
prabbat3 | 0:0a99e3fc2a46 | 138 | int hourTemp = atoi(chars_array); |
prabbat3 | 0:0a99e3fc2a46 | 139 | hourTemp--; //Daylight savings |
prabbat3 | 0:0a99e3fc2a46 | 140 | if(hourTemp > 12) hourTemp -= 12; |
prabbat3 | 0:0a99e3fc2a46 | 141 | hour = hourTemp; |
prabbat3 | 0:0a99e3fc2a46 | 142 | break; |
prabbat3 | 0:0a99e3fc2a46 | 143 | case 4: |
prabbat3 | 0:0a99e3fc2a46 | 144 | minute = atoi(chars_array); |
prabbat3 | 0:0a99e3fc2a46 | 145 | break; |
prabbat3 | 0:0a99e3fc2a46 | 146 | case 5: |
prabbat3 | 0:0a99e3fc2a46 | 147 | sec = atoi(chars_array); |
prabbat3 | 0:0a99e3fc2a46 | 148 | break; |
prabbat3 | 0:0a99e3fc2a46 | 149 | case 6: |
prabbat3 | 0:0a99e3fc2a46 | 150 | ampm = chars_array; |
prabbat3 | 0:0a99e3fc2a46 | 151 | break; |
prabbat3 | 0:0a99e3fc2a46 | 152 | } |
prabbat3 | 0:0a99e3fc2a46 | 153 | i++; |
prabbat3 | 0:0a99e3fc2a46 | 154 | |
prabbat3 | 0:0a99e3fc2a46 | 155 | chars_array = strtok(NULL, " :"); |
prabbat3 | 0:0a99e3fc2a46 | 156 | } |
prabbat3 | 0:0a99e3fc2a46 | 157 | |
prabbat3 | 0:0a99e3fc2a46 | 158 | if(minute < 10 && sec < 10){ uLCD.printf(" %s, %s %s\n %d:0%d:0%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } |
prabbat3 | 0:0a99e3fc2a46 | 159 | else if(minute < 10){ uLCD.printf(" %s, %s %s\n %d:0%d:%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } |
prabbat3 | 0:0a99e3fc2a46 | 160 | else if (sec < 10){ uLCD.printf(" %s, %s %s\n %d:%d:0%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } |
prabbat3 | 0:0a99e3fc2a46 | 161 | else{ uLCD.printf(" %s, %s %s\n %d:%d:%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } |
prabbat3 | 0:0a99e3fc2a46 | 162 | |
prabbat3 | 0:0a99e3fc2a46 | 163 | if(_alarm.alarmSet){ |
prabbat3 | 0:0a99e3fc2a46 | 164 | uLCD.color(GREEN); |
prabbat3 | 0:0a99e3fc2a46 | 165 | if(_alarm.minutes < 10){ uLCD.printf("\n\n Alarm:\n %d:0%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); } |
prabbat3 | 0:0a99e3fc2a46 | 166 | else{ uLCD.printf("\n\n Alarm:\n %d:%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); } |
prabbat3 | 0:0a99e3fc2a46 | 167 | } |
prabbat3 | 0:0a99e3fc2a46 | 168 | |
prabbat3 | 0:0a99e3fc2a46 | 169 | Thread::wait(100); |
prabbat3 | 0:0a99e3fc2a46 | 170 | } |
prabbat3 | 0:0a99e3fc2a46 | 171 | } |
prabbat3 | 0:0a99e3fc2a46 | 172 | |
prabbat3 | 0:0a99e3fc2a46 | 173 | void thread_server(void const *args) |
prabbat3 | 0:0a99e3fc2a46 | 174 | { |
prabbat3 | 0:0a99e3fc2a46 | 175 | RPCType::instance().register_types(); |
prabbat3 | 0:0a99e3fc2a46 | 176 | HTTPServer srv = create_interactive_server(); |
prabbat3 | 0:0a99e3fc2a46 | 177 | |
prabbat3 | 0:0a99e3fc2a46 | 178 | if(!srv.init(SERVER_PORT)) |
prabbat3 | 0:0a99e3fc2a46 | 179 | { |
prabbat3 | 0:0a99e3fc2a46 | 180 | eth.disconnect(); |
prabbat3 | 0:0a99e3fc2a46 | 181 | //return -1; |
prabbat3 | 0:0a99e3fc2a46 | 182 | printf("Thread 1 error.\n"); |
prabbat3 | 0:0a99e3fc2a46 | 183 | } |
prabbat3 | 0:0a99e3fc2a46 | 184 | |
prabbat3 | 0:0a99e3fc2a46 | 185 | srv.run(); |
prabbat3 | 0:0a99e3fc2a46 | 186 | } |
prabbat3 | 0:0a99e3fc2a46 | 187 | |
prabbat3 | 0:0a99e3fc2a46 | 188 | HTTPServer create_simple_server() |
prabbat3 | 0:0a99e3fc2a46 | 189 | { |
prabbat3 | 0:0a99e3fc2a46 | 190 | HTTPServer srv; |
prabbat3 | 0:0a99e3fc2a46 | 191 | srv.add_request_handler("DELETE", new DeleteRequestHandler()); |
prabbat3 | 0:0a99e3fc2a46 | 192 | srv.add_request_handler("GET", new GetRequestHandler()); |
prabbat3 | 0:0a99e3fc2a46 | 193 | srv.add_request_handler("PUT", new PutRequestHandler()); |
prabbat3 | 0:0a99e3fc2a46 | 194 | return srv; |
prabbat3 | 0:0a99e3fc2a46 | 195 | } |
prabbat3 | 0:0a99e3fc2a46 | 196 | |
prabbat3 | 0:0a99e3fc2a46 | 197 | HTTPServer create_interactive_server() |
prabbat3 | 0:0a99e3fc2a46 | 198 | { |
prabbat3 | 0:0a99e3fc2a46 | 199 | HTTPServer srv(new InteractiveHTMLFormatter()); |
prabbat3 | 0:0a99e3fc2a46 | 200 | srv.add_request_handler("GET", new ComplexRequestHandler()); |
prabbat3 | 0:0a99e3fc2a46 | 201 | return srv; |
prabbat3 | 0:0a99e3fc2a46 | 202 | } |
prabbat3 | 0:0a99e3fc2a46 | 203 | |
prabbat3 | 0:0a99e3fc2a46 | 204 | //SET FOR CSV FORMAT: NEEDS TO BE EDITED IF DIFFERENT FORMAT |
prabbat3 | 0:0a99e3fc2a46 | 205 | void parse(char buffer[], int *j, char *string) { |
prabbat3 | 0:0a99e3fc2a46 | 206 | //extracts next location string data item from buffer |
prabbat3 | 0:0a99e3fc2a46 | 207 | int i=0; |
prabbat3 | 0:0a99e3fc2a46 | 208 | for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA |
prabbat3 | 0:0a99e3fc2a46 | 209 | if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string |
prabbat3 | 0:0a99e3fc2a46 | 210 | //comma is the string field delimiter |
prabbat3 | 0:0a99e3fc2a46 | 211 | string[i]=0; //SETS END OF SRTRING TO 0 |
prabbat3 | 0:0a99e3fc2a46 | 212 | *j=*j+i+1; //UPDATES to 1 after comma seperated value |
prabbat3 | 0:0a99e3fc2a46 | 213 | break; |
prabbat3 | 0:0a99e3fc2a46 | 214 | } else string[i]=buffer[*j+i]; //Keep adding to the string |
prabbat3 | 0:0a99e3fc2a46 | 215 | } |
prabbat3 | 0:0a99e3fc2a46 | 216 | } |