| @@ -0,0 +1,200 @@
+#include "user_interface.h"
+#include
+#include
+#include "secrets.h"
+
+#define DEBUG false // todo: change macro from DEBUG to SERIAL (i think debug is fucking with things)
+#define UDP true
+#define TCP true
+
+WiFiUDP Udp;
+
+uint32_t wake_up_count = 0;
+
+// ap_* variables declared in 'secrets.h'
+// const char* ap_ssid = "";
+// const char* ap_pass = "";
+const char* server_host = "192.168.2.20";
+const uint16_t server_port = 8008;
+const uint16_t local_udp_port = 5000;
+uint32_t max_ap_conn_attempts = 5;
+uint32_t max_client_conn_attempts = 5;
+uint32_t reconn_attempt_timeout = 4000;
+uint32_t ap_conn_attempt_timeout = 20000;
+
+const int event_open = 1; // todo: change to enum
+const int event_close = 2;
+bool event_mailbox_open = false;
+char event_open_message[] = "SENSOR\nMAIL 1 OPEN";
+char event_close_message[] = "SENSOR\nMAILBOX 1 CLOSE";
+
+void onWakeUp() {
+ wake_up_count += 1;
+#ifdef DEBUG
+ Serial.println("Callback called");
+#endif
+ bool connected = connectToAccessPoint();
+ if (connected) {
+ sendEvent(event_open);
+ }
+#ifdef DEBUG
+ Serial.println("Waiting to sleep");
+#endif
+ while(digitalRead(D2)) {
+#ifdef DEBUG
+ Serial.print(".");
+#endif
+ delay(100);
+ }
+ if (connected) {
+ sendEvent(event_close);
+ }
+ disconnectFromAccessPoint();
+ goToSleep();
+}
+
+bool connectToAccessPoint() {
+#ifdef DEBUG
+ Serial.println("Connecting to AP");
+#endif
+ WiFi.mode(WIFI_STA);
+ WiFi.begin(ap_ssid, ap_pass);
+ WiFi.waitForConnectResult(ap_conn_attempt_timeout);
+ if(WiFi.status() != WL_CONNECTED) {
+#ifdef DEBUG
+ Serial.println("> Fail");
+#endif
+ return false;
+ } else {
+#ifdef DEBUG
+ Serial.println("> Success");
+#endif
+ return true;
+ }
+}
+
+void disconnectFromAccessPoint() {
+#ifdef DEBUG
+ Serial.println("Disconnecting from AP");
+#endif
+ WiFi.mode(WIFI_OFF);
+}
+
+void goToSleep() {
+#ifdef DEBUG
+ Serial.println("Going to sleep");
+#endif
+ wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
+ wifi_fpm_open();
+ gpio_pin_wakeup_enable(D2, GPIO_PIN_INTR_HILEVEL);
+#ifdef DEBUG
+ digitalWrite(LED_BUILTIN_AUX, HIGH);
+#endif
+ wifi_fpm_do_sleep(0xFFFFFFF);
+ // the CPU will only enter light sleep on the next idle cycle, which
+ // can be triggered by a short delay()
+ delay(100);
+#ifdef DEBUG
+ digitalWrite(LED_BUILTIN_AUX, LOW);
+ Serial.println("Woke up from sleep");
+#endif
+ onWakeUp();
+}
+
+void sendUdpMessage(char* message) {
+#ifdef DEBUG
+ Serial.println("Sending UDP");
+#endif
+ Udp.begin(5000);
+ delay(100);
+ int packet_began = Udp.beginPacket(server_host, server_port);
+#ifdef DEBUG
+ if(packet_began) {
+ Serial.println("> Packet begun");
+ } else {
+ Serial.println("> Packet not begun");
+ }
+#endif
+ Udp.write(message);
+ int packet_end = Udp.endPacket();
+#ifdef DEBUG
+ if(packet_end) {
+ Serial.println("> Packet end");
+ } else {
+ Serial.println("> Packet not end");
+ }
+#endif
+}
+
+void sendTcpMessage(char* message) {
+#ifdef DEBUG
+ Serial.println("Sending TCP");
+#endif
+ WiFiClient client;
+ for(uint32_t i = 0; i < max_client_conn_attempts; i++) {
+ if (!client.connect(server_host, server_port)) { // TODO: Change to UDP
+#ifdef DEBUG
+ Serial.print(".");
+#endif
+ delay(reconn_attempt_timeout);
+ } else {
+ break;
+ }
+ }
+ if(!client.connected()) {
+#ifdef DEBUG
+ Serial.println("> Failed to connect client to server");
+#endif
+ // This will be a missed event. Could add event to a running log,
+ // and transmit the log next time there is successful connection.
+ return;
+ }
+#ifdef DEBUG
+ Serial.println("> Sending string");
+#endif
+ client.println(message);
+ client.abort();
+}
+
+void sendEvent(int event) {
+#ifdef DEBUG
+ Serial.println("Connecting to client");
+#endif
+ char* message;
+ switch(event) {
+ case event_open:
+ message = event_open_message;
+ break;
+ case event_close:
+ message = event_close_message;
+ break;
+ }
+#ifdef UDP
+ sendUdpMessage(message);
+#endif
+#ifdef TCP
+ sendTcpMessage(message);
+#endif
+}
+
+void setup() {
+#ifdef DEBUG
+ Serial.begin(115200);
+ delay(1000);
+ Serial.println();
+ Serial.println();
+ pinMode(LED_BUILTIN_AUX, OUTPUT);
+ digitalWrite(LED_BUILTIN_AUX, LOW);
+#endif
+ pinMode(D2, INPUT_PULLUP);
+ digitalWrite(D2, LOW);
+#ifdef DEBUG
+ Serial.println("Setup complete");
+#endif
+ delay(1000);
+ goToSleep(); // fix: false event triggered on program boot.
+}
+
+void loop() {
+ delay(1000);
+} |