From e7360f2c1ecdd9fff033c8938f613a52d7e5ef45 Mon Sep 17 00:00:00 2001
From: "Hans P. Reiser"
Date: Fri, 5 Apr 2019 20:05:22 +0200
Subject: [PATCH] incremental enhancements on train trip
---
RX_FSK/RX_FSK.ino | 230 ++++++++++++++----------------
RX_FSK/data/index.html | 18 +++
libraries/SX1278FSK/SX1278FSK.cpp | 9 +-
3 files changed, 134 insertions(+), 123 deletions(-)
diff --git a/RX_FSK/RX_FSK.ino b/RX_FSK/RX_FSK.ino
index 2e79283..46b0674 100644
--- a/RX_FSK/RX_FSK.ino
+++ b/RX_FSK/RX_FSK.ino
@@ -1,17 +1,14 @@
#include
#include
#include
-
#include
+#include
+
+#include
#include
#include
-
-
-#include
-#include
-#include
-
-#include
+//#include
+//#include
#define LORA_LED 9
@@ -26,24 +23,9 @@ U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ OLED_SCL, /* data=*/ OLED_SDA
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C Display(U8G2_R0, /* clock=*/ OLED_SCL, /* data=*/ OLED_SDA, /* reset=*/ OLED_RST); // Full framebuffer, SW I2C
int e;
-char my_packet[100];
-
-//const char* ssid = "DinoGast";
-//const char* password = "Schokolade";
-const char *ssid="AndroidDD";
-const char *password="dl9rdzhr";
AsyncWebServer server(80);
-//pthread_t wifithread;
-
-
-int conn = 0;
-String currentLine;
-WiFiClient client;
-unsigned long lastdu;
-
-
// Set LED GPIO
const int ledPin = 2;
// Stores LED state
@@ -131,97 +113,38 @@ const char *fetchWifiPw(const char *id) {
return NULL;
}
-#if 0
-void wifiloop(void *arg){
- lastdu=millis();
- while(true) {
- if(millis()-lastdu>500) {
- // This is too slow to do in main loop
- //u8x8.setFont(u8x8_font_chroma48medium8_r);
- //u8x8.clearDisplay();
- sonde.updateDisplay();
- lastdu=millis();
- }
-
- delay(1);
- if(!conn) {
- client = server.available(); // listen for incoming clients
- if (client) { // if you get a client,
- Serial.println("New Client."); // print a message out the serial port
- currentLine = ""; // make a String to hold incoming data from the client
- conn = 1;
- }
- } else {
- if(!client.connected()) { // loop while the client's connected
- conn = 0;
- Serial.println("Client no longer connected");
- continue;
- }
- while (client.available()) { // if there's bytes to read from the client,
- char c = client.read(); // read a byte, then
- Serial.write(c); // print it out the serial monitor
- if (c == '\n') { // if the byte is a newline character
-
- // if the current line is blank, you got two newline characters in a row.
- // that's the end of the client HTTP request, so send a response:
- if (currentLine.length() == 0) {
- // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
- // and a content-type so the client knows what's coming, then a blank line:
- client.println("HTTP/1.1 200 OK");
- client.println("Content-type:text/html");
- client.println();
-
- // the content of the HTTP response follows the header:
- client.print("Click here to turn the LED on pin 5 on.
");
- client.print("Click here to turn the LED on pin 5 off.
");
-
- // The HTTP response ends with another blank line:
- client.println();
- // break out of the while loop:
- // close the connection:
- client.stop();
- Serial.println("Client Disconnected.");
- continue;
- } else { // if you got a newline, then clear currentLine:
- currentLine = "";
- }
- } else if (c != '\r') { // if you got anything else but a carriage return character,
- currentLine += c; // add it to the end of the currentLine
- }
-
- // Check to see if the client request was "GET /H" or "GET /L":
- if (currentLine.endsWith("GET /H")) {
- digitalWrite(5, HIGH); // GET /H turns the LED on
- }
- if (currentLine.endsWith("GET /L")) {
- digitalWrite(5, LOW); // GET /L turns the LED off
- }
-
- }
- }
- }
-}
-#endif
-
-enum KeyPress { KP_NONE, KP_SHORT, KP_DOUBLE, KP_MID, KP_LONG };
+enum KeyPress { KP_NONE=0, KP_SHORT, KP_DOUBLE, KP_MID, KP_LONG };
struct Button {
const uint8_t PIN;
uint32_t numberKeyPresses;
KeyPress pressed;
- unsigned long press;
+ unsigned long press_ts;
+ boolean doublepress;
};
-Button button1 = {0, 0, KP_NONE, 0};
+Button button1 = {0, 0, KP_NONE, 0, false};
void IRAM_ATTR buttonISR() {
if(digitalRead(0)==0) { // Button down
- button1.press = millis();
+ if(millis()-button1.press_ts<500) {
+ // Double press
+ button1.doublepress = true;
+ } else {
+ button1.doublepress = false;
+ }
+ button1.press_ts = millis();
} else { //Button up
- unsigned int elapsed = millis()-button1.press;
- if(elapsed>1500) { if(elapsed<4000) { button1.pressed=KP_MID; } else { button1.pressed=KP_LONG; } }
- else { button1.pressed=KP_SHORT; }
+ unsigned int elapsed = millis()-button1.press_ts;
+ if(elapsed>1500) {
+ if(elapsed<4000) { button1.pressed=KP_MID; }
+ else { button1.pressed=KP_LONG; }
+ } else {
+ if(button1.doublepress) button1.pressed=KP_DOUBLE;
+ else button1.pressed=KP_SHORT;
+ }
button1.numberKeyPresses += 1;
+ button1.press_ts = millis();
}
}
@@ -230,6 +153,9 @@ int getKeyPress() {
button1.pressed = KP_NONE;
return p;
}
+int hasKeyPress() {
+ return button1.pressed;
+}
void setup()
{
@@ -248,8 +174,7 @@ void setup()
setupWifiList();
- rs41.setup();
-
+#if 0
if(rs41.setFrequency(402700000)==0) {
Serial.println(F("Setting freq: SUCCESS "));
} else {
@@ -258,8 +183,9 @@ void setup()
float f = sx1278.getFrequency();
Serial.print("Frequency set to ");
Serial.println(f);
+#endif
- sx1278.setLNAGain(-48);
+ sx1278.setLNAGain(0); //-48);
int gain = sx1278.getLNAGain();
Serial.print("RX LNA Gain is ");
Serial.println(gain);
@@ -279,25 +205,84 @@ void setup()
// Handle button press
attachInterrupt(0, buttonISR, CHANGE);
+
+ sonde.clearSonde();
+ sonde.addSonde(402.300, STYPE_RS41);
+ sonde.addSonde(402.700, STYPE_RS41);
+ sonde.addSonde(403.450, STYPE_DFM09);
+ /// not here, done by sonde.setup(): rs41.setup();
+ sonde.setup();
}
enum MainState { ST_DECODER, ST_SCANNER, ST_SPECTRUM, ST_WIFISCAN };
-static MainState mainState = ST_SPECTRUM;
+static MainState mainState = ST_DECODER;
-void loopDecoder() {
-
+void enterMode(int mode) {
+ mainState = (MainState)mode;
+ sonde.clearDisplay();
}
+void loopDecoder() {
+ switch(getKeyPress()) {
+ case KP_SHORT:
+ sonde.nextConfig();
+ break;
+ case KP_DOUBLE:
+ enterMode(ST_SCANNER);
+ return;
+ case KP_MID:
+ enterMode(ST_SPECTRUM);
+ return;
+ case KP_LONG:
+ enterMode(ST_WIFISCAN);
+ return;
+ }
+ // sonde knows the current type and frequency, and delegates to the right decoder
+ sonde.receiveFrame();
+ sonde.updateDisplay();
+}
+
+#define SCAN_MAXTRIES 1
void loopScanner() {
-
+ sonde.updateDisplayScanner();
+ static int tries=0;
+ switch(getKeyPress()) {
+ case KP_SHORT:
+ enterMode(ST_DECODER);
+ return;
+ case KP_DOUBLE: break; /* ignored */
+ case KP_MID:
+ enterMode(ST_SPECTRUM);
+ return;
+ case KP_LONG:
+ enterMode(ST_WIFISCAN);
+ return;
+ }
+ // receiveFrame returns 0 on success, 1 on timeout
+ int res = sonde.receiveFrame(); // Maybe instead of receiveFrame, just detect if right type is present? TODO
+ Serial.print("Scanner: receiveFrame returned");
+ Serial.println(res);
+ if(res==0) {
+ enterMode(ST_DECODER);
+ return;
+ }
+ if(++tries>=SCAN_MAXTRIES) {
+ sonde.nextConfig();
+ tries = 0;
+ }
}
void loopSpectrum() {
switch(getKeyPress()) {
- case KP_SHORT: /* move selection of peak, TODO */ break;
+ case KP_SHORT: /* move selection of peak, TODO */
+ sonde.nextConfig(); // TODO: Should be set specific frequency
+ enterMode(ST_DECODER);
+ return;
case KP_MID: /* restart, TODO */ break;
- case KP_LONG: mainState = ST_WIFISCAN; return;
+ case KP_LONG:
+ enterMode(ST_WIFISCAN);
+ return;
case KP_DOUBLE: /* ignore */ break;
default: break;
}
@@ -322,13 +307,21 @@ String translateEncryptionType(wifi_auth_mode_t encryptionType) {
}
}
+static char* _scan[2]={"/","\\"};
void loopWifiScan() {
+ u8x8.setFont(u8x8_font_chroma48medium8_r);
+ u8x8.drawString(0,0,"WiFi Scan...");
+ int line=0;
+ int cnt=0;
+
WiFi.mode(WIFI_STA);
const char *id, *pw;
int n = WiFi.scanNetworks();
for (int i = 0; i < n; i++) {
Serial.print("Network name: ");
Serial.println(WiFi.SSID(i));
+ u8x8.drawString(0,1+line,WiFi.SSID(i).c_str());
+ line = (line+1)%5;
Serial.print("Signal strength: ");
Serial.println(WiFi.RSSI(i));
Serial.print("MAC address: ");
@@ -343,17 +336,22 @@ void loopWifiScan() {
}
if(!pw) { id="test"; pw="test"; }
Serial.print("Connecting to: "); Serial.println(id);
+ u8x8.drawString(0,6, "Conn:");
+ u8x8.drawString(6,6, id);
WiFi.begin(id, pw);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
+ u8x8.drawString(15,7,_scan[cnt&1]);
+ cnt++;
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
-
+ sonde.setIP(WiFi.localIP().toString().c_str());
+ sonde.updateDisplayIP();
SetupAsyncServer();
delay(5000);
mainState=ST_SPECTRUM;
@@ -369,17 +367,9 @@ void loop() {
case ST_WIFISCAN: loopWifiScan(); break;
}
#if 0
- if (button1.pressed) {
- Serial.print( ((const char *[]){"SHORT PRESS -","LONG PRESS -","VERYLONG PRESS -"})[button1.pressed-1]);
- Serial.printf("Button 1 has been pressed %u times\n", button1.numberKeyPresses);
- button1.pressed = false;
- }
-
//wifiloop(NULL);
//e = dfm.receiveFrame();
//e = rs41.receiveFrame();
- scanner.scan();
- scanner.plotResult();
delay(1000);
int rssi = sx1278.getRSSI();
Serial.print(" RSSI: ");
diff --git a/RX_FSK/data/index.html b/RX_FSK/data/index.html
index 952beba..2f4b4cb 100644
--- a/RX_FSK/data/index.html
+++ b/RX_FSK/data/index.html
@@ -8,9 +8,27 @@
ESP32 Web Server
+
+
+
+ |
+ ID |
+ PW |
+
+
+ | 1 |
+ DinoGast |
+ Schokolade |
+
+ | 2 |
+ |
+ |
+
+