// 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,
/* 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;
// 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
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)
{
{
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();
}
}
}
// 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);
Serial.println(Ethernet.localIP());
else
{
+ #ifdef SERIAL_DEBUG
Serial.println(F("Network Error"));
+ #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);
case nochange:
break;
case pressed:
- //Serial.println(F("Button 1 pressed"));
+ #ifdef SERIAL_DEBUG
+ Serial.println(F("Button 1 pressed"));
+ #endif
digitalWrite(ledsArray[blinkingSelection], RELAY_STATE_CLOSED);
blinkingSelection++;
+ if (blinkingSelection > STUDIO2) {
+ blinkingSelection = NONSTOP;
+ }
blinkingStartTime = millis(),
blinkingAbortTime = millis();
blinkingLedState = RELAY_STATE_OPEN;
break;
case released:
- //Serial.println(F("Button 1 released"));
+ #ifdef SERIAL_DEBUG
+ Serial.println(F("Button 1 released"));
+ #endif
break;
}
case nochange:
break;
case pressed:
- //Serial.println(F("Button 2 pressed"));
+ #ifdef SERIAL_DEBUG
+ Serial.println(F("Button 2 pressed"));
+ #endif
blinkingAbortTime = 0; // disable blinking auto abort
break;
case released:
- //Serial.println(F("Button 2 released"));
+ #ifdef SERIAL_DEBUG
+ Serial.println(F("Button 2 released"));
+ #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);
- // notify over UDP
- snprintf(str_selection, 19, "{\"active\": %d}", activeSelection);
- Udp.beginPacket(udp_remote_ip, 1312);
- Udp.write(str_selection);
- Udp.endPacket();
+ #endif
+ notify_udp();
break;
}
}
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);
}
return nochange;
}
-