Version 5.1.0; Better debug possibilities in WebGUI, storage of LOG files on ESP8266, and well-known list of devices (with name) in WebGui See read.me and ESP-gateway.h

pull/29/head
platenspeler 2018-05-20 13:23:50 +02:00
rodzic c625baedae
commit 9aebd1258e
17 zmienionych plików z 679 dodań i 353 usunięć

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9 H
// Date: 2018-04-16
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0 H
// Date: 2018-05-03
//
// Based on work done by Thomas Telkamp for Raspberry PI 1ch gateway and many others.
// Contibutions of Dorijan Morelj and Andreas Spies for OLED support.
@ -19,7 +19,7 @@
//
// ----------------------------------------------------------------------------------------
#define VERSION "V.5.0.9.H; 180416a"
#define VERSION "V.5.1.0.H; 180503a"
// This value of DEBUG determines whether some parts of code get compiled.
// Also this is the initial value of debug parameter.
@ -212,6 +212,37 @@
// Serial Port speed
#define _BAUDRATE 115200 // Works for debug messages to serial momitor
// We can put the gateway in such a mode that it will (only) recognize
// nodes that are put in a list of trusted nodes
// Values:
// 0: Do not use names for trusted Nodes
// 1: Use the nodes as a translation tabel for hex codes to names (in TLN)
// 2: Same as 1, but is nodes NOT in the nodes list below they are NOT
// forwarded or counted! (not yet fully implemented)
#define TRUSTED_NODES 1
#if TRUSTED_NODES >= 1
struct nodex {
uint32_t id;
char nm[32];
};
// Add all your named and trusted nodes to this list
nodex nodes[] = {
{ 0x260116BD , "lora-34 PIR node" }, // F=0
{ 0x26011152 , "lora-35 temp+humi node" }, // F=0
{ 0x2601148C , "lora-36 test node" }, // F=0
{ 0x26011B90 , "lora-39 temp DS18B20" }, // F=1
{ 0x260119A6 , "lora-40 airquality" }, // F=0
{ 0x2601117D , "lora-41 temp+humi SR04T" },
{ 0x26011514 , "lora-43 ch1, no sensors" }, // F=1
{ 0x26011D77 , "lora-45 not sensor" },
{ 0x2601160F , "lora-46 HTU21 metal case" }, // F=0
{ 0x26011E52 , "lora-53 gas sensor" }, // F=ALL
{ 0x02020441 , "lora-65 Waterproof temp humi" },// F=0
{ 0x26011999 , "lora-901 distance sensor" } // F=0
};
#endif
// Wifi definitions
// WPA is an array with SSID and password records. Set WPA size to number of entries in array
// When using the WiFiManager, we will overwrite the first entry with the

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
// Author: Maarten Westenberg (mw12554@hotmail.com)
//
// based on work done by Thomas Telkamp for Raspberry PI 1-ch gateway
@ -90,9 +90,8 @@ extern "C" {
#include "AES-128_V10.h"
#endif
int debug=1; // Debug level! 0 is no msgs, 1 normal, 2 extensive
uint8_t debug=1; // Debug level! 0 is no msgs, 1 normal, 2 extensive
uint8_t pdebug=0xFF; // Allow all atterns (departments)
// You can switch webserver off if not necessary but probably better to leave it in.
#if A_SERVER==1
@ -146,6 +145,7 @@ time_t startTime = 0; // The time in seconds since 1970 that the server st
// be aware that UTP time has to succeed for meaningful values.
// We use this variable since millis() is reset every 50 days...
uint32_t eventTime = 0; // Timing of _event to change value (or not).
uint32_t doneTime = 0; // Time to expire when CDDONE takes too long
uint32_t statTime = 0; // last time we sent a stat message to server
uint32_t pulltime = 0; // last time we sent a pull_data request to server
uint32_t lastTmst = 0; // Last activity Timer
@ -436,6 +436,7 @@ int WlanReadWpa() {
if (gwayConfig.sf != (uint8_t) 0) sf = (sf_t) gwayConfig.sf;
ifreq = gwayConfig.ch;
debug = gwayConfig.debug;
pdebug = gwayConfig.pdebug;
_cad = gwayConfig.cad;
_hop = gwayConfig.hop;
gwayConfig.boots++; // Every boot of the system we increase the reset
@ -472,12 +473,13 @@ int WlanReadWpa() {
#if WIFIMANAGER==1
int WlanWriteWpa( char* ssid, char *pass) {
#if DUSB>=1
Serial.print(F("WlanWriteWpa:: ssid="));
Serial.print(ssid);
Serial.print(F(", pass="));
Serial.print(pass);
Serial.println();
#endif
// Version 3.3 use of config file
String s((char *) ssid);
gwayConfig.ssid = s;
@ -542,7 +544,7 @@ int WlanConnect(int maxTry) {
// Start with well-known access points in the list
char *ssid = wpa[j].login;
char *password = wpa[j].passw;
#if DUSB>=1
Serial.print(i);
Serial.print(':');
Serial.print(j);
@ -553,7 +555,7 @@ int WlanConnect(int maxTry) {
Serial.print(password);
}
Serial.println();
#endif
// Count the number of times we call WiFi.begin
gwayConfig.wifis++;
@ -573,38 +575,55 @@ int WlanConnect(int maxTry) {
while (((WiFi.status()) != WL_CONNECTED) && (agains < 10)) {
agains++;
delay(agains*500);
#if DUSB>=1
if (debug>=0) Serial.print(".");
#endif
}
// Check the connection status again
switch (WiFi.status()) {
case WL_CONNECTED:
#if DUSB>=1
if (debug>=0)
Serial.println(F("WlanConnect:: CONNECTED")); // 3
#endif
return(1);
break;
case WL_IDLE_STATUS:
#if DUSB>=1
Serial.println(F("WlanConnect:: IDLE")); // 0
#endif
break;
case WL_NO_SSID_AVAIL:
#if DUSB>=1
Serial.println(F("WlanConnect:: NO SSID")); // 1
#endif
break;
case WL_CONNECT_FAILED:
#if DUSB>=1
Serial.println(F("WlanConnect:: FAILED")); // 4
#endif
break;
case WL_DISCONNECTED:
#if DUSB>=1
Serial.println(F("WlanConnect:: DISCONNECTED")); // 6
#endif
break;
case WL_SCAN_COMPLETED:
#if DUSB>=1
Serial.println(F("WlanConnect:: SCAN COMPLETE")); // 2
#endif
break;
case WL_CONNECTION_LOST:
#if DUSB>=1
Serial.println(F("WlanConnect:: LOST")); // 5
#endif
break;
default:
#if DUSB>=1
Serial.print(F("WlanConnect:: code="));
Serial.println(WiFi.status());
#endif
break;
}
@ -615,7 +634,7 @@ int WlanConnect(int maxTry) {
// It should not be possible to be here while WL_CONNECTed
if (WiFi.status() == WL_CONNECTED) {
#if DUSB>=1
if (debug>=3) {
if (( debug>=3 ) && ( pdebug & P_MAIN )) {
Serial.print(F("WLAN connected"));
Serial.println();
}
@ -625,11 +644,13 @@ int WlanConnect(int maxTry) {
}
else {
#if WIFIMANAGER==1
#if DUSB>=1
Serial.println(F("Starting Access Point Mode"));
Serial.print(F("Connect Wifi to accesspoint: "));
Serial.print(AP_NAME);
Serial.print(F(" and connect to IP: 192.168.4.1"));
Serial.println();
#endif
wifiManager.autoConnect(AP_NAME, AP_PASSWD );
//wifiManager.startConfigPortal(AP_NAME, AP_PASSWD );
// At this point, there IS a Wifi Access Point found and connected
@ -1068,7 +1089,7 @@ void pullData() {
Serial.print(pullIndex);
Serial.print(F("> "));
for (i=0; i<pullIndex; i++) {
Serial.print(pullDataReq[i],HEX); // DEBUG: display JSON stat
Serial.print(pullDataReq[i],HEX); // debug: display JSON stat
Serial.print(':');
}
Serial.println();
@ -1179,7 +1200,9 @@ void setup() {
Serial.begin(_BAUDRATE); // As fast as possible for bus
delay(100);
#if DUSB>=1
Serial.flush();
delay(500);
if (SPIFFS.begin()) {
@ -1187,7 +1210,7 @@ void setup() {
}
else {
}
#endif
#if SPIFF_FORMAT>=1
SPIFFS.format(); // Normally disabled. Enable only when SPIFFS corrupt
#endif
@ -1319,7 +1342,10 @@ void setup() {
//setTime((time_t)getNtpTime());
while (timeStatus() == timeNotSet) {
Serial.println(F("setupTime:: Time not set (yet)"));
#if DUSB>=1
if (( debug>=0 ) && ( pdebug & P_MAIN ))
Serial.println(F("setupTime:: Time not set (yet)"));
#endif
delay(500);
time_t newTime;
newTime = (time_t)getNtpTime();
@ -1327,11 +1353,14 @@ void setup() {
}
// When we are here we succeeded in getting the time
startTime = now(); // Time in seconds
#if DUSB>=1
Serial.print("Time: "); printTime();
Serial.println();
#endif
writeGwayCfg(CONFIGFILE );
#if DUSB>=1
Serial.println(F("Gateway configuration saved"));
#endif
#endif //NTP_INTR
#if A_SERVER==1
@ -1347,6 +1376,7 @@ void setup() {
if (_cad) {
_state = S_SCAN;
sf = SF7;
cadScanner(); // Always start at SF7
}
else {
@ -1408,9 +1438,8 @@ void loop ()
// In this case we handle the interrupt ( e.g. message received)
// in userspace in loop().
//
//while (_event != 0x00) { //
stateMachine(); // do the state machine
//}
stateMachine(); // do the state machine
// After a quiet period, make sure we reinit the modem and state machine.
// The interval is in seconds (about 10 seconds) as this re-init
@ -1422,7 +1451,7 @@ void loop ()
(msgTime < statr[0].tmst) )
{
#if DUSB>=1
if (debug>=1) {
if (( debug>=1 ) && ( pdebug & P_MAIN )) {
Serial.print("REINIT: ");
Serial.print( _MSG_INTERVAL );
Serial.print(F(" "));
@ -1432,6 +1461,7 @@ void loop ()
if ((_cad) || (_hop)) {
_state = S_SCAN;
sf = SF7;
cadScanner();
}
else {
@ -1462,7 +1492,8 @@ void loop ()
// I event is set, we know that we have a (soft) interrupt.
// After all necessary web/OTA services are scanned, we will
// reloop here for timing purposes. Do a less yield() as possible.
// reloop here for timing purposes.
// Do as less yield() as possible.
// XXX 180326
if (_event == 1) return;
else yield();
@ -1471,10 +1502,11 @@ void loop ()
// We will not read Udp in this loop cycle then
if (WlanConnect(1) < 0) {
#if DUSB>=1
if (( debug >= 0 ) && ( pdebug & P_MAIN ))
Serial.println(F("loop: ERROR reconnect WLAN"));
#endif
yield();
return; // Exit loop if no WLAN connected
yield();
return; // Exit loop if no WLAN connected
}
// So if we are connected
@ -1492,7 +1524,8 @@ void loop ()
// This command is found in byte 4 (buffer[3])
if (readUdp(packetSize) <= 0) {
#if DUSB>=1
if (debug>0) Serial.println(F("readUDP error"));
if (( debug>0 ) && ( pdebug & P_MAIN ))
Serial.println(F("readUDP error"));
#endif
break;
}
@ -1510,14 +1543,14 @@ void loop ()
if ((nowSeconds - statTime) >= _STAT_INTERVAL) { // Wake up every xx seconds
#if DUSB>=1
if (debug>=2) {
if (( debug>=1 ) && ( pdebug & P_MAIN )) {
Serial.print(F("STAT <"));
Serial.flush();
}
#endif
sendstat(); // Show the status message and send to server
#if DUSB>=1
if (debug>=2) {
if (( debug>=2 ) && ( pdebug & P_MAIN )) {
Serial.println(F(">"));
if (debug>=2) Serial.flush();
}
@ -1537,7 +1570,9 @@ void loop ()
// could be battery but also other status info or sensor info
if (sensorPacket() < 0) {
#if DUSB>=1
Serial.println(F("sensorPacket: Error"));
#endif
}
}
#endif
@ -1552,20 +1587,21 @@ void loop ()
nowSeconds = now();
if ((nowSeconds - pulltime) >= _PULL_INTERVAL) { // Wake up every xx seconds
#if DUSB>=1
if (debug>=1) {
if (debug>=2) {
Serial.print(F("PULL <"));
if (debug>=2) Serial.flush();
if (debug>=1) Serial.flush();
}
#endif
pullData(); // Send PULL_DATA message to server
initLoraModem(); // XXX 180326, after adapting this function
if (_cad) {
#if DUSB>=1
if (debug>=1) {
if (( debug>=1 ) && ( pdebug & P_MAIN )) {
Serial.print(F("PULL:: _state set to S_SCAN"));
}
#endif
_state = S_SCAN;
sf = SF7;
cadScanner();
}
else {
@ -1575,7 +1611,7 @@ void loop ()
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, 0xFF); // Reset all interrupt flags
#if DUSB>=1
if (debug>=1) {
if (( debug>=1 ) && ( pdebug & P_MAIN )) {
Serial.println(F(">"));
if (debug>=2) Serial.flush();
}

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg
// Version 5.1.0
// Date: 2018-04-17
//
// Based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -21,6 +21,18 @@
//
// The LoRa supporting functions are in the section below
// ----------------------------------------------------------------------------
// Supporting function to readConfig
// ----------------------------------------------------------------------------
void id_print (String id, String val) {
#if DUSB>=1
if (( debug>=0 ) && ( pdebug & P_MAIN )) {
Serial.print(id);
Serial.print(F("=\t"));
Serial.println(val);
}
#endif
}
// ----------------------------------------------------------------------------
@ -29,12 +41,16 @@
int readConfig(const char *fn, struct espGwayConfig *c) {
int tries = 0;
#if DUSB>=1
Serial.print(F("readConfig:: Starting "));
#endif
if (!SPIFFS.exists(fn)) {
#if DUSB>=1
if (( debug >= 0 ) && ( pdebug & P_MAIN ))
Serial.print(F("ERROR:: readConfig, file="));
Serial.print(fn);
Serial.print(F(" does not exist .. Formatting"));
#endif
SPIFFS.format();
return(-1);
}
@ -48,7 +64,7 @@ int readConfig(const char *fn, struct espGwayConfig *c) {
while (f.available()) {
#if DUSB>=1
if (debug>=0) {
if (( debug>=0 ) && ( pdebug & P_MAIN )) {
Serial.print('.');
}
#endif
@ -57,7 +73,10 @@ int readConfig(const char *fn, struct espGwayConfig *c) {
//
if (tries >= 10) {
f.close();
Serial.println(F("Formatting"));
#if DUSB>=1
if (( debug >= 0 ) && ( pdebug & P_MAIN ))
Serial.println(F("Formatting"));
#endif
SPIFFS.format();
f = SPIFFS.open(fn, "r");
tries = 0;
@ -67,29 +86,33 @@ int readConfig(const char *fn, struct espGwayConfig *c) {
String val=f.readStringUntil('\n');
if (id == "SSID") { // WiFi SSID
Serial.print(F("SSID=")); Serial.println(val);
id_print(id, val);
(*c).ssid = val; // val contains ssid, we do NO check
}
//else if (id == "PASS") { // WiFi Password
// Serial.print(F("PASS=")); Serial.println(val);
// id_print(id, val);
// (*c).pass = val;
//}
else if (id == "CH") { // Frequency Channel
Serial.print(F("CH=")); Serial.println(val);
id_print(id,val);
(*c).ch = (uint32_t) val.toInt();
}
else if (id == "SF") { // Spreading Factor
Serial.print(F("SF =")); Serial.println(val);
id_print(id, val);
(*c).sf = (uint32_t) val.toInt();
}
else if (id == "FCNT") { // Frame Counter
Serial.print(F("FCNT=")); Serial.println(val);
id_print(id, val);
(*c).fcnt = (uint32_t) val.toInt();
}
else if (id == "DEBUG") { // Frame Counter
Serial.print(F("DEBUG=")); Serial.println(val);
else if (id == "DEBUG") { // Debug Level
id_print(id, val);
(*c).debug = (uint8_t) val.toInt();
}
else if (id == "PDEBUG") { // pDebug Pattern
Serial.print(F("PDEBUG=")); Serial.println(val);
(*c).pdebug = (uint8_t) val.toInt();
}
else if (id == "CAD") { // CAD setting
Serial.print(F("CAD=")); Serial.println(val);
(*c).cad = (uint8_t) val.toInt();
@ -99,55 +122,55 @@ int readConfig(const char *fn, struct espGwayConfig *c) {
(*c).hop = (uint8_t) val.toInt();
}
else if (id == "BOOTS") { // BOOTS setting
Serial.print(F("BOOTS=")); Serial.println(val);
id_print(id, val);
(*c).boots = (uint8_t) val.toInt();
}
else if (id == "RESETS") { // RESET setting
Serial.print(F("RESETS=")); Serial.println(val);
id_print(id, val);
(*c).resets = (uint8_t) val.toInt();
}
else if (id == "WIFIS") { // WIFIS setting
Serial.print(F("WIFIS=")); Serial.println(val);
id_print(id, val);
(*c).wifis = (uint8_t) val.toInt();
}
else if (id == "VIEWS") { // VIEWS setting
Serial.print(F("VIEWS=")); Serial.println(val);
id_print(id, val);
(*c).views = (uint8_t) val.toInt();
}
else if (id == "NODE") { // NODE setting
Serial.print(F("NODE=")); Serial.println(val);
id_print(id, val);
(*c).isNode = (uint8_t) val.toInt();
}
else if (id == "REFR") { // REFR setting
Serial.print(F("REFR=")); Serial.println(val);
id_print(id, val);
(*c).refresh = (uint8_t) val.toInt();
}
else if (id == "REENTS") { // REENTS setting
Serial.print(F("REENTS=")); Serial.println(val);
id_print(id, val);
(*c).reents = (uint8_t) val.toInt();
}
else if (id == "NTPERR") { // NTPERR setting
Serial.print(F("NTPERR=")); Serial.println(val);
id_print(id, val);
(*c).ntpErr = (uint8_t) val.toInt();
}
else if (id == "NTPETIM") { // NTPERR setting
Serial.print(F("NTPETIM=")); Serial.println(val);
id_print(id, val);
(*c).ntpErrTime = (uint32_t) val.toInt();
}
else if (id == "NTPS") { // NTPS setting
Serial.print(F("NTPS=")); Serial.println(val);
id_print(id, val);
(*c).ntps = (uint8_t) val.toInt();
}
else if (id == "FILENO") { // log FILENO setting
Serial.print(F("FILENO=")); Serial.println(val);
id_print(id, val);
(*c).logFileNo = (uint8_t) val.toInt();
}
else if (id == "FILEREC") { // FILEREC setting
Serial.print(F("FILEREC=")); Serial.println(val);
id_print(id, val);
(*c).logFileRec = (uint8_t) val.toInt();
}
else if (id == "FILENUM") { // FILEREC setting
Serial.print(F("FILENUM=")); Serial.println(val);
id_print(id, val);
(*c).logFileNum = (uint8_t) val.toInt();
}
else {
@ -171,17 +194,17 @@ int readConfig(const char *fn, struct espGwayConfig *c) {
// ----------------------------------------------------------------------------
int writeGwayCfg(const char *fn) {
gwayConfig.sf = (uint8_t) sf;
gwayConfig.ssid = WiFi.SSID();
//gwayConfig.pass = WiFi.PASS(); // XXX We should find a way to store the password too
gwayConfig.ch = ifreq;
gwayConfig.ch = ifreq; // Frequency Index
gwayConfig.sf = (uint8_t) sf; // Spreading Factor
gwayConfig.debug = debug;
gwayConfig.pdebug = pdebug;
gwayConfig.cad = _cad;
gwayConfig.hop = _hop;
#if GATEWAYNODE==1
gwayConfig.fcnt = frameCount;
#endif
return(writeConfig(fn, &gwayConfig));
}
@ -211,6 +234,7 @@ int writeConfig(const char *fn, struct espGwayConfig *c) {
f.print("SF"); f.print('='); f.print((*c).sf); f.print('\n');
f.print("FCNT"); f.print('='); f.print((*c).fcnt); f.print('\n');
f.print("DEBUG"); f.print('='); f.print((*c).debug); f.print('\n');
f.print("PDEBUG"); f.print('='); f.print((*c).pdebug); f.print('\n');
f.print("CAD"); f.print('='); f.print((*c).cad); f.print('\n');
f.print("HOP"); f.print('='); f.print((*c).hop); f.print('\n');
f.print("NODE"); f.print('='); f.print((*c).isNode); f.print('\n');
@ -270,24 +294,28 @@ void addLog(const unsigned char * line, int cnt)
// Make sure to write the config record also
if (!SPIFFS.exists(fn)) {
#if DUSB>=1
Serial.print(F("ERROR:: addLog:: file="));
Serial.print(fn);
Serial.print(F(" does not exist .. rec="));
Serial.print(gwayConfig.logFileRec);
Serial.println();
if (( debug >= 1 ) && ( pdebug & P_GUI )) {
Serial.print(F("ERROR:: addLog:: file="));
Serial.print(fn);
Serial.print(F(" does not exist .. rec="));
Serial.print(gwayConfig.logFileRec);
Serial.println();
}
#endif
}
File f = SPIFFS.open(fn, "a");
if (!f) {
#if DUSB>=1
Serial.println("file open failed=");
Serial.println(fn);
if (debug>=1) {
Serial.println("file open failed=");
Serial.println(fn);
}
#endif
}
#if DUSB>=1
if (debug>=1) {
if (( debug>=1 ) && ( pdebug & P_RX )) {
Serial.print(F("addLog:: fileno="));
Serial.print(gwayConfig.logFileNo);
Serial.print(F(", rec="));

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -90,7 +90,7 @@
// The variable is for obvious reasons valid for read and write traffic at the
// same time. Since both read and write mean that we write to the SPI interface.
// Parameters:
// Address: SPI address to read from. Type unint8_t
// Address: SPI address to read from. Type uint8_t
// Return:
// Value read from address
// ----------------------------------------------------------------------------
@ -307,6 +307,7 @@ void opmode(uint8_t mode)
void hop() {
ifreq = (ifreq + 1) % NUM_HOPS ; // Increment the freq round robin
freq = freqs[ifreq];
setFreq(freqs[ifreq]);
sf = SF7; // Set the sf to SF7
@ -357,15 +358,14 @@ uint8_t receivePkt(uint8_t *payload)
if (irqflags & IRQ_LORA_CRCERR_MASK)
{
#if DUSB>=1
if (debug>=0) {
Serial.print(F("Err RxPkg:: CRC, ="));
if (( debug>=0) && ( pdebug & P_RADIO )) {
Serial.print(F("Err RxPkt:: CRC, ="));
SerialTime();
Serial.println();
}
#endif
// Reset CRC flag 0x20
//writeRegister(REG_IRQ_FLAGS, (uint8_t)(IRQ_LORA_CRCERR_MASK | IRQ_LORA_RXDONE_MASK)); // 0x12; clear CRC (== 0x20) flag
//_event=0;
//writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
//writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // XXX 180324 done in state machine
return 0;
@ -377,8 +377,8 @@ uint8_t receivePkt(uint8_t *payload)
else if ((irqflags & IRQ_LORA_HEADER_MASK) == false)
{
#if DUSB>=1
if (debug>=0) {
Serial.println(F("Err RxPkg:: HEADER"));
if (( debug>=0) && ( pdebug & P_RADIO )) {
Serial.println(F("Err RxPkt:: HEADER"));
}
#endif
// Reset VALID-HEADER flag 0x10
@ -415,7 +415,7 @@ uint8_t receivePkt(uint8_t *payload)
if (receivedCount > PAYLOAD_LENGTH) {
#if DUSB>=1
if (debug>=0) {
if (( debug>=0 ) & ( pdebug & P_RADIO )) {
Serial.print(F("rxPkt:: receivedCount="));
Serial.println(receivedCount);
}
@ -430,7 +430,7 @@ uint8_t receivePkt(uint8_t *payload)
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // Reset ALL interrupts
#if DUSB>=1
if (debug>=0) {
if (( debug>=0 ) && ( pdebug & P_RADIO )){
Serial.print(F("rxPkt:: t="));
SerialTime();
@ -675,11 +675,15 @@ void txLoraModem(uint8_t *payLoad, uint8_t payLength, uint32_t tmst, uint8_t sfT
void rxLoraModem()
{
// 1. Put system in LoRa mode
//opmode(OPMODE_LORA);
//opmode(OPMODE_LORA); // Is already so
// 2. Put the radio in sleep mode
opmode(OPMODE_STANDBY);
//opmode(OPMODE_SLEEP); // set 0x01 to 0x00
//if (_hop) {
// opmode(OPMODE_SLEEP); // power save, and enable switch FSK/OOK ro LORA
//}
//else {
opmode(OPMODE_STANDBY); // CAD set 0x01 to 0x00
//}
// 3. Set frequency based on value in freq
setFreq(freqs[ifreq]); // set to 868.1MHz
@ -765,14 +769,11 @@ void cadScanner()
// 2. Put the radio in sleep mode
opmode(OPMODE_STANDBY); // Was old value
// As we can come back from S_TX with other frequencies and SF
// reset both to good values for cadScanner
// 3. Set frequency based on value in ifreq // XXX New, might be needed when receiving down
setFreq(freqs[ifreq]);
// For every time we stat the scanner, we set the SF to the begin value
sf = SF7; // we make SF the lower, this is faster!
// For every time we start the scanner, we set the SF to the begin value
//sf = SF7; // XXX 180501 Not by default
// 4. Set spreading Factor and CRC
setRate(sf, 0x04);

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
//
// All rights reserved. This program and the accompanying materials
@ -30,8 +30,9 @@
void setupOta(char *hostname) {
ArduinoOTA.begin();
#if DUSB>=1
Serial.println(F("setupOta:: Started"));
#endif
// Hostname defaults to esp8266-[ChipID]
ArduinoOTA.setHostname(hostname);
@ -65,10 +66,11 @@ void setupOta(char *hostname) {
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
#if DUSB>=1
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
#endif
// Only if the Webserver is active also
#if A_SERVER==2 // Displaed for the moment

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg
// Verison 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg
// Verison 5.1.0
// Date: 2018-04-17
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the MIT License

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg
// Verison 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg
// Verison 5.1.0
// Date: 2018-04-17
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the MIT License
@ -486,8 +486,9 @@ int sensorPacket() {
#endif
if (_cad) {
// Set the state to CAD scanning after receiving
// Set the state to CAD scanning after sending a packet
_state = S_SCAN; // Inititialise scanner
sf = SF7;
cadScanner();
}
else {

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-25
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -75,80 +75,144 @@ void stateMachine()
uint8_t flags = readRegister(REG_IRQ_FLAGS);
uint8_t mask = readRegister(REG_IRQ_FLAGS_MASK);
uint8_t intr = flags & ( ~ mask ); // Only react on non masked interrupts
uint8_t rssi;
// If there is NO event interrupt detected but the state machine is called anyway
// then we know its a soft interrupt and we wait the frequency _hop out.
//
if ((intr == 0x00) && (_hop))
{
// If we hop and we are scanning we have to make sure that we allow enought time to detect
// CDDONE or CDECT. But if we do not receive interrupts, we have to schedule
// another hop after EVENT_WAIT microseconds.
// The process is such that we scan on SF7 (the shortest) preamble and if
// nothing detected within a scan, we switch to another frequency.
//
if ((_state == S_SCAN) || (_state == S_CAD)) {
// If there is no interrupt, _event has been set by software and not in
// an interrupt handler.
_event=0;
// As long as there is no interrupt event, stay in this loop.
// A real interrupt on one of the dio pins will be read by the
// system and the register REG_IRQ_FLAGS will reflect this.
// For SF7, one token takes XXX uSecs
//
eventTime = micros();
while ( (_event == 0) &&
(((micros() - eventTime + 0xFFFFFFFF) % 0xFFFFFFFF) < EVENT_WAIT) &&
((_state == S_SCAN) || (_state == S_CAD)) )
{
// If an event arises during this wait, we break the while
delayMicroseconds(10); // XXX 180103
}
yield();
// If we received a real interrupt, take the action
// by the stateMachine and read interrupt.
//
if (_event != 0) {
_event=0;
flags = readRegister(REG_IRQ_FLAGS);
mask = readRegister(REG_IRQ_FLAGS_MASK);
//intr = intr | (flags & ( ~ mask ));
intr = (flags & ( ~ mask ));
#if DUSB>=1
if (debug >=1 ) SerialStat(intr);
#endif
}
// If no interrupt received, switch both channel/frequency
// and switch Spreading Factor (SF)
//
else {
hop(); // increment ifreq = (ifreq + 1) % NUM_HOPS ;
cadScanner(); // Reset to initial SF, leave frequency "freqs[ifreq]"
_state = S_SCAN;
#if DUSB>=1
if (debug >= 1) SerialStat(intr);
if (intr != flags) {
Serial.print(F("FLAG ::"));
SerialStat(intr);
}
#endif
_event=1; //XXX 06/03, start State Machine again
return;
}
}// SCAN or CAD
// If not in SCAN or CAD state
// we only act on interrupts in this mode ((_event!=0) && (intr!=0))
//
else {
uint8_t rssi;
_event=0; // Reset the interrupt detector
// If Hopping is selected AND if there is NO event interrupt detected
// and the state machine is called anyway
// then we know its a soft interrupt and we do nothing and return to main loop.
//
if ((_hop) && (intr == 0x00) )
{
// If we are not in scanning state, and there will be an interrupt coming,
// In state S_RX it could be RXDONE in which case allow kernel time
//
if ((_state == S_SCAN) || (_state == S_CAD)) {
_event=0;
uint32_t eventWait = EVENT_WAIT;
switch (_state) {
case S_INIT: eventWait = 0; break;
case S_SCAN: eventWait = EVENT_WAIT * 1; break;
case S_CAD: eventWait = EVENT_WAIT * 1; break;
case S_RX: eventWait = EVENT_WAIT * 8; break;
case S_TX: eventWait = EVENT_WAIT * 1; break;
case S_TXDONE: eventWait = EVENT_WAIT * 4; break;
default:
eventWait=0;
#if DUSB>=1
Serial.print(F("DEF :: "));
SerialStat(intr);
#endif
}
//
// So we init the wait time for RXDONE based on the current SF.
// As for highter CF it takes longer to receive symbols
//
uint32_t doneWait = DONE_WAIT; // Initial value
switch (sf) {
case SF7:
break;
case SF8:
doneWait *= 2; // Assume symbols in SF8 take twice the time of SF7
break;
case SF9:
doneWait *= 4;
break;
case SF10:
doneWait *= 8;
break;
case SF11:
doneWait *= 16;
break;
case SF12:
doneWait *= 32;
break;
default:
#if DUSB>=1
Serial.print(F("PRE:: DEF set"));
Serial.println();
#endif
}
// If micros is starting over again after 51 minutes
// it's value is smaller than an earlier value of eventTime/doneTime
//
if (eventTime > micros()) eventTime=micros();
if (doneTime > micros()) doneTime=micros();
if ((micros() - doneTime) > doneWait )
{
_state = S_SCAN;
hop(); // increment ifreq = (ifreq + 1) % NUM_HOPS ;
cadScanner(); // Reset to initial SF, leave frequency "freqs[ifreq]"
rxLoraModem();
#if DUSB>=1
if (( debug >= 1 ) && ( pdebug & P_PRE )) {
Serial.print(F("DONE:: "));
SerialStat(intr);
}
#endif
eventTime=micros(); // reset the timer on timeout
doneTime=micros(); // reset the timer on timeout
return;
}
// If timeout occurs and still no _event, then increase SF
// and when reaching SF12 hop and return
// Start scanning again
//
if ((micros() - eventTime) > eventWait )
{
_state = S_SCAN;
hop(); // increment ifreq = (ifreq + 1) % NUM_HOPS ;
cadScanner(); // Reset to initial SF, leave frequency "freqs[ifreq]"
#if DUSB>=1
if (( debug >= 2 ) && ( pdebug & P_PRE )) {
Serial.print(F("HOP :: "));
SerialStat(intr);
}
#endif
eventTime=micros(); // reset the timer on timeout
doneTime=micros(); // reset the timer on timeout
return;
}
}
// If we are here, NO timeout has occurred
// So we need to return to the main State Machine
// as there was NO interrupt
#if DUSB>=1
if (( debug>=3 ) && ( pdebug & P_PRE )) {
Serial.print(F("PRE:: eventTime="));
Serial.print(eventTime);
Serial.print(F(", micros="));
Serial.print(micros());
Serial.print(F(": "));
SerialStat(intr);
}
#endif
} // if SCAN or CAD
// else, S_RX of S_TX for example
else {
yield();
} // else S_RX or S_TX, TXDONE
}// intr==0 && _hop
doneTime = micros(); // We need CDDONE or other intr to reset timeout
// This is the actual state machine of the gateway
// and its next actions are depending on the state we are in.
// For hop situations we do not get interrupts, so we have to
@ -161,13 +225,14 @@ void stateMachine()
// The initLoraModem() function is already called in setup();
//
case S_INIT:
#if DUSB>=2
if (debug >= 1) {
#if DUSB>=1
if (( debug>=1 ) && ( pdebug & P_PRE )) {
Serial.println(F("S_INIT"));
}
#endif
// new state, needed to startup the radio (to S_SCAN)
writeRegister(REG_IRQ_FLAGS, 0xFF ); // Clear ALL interrupts
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // Clear ALL interrupts
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00 ); // Clear ALL interrupts
_event=0;
break;
@ -192,35 +257,37 @@ void stateMachine()
writeRegister(REG_DIO_MAPPING_1, (
MAP_DIO0_LORA_RXDONE |
MAP_DIO1_LORA_RXTOUT |
MAP_DIO2_LORA_NOP |
MAP_DIO2_LORA_NOP |
MAP_DIO3_LORA_CRC));
// Since new state is S_RX, accept no interrupts except RXDONE or RXTOUT
// Since new state is S_RX, accept no interrupts except RXDONE or RXTOUT
// HEADER and CRCERR
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) ~(
IRQ_LORA_RXDONE_MASK |
IRQ_LORA_RXTOUT_MASK |
IRQ_LORA_HEADER_MASK |
IRQ_LORA_CRCERR_MASK));
delayMicroseconds( RSSI_WAIT ); // Wait some microseconds less
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // reset all interrupt flags
// Starting with version 5.0.1 the waittime is dependent on the SF
// So for SF12 we wait longer (2^7 == 128 uSec) and for SF7 4 uSec.
//delayMicroseconds( (0x01 << ((uint8_t)sf - 5 )) );
delayMicroseconds( RSSI_WAIT ); // Wait some microseconds less
rssi = readRegister(REG_RSSI); // Read the RSSI
_rssi = rssi; // Read the RSSI in the state variable
_event = 0; // Make 0, as soon aswe have an interrupt
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // reset all interrupt flags
_event = 0; // Make 0, as soon as we have an interrupt
// XXX IRQ writeregister was here May 11
detTime = micros();
#if DUSB>=1
if (debug>=1) {
Serial.print(F("SCAN:: CDDETD, f="));
Serial.println(ifreq);
if (( debug>=1 ) && ( pdebug & P_SCAN )) {
Serial.print(F("SCAN:: "));
SerialStat(intr);
}
#endif
detTime = micros();
}//if
// CDDONE
@ -233,39 +300,48 @@ void stateMachine()
opmode(OPMODE_CAD);
rssi = readRegister(REG_RSSI); // Read the RSSI
#if DUSB>=1
if (( debug>=2 ) && ( pdebug & P_SCAN )) {
Serial.print(F("SCAN:: f="));
Serial.print(ifreq);
Serial.print(F(", sf="));
Serial.print(sf);
Serial.print(F("CDDONE: "));
SerialStat(intr);
}
#endif
// We choose the generic RSSI as a sorting mechanism for packages/messages
// The pRSSI (package RSSI) is calculated upon successful reception of message
// So we expect that this value makes little sense for the moment with CDDONE.
// Set the rssi as low as the noise floor. Lower values are not recognized then.
// Every cycle starts with ifreq==0 and sf=SF7 (or the set init SF)
//
if ( rssi > RSSI_LIMIT ) // Is set to 35
//if ( rssi > RSSI_LIMIT ) // Is set to 35
if ( rssi > (RSSI_LIMIT - (_hop * 7))) // Is set to 35, or 29 for HOP
{
#if DUSB>=1
if (debug>=2) {
Serial.println(F("S_SCAN:: -> CAD"));
if (( debug>=2 ) && ( pdebug & P_SCAN )) {
Serial.println(F("SCAN:: -> CAD: "));
SerialStat(intr);
}
#endif
_state = S_CAD; // promote next level
if (_hop) {
_event=1; // if SCAN, goto CAD asap and next SF
}
else {
_event=0; // next CDDONE by interrupt XXXXX
}
_state = S_CAD; // promote to next level
_event=0;
}
// If the RSSI is not big enough we skip the CDDONE
// and go back to scanning
else {
#if DUSB>=1
if (debug>=3) {
Serial.print("S_SCAN:: rssi=");
Serial.println(rssi);
if (( debug>=2 ) && ( pdebug & P_SCAN )) {
Serial.print("SCAN:: rssi=");
Serial.print(rssi);
Serial.print(F(": "));
SerialStat(intr);
}
#endif
_state = S_SCAN;
_event=1; // loop() scan until CDDONE
//_event=1; // loop() scan until CDDONE
}
// Clear the CADDONE flag
@ -291,19 +367,20 @@ void stateMachine()
//
else if (intr == 0x00)
{
//_state = S_SCAN; // Do this state again but now for other freq.
if (! _hop) _event = 0; // XXX 26/12/2017 !!! NEED
_event=0; // XXX 26/12/2017 !!! NEED
}
// Unkown Interrupt, so we have an error
//
else {
#if DUSB>=1
Serial.print(F("SCAN unknown:: "));
SerialStat(intr);
if (( debug>=0 ) && ( pdebug & P_SCAN )) {
Serial.print(F("SCAN unknown:: "));
SerialStat(intr);
}
#endif
_state=S_SCAN;
_event=1; // XXX 06/03 loop until interrupt
//_event=1; // XXX 06/03 loop until interrupt
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF);
}
@ -347,7 +424,7 @@ void stateMachine()
// Reset all interrupts as soon as possible
// But listen ONLY to RXDONE and RXTOUT interrupts
writeRegister(REG_IRQ_FLAGS, IRQ_LORA_CDDETD_MASK | IRQ_LORA_RXDONE_MASK);
//writeRegister(REG_IRQ_FLAGS, 0xFF ); // XXX 180326, reset all CAD Detect interrupt flags
//writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // XXX 180326, reset all CAD Detect interrupt flags
_state = S_RX; // Set state to start receiving
opmode(OPMODE_RX_SINGLE); // set reg 0x01 to 0x06, initiate READ
@ -357,25 +434,15 @@ void stateMachine()
rssi = readRegister(REG_RSSI); // Read the RSSI
_rssi = rssi; // Read the RSSI in the state variable
if (_hop) {
//_event=1;
detTime = micros();
#if DUSB>=1
// XXX We see message under often in hop, but no RXDONE or RXTOUT
// and that should not be possible
if (debug>=1) {
Serial.print(F("S_CAD:: hop CDDET fr="));
Serial.print(ifreq);
Serial.print(F(", sf="));
Serial.println(sf);
}
if (( debug>=1 ) && ( pdebug & P_CAD )) {
Serial.print(F("CAD:: "));
SerialStat(intr);
}
#endif
}
// If not hop, we return to the state Machine immediately
else{
//_event=1; // XXX 180324, was 1;
}
detTime=micros();
}// CDDETD
// Intr == CADDONE
@ -394,7 +461,7 @@ void stateMachine()
_event=0; // XXX 180324, when increasing SF loop, ws 0x00
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00); // Reset the interrupt mask
//writeRegister(REG_IRQ_FLAGS, IRQ_LORA_CDDONE_MASK | IRQ_LORA_CDDETD_MASK);
writeRegister(REG_IRQ_FLAGS, 0xFF ); // This will prevent the CDDETD from being read
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // This will prevent the CDDETD from being read
opmode(OPMODE_CAD); // Scanning mode
@ -402,7 +469,7 @@ void stateMachine()
rssi = readRegister(REG_RSSI); // Read the RSSI
#if DUSB>=1
if (debug>=2) {
if (( debug>=2 ) && ( pdebug & P_CAD )) {
Serial.print(F("S_CAD:: CDONE, SF="));
Serial.println(sf);
}
@ -416,21 +483,16 @@ void stateMachine()
// Reset Interrupts
_event=1; // reset soft intr, to state machine again
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00); // Reset the interrupt mask
writeRegister(REG_IRQ_FLAGS, 0xFF ); // or IRQ_LORA_CDDONE_MASK
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF ); // or IRQ_LORA_CDDONE_MASK
_state = S_SCAN; // As soon as we reach SF12 do something
if (_hop) {
hop(); // but Change channels
}
sf = SF7;
cadScanner(); // Which will reset SF to SF7
#if DUSB>=1
if (debug>=2) {
Serial.print(F("CAD->SCAN:0x"));
Serial.print(ifreq);
Serial.print(F(":SF"));
Serial.print(sf);
Serial.println();
if (( debug>=2 ) && ( pdebug & P_CAD )) {
Serial.print(F("CAD->SCAN:: "));
SerialStat(intr);
}
#endif
}
@ -444,7 +506,7 @@ void stateMachine()
//
else if (intr == 0x00) {
#if DUSB>=0
if (debug>=3) {
if (( debug>=3 ) && ( pdebug & P_CAD )) {
Serial.println("Err CAD:: intr is 0x00");
}
#endif
@ -456,12 +518,13 @@ void stateMachine()
//
else {
#if DUSB>=1
if (debug>=0) {
if (( debug>=0) && ( pdebug & P_CAD )) {
Serial.print(F("Err CAD: Unknown::"));
SerialStat(intr);
}
#endif
_state = S_SCAN;
sf = SF7;
cadScanner(); // Scan and set SF7
// Reset Interrupts
@ -471,7 +534,6 @@ void stateMachine()
}
break; //S_CAD
// --------------------------------------------------------------
// If we receive an RXDONE interrupt on dio0 with state==S_RX
@ -482,7 +544,7 @@ void stateMachine()
// Go back to SCAN
//
case S_RX:
if (intr & IRQ_LORA_RXDONE_MASK) {
#if CRCCHECK==1
@ -493,12 +555,13 @@ void stateMachine()
//
if (intr & IRQ_LORA_CRCERR_MASK) {
#if DUSB>=1
if ((debug>=0)&&
(intr & IRQ_LORA_CRCERR_MASK)) {
Serial.println(F("Rx CRC err"));
if (( debug>=0 ) && ( pdebug & P_RX )) {
Serial.print(F("Rx CRC err: "));
SerialStat(intr);
}
#endif
if (_cad) {
sf = SF7;
_state = S_SCAN;
cadScanner();
}
@ -535,7 +598,7 @@ void stateMachine()
// - break
if((LoraUp.payLength = receivePkt(LoraUp.payLoad)) <= 0) {
#if DUSB>=1
if (debug>=1) {
if (( debug>=1 ) && ( pdebug & P_RX )) {
Serial.println(F("sMachine:: Error S-RX"));
}
#endif
@ -546,14 +609,17 @@ void stateMachine()
// IRQ_LORA_RXTOUT_MASK |
// IRQ_LORA_HEADER_MASK |
// IRQ_LORA_CRCERR_MASK ));
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF);
_state = S_SCAN;
break;
}
#if DUSB>=1
if (debug>=1) {
Serial.print(F("RXDONE="));
Serial.println(ffTime - detTime);
if (( debug>=1 ) && ( pdebug & P_RX )) {
Serial.print(F("RXDONE in dT="));
Serial.print(ffTime - detTime);
Serial.print(F(": "));
SerialStat(intr);
}
#endif
@ -585,7 +651,7 @@ void stateMachine()
//
if (receivePacket() <= 0) { // read is not successful
#if DUSB>=1
if (debug>=0) {
if (( debug>=0 ) && ( pdebug & P_RX )) {
Serial.println(F("sMach:: Error receivePacket"));
}
#endif
@ -595,6 +661,7 @@ void stateMachine()
//
if ((_cad) || (_hop)) {
_state = S_SCAN;
sf = SF7;
cadScanner();
}
else {
@ -604,6 +671,7 @@ void stateMachine()
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // Reset the interrupt mask
eventTime=micros(); //There was an event for receive
_event=0;
}// RXDONE
@ -619,20 +687,26 @@ void stateMachine()
// For the modem in cad state we reset to SF7
// If a timeout occurs here we reset the cadscanner
//
if ((_cad) || (_hop)) { // XXX 01/01/2018
// Set the state to CAD scanning
#if DUSB>=1
if (debug>=2) {
if (( debug>=1 ) && ( pdebug & P_RX )) {
Serial.print(F("RXTOUT:: f="));
Serial.print(ifreq);
Serial.print(F(", sf="));
Serial.print(sf);
Serial.print(F(", tim="));
Serial.println(micros() - detTime);
Serial.print(F(", dT="));
Serial.print(micros() - detTime);
Serial.print(F(": "));
SerialStat(intr);
}
#endif
_state = S_SCAN;
sf = SF7;
cadScanner(); // Start the scanner after RXTOUT
_state = S_SCAN; // New state is scan after RXTOUT
}// RXTOUT
@ -642,7 +716,7 @@ void stateMachine()
_state = S_RX; // Receive when interrupted
rxLoraModem();
}
eventTime=micros(); //There was an event for receive
}
else if (intr & IRQ_LORA_HEADER_MASK) {
@ -650,32 +724,41 @@ void stateMachine()
// which is normall an indication of RXDONE
//writeRegister(REG_IRQ_FLAGS, IRQ_LORA_HEADER_MASK);
#if DUSB>=1
if (debug>=1) {
if (( debug>=2 ) && ( pdebug & P_RX )) {
Serial.print(F("RX HEADER:: "));
SerialStat(intr);
}
#endif
_event=1;
//_event=1;
}
// If we did not receive a hard interrupt
// The probably do not do anythings, because in the S_RX
// state there e always comes a RXTOUT or RXDONE interrupt
//
else if (intr == 0x00) {
#if DUSB>=1
if (( debug>=2) && ( pdebug & P_RX )) {
Serial.print(F("S_RX noINTR:: "));
SerialStat(intr);
}
#endif
}
// The interrupt received is not RXDONE, RXTOUT or HEADER
// therefore we wait. Make sure to clear the interrupt
// as HEADER interrupt comes just before RXDONE
else {
//writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00 );
//writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF);
if (_hop) {
_event=1;
}
//_state=S_SCAN; // NONONONONONONONONO do NOT change state
else {
#if DUSB>=1
if (debug>=1) {
if (( debug>=0 ) && ( pdebug & P_RX )) {
Serial.print(F("S_RX:: no RXDONE, RXTOUT, HEADER:: "));
SerialStat(intr);
}
#endif
//writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00 );
//writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF);
}// int not RXDONE or RXTOUT
break; // S_RX
@ -717,8 +800,9 @@ void stateMachine()
);
#if DUSB>=2
if (debug>=0) {
if ( debug>=0 ) {
Serial.println(F("S_TX, "));
SerialStat(intr);
}
#endif
@ -738,19 +822,23 @@ void stateMachine()
case S_TXDONE:
if (intr & IRQ_LORA_TXDONE_MASK) {
#if DUSB>=1
Serial.println(F("TXDONE interrupt"));
if (( debug>=0 ) && ( pdebug & P_TX )) {
Serial.println(F("TXDONE interrupt"));
}
#endif
// After transmission reset to receiver
if ((_cad) || (_hop)) { // XXX 26/02
// Set the state to CAD scanning
_state = S_SCAN;
sf = SF7;
cadScanner(); // Start the scanner after TX cycle
}
else {
_state = S_RX;
rxLoraModem();
}
_event=0;
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // reset interrupt flags
#if DUSB>=1
@ -759,21 +847,20 @@ void stateMachine()
if (debug>=2) Serial.flush();
}
#endif
_event=0;
}
// If a soft _event==0 interrupt and no transmission finished:
else {
#if DUSB>=1
if (debug>=0) {
Serial.print(F("TXDONE unknown interrupt="));
Serial.println(intr);
if (debug>=2) Serial.flush();
if (( debug>=0 ) && ( pdebug & P_TX )) {
Serial.print(F("TXDONE unknown int="));
SerialStat(intr);
}
#endif
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // reset interrupt flags
_event=0;
_state=S_SCAN;
}
break; // S_TXDONE
@ -792,9 +879,13 @@ void stateMachine()
#endif
if ((_cad) || (_hop)) {
#if DUSB>=1
if (debug>=1) Serial.println(F("default:: _state set to S_SCAN"));
if (debug>=0) {
Serial.println(F("default:: Unknown _state "));
SerialStat(intr);
}
#endif
_state = S_SCAN;
sf = SF7;
cadScanner();
_event=1; // XXX Restart the state machine
}
@ -806,7 +897,8 @@ void stateMachine()
}
writeRegister(REG_IRQ_FLAGS_MASK, (uint8_t) 0x00);
writeRegister(REG_IRQ_FLAGS, (uint8_t) 0xFF); // Reset all interrupts
eventTime=micros(); // Reset event for unkonwn state
break;// default
}// switch(_state)

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-03-09
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -81,7 +81,8 @@ int sendPacket(uint8_t *buf, uint8_t length)
#endif
return(-1);
}
delay(1);
yield();
// Meta Data sent by server (example)
// {"txpk":{"codr":"4/5","data":"YCkEAgIABQABGmIwYX/kSn4Y","freq":868.1,"ipol":true,"modu":"LORA","powe":14,"rfch":0,"size":18,"tmst":1890991792,"datr":"SF7BW125"}}
@ -319,7 +320,7 @@ int buildPacket(uint32_t tmst, uint8_t *buff_up, struct LoraUp LoraUp, bool inte
#endif // STATISTICS >= 2
#if DUSB>=1
if (debug>=1) {
if (( debug>=2 ) && ( pdebug & P_RADIO )){
Serial.print(F("buildPacket:: pRSSI="));
Serial.print(prssi-rssicorr);
Serial.print(F(" RSSI: "));
@ -506,7 +507,7 @@ int buildPacket(uint32_t tmst, uint8_t *buff_up, struct LoraUp LoraUp, bool inte
#if DUSB>=1
if (debug>=2) {
Serial.print(F("RXPK:: "));
Serial.println((char *)(buff_up + 12)); // DEBUG: display JSON payload
Serial.println((char *)(buff_up + 12)); // debug: display JSON payload
}
if (debug>= 2) {
Serial.print(F("RXPK:: package length="));

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-09
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -43,14 +43,14 @@ static void stringTime(time_t t, String& response) {
// now() gives seconds since 1970
// as millis() does rotate every 50 days
// So we need another timing parameter
time_t eventTime = t;
time_t eTime = t;
// Rest is standard
byte _hour = hour(eventTime);
byte _minute = minute(eventTime);
byte _second = second(eventTime);
byte _hour = hour(eTime);
byte _minute = minute(eTime);
byte _second = second(eTime);
switch(weekday(eventTime)) {
switch(weekday(eTime)) {
case 1: response += "Sunday "; break;
case 2: response += "Monday "; break;
case 3: response += "Tuesday "; break;
@ -59,9 +59,9 @@ static void stringTime(time_t t, String& response) {
case 6: response += "Friday "; break;
case 7: response += "Saturday "; break;
}
response += String() + day(eventTime) + "-";
response += String() + month(eventTime) + "-";
response += String() + year(eventTime) + " ";
response += String() + day(eTime) + "-";
response += String() + month(eTime) + "-";
response += String() + year(eTime) + " ";
if (_hour < 10) response += "0";
response += String() + _hour + ":";
@ -104,17 +104,16 @@ void SerialStat(uint8_t intr)
#if DUSB>=1
if (debug>=0) {
Serial.print(F("I="));
//Serial.print(intr,HEX);
if (intr & IRQ_LORA_RXTOUT_MASK) Serial.print(F("RXTOUT")); // 0x80
if (intr & IRQ_LORA_RXDONE_MASK) Serial.print(F("RXDONE")); // 0x40
if (intr & IRQ_LORA_CRCERR_MASK) Serial.print(F("CRCERR")); // 0x20
if (intr & IRQ_LORA_HEADER_MASK) Serial.print(F("HEADER")); // 0x10
if (intr & IRQ_LORA_TXDONE_MASK) Serial.print(F("TXDONE")); // 0x08
if (intr & IRQ_LORA_CDDONE_MASK) Serial.print(F("CDDONE")); // 0x04
if (intr & IRQ_LORA_FHSSCH_MASK) Serial.print(F("FHSSCH")); // 0x02
if (intr & IRQ_LORA_CDDETD_MASK) Serial.print(F("CDDETD")); // 0x01
if (intr & IRQ_LORA_RXTOUT_MASK) Serial.print(F("RXTOUT ")); // 0x80
if (intr & IRQ_LORA_RXDONE_MASK) Serial.print(F("RXDONE ")); // 0x40
if (intr & IRQ_LORA_CRCERR_MASK) Serial.print(F("CRCERR ")); // 0x20
if (intr & IRQ_LORA_HEADER_MASK) Serial.print(F("HEADER ")); // 0x10
if (intr & IRQ_LORA_TXDONE_MASK) Serial.print(F("TXDONE ")); // 0x08
if (intr & IRQ_LORA_CDDONE_MASK) Serial.print(F("CDDONE ")); // 0x04
if (intr & IRQ_LORA_FHSSCH_MASK) Serial.print(F("FHSSCH ")); // 0x02
if (intr & IRQ_LORA_CDDETD_MASK) Serial.print(F("CDDETD ")); // 0x01
if (intr == 0x00) Serial.print(F(" -- "));
Serial.print(F(", F="));
@ -143,12 +142,12 @@ void SerialStat(uint8_t intr)
Serial.print(F("TX "));
break;
case S_TXDONE:
Serial.print(F("TXDN"));
Serial.print(F("TXDONE"));
break;
default:
Serial.print(F(" -- "));
}
Serial.print(F(", t="));
Serial.print(F(", eT="));
Serial.print( micros() - eventTime );
Serial.println();
}

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by many people and making use of several libraries.
//
@ -130,8 +130,9 @@ static void setVariables(const char *cmd, const char *arg) {
_hop=(bool)atoi(arg);
if (! _hop) {
ifreq=0;
freq=freqs[0];
freq=freqs[ifreq];
rxLoraModem();
sf = SF7;
cadScanner();
}
writeGwayCfg(CONFIGFILE); // Save configuration to file
@ -306,14 +307,14 @@ static void settingsData()
response +="<table class=\"config_table\">";
response +="<tr>";
response +="<th class=\"thead\">Setting</th>";
response +="<th style=\"background-color: green; color: white; width:120px;\">Value</th>";
response +="<th colspan=\"2\" style=\"background-color: green; color: white; width:100px;\">Set</th>";
response +="<th colspan=\"2\" style=\"background-color: green; color: white; width:120px;\">Value</th>";
response +="<th colspan=\"4\" style=\"background-color: green; color: white; width:100px;\">Set</th>";
response +="</tr>";
bg = " background-color: ";
bg += ( _cad ? "LightGreen" : "orange" );
response +="<tr><td class=\"cell\">CAD</td>";
response +="<td style=\"border: 1px solid black;"; response += bg; response += "\">";
response +="<td colspan=\"2\" style=\"border: 1px solid black;"; response += bg; response += "\">";
response += ( _cad ? "ON" : "OFF" );
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"CAD=1\"><button>ON</button></a></td>";
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"CAD=0\"><button>OFF</button></a></td>";
@ -322,13 +323,13 @@ static void settingsData()
bg = " background-color: ";
bg += ( _hop ? "LightGreen" : "orange" );
response +="<tr><td class=\"cell\">HOP</td>";
response +="<td style=\"border: 1px solid black;"; response += bg; response += "\">";
response +="<td colspan=\"2\" style=\"border: 1px solid black;"; response += bg; response += "\">";
response += ( _hop ? "ON" : "OFF" );
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"HOP=1\"><button>ON</button></a></td>";
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"HOP=0\"><button>OFF</button></a></td>";
response +="</tr>";
response +="<tr><td class=\"cell\">SF Setting</td><td class=\"cell\">";
response +="<tr><td class=\"cell\">SF Setting</td><td class=\"cell\" colspan=\"2\">";
if (_cad) {
response += "AUTO</td>";
}
@ -341,7 +342,7 @@ static void settingsData()
// Channel
response +="<tr><td class=\"cell\">Channel</td>";
response +="<td class=\"cell\">";
response +="<td class=\"cell\" colspan=\"2\">";
if (_hop) {
response += "AUTO</td>";
}
@ -353,18 +354,72 @@ static void settingsData()
}
response +="</tr>";
// Debugging options
response +="<tr><td class=\"cell\">";
response +="Debug level</td><td class=\"cell\">";
// Debugging options, only when DUSB is set, otherwise no
// serial activity
#if DUSB>=1
response +="<tr><td class=\"cell\">Debug level</td><td class=\"cell\" colspan=\"2\">";
response +=debug;
response +="</td>";
response +="<td class=\"cell\"><a href=\"DEBUG=-1\"><button>-</button></a></td>";
response +="<td class=\"cell\"><a href=\"DEBUG=1\"><button>+</button></a></td>";
response +="</tr>";
response +="<tr><td class=\"cell\">Debug pattern</td>";
bg = ( (pdebug & P_SCAN) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=SCAN\">";
response +="<button>SCN</button></a></td>";
bg = ( (pdebug & P_CAD) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=CAD\">";
response +="<button>CAD</button></a></td>";
bg = ( (pdebug & P_RX) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=RX\">";
response +="<button>RX</button></a></td>";
bg = ( (pdebug & P_TX) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=TX\">";
response +="<button>TX</button></a></td>";
response += "</tr>";
// Use a second Line
response +="<tr><td class=\"cell\"></td>";
bg = ( (pdebug & P_PRE) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=PRE\">";
response +="<button>PRE</button></a></td>";
bg = ( (pdebug & P_MAIN) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=MAIN\">";
response +="<button>MAI</button></a></td>";
bg = ( (pdebug & P_GUI) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=GUI\">";
response +="<button>GUI</button></a></td>";
bg = ( (pdebug & P_RADIO) ? "LightGreen" : "orange" );
response +="<td class=\"cell\" style=\"border: 1px solid black; width:20px; background-color: ";
response += bg; response += "\">";
response +="<a href=\"PDEBUG=RADIO\">";
response +="<button>RDIO</button></a></td>";
response +="</tr>";
#endif
// Serial Debugging
response +="<tr><td class=\"cell\">";
response +="Usb Debug</td><td class=\"cell\">";
response +="<tr><td class=\"cell\">Usb Debug</td><td class=\"cell\" colspan=\"2\">";
response +=DUSB;
response +="</td>";
//response +="<td class=\"cell\"> </td>";
@ -373,7 +428,7 @@ static void settingsData()
#if GATEWAYNODE==1
response +="<tr><td class=\"cell\">Framecounter Internal Sensor</td>";
response +="<td class=\"cell\">";
response +="<td class=\"cell\" colspan=\"2\">";
response +=frameCount;
response +="</td><td colspan=\"2\" style=\"border: 1px solid black;\">";
response +="<button><a href=\"/FCNT\">RESET</a></button></td>";
@ -393,7 +448,7 @@ static void settingsData()
bg = " background-color: ";
bg += ( (gwayConfig.refresh == 1) ? "LightGreen" : "orange" );
response +="<tr><td class=\"cell\">WWW Refresh</td>";
response +="<td class=\"cell\" style=\"border: 1px solid black;" + bg + "\">";
response +="<td class=\"cell\" colspan=\"2\" style=\"border: 1px solid black; " + bg + "\">";
response += ( (gwayConfig.refresh == 1) ? "ON" : "OFF" );
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"REFR=1\"><button>ON</button></a></td>";
response +="<td style=\"border: 1px solid black; width:40px;\"><a href=\"REFR=0\"><button>OFF</button></a></td>";
@ -402,24 +457,24 @@ static void settingsData()
// Reset Accesspoint
#if WIFIMANAGER==1
response +="<tr><td>";
response +="<tr><td><tr><td>";
response +="Click <a href=\"/NEWSSID\">here</a> to reset accesspoint<br>";
response +="</td><td></td></tr>";
#endif
// Update Firmware all statistics
response +="<tr><td class=\"cell\">Update Firmware</td>";
response +="<td class=\"cell\"></td><td colspan=\"2\" class=\"cell\"><a href=\"/UPDATE=1\"><button>UPDATE</button></a></td></tr>";
response +="<tr><td class=\"cell\">Update Firmware</td><td colspan=\"2\"></td>";
response +="<td class=\"cell\" colspan=\"2\" class=\"cell\"><a href=\"/UPDATE=1\"><button>UPDATE</button></a></td></tr>";
// Reset all statistics
#if STATISTICS >= 1
response +="<tr><td class=\"cell\">Statistics</td>";
response +=String() + "<td class=\"cell\">"+statc.resets+"</td>";
response +=String() + "<td class=\"cell\" colspan=\"2\" >"+statc.resets+"</td>";
response +="<td colspan=\"2\" class=\"cell\"><a href=\"/RESET\"><button>RESET</button></a></td></tr>";
// Reset
response +="<tr><td class=\"cell\">Boots and Resets</td>";
response +=String() + "<td class=\"cell\">"+gwayConfig.boots+"</td>";
response +=String() + "<td class=\"cell\" colspan=\"2\" >"+gwayConfig.boots+"</td>";
response +="<td colspan=\"2\" class=\"cell\"><a href=\"/BOOT\"><button>RESET</button></a></td></tr>";
#endif
@ -813,11 +868,11 @@ void sendWebPage(const char *cmd, const char *arg)
statisticsData(); yield(); // Node statistics
sensorData(); yield(); // Display the sensor history, message statistics
systemData(); yield(); // System statistics such as heap etc.
settingsData(); yield(); // Display web configuration
wifiData(); yield(); // WiFI specific parameters
settingsData(); yield(); // Display web configuration
systemData(); yield(); // System statistics such as heap etc.
interruptData(); yield(); // Display interrupts only when debug >= 2
// Close the client connection to server
@ -891,6 +946,14 @@ void setupWWW()
statc.resets= 0;
writeGwayCfg(CONFIGFILE);
#if STATISTICS >= 3
statc.sf7_0 = 0; statc.sf7_1 = 0; statc.sf7_2 = 0;
statc.sf8_0 = 0; statc.sf8_1 = 0; statc.sf8_2 = 0;
statc.sf9_0 = 0; statc.sf9_1 = 0; statc.sf9_2 = 0;
statc.sf10_0= 0; statc.sf10_1= 0; statc.sf10_2= 0;
statc.sf11_0= 0; statc.sf11_1= 0; statc.sf11_2= 0;
statc.sf12_0= 0; statc.sf12_1= 0; statc.sf12_2= 0;
#endif
#endif
#endif
server.sendHeader("Location", String("/"), true);
@ -935,6 +998,57 @@ void setupWWW()
server.send ( 302, "text/plain", "");
});
// Set PDEBUG parameter
//
server.on("/PDEBUG=SCAN", []() { // Set debug level 0-2
pdebug ^= P_SCAN;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=CAD", []() { // Set debug level 0-2
pdebug ^= P_CAD;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=RX", []() { // Set debug level 0-2
pdebug ^= P_RX;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=TX", []() { // Set debug level 0-2
pdebug ^= P_TX;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=PRE", []() { // Set debug level 0-2
pdebug ^= P_PRE;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=MAIN", []() { // Set debug level 0-2
pdebug ^= P_MAIN;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=GUI", []() { // Set debug level 0-2
pdebug ^= P_GUI;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
server.on("/PDEBUG=RADIO", []() { // Set debug level 0-2
pdebug ^= P_RADIO;
writeGwayCfg(CONFIGFILE); // Save configuration to file
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
});
// Set delay in microseconds
server.on("/DELAY=1", []() {

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.
@ -29,6 +29,18 @@
//
// Define Pattern debug settings, this allows debugging per
// module rather than per level. See also pdebug.
//
#define P_SCAN 0x01
#define P_CAD 0x02
#define P_RX 0x04
#define P_TX 0x08
#define P_PRE 0x10
#define P_MAIN 0x20
#define P_GUI 0x40
#define P_RADIO 0x80
// Definition of the configuration record that is read at startup and written
// when settings are changed.
@ -47,18 +59,19 @@ struct espGwayConfig {
uint8_t ch; // index to freqs array, freqs[ifreq]=868100000 default
uint8_t sf; // range from SF7 to SF12
uint8_t debug; // range 0 to 4
uint8_t pdebug; // pattern debug,
uint16_t logFileRec; // Logging File Record number
uint16_t logFileNo; // Logging File Number
uint16_t logFileNum; // Number of log files
bool cad; // is CAD enabled?
bool hop; // Is HOP enabled (Note: Should be disabled)
bool hop; // Is HOP enabled (Note: default be disabled)
bool isNode; // Is gateway node enabled
bool refresh; // Is WWW browser refresh enabled
String ssid; // SSID of the last connected WiFi Network
String pass; // Password
String pass; // Password of WiFi network
} gwayConfig;
// Define a log record to be written to the log file

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many other contributors.
@ -43,10 +43,10 @@
#define RSSI_WAIT 6 // was 25
// How long will it take when hopping before a CDONE or CDETD value
// should be present and measured.
// is present and can be measured.
//
#define EVENT_WAIT 5000 // was 2000
#define EVENT_WAIT 25000 // 25 milliseconds before CDDETD
#define DONE_WAIT 1000 // 500 microseconds (1/2000) sec between CDDONE events
// Our code should correct the server Tramission delay settings
@ -92,7 +92,7 @@ volatile uint8_t _event=0;
uint8_t _rssi;
bool _cad= (bool) _CAD; // Set to true for Channel Activity Detection, only when dio 1 connected
bool _hop=false; // experimental; frequency hopping. Only use when dio2 connected
bool _hop= (bool) false;// experimental; frequency hopping. Only use when dio2 connected
unsigned long nowTime=0;
unsigned long msgTime=0;

Wyświetl plik

@ -1,7 +1,7 @@
// 1-channel LoRa Gateway for ESP8266
// Copyright (c) 2016, 2017 Maarten Westenberg version for ESP8266
// Version 5.0.9
// Date: 2018-04-07
// Copyright (c) 2016, 2017, 2018 Maarten Westenberg version for ESP8266
// Version 5.1.0
// Date: 2018-04-17
//
// based on work done by Thomas Telkamp for Raspberry PI 1ch gateway
// and many others.

Wyświetl plik

@ -1,6 +1,6 @@
# Single Channel LoRaWAN Gateway
Version 5.0.8, March 31, 2018
Version 5.1.0, May 10, 2018
Author: M. Westenberg (mw12554@hotmail.com)
Copyright: M. Westenberg (mw12554@hotmail.com)
@ -64,9 +64,17 @@ see nothing on the Serial Monitor.
this section.
4. Edit the ESP-sc-gway.h file and adapt the "wpas" structure. `Make sure that the first line of this structure
remains empty and put the SSID and Password of your router on the second line of the array.
5. Compile the code and doenload the executable over USB to the gateway. If all is right, you should
5. In the preferences part of the IDE, set the location of your sketch to the place where you put the
sketch on your computer. This will make sure that for example the required libraries that are shipped
with this sketch in the libraries folder can be found by the compiler
6. If not yet done: Load the support for ESP8266 in your IDE. <Tools><Board><Board Manager...>
7. Load the other necessary libraries that are not shipped with this sketch in your IDE.
Goto <Sketch><Include Library><Manage Libraries...> in the IDE to do so.
- ArduinoJson (version 5.13.1)
- WifiManager (Version 0.12.0 by Tzapu)
8. Compile the code and download the executable over USB to the gateway. If all is right, you should
see the gateway starting up on the Serial Monitor.
6. Note the IP address that the device receives from your router. Use that IP address in a browser on
9. Note the IP address that the device receives from your router. Use that IP address in a browser on
your computer to connect to the gateway with the browser.
Now your gateway should be running. Use the webpage to set "debug" to 1 and you should be able to see packages
@ -163,7 +171,7 @@ gateway will be reduced in CAD mode.
### Over the Air Updates (OTA)
As from version 4.0.6 the gateway allows over the air updated if the setting A_OTA is on.
As from version 4.0.6 the gateway allows over the air updating if the setting A_OTA is on.
The over the air software requires once setting of the 4.0.6 version over USB to the gateway,
after which the software is (default) enabled for use.