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
Diff: main.cpp
- Revision:
- 0:0a99e3fc2a46
- Child:
- 1:d7f65be2640d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Nov 15 19:36:44 2014 +0000 @@ -0,0 +1,216 @@ +// Includes +#include "mbed.h" +#include "NTPClient.h" +#include "uLCD_4DGL.h" +#include "EthernetInterface.h" +#include <string> +#include "mbed_rpc.h" +#include "RPCCommand.h" +#include "HTTPServer.h" +#include "Formatter.h" +#include "RequestHandler.h" +#include "RPCType.h" +#include "alarmContainer.h" + +// Defines +#define SERVER_PORT 80 //HTTPSERVER + +// Global variables +EthernetInterface eth; +uLCD_4DGL uLCD(p28, p27, p29); // serial tx, serial rx, reset pin; +NTPClient ntpClient; +alarmModel _alarm; +string dayOfWeek, month, dayNum, ampm; +int hour, minute, sec; +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +// Function prototypes +HTTPServer create_simple_server(); +HTTPServer create_interactive_server(); +void parse(char[], int*, char*); +void thread_server(void const *args); +void thread_display(void const *args); +void thread_alarm(void const *args); + +int main() { + + printf("Getting IP Address.. "); + + uLCD.baudrate(2000000); + uLCD.cls(); + uLCD.background_color(BLACK); + uLCD.textbackground_color(BLACK); + uLCD.locate(0,0); + uLCD.color(BLUE); + uLCD.text_height(2); + uLCD.text_width(2); + uLCD.printf("\n\nUniv Time\n Clock\n"); + uLCD.text_height(1); + uLCD.text_width(1); + uLCD.printf(" Loading...\n"); + uLCD.locate(0,0); + + if(eth.init()) + { + printf("Error while initializing the ethernet interface.\n"); + return -1; + } + wait(5); + if(eth.connect()) + { + printf("Error while starting the ethernet interface.\n"); + return -1; + } + + printf("IP Address is %s\n", eth.getIPAddress()); + + printf("Reading time..\n"); + char* domainName="us.pool.ntp.org"; //SET TO DOMAIN NAME OF SERVER GETTING TIME FROM + //GETS THE TIME FROM THE SERVER + //setTime(DOMAIN_NAME,PORT_NUMBER,TIME_OUT) + //DOMAIN_NAME= domain name + //PORT NUMBER=port number (123 for NTP) + //TIME_OUT= timeout value for request + ntpClient.setTime(domainName,123,0x00005000); + printf("Time set.\n"); + + Thread t1(thread_server); //start thread_server + Thread t2(thread_display); + Thread t3(thread_alarm); + + while(1){} +} + +void thread_alarm(void const *args) +{ + while(1){ + if(_alarm.alarmSet){ + led1 = 1; + if(_alarm.hours == hour && _alarm.minutes == minute && _alarm.amPm == ampm){ + led2 = 1; + led3 = 1; + led4 = 1; + } + } + Thread::wait(100); + } +} + +void thread_display(void const *args){ + time_t ctTime; //system time structure + uLCD.cls(); + uLCD.locate(0,0); + uLCD.text_height(2); + uLCD.text_width(1); + char buffer[80]; //BUFFER TO HOLD FORMATTED TIME DATA + uLCD.textbackground_color(BLACK); + + while (1) { + + uLCD.locate(0,0); + uLCD.color(RED); + // loop and periodically update the LCD's time display + ctTime = time(NULL)-(3600*4); //TIME with offset for eastern time US + + //FORMAT TIME FOR DISPLAY AND STORE FORMATTED RESULT IN BUFFER + strftime(buffer,80,"%a %b %d %T %p %z %Z",localtime(&ctTime)); + + int i=0; + char* chars_array = strtok(buffer, " :"); + //printf("Chars array: \n"); + while(chars_array) + { + switch(i){ + case 0: + dayOfWeek = chars_array; + break; + case 1: + month = chars_array; + break; + case 2: + dayNum = chars_array; + break; + case 3: + //chars_array = chars_array - 1; + int hourTemp = atoi(chars_array); + hourTemp--; //Daylight savings + if(hourTemp > 12) hourTemp -= 12; + hour = hourTemp; + break; + case 4: + minute = atoi(chars_array); + break; + case 5: + sec = atoi(chars_array); + break; + case 6: + ampm = chars_array; + break; + } + i++; + + chars_array = strtok(NULL, " :"); + } + + if(minute < 10 && sec < 10){ uLCD.printf(" %s, %s %s\n %d:0%d:0%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } + else if(minute < 10){ uLCD.printf(" %s, %s %s\n %d:0%d:%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } + else if (sec < 10){ uLCD.printf(" %s, %s %s\n %d:%d:0%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } + else{ uLCD.printf(" %s, %s %s\n %d:%d:%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); } + + if(_alarm.alarmSet){ + uLCD.color(GREEN); + if(_alarm.minutes < 10){ uLCD.printf("\n\n Alarm:\n %d:0%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); } + else{ uLCD.printf("\n\n Alarm:\n %d:%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); } + } + + Thread::wait(100); + } +} + +void thread_server(void const *args) +{ + RPCType::instance().register_types(); + HTTPServer srv = create_interactive_server(); + + if(!srv.init(SERVER_PORT)) + { + eth.disconnect(); + //return -1; + printf("Thread 1 error.\n"); + } + + srv.run(); +} + +HTTPServer create_simple_server() +{ + HTTPServer srv; + srv.add_request_handler("DELETE", new DeleteRequestHandler()); + srv.add_request_handler("GET", new GetRequestHandler()); + srv.add_request_handler("PUT", new PutRequestHandler()); + return srv; +} + +HTTPServer create_interactive_server() +{ + HTTPServer srv(new InteractiveHTMLFormatter()); + srv.add_request_handler("GET", new ComplexRequestHandler()); + return srv; +} + +//SET FOR CSV FORMAT: NEEDS TO BE EDITED IF DIFFERENT FORMAT +void parse(char buffer[], int *j, char *string) { +//extracts next location string data item from buffer + int i=0; + for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA + if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string + //comma is the string field delimiter + string[i]=0; //SETS END OF SRTRING TO 0 + *j=*j+i+1; //UPDATES to 1 after comma seperated value + break; + } else string[i]=buffer[*j+i]; //Keep adding to the string + } +} \ No newline at end of file