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 Angel Daruna

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?

UserRevisionLine numberNew 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 }