Paul Rabbat / Mbed 2 deprecated ECE4180_FinalProject

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient mbed-rpc mbed-rtos mbed HTTPClient spxml

Revision:
1:d7f65be2640d
Parent:
0:0a99e3fc2a46
Child:
2:0ec5c713bd50
--- a/main.cpp	Sat Nov 15 19:36:44 2014 +0000
+++ b/main.cpp	Sat Nov 15 20:45:33 2014 +0000
@@ -22,23 +22,42 @@
 alarmModel _alarm;
 string dayOfWeek, month, dayNum, ampm;
 int hour, minute, sec;
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
+PwmOut led(LED1); // led 1 indicates dim value
+DigitalOut led2(LED2); // led 2 indicates delay time for interrupts
+DigitalOut led3(LED3); // Indicates the alarm has been set 
+DigitalOut led4(LED4);  // Indiciates the alarm is going off
+int alarmSignaled = 0;
+
+// pin for ZeroCross tail input
+// An external 1K pullup required
+InterruptIn zerocross(p22);
+ 
+// pin for PowerSSRtail output
+DigitalOut SSR(p21);
+ 
+//use timer interrupts to control dimming
+Timeout SSRtriggerOn;
+ 
+// dimmer value 0.0=off and 1.0=full on
+volatile float dim;
+ 
+// AC power line frequency
+const float powerlinefrequency=60.000;
+
 
 // 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);
+void triggerOn();
+void dimmer();
+void turn_on();
 
 int main() {
-    
+    dim = -1.0;
     printf("Getting IP Address.. ");
-    
     uLCD.baudrate(2000000);
     uLCD.cls();
     uLCD.background_color(BLACK); 
@@ -76,6 +95,15 @@
     //TIME_OUT= timeout value for request
     ntpClient.setTime(domainName,123,0x00005000);
     printf("Time set.\n");
+    
+    
+    //set up interrupt routine to detect AC line zero crossings
+    zerocross.mode(PullNone);
+    wait(.2);
+    zerocross.rise(&dimmer);
+    // main program only sets dimmer level (dim)
+    // interrupt routines dim the light
+    
 
     Thread t1(thread_server); //start thread_server
     Thread t2(thread_display);
@@ -87,11 +115,11 @@
 void thread_alarm(void const *args)
 {
     while(1){
-        if(_alarm.alarmSet){
-            led1 = 1;
+        if(_alarm.alarmSet && !alarmSignaled){
+            led3 = 1;
             if(_alarm.hours == hour && _alarm.minutes == minute && _alarm.amPm == ampm){
-                led2 = 1;
-                led3 = 1;
+                alarmSignaled = 1;
+                turn_on();
                 led4 = 1;
             }
         }
@@ -200,17 +228,31 @@
     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
+
+// this interrupt routine is activated after a time delay set by dim value
+void triggerOn()
+{
+    SSR = 1;
+    led2=0;
+}
+
+// this interrupt routine is activated by every AC line zero crossing
+// it is needed to synchronize the SSR turnon time delay to the AC line
+void dimmer()
+{
+    // turn off SSR at zero crossing
+    SSR = 0;
+    // compute time delay using dim value and set timer interrupt
+    // triggers SSR after a small post zero crossing time delay
+    SSRtriggerOn.attach(&triggerOn,(1.001-dim)/(2*powerlinefrequency));
+    led2=1;
+}
+
+void turn_on(){
+    //increase brightness
+    for(dim = 0.0; dim <= 1.0; dim += 0.025) {
+        led = (dim < 0 ? 0 : dim);
+        wait(0.10);
     }
+    dim = 1.0;
 }
\ No newline at end of file