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 20:45:33 2014 +0000
Revision:
1:d7f65be2640d
Parent:
0:0a99e3fc2a46
Child:
2:0ec5c713bd50
pre-weather;

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 1:d7f65be2640d 25 PwmOut led(LED1); // led 1 indicates dim value
prabbat3 1:d7f65be2640d 26 DigitalOut led2(LED2); // led 2 indicates delay time for interrupts
prabbat3 1:d7f65be2640d 27 DigitalOut led3(LED3); // Indicates the alarm has been set
prabbat3 1:d7f65be2640d 28 DigitalOut led4(LED4); // Indiciates the alarm is going off
prabbat3 1:d7f65be2640d 29 int alarmSignaled = 0;
prabbat3 1:d7f65be2640d 30
prabbat3 1:d7f65be2640d 31 // pin for ZeroCross tail input
prabbat3 1:d7f65be2640d 32 // An external 1K pullup required
prabbat3 1:d7f65be2640d 33 InterruptIn zerocross(p22);
prabbat3 1:d7f65be2640d 34
prabbat3 1:d7f65be2640d 35 // pin for PowerSSRtail output
prabbat3 1:d7f65be2640d 36 DigitalOut SSR(p21);
prabbat3 1:d7f65be2640d 37
prabbat3 1:d7f65be2640d 38 //use timer interrupts to control dimming
prabbat3 1:d7f65be2640d 39 Timeout SSRtriggerOn;
prabbat3 1:d7f65be2640d 40
prabbat3 1:d7f65be2640d 41 // dimmer value 0.0=off and 1.0=full on
prabbat3 1:d7f65be2640d 42 volatile float dim;
prabbat3 1:d7f65be2640d 43
prabbat3 1:d7f65be2640d 44 // AC power line frequency
prabbat3 1:d7f65be2640d 45 const float powerlinefrequency=60.000;
prabbat3 1:d7f65be2640d 46
prabbat3 0:0a99e3fc2a46 47
prabbat3 0:0a99e3fc2a46 48 // Function prototypes
prabbat3 0:0a99e3fc2a46 49 HTTPServer create_simple_server();
prabbat3 0:0a99e3fc2a46 50 HTTPServer create_interactive_server();
prabbat3 0:0a99e3fc2a46 51 void thread_server(void const *args);
prabbat3 0:0a99e3fc2a46 52 void thread_display(void const *args);
prabbat3 0:0a99e3fc2a46 53 void thread_alarm(void const *args);
prabbat3 1:d7f65be2640d 54 void triggerOn();
prabbat3 1:d7f65be2640d 55 void dimmer();
prabbat3 1:d7f65be2640d 56 void turn_on();
prabbat3 0:0a99e3fc2a46 57
prabbat3 0:0a99e3fc2a46 58 int main() {
prabbat3 1:d7f65be2640d 59 dim = -1.0;
prabbat3 0:0a99e3fc2a46 60 printf("Getting IP Address.. ");
prabbat3 0:0a99e3fc2a46 61 uLCD.baudrate(2000000);
prabbat3 0:0a99e3fc2a46 62 uLCD.cls();
prabbat3 0:0a99e3fc2a46 63 uLCD.background_color(BLACK);
prabbat3 0:0a99e3fc2a46 64 uLCD.textbackground_color(BLACK);
prabbat3 0:0a99e3fc2a46 65 uLCD.locate(0,0);
prabbat3 0:0a99e3fc2a46 66 uLCD.color(BLUE);
prabbat3 0:0a99e3fc2a46 67 uLCD.text_height(2);
prabbat3 0:0a99e3fc2a46 68 uLCD.text_width(2);
prabbat3 0:0a99e3fc2a46 69 uLCD.printf("\n\nUniv Time\n Clock\n");
prabbat3 0:0a99e3fc2a46 70 uLCD.text_height(1);
prabbat3 0:0a99e3fc2a46 71 uLCD.text_width(1);
prabbat3 0:0a99e3fc2a46 72 uLCD.printf(" Loading...\n");
prabbat3 0:0a99e3fc2a46 73 uLCD.locate(0,0);
prabbat3 0:0a99e3fc2a46 74
prabbat3 0:0a99e3fc2a46 75 if(eth.init())
prabbat3 0:0a99e3fc2a46 76 {
prabbat3 0:0a99e3fc2a46 77 printf("Error while initializing the ethernet interface.\n");
prabbat3 0:0a99e3fc2a46 78 return -1;
prabbat3 0:0a99e3fc2a46 79 }
prabbat3 0:0a99e3fc2a46 80 wait(5);
prabbat3 0:0a99e3fc2a46 81 if(eth.connect())
prabbat3 0:0a99e3fc2a46 82 {
prabbat3 0:0a99e3fc2a46 83 printf("Error while starting the ethernet interface.\n");
prabbat3 0:0a99e3fc2a46 84 return -1;
prabbat3 0:0a99e3fc2a46 85 }
prabbat3 0:0a99e3fc2a46 86
prabbat3 0:0a99e3fc2a46 87 printf("IP Address is %s\n", eth.getIPAddress());
prabbat3 0:0a99e3fc2a46 88
prabbat3 0:0a99e3fc2a46 89 printf("Reading time..\n");
prabbat3 0:0a99e3fc2a46 90 char* domainName="us.pool.ntp.org"; //SET TO DOMAIN NAME OF SERVER GETTING TIME FROM
prabbat3 0:0a99e3fc2a46 91 //GETS THE TIME FROM THE SERVER
prabbat3 0:0a99e3fc2a46 92 //setTime(DOMAIN_NAME,PORT_NUMBER,TIME_OUT)
prabbat3 0:0a99e3fc2a46 93 //DOMAIN_NAME= domain name
prabbat3 0:0a99e3fc2a46 94 //PORT NUMBER=port number (123 for NTP)
prabbat3 0:0a99e3fc2a46 95 //TIME_OUT= timeout value for request
prabbat3 0:0a99e3fc2a46 96 ntpClient.setTime(domainName,123,0x00005000);
prabbat3 0:0a99e3fc2a46 97 printf("Time set.\n");
prabbat3 1:d7f65be2640d 98
prabbat3 1:d7f65be2640d 99
prabbat3 1:d7f65be2640d 100 //set up interrupt routine to detect AC line zero crossings
prabbat3 1:d7f65be2640d 101 zerocross.mode(PullNone);
prabbat3 1:d7f65be2640d 102 wait(.2);
prabbat3 1:d7f65be2640d 103 zerocross.rise(&dimmer);
prabbat3 1:d7f65be2640d 104 // main program only sets dimmer level (dim)
prabbat3 1:d7f65be2640d 105 // interrupt routines dim the light
prabbat3 1:d7f65be2640d 106
prabbat3 0:0a99e3fc2a46 107
prabbat3 0:0a99e3fc2a46 108 Thread t1(thread_server); //start thread_server
prabbat3 0:0a99e3fc2a46 109 Thread t2(thread_display);
prabbat3 0:0a99e3fc2a46 110 Thread t3(thread_alarm);
prabbat3 0:0a99e3fc2a46 111
prabbat3 0:0a99e3fc2a46 112 while(1){}
prabbat3 0:0a99e3fc2a46 113 }
prabbat3 0:0a99e3fc2a46 114
prabbat3 0:0a99e3fc2a46 115 void thread_alarm(void const *args)
prabbat3 0:0a99e3fc2a46 116 {
prabbat3 0:0a99e3fc2a46 117 while(1){
prabbat3 1:d7f65be2640d 118 if(_alarm.alarmSet && !alarmSignaled){
prabbat3 1:d7f65be2640d 119 led3 = 1;
prabbat3 0:0a99e3fc2a46 120 if(_alarm.hours == hour && _alarm.minutes == minute && _alarm.amPm == ampm){
prabbat3 1:d7f65be2640d 121 alarmSignaled = 1;
prabbat3 1:d7f65be2640d 122 turn_on();
prabbat3 0:0a99e3fc2a46 123 led4 = 1;
prabbat3 0:0a99e3fc2a46 124 }
prabbat3 0:0a99e3fc2a46 125 }
prabbat3 0:0a99e3fc2a46 126 Thread::wait(100);
prabbat3 0:0a99e3fc2a46 127 }
prabbat3 0:0a99e3fc2a46 128 }
prabbat3 0:0a99e3fc2a46 129
prabbat3 0:0a99e3fc2a46 130 void thread_display(void const *args){
prabbat3 0:0a99e3fc2a46 131 time_t ctTime; //system time structure
prabbat3 0:0a99e3fc2a46 132 uLCD.cls();
prabbat3 0:0a99e3fc2a46 133 uLCD.locate(0,0);
prabbat3 0:0a99e3fc2a46 134 uLCD.text_height(2);
prabbat3 0:0a99e3fc2a46 135 uLCD.text_width(1);
prabbat3 0:0a99e3fc2a46 136 char buffer[80]; //BUFFER TO HOLD FORMATTED TIME DATA
prabbat3 0:0a99e3fc2a46 137 uLCD.textbackground_color(BLACK);
prabbat3 0:0a99e3fc2a46 138
prabbat3 0:0a99e3fc2a46 139 while (1) {
prabbat3 0:0a99e3fc2a46 140
prabbat3 0:0a99e3fc2a46 141 uLCD.locate(0,0);
prabbat3 0:0a99e3fc2a46 142 uLCD.color(RED);
prabbat3 0:0a99e3fc2a46 143 // loop and periodically update the LCD's time display
prabbat3 0:0a99e3fc2a46 144 ctTime = time(NULL)-(3600*4); //TIME with offset for eastern time US
prabbat3 0:0a99e3fc2a46 145
prabbat3 0:0a99e3fc2a46 146 //FORMAT TIME FOR DISPLAY AND STORE FORMATTED RESULT IN BUFFER
prabbat3 0:0a99e3fc2a46 147 strftime(buffer,80,"%a %b %d %T %p %z %Z",localtime(&ctTime));
prabbat3 0:0a99e3fc2a46 148
prabbat3 0:0a99e3fc2a46 149 int i=0;
prabbat3 0:0a99e3fc2a46 150 char* chars_array = strtok(buffer, " :");
prabbat3 0:0a99e3fc2a46 151 //printf("Chars array: \n");
prabbat3 0:0a99e3fc2a46 152 while(chars_array)
prabbat3 0:0a99e3fc2a46 153 {
prabbat3 0:0a99e3fc2a46 154 switch(i){
prabbat3 0:0a99e3fc2a46 155 case 0:
prabbat3 0:0a99e3fc2a46 156 dayOfWeek = chars_array;
prabbat3 0:0a99e3fc2a46 157 break;
prabbat3 0:0a99e3fc2a46 158 case 1:
prabbat3 0:0a99e3fc2a46 159 month = chars_array;
prabbat3 0:0a99e3fc2a46 160 break;
prabbat3 0:0a99e3fc2a46 161 case 2:
prabbat3 0:0a99e3fc2a46 162 dayNum = chars_array;
prabbat3 0:0a99e3fc2a46 163 break;
prabbat3 0:0a99e3fc2a46 164 case 3:
prabbat3 0:0a99e3fc2a46 165 //chars_array = chars_array - 1;
prabbat3 0:0a99e3fc2a46 166 int hourTemp = atoi(chars_array);
prabbat3 0:0a99e3fc2a46 167 hourTemp--; //Daylight savings
prabbat3 0:0a99e3fc2a46 168 if(hourTemp > 12) hourTemp -= 12;
prabbat3 0:0a99e3fc2a46 169 hour = hourTemp;
prabbat3 0:0a99e3fc2a46 170 break;
prabbat3 0:0a99e3fc2a46 171 case 4:
prabbat3 0:0a99e3fc2a46 172 minute = atoi(chars_array);
prabbat3 0:0a99e3fc2a46 173 break;
prabbat3 0:0a99e3fc2a46 174 case 5:
prabbat3 0:0a99e3fc2a46 175 sec = atoi(chars_array);
prabbat3 0:0a99e3fc2a46 176 break;
prabbat3 0:0a99e3fc2a46 177 case 6:
prabbat3 0:0a99e3fc2a46 178 ampm = chars_array;
prabbat3 0:0a99e3fc2a46 179 break;
prabbat3 0:0a99e3fc2a46 180 }
prabbat3 0:0a99e3fc2a46 181 i++;
prabbat3 0:0a99e3fc2a46 182
prabbat3 0:0a99e3fc2a46 183 chars_array = strtok(NULL, " :");
prabbat3 0:0a99e3fc2a46 184 }
prabbat3 0:0a99e3fc2a46 185
prabbat3 0:0a99e3fc2a46 186 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 187 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 188 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 189 else{ uLCD.printf(" %s, %s %s\n %d:%d:%d %s", dayOfWeek, month, dayNum, hour, minute, sec, ampm); }
prabbat3 0:0a99e3fc2a46 190
prabbat3 0:0a99e3fc2a46 191 if(_alarm.alarmSet){
prabbat3 0:0a99e3fc2a46 192 uLCD.color(GREEN);
prabbat3 0:0a99e3fc2a46 193 if(_alarm.minutes < 10){ uLCD.printf("\n\n Alarm:\n %d:0%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); }
prabbat3 0:0a99e3fc2a46 194 else{ uLCD.printf("\n\n Alarm:\n %d:%d %s", _alarm.hours, _alarm.minutes, _alarm.amPm); }
prabbat3 0:0a99e3fc2a46 195 }
prabbat3 0:0a99e3fc2a46 196
prabbat3 0:0a99e3fc2a46 197 Thread::wait(100);
prabbat3 0:0a99e3fc2a46 198 }
prabbat3 0:0a99e3fc2a46 199 }
prabbat3 0:0a99e3fc2a46 200
prabbat3 0:0a99e3fc2a46 201 void thread_server(void const *args)
prabbat3 0:0a99e3fc2a46 202 {
prabbat3 0:0a99e3fc2a46 203 RPCType::instance().register_types();
prabbat3 0:0a99e3fc2a46 204 HTTPServer srv = create_interactive_server();
prabbat3 0:0a99e3fc2a46 205
prabbat3 0:0a99e3fc2a46 206 if(!srv.init(SERVER_PORT))
prabbat3 0:0a99e3fc2a46 207 {
prabbat3 0:0a99e3fc2a46 208 eth.disconnect();
prabbat3 0:0a99e3fc2a46 209 //return -1;
prabbat3 0:0a99e3fc2a46 210 printf("Thread 1 error.\n");
prabbat3 0:0a99e3fc2a46 211 }
prabbat3 0:0a99e3fc2a46 212
prabbat3 0:0a99e3fc2a46 213 srv.run();
prabbat3 0:0a99e3fc2a46 214 }
prabbat3 0:0a99e3fc2a46 215
prabbat3 0:0a99e3fc2a46 216 HTTPServer create_simple_server()
prabbat3 0:0a99e3fc2a46 217 {
prabbat3 0:0a99e3fc2a46 218 HTTPServer srv;
prabbat3 0:0a99e3fc2a46 219 srv.add_request_handler("DELETE", new DeleteRequestHandler());
prabbat3 0:0a99e3fc2a46 220 srv.add_request_handler("GET", new GetRequestHandler());
prabbat3 0:0a99e3fc2a46 221 srv.add_request_handler("PUT", new PutRequestHandler());
prabbat3 0:0a99e3fc2a46 222 return srv;
prabbat3 0:0a99e3fc2a46 223 }
prabbat3 0:0a99e3fc2a46 224
prabbat3 0:0a99e3fc2a46 225 HTTPServer create_interactive_server()
prabbat3 0:0a99e3fc2a46 226 {
prabbat3 0:0a99e3fc2a46 227 HTTPServer srv(new InteractiveHTMLFormatter());
prabbat3 0:0a99e3fc2a46 228 srv.add_request_handler("GET", new ComplexRequestHandler());
prabbat3 0:0a99e3fc2a46 229 return srv;
prabbat3 0:0a99e3fc2a46 230 }
prabbat3 1:d7f65be2640d 231
prabbat3 1:d7f65be2640d 232 // this interrupt routine is activated after a time delay set by dim value
prabbat3 1:d7f65be2640d 233 void triggerOn()
prabbat3 1:d7f65be2640d 234 {
prabbat3 1:d7f65be2640d 235 SSR = 1;
prabbat3 1:d7f65be2640d 236 led2=0;
prabbat3 1:d7f65be2640d 237 }
prabbat3 1:d7f65be2640d 238
prabbat3 1:d7f65be2640d 239 // this interrupt routine is activated by every AC line zero crossing
prabbat3 1:d7f65be2640d 240 // it is needed to synchronize the SSR turnon time delay to the AC line
prabbat3 1:d7f65be2640d 241 void dimmer()
prabbat3 1:d7f65be2640d 242 {
prabbat3 1:d7f65be2640d 243 // turn off SSR at zero crossing
prabbat3 1:d7f65be2640d 244 SSR = 0;
prabbat3 1:d7f65be2640d 245 // compute time delay using dim value and set timer interrupt
prabbat3 1:d7f65be2640d 246 // triggers SSR after a small post zero crossing time delay
prabbat3 1:d7f65be2640d 247 SSRtriggerOn.attach(&triggerOn,(1.001-dim)/(2*powerlinefrequency));
prabbat3 1:d7f65be2640d 248 led2=1;
prabbat3 1:d7f65be2640d 249 }
prabbat3 1:d7f65be2640d 250
prabbat3 1:d7f65be2640d 251 void turn_on(){
prabbat3 1:d7f65be2640d 252 //increase brightness
prabbat3 1:d7f65be2640d 253 for(dim = 0.0; dim <= 1.0; dim += 0.025) {
prabbat3 1:d7f65be2640d 254 led = (dim < 0 ? 0 : dim);
prabbat3 1:d7f65be2640d 255 wait(0.10);
prabbat3 0:0a99e3fc2a46 256 }
prabbat3 1:d7f65be2640d 257 dim = 1.0;
prabbat3 0:0a99e3fc2a46 258 }