]> git.0d.be Git - PanikSwitch.git/blobdiff - FINAL2013V2.ino
use a simple int for active selection
[PanikSwitch.git] / FINAL2013V2.ino
index 0734bd8f647b4fe7cd523b2afee4b801359fa0e6..c9f3829e6d9a0a00e13d93daf013b8b09181430f 100644 (file)
@@ -1,6 +1,7 @@
 // Panik Web Form Demo
 
 #define SERIAL_DEBUG
+#define ENABLE_UDP
 
 
 // define network constants
 #include <SPI.h>
 #include <SD.h>
 #include <Ethernet.h>
+#ifdef ENABLE_UDP
 #include <EthernetUdp.h>
+#endif
 
 // include third party libraries
 #include "WebServer.h"
 
-// include in-house libs
-#include "PanikSwitch.h"    // contains variable types for panik switch
-
 // define SD and Ethernet select ports
 #define  SD_SELECT            4
 #define  ETHERNET_SELECT     10
 #define NONSTOP_VIA_STUD1       14   // is nonstop coming out of studio 1
 #define NONSTOP_VIA_STUD2       15   // is nonstop coming out of studio 2
 
+/* status */
+#define NONSTOP 0
+#define STUDIO1 1
+#define STUDIO2 2
+
+
+/* relay positions */
+typedef enum { RELAY_STATE_OPEN, RELAY_STATE_CLOSED } relayState_t;
 
 
 /* define an array with led pins,
@@ -59,10 +67,10 @@ const int ledsArray[] = { RELAY_GREEN_LEDS, RELAY_RED_LEDS, RELAY_YELLOW_LEDS };
 /* activeSelection is the variable that holds the active output of the switch
    it is declared as an attribute that keeps its value between arduino resets
 */
-switchSelection_t activeSelection __attribute__ ((section (".noinit")));
+int activeSelection = NONSTOP;
 
 // variables and timers for blinking selection (selected but not confirmed)
-switchSelection_t blinkingSelection = nonstop;
+int blinkingSelection = NONSTOP;
 bool blinkingLedState = RELAY_STATE_CLOSED;
 unsigned long blinkingStartTime = 0, blinkingAbortTime = 0;
 
@@ -91,9 +99,11 @@ static uint8_t mac[] = MAC_ADDRESS;
 // instanciate web server
 WebServer webserver(PREFIX, 80);
 
+#ifdef ENABLE_UDP
 // and EthernetUDP instance to send notifications
 EthernetUDP Udp;
 IPAddress udp_remote_ip(192, 168, 17, 224);
+#endif
 
 
 #define NAMELEN 4
@@ -102,6 +112,21 @@ IPAddress udp_remote_ip(192, 168, 17, 224);
 typedef enum responseStatus { NO_POST, POST_OK, POST_ERROR };
 
 
+inline void notify_udp()  // notify over UDP
+{
+#ifdef ENABLE_UDP
+  char str_selection[20];
+  snprintf(str_selection, 19, "{\"active\": %d}", activeSelection);
+  #ifdef SERIAL_DEBUG
+  Serial.println(F("Sending UDP... "));
+  Serial.println(str_selection);
+  #endif
+  Udp.beginPacket(udp_remote_ip, 1312);
+  Udp.write(str_selection);
+  Udp.endPacket();
+#endif
+}
+
 // web resource
 void webCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
 {
@@ -126,9 +151,11 @@ void webCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, b
     {
       if (strcmp(name, "s") == 0) {
         digitalWrite(ledsArray[activeSelection], RELAY_STATE_CLOSED);
-        blinkingSelection = static_cast<switchSelection_t>(atoi(value));
-        activeSelection = static_cast<switchSelection_t>(atoi(value));
+        blinkingSelection = atoi(value);
+        activeSelection = atoi(value);
         response_status = POST_OK;
+
+        notify_udp();
       }
     }
   }
@@ -153,10 +180,7 @@ void webCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, b
 // setup function
 void setup()
 {
-  // make sure that activeSelection holds something valid
-//  if (!(activeSelection > nonstop) || !(activeSelection < _NbrSwitchSelections))
-//    activeSelection = nonstop;
-  blinkingSelection = activeSelection = nonstop;
+  blinkingSelection = activeSelection = NONSTOP;
 
   // open serial communication for debugging
   Serial.begin(9600);
@@ -181,11 +205,13 @@ void setup()
     #endif
     while (1) ;
   }
+  #ifdef ENABLE_UDP
   if (! Udp.begin(1312)) {
     #ifdef SERIAL_DEBUG
     Serial.println(F("Failed to initiate UDP"));
     #endif
   }
+  #endif
 
   // set mode for used pins
   pinMode(RELAY_RED_LEDS, OUTPUT);
@@ -244,6 +270,9 @@ void loop()
       #endif
       digitalWrite(ledsArray[blinkingSelection], RELAY_STATE_CLOSED);
       blinkingSelection++;
+      if (blinkingSelection > STUDIO2) {
+        blinkingSelection = NONSTOP;
+      }
       blinkingStartTime = millis(),
       blinkingAbortTime = millis();
       blinkingLedState = RELAY_STATE_OPEN;
@@ -272,18 +301,13 @@ void loop()
       #endif
       if (activeSelection != blinkingSelection)
       {
-        char str_selection[20];
         digitalWrite(ledsArray[activeSelection], RELAY_STATE_CLOSED);
         activeSelection = blinkingSelection;  // relay states must be changed now
         #ifdef SERIAL_DEBUG
         Serial.print(F("Active Selection: "));
         Serial.println(activeSelection);
         #endif
-        // notify over UDP
-        snprintf(str_selection, 19, "{\"active\": %d}", activeSelection);
-        Udp.beginPacket(udp_remote_ip, 1312);
-        Udp.write(str_selection);
-        Udp.endPacket();
+        notify_udp();
         break;
       }
   }
@@ -312,17 +336,17 @@ void loop()
   digitalWrite(ledsArray[activeSelection], RELAY_STATE_OPEN);
 
   // update audio channel relays
-  if (activeSelection == nonstop)
+  if (activeSelection == NONSTOP)
   {
     digitalWrite(RELAY_NONSTOP_OR_STUD, RELAY_STATE_CLOSED);
     digitalWrite(RELAY_STUD1_OR_STUD2, RELAY_STATE_CLOSED);
   }
-  else if (activeSelection == studio1)
+  else if (activeSelection == STUDIO1)
   {
     digitalWrite(RELAY_NONSTOP_OR_STUD, RELAY_STATE_OPEN);
     digitalWrite(RELAY_STUD1_OR_STUD2, RELAY_STATE_CLOSED);
   }
-  else if (activeSelection == studio2)
+  else if (activeSelection == STUDIO2)
   {
     digitalWrite(RELAY_NONSTOP_OR_STUD, RELAY_STATE_OPEN);
     digitalWrite(RELAY_STUD1_OR_STUD2, RELAY_STATE_OPEN);