extern "C" { #define LWIP_OPEN_SRC #include "user_interface.h" } #include #include #include #define MAX_CLIENTS 4 String WifiSSIDPrefix = "CrystalPoint"; char WifiPassword[10]; char WifiSSID[17]; struct controllerInformation{ IPAddress ipaddr; u_long lastPackage; }; controllerInformation ConnectionList[MAX_CLIENTS]; u_long lastDisconnectionCheck = 0; //Serial buffer string String serialInput = ""; boolean serialDataReady = false; //UDP server (receiving) setup unsigned int udpPort = 2730; byte packetBuffer[512]; //udp package buffer WiFiUDP Udp; boolean started = false; void setup(void){ Serial.begin(115200); Serial.println(); //LED pinMode(2,OUTPUT); digitalWrite(2,LOW); //BUTTON pinMode(0,INPUT); Udp.begin(udpPort); delay(100); setupWifi(); serialInput.reserve(200); } int SSIDVisibleTimeout = 0; char SSIDVisible = 0; void loop(void){ int noBytes = Udp.parsePacket(); if ( noBytes ) { Udp.read(packetBuffer,noBytes); if(started){ Serial.printf("1|%d|", getControllerId(Udp.remoteIP())); for (int i=1;i<=noBytes;i++){ Serial.printf("%c", packetBuffer[i-1]); } Serial.println(); }else{ getControllerId(Udp.remoteIP()); } } if (serialDataReady) { Serial.println("0|" + serialInput); if(serialInput == "start"){ started = true; }else if(serialInput == "stop"){ started = false; }else if(serialInput == "clientlist"){ getControllerList(); } serialInput = ""; serialDataReady = false; } if (Serial.available()) serialEvent(); if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis()) { SSIDVisibleTimeout = 0; ToggleWifiVisibility(0); } if(digitalRead(0) == 0 && SSIDVisible == 0) { Serial.println("0|Button Pressed"); SSIDVisibleTimeout = millis(); ToggleWifiVisibility(1); } if(millis() - lastDisconnectionCheck > 10000){ checkControllerDisconnect(); } } void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); if (inChar == '\n' || inChar == '\r') { serialDataReady = true; }else{ serialInput += inChar; } } } void ToggleWifiVisibility(char v) { if(v == 1){ SSIDVisible = 1; WiFi.softAP(WifiSSID, WifiPassword, 6, 0); digitalWrite(2, HIGH); Serial.println("0|Wifi Visible"); }else if(v == 0){ SSIDVisible = 0; WiFi.softAP(WifiSSID, WifiPassword, 6, 1); digitalWrite(2, LOW); Serial.println("0|Wifi Hidden"); } } char getControllerId(IPAddress ipaddr){ for(char i=0; i < MAX_CLIENTS; i++){ if(ConnectionList[i].ipaddr == ipaddr){ //Yay, controller found. Return the id. ConnectionList[i].lastPackage = millis(); return i; } } //We didn't found the controller, so add it and return a new id. for(char i=0; i < MAX_CLIENTS; i++){ if(ConnectionList[i].ipaddr == INADDR_NONE){ ConnectionList[i].ipaddr = ipaddr; ConnectionList[i].lastPackage = millis(); Serial.printf("2|connected|%d\n\r", i); return i; } } //No room for new controllers. return -1; } void checkControllerDisconnect(){ for(char i=0; i < MAX_CLIENTS; i++){ if(ConnectionList[i].ipaddr != INADDR_NONE && millis() - ConnectionList[i].lastPackage > 10000){ //Controller didn't send any messages last 10 seconds, disconnected. ConnectionList[i].ipaddr = INADDR_NONE; Serial.printf("2|disconnected|%d\n\r", i); } } } void setupWifi(void){ WiFi.disconnect(true); WiFi.mode(WIFI_AP); generateWiFiSSID(); generateWiFiPassword(); WiFi.softAP(WifiSSID, WifiPassword, 6, 1); } void generateWiFiSSID() { //Last 4 digits mac adress uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); WifiSSIDPrefix += macID; memset(WifiSSID, 0, WifiSSIDPrefix.length() + 1); for (int i=0; i