From d174c05127ec44de655fb32e489466b9300a28e6 Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Tue, 5 Oct 2021 21:53:02 +0200 Subject: [PATCH] Wifi connect and waveform --- DCCTimer.cpp | 2 +- WifiESP32.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/DCCTimer.cpp b/DCCTimer.cpp index 6b204fe..5de7e6a 100644 --- a/DCCTimer.cpp +++ b/DCCTimer.cpp @@ -179,7 +179,7 @@ void DCCTimer::begin(INTERRUPT_CALLBACK callback) { hw_timer_t *timer = NULL; timer = timerBegin(0, 2, true); // prescaler can be 2 to 65536 so choose 2 timerAttachInterrupt(timer, interruptHandler, true); - timerAlarmWrite(timer, CLOCK_CYCLES / 2, true); // divide by prescaler + timerAlarmWrite(timer, CLOCK_CYCLES / 6, true); // divide by prescaler*3 (Clockbase is 80Mhz and not F_CPU 240Mhz) timerAlarmEnable(timer); } diff --git a/WifiESP32.cpp b/WifiESP32.cpp index 93ec702..10dbdb2 100644 --- a/WifiESP32.cpp +++ b/WifiESP32.cpp @@ -25,15 +25,138 @@ #include "RingStream.h" #include "CommandDistributor.h" +static std::vector clients; // a list to hold all clients +static WiFiServer *server = NULL; +static RingStream *outboundRing = new RingStream(2048); + bool WifiESP::setup(const char *SSid, const char *password, const char *hostname, int port, const byte channel) { + bool havePassword = true; + bool haveSSID = true; + bool wifiUp = false; + + const char *yourNetwork = "Your network "; + if (strncmp(yourNetwork, SSid, 13) == 0 || strncmp("", SSid, 13) == 0) + haveSSID = false; + if (strncmp(yourNetwork, password, 13) == 0 || strncmp("", password, 13) == 0) + havePassword = false; + + if (haveSSID && havePassword) { + WiFi.mode(WIFI_STA); + WiFi.setAutoReconnect(true); + WiFi.begin(SSid, password); + while (WiFi.status() != WL_CONNECTED) { + Serial.print('.'); + delay(500); + } + if (WiFi.status() == WL_CONNECTED) { + DIAG(F("Wifi STA IP %s"),WiFi.localIP().toString().c_str()); + wifiUp = true; + } + } + if (!haveSSID) { + // prepare all strings + String strSSID("DCC_"); + String strPass("PASS_"); + String strMac = WiFi.macAddress(); + strMac.remove(0,9); + strMac.replace(":",""); + strMac.replace(":",""); + strSSID.concat(strMac); + strPass.concat(strMac); + + WiFi.mode(WIFI_AP); + if (WiFi.softAP(strSSID.c_str(), + havePassword ? password : strPass.c_str(), + channel, false, 8)) { + DIAG(F("Wifi AP SSID %s PASS %s"),strSSID.c_str(),havePassword ? password : strPass.c_str()); + DIAG(F("Wifi AP IP %s"),WiFi.softAPIP().toString().c_str()); + wifiUp = true; + } + } + + + if (!wifiUp) { + DIAG(F("Wifi all fail")); + // no idea to go on + return false; + } + server = new WiFiServer(port); // start listening on tcp port + server->begin(); + DIAG(F("Server up port %d"),port); + + return true; return false; } void WifiESP::loop() { + int clientId; //tmp loop var + if (WiFi.status() == WL_CONNECTED /* || what for AP? */) { + if (server->hasClient()) { + // loop over all clients and remove inactive + for (clientId=0; clientIdavailable()) { + clients.push_back(client); + DIAG(F("New client %s"), client.remoteIP().toString().c_str()); + } + } + // loop over all connected clients + for (clientId=0; clientId 0) { + // read data from client + byte cmd[len+1]; + for(int i=0; imark(clientId); + CommandDistributor::parse(clientId,cmd,outboundRing); + outboundRing->commit(); + } + } + } // all clients + + // something to write out? + clientId=outboundRing->peek(); + if (clientId >= 0) { + if ((unsigned int)clientId > clients.size()) { + // something is wrong with the ringbuffer position + outboundRing->info(); + } else { + // we have data to send in outboundRing + if(clients[clientId].connected()) { + outboundRing->read(); // read over peek() + int count=outboundRing->count(); + { + char buffer[count+1]; + for(int i=0;iread(); + if (c >= 0) + buffer[i] = (char)c; + else { + DIAG(F("Ringread fail at %d"),i); + break; + } + } + buffer[count]=0; + clients[clientId].write(buffer,count); + } + } + } + } + } //connected } #endif //ESP32