senddata restructured
This commit is contained in:
parent
f0cf08bd75
commit
786714d69a
@ -16,9 +16,11 @@
|
|||||||
#include <TinyGPS++.h>
|
#include <TinyGPS++.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
// LMIC-Arduino LoRaWAN Stack
|
// LMIC-Arduino LoRaWAN Stack
|
||||||
#include <lmic.h>
|
#include <lmic.h>
|
||||||
#include <hal/hal.h>
|
#include <hal/hal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// LED controls
|
// LED controls
|
||||||
#ifdef HAS_RGB_LED
|
#ifdef HAS_RGB_LED
|
||||||
@ -31,9 +33,8 @@
|
|||||||
#include "payload.h"
|
#include "payload.h"
|
||||||
|
|
||||||
extern configData_t cfg;
|
extern configData_t cfg;
|
||||||
|
extern char display_line6[], display_line7[];
|
||||||
extern uint64_t uptimecounter;
|
extern uint64_t uptimecounter;
|
||||||
extern osjob_t sendjob, rcmdjob;
|
|
||||||
extern char display_lora[], display_lmic[];
|
|
||||||
extern int countermode, screensaver, adrmode, lorasf, txpower, rlim;
|
extern int countermode, screensaver, adrmode, lorasf, txpower, rlim;
|
||||||
extern uint16_t macs_total, macs_wifi, macs_ble; // MAC counters
|
extern uint16_t macs_total, macs_wifi, macs_ble; // MAC counters
|
||||||
extern std::set<uint16_t> macs;
|
extern std::set<uint16_t> macs;
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
// Hardware related definitions for Pycom FiPy Board
|
// Hardware related definitions for Pycom FiPy Board
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
|
|
||||||
#define CFG_sx1272_radio 1
|
#define CFG_sx1272_radio 1
|
||||||
#define HAS_LED NOT_A_PIN // FiPy has no on board LED, so we use RGB LED
|
#define HAS_LED NOT_A_PIN // FiPy has no on board LED, so we use RGB LED
|
||||||
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for Heltec LoRa-32 Board
|
// Hardware related definitions for Heltec LoRa-32 Board
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1
|
#define CFG_sx1276_radio 1
|
||||||
|
|
||||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
||||||
#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
|
#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1 // RFM95 module
|
#define CFG_sx1276_radio 1 // RFM95 module
|
||||||
|
|
||||||
// re-define pin definitions of pins_arduino.h
|
// re-define pin definitions of pins_arduino.h
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield
|
||||||
#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
|
#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1 // RFM95 module
|
#define CFG_sx1276_radio 1 // RFM95 module
|
||||||
|
|
||||||
// re-define pin definitions of pins_arduino.h
|
// re-define pin definitions of pins_arduino.h
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for Pycom LoPy Board (not: LoPy4)
|
// Hardware related definitions for Pycom LoPy Board (not: LoPy4)
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1272_radio 1
|
#define CFG_sx1272_radio 1
|
||||||
#define HAS_LED NOT_A_PIN // LoPy4 has no on board LED, so we use RGB LED on LoPy4
|
#define HAS_LED NOT_A_PIN // LoPy4 has no on board LED, so we use RGB LED on LoPy4
|
||||||
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for Pycom LoPy Board (not: LoPy4)
|
// Hardware related definitions for Pycom LoPy Board (not: LoPy4)
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1
|
#define CFG_sx1276_radio 1
|
||||||
#define HAS_LED NOT_A_PIN // LoPy4 has no on board LED, so we use RGB LED on LoPy4
|
#define HAS_LED NOT_A_PIN // LoPy4 has no on board LED, so we use RGB LED on LoPy4
|
||||||
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
#define HAS_RGB_LED GPIO_NUM_0 // WS2812B RGB LED on GPIO0
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for TTGO T-Beam board
|
// Hardware related definitions for TTGO T-Beam board
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
||||||
#define BOARD_HAS_PSRAM // use extra 4MB extern RAM
|
#define BOARD_HAS_PSRAM // use extra 4MB extern RAM
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for TTGOv1 board
|
// Hardware related definitions for TTGOv1 board
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1
|
#define CFG_sx1276_radio 1
|
||||||
|
|
||||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Hardware related definitions for TTGO V2 Board
|
// Hardware related definitions for TTGO V2 Board
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
||||||
|
|
||||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
|
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
/ - labelled v1.6 on pcb -> "new"
|
/ - labelled v1.6 on pcb -> "new"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
||||||
|
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
||||||
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
|
||||||
|
|
||||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
|
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#ifdef HAS_LORA
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
* LMIC LoRaWAN configuration
|
* LMIC LoRaWAN configuration
|
||||||
*
|
*
|
||||||
@ -29,3 +31,5 @@ static const u1_t APPEUI[8] = {0x70, 0xB3, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|||||||
|
|
||||||
static const u1_t APPKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
static const u1_t APPKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
|
#endif // HAS_LORA
|
@ -1,3 +1,5 @@
|
|||||||
|
#ifdef HAS_LORA
|
||||||
|
|
||||||
// Basic Config
|
// Basic Config
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
|
||||||
@ -152,7 +154,7 @@ void onEvent(ev_t ev) {
|
|||||||
case EV_JOINED:
|
case EV_JOINED:
|
||||||
|
|
||||||
strcpy_P(buff, PSTR("JOINED"));
|
strcpy_P(buff, PSTR("JOINED"));
|
||||||
sprintf(display_lora, " "); // clear previous lmic status
|
sprintf(display_line6, " "); // clear previous lmic status
|
||||||
|
|
||||||
// set data rate adaptation
|
// set data rate adaptation
|
||||||
LMIC_setAdrMode(cfg.adrmode);
|
LMIC_setAdrMode(cfg.adrmode);
|
||||||
@ -169,14 +171,14 @@ void onEvent(ev_t ev) {
|
|||||||
|
|
||||||
strcpy_P(buff, (LMIC.txrxFlags & TXRX_ACK) ? PSTR("RECEIVED ACK")
|
strcpy_P(buff, (LMIC.txrxFlags & TXRX_ACK) ? PSTR("RECEIVED ACK")
|
||||||
: PSTR("TX COMPLETE"));
|
: PSTR("TX COMPLETE"));
|
||||||
sprintf(display_lora, " "); // clear previous lmic status
|
sprintf(display_line6, " "); // clear previous lmic status
|
||||||
|
|
||||||
if (LMIC.dataLen) {
|
if (LMIC.dataLen) {
|
||||||
ESP_LOGI(TAG, "Received %d bytes of payload, RSSI %d SNR %d",
|
ESP_LOGI(TAG, "Received %d bytes of payload, RSSI %d SNR %d",
|
||||||
LMIC.dataLen, LMIC.rssi, (signed char)LMIC.snr / 4);
|
LMIC.dataLen, LMIC.rssi, (signed char)LMIC.snr / 4);
|
||||||
// LMIC.snr = SNR twos compliment [dB] * 4
|
// LMIC.snr = SNR twos compliment [dB] * 4
|
||||||
// LMIC.rssi = RSSI [dBm] (-196...+63)
|
// LMIC.rssi = RSSI [dBm] (-196...+63)
|
||||||
sprintf(display_lora, "RSSI %d SNR %d", LMIC.rssi,
|
sprintf(display_line6, "RSSI %d SNR %d", LMIC.rssi,
|
||||||
(signed char)LMIC.snr / 4);
|
(signed char)LMIC.snr / 4);
|
||||||
|
|
||||||
// check if payload received on command port, then call remote command
|
// check if payload received on command port, then call remote command
|
||||||
@ -205,7 +207,9 @@ void onEvent(ev_t ev) {
|
|||||||
// Log & Display if asked
|
// Log & Display if asked
|
||||||
if (*buff) {
|
if (*buff) {
|
||||||
ESP_LOGI(TAG, "EV_%s", buff);
|
ESP_LOGI(TAG, "EV_%s", buff);
|
||||||
sprintf(display_lmic, buff);
|
sprintf(display_line7, buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // onEvent()
|
} // onEvent()
|
||||||
|
|
||||||
|
#endif // HAS_LORA
|
@ -1,3 +1,5 @@
|
|||||||
|
#ifdef HAS_LORA
|
||||||
|
|
||||||
#ifndef LORAWAN_H
|
#ifndef LORAWAN_H
|
||||||
#define LORAWAN_H
|
#define LORAWAN_H
|
||||||
|
|
||||||
@ -7,3 +9,5 @@ void RevBytes(unsigned char *b, size_t c);
|
|||||||
void get_hard_deveui(uint8_t *pdeveui);
|
void get_hard_deveui(uint8_t *pdeveui);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // HAS_LORA
|
39
src/main.cpp
39
src/main.cpp
@ -28,10 +28,12 @@ licenses. Refer to LICENSE.txt file in repository for more details.
|
|||||||
// Does nothing and avoid any compilation error with I2C
|
// Does nothing and avoid any compilation error with I2C
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
// LMIC-Arduino LoRaWAN Stack
|
// LMIC-Arduino LoRaWAN Stack
|
||||||
#include "loraconf.h"
|
#include "loraconf.h"
|
||||||
#include <hal/hal.h>
|
#include <hal/hal.h>
|
||||||
#include <lmic.h>
|
#include <lmic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// ESP32 lib Functions
|
// ESP32 lib Functions
|
||||||
#include <esp32-hal-log.h> // needed for ESP_LOGx on arduino framework
|
#include <esp32-hal-log.h> // needed for ESP_LOGx on arduino framework
|
||||||
@ -40,13 +42,12 @@ licenses. Refer to LICENSE.txt file in repository for more details.
|
|||||||
|
|
||||||
// Initialize global variables
|
// Initialize global variables
|
||||||
configData_t cfg; // struct holds current device configuration
|
configData_t cfg; // struct holds current device configuration
|
||||||
osjob_t sendjob, rcmdjob; // LMIC job handler
|
char display_line6[16], display_line7[16]; // display buffers
|
||||||
uint64_t uptimecounter = 0; // timer global for uptime counter
|
uint64_t uptimecounter = 0; // timer global for uptime counter
|
||||||
uint8_t DisplayState = 0; // globals for state machine
|
uint8_t DisplayState = 0; // globals for state machine
|
||||||
uint16_t macs_total = 0, macs_wifi = 0,
|
uint16_t macs_total = 0, macs_wifi = 0,
|
||||||
macs_ble = 0; // MAC counters globals for display
|
macs_ble = 0; // MAC counters globals for display
|
||||||
uint8_t channel = 0; // wifi channel rotation counter global for display
|
uint8_t channel = 0; // wifi channel rotation counter global for display
|
||||||
char display_lora[16], display_lmic[16]; // display buffers
|
|
||||||
led_states LEDState = LED_OFF; // LED state global for state machine
|
led_states LEDState = LED_OFF; // LED state global for state machine
|
||||||
led_states previousLEDState =
|
led_states previousLEDState =
|
||||||
LED_ON; // This will force LED to be off at boot since State is OFF
|
LED_ON; // This will force LED to be off at boot since State is OFF
|
||||||
@ -105,6 +106,8 @@ void reset_counters() {
|
|||||||
/* begin LMIC specific parts
|
/* begin LMIC specific parts
|
||||||
* ------------------------------------------------------------ */
|
* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
void printKeys(void);
|
void printKeys(void);
|
||||||
#endif // VERBOSE
|
#endif // VERBOSE
|
||||||
@ -156,6 +159,8 @@ void lorawan_loop(void *pvParameters) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
/* end LMIC specific parts
|
/* end LMIC specific parts
|
||||||
* --------------------------------------------------------------- */
|
* --------------------------------------------------------------- */
|
||||||
|
|
||||||
@ -238,6 +243,7 @@ uint64_t uptime() {
|
|||||||
|
|
||||||
#ifdef HAS_DISPLAY
|
#ifdef HAS_DISPLAY
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
// Print a key on display
|
// Print a key on display
|
||||||
void DisplayKey(const uint8_t *key, uint8_t len, bool lsb) {
|
void DisplayKey(const uint8_t *key, uint8_t len, bool lsb) {
|
||||||
const uint8_t *p;
|
const uint8_t *p;
|
||||||
@ -247,6 +253,7 @@ void DisplayKey(const uint8_t *key, uint8_t len, bool lsb) {
|
|||||||
}
|
}
|
||||||
u8x8.printf("\n");
|
u8x8.printf("\n");
|
||||||
}
|
}
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
void init_display(const char *Productname, const char *Version) {
|
void init_display(const char *Productname, const char *Version) {
|
||||||
uint8_t buf[32];
|
uint8_t buf[32];
|
||||||
@ -289,9 +296,13 @@ void init_display(const char *Productname, const char *Version) {
|
|||||||
u8x8.print(Productname);
|
u8x8.print(Productname);
|
||||||
u8x8.print(" v");
|
u8x8.print(" v");
|
||||||
u8x8.println(PROGVERSION);
|
u8x8.println(PROGVERSION);
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
u8x8.println("DEVEUI:");
|
u8x8.println("DEVEUI:");
|
||||||
os_getDevEui((u1_t *)buf);
|
os_getDevEui((u1_t *)buf);
|
||||||
DisplayKey(buf, 8, true);
|
DisplayKey(buf, 8, true);
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
delay(5000);
|
delay(5000);
|
||||||
u8x8.clear();
|
u8x8.clear();
|
||||||
}
|
}
|
||||||
@ -325,6 +336,8 @@ void refreshDisplay() {
|
|||||||
else
|
else
|
||||||
u8x8.printf("%s", "BLTH:off");
|
u8x8.printf("%s", "BLTH:off");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
u8x8.setCursor(11, 3);
|
u8x8.setCursor(11, 3);
|
||||||
u8x8.printf("SF:");
|
u8x8.printf("SF:");
|
||||||
if (cfg.adrmode) // if ADR=on then display SF value inverse
|
if (cfg.adrmode) // if ADR=on then display SF value inverse
|
||||||
@ -333,6 +346,7 @@ void refreshDisplay() {
|
|||||||
lora_datarate[LMIC.datarate * 2 + 1]);
|
lora_datarate[LMIC.datarate * 2 + 1]);
|
||||||
if (cfg.adrmode) // switch off inverse if it was turned on
|
if (cfg.adrmode) // switch off inverse if it was turned on
|
||||||
u8x8.setInverseFont(0);
|
u8x8.setInverseFont(0);
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
// update wifi counter + channel display (line 4)
|
// update wifi counter + channel display (line 4)
|
||||||
u8x8.setCursor(0, 4);
|
u8x8.setCursor(0, 4);
|
||||||
@ -346,13 +360,15 @@ void refreshDisplay() {
|
|||||||
u8x8.setCursor(10, 5);
|
u8x8.setCursor(10, 5);
|
||||||
u8x8.printf("%4dKB", ESP.getFreeHeap() / 1024);
|
u8x8.printf("%4dKB", ESP.getFreeHeap() / 1024);
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
// update LoRa status display (line 6)
|
// update LoRa status display (line 6)
|
||||||
u8x8.setCursor(0, 6);
|
u8x8.setCursor(0, 6);
|
||||||
u8x8.printf("%-16s", display_lora);
|
u8x8.printf("%-16s", display_line6);
|
||||||
|
|
||||||
// update LMiC event display (line 7)
|
// update LMiC event display (line 7)
|
||||||
u8x8.setCursor(0, 7);
|
u8x8.setCursor(0, 7);
|
||||||
u8x8.printf("%-16s", display_lmic);
|
u8x8.printf("%-16s", display_line7);
|
||||||
|
#endif // HAS_LORA
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateDisplay() {
|
void updateDisplay() {
|
||||||
@ -417,6 +433,7 @@ void led_loop() {
|
|||||||
// No custom blink, check LoRaWAN state
|
// No custom blink, check LoRaWAN state
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
// LED indicators for viusalizing LoRaWAN state
|
// LED indicators for viusalizing LoRaWAN state
|
||||||
if (LMIC.opmode & (OP_JOINING | OP_REJOIN)) {
|
if (LMIC.opmode & (OP_JOINING | OP_REJOIN)) {
|
||||||
LEDColor = COLOR_YELLOW;
|
LEDColor = COLOR_YELLOW;
|
||||||
@ -425,7 +442,7 @@ void led_loop() {
|
|||||||
} else if (LMIC.opmode & (OP_TXDATA | OP_TXRXPEND)) {
|
} else if (LMIC.opmode & (OP_TXDATA | OP_TXRXPEND)) {
|
||||||
LEDColor = COLOR_BLUE;
|
LEDColor = COLOR_BLUE;
|
||||||
// small blink 10ms on each 1/2sec (not when joining)
|
// small blink 10ms on each 1/2sec (not when joining)
|
||||||
LEDState = ((millis() % 500) < 20) ? LED_ON : LED_OFF;
|
LEDState = ((millis() % 500) < 10) ? LED_ON : LED_OFF;
|
||||||
// This should not happen so indicate a problem
|
// This should not happen so indicate a problem
|
||||||
} else if (LMIC.opmode &
|
} else if (LMIC.opmode &
|
||||||
((OP_TXDATA | OP_TXRXPEND | OP_JOINING | OP_REJOIN) == 0)) {
|
((OP_TXDATA | OP_TXRXPEND | OP_JOINING | OP_REJOIN) == 0)) {
|
||||||
@ -433,6 +450,7 @@ void led_loop() {
|
|||||||
// heartbeat long blink 200ms on each 2 seconds
|
// heartbeat long blink 200ms on each 2 seconds
|
||||||
LEDState = ((millis() % 2000) < 200) ? LED_ON : LED_OFF;
|
LEDState = ((millis() % 2000) < 200) ? LED_ON : LED_OFF;
|
||||||
} else {
|
} else {
|
||||||
|
#endif // HAS_LORA
|
||||||
// led off
|
// led off
|
||||||
LEDColor = COLOR_NONE;
|
LEDColor = COLOR_NONE;
|
||||||
LEDState = LED_OFF;
|
LEDState = LED_OFF;
|
||||||
@ -571,7 +589,9 @@ void setup() {
|
|||||||
u8x8.setCursor(0, 5);
|
u8x8.setCursor(0, 5);
|
||||||
u8x8.printf(!cfg.rssilimit ? "RLIM:off " : "RLIM:%d", cfg.rssilimit);
|
u8x8.printf(!cfg.rssilimit ? "RLIM:off " : "RLIM:%d", cfg.rssilimit);
|
||||||
|
|
||||||
sprintf(display_lora, "Join wait");
|
#ifdef HAS_LORA
|
||||||
|
sprintf(display_line6, "Join wait");
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
// setup display refresh trigger IRQ using esp32 hardware timer 0
|
// setup display refresh trigger IRQ using esp32 hardware timer 0
|
||||||
// for explanation see
|
// for explanation see
|
||||||
@ -604,6 +624,8 @@ void setup() {
|
|||||||
// show compiled features
|
// show compiled features
|
||||||
ESP_LOGI(TAG, "Features: %s", features);
|
ESP_LOGI(TAG, "Features: %s", features);
|
||||||
|
|
||||||
|
#ifdef HAS_LORA
|
||||||
|
|
||||||
// output LoRaWAN keys to console
|
// output LoRaWAN keys to console
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printKeys();
|
printKeys();
|
||||||
@ -624,6 +646,7 @@ void setup() {
|
|||||||
ESP_LOGI(TAG, "Starting Lora task on core 1");
|
ESP_LOGI(TAG, "Starting Lora task on core 1");
|
||||||
xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, (void *)1,
|
xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, (void *)1,
|
||||||
(5 | portPRIVILEGE_BIT), NULL, 1);
|
(5 | portPRIVILEGE_BIT), NULL, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
// start wifi in monitor mode and start channel rotation task on core 0
|
// start wifi in monitor mode and start channel rotation task on core 0
|
||||||
ESP_LOGI(TAG, "Starting Wifi task on core 0");
|
ESP_LOGI(TAG, "Starting Wifi task on core 0");
|
||||||
@ -672,7 +695,7 @@ void loop() {
|
|||||||
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
||||||
|
|
||||||
// send data every x seconds, x/2 is configured in cfg.sendcycle
|
// send data every x seconds, x/2 is configured in cfg.sendcycle
|
||||||
if (uptime() % (cfg.sendcycle * 20000) == 0)
|
if (uptime() % (cfg.sendcycle * 20000) < cfg.sendcycle * 2)
|
||||||
senddata(PAYLOADPORT);
|
senddata(PAYLOADPORT);
|
||||||
|
|
||||||
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
|
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
|
||||||
@ -700,7 +723,7 @@ void loop() {
|
|||||||
|
|
||||||
#ifdef HAS_GPS
|
#ifdef HAS_GPS
|
||||||
// log NMEA status every 60 seconds, useful for debugging GPS connection
|
// log NMEA status every 60 seconds, useful for debugging GPS connection
|
||||||
if ((uptime() % 60000) == 0) {
|
if ((uptime() % 60000) < 60) {
|
||||||
ESP_LOGI(TAG, "GPS NMEA data: passed %d / failed: %d / with fix: %d",
|
ESP_LOGI(TAG, "GPS NMEA data: passed %d / failed: %d / with fix: %d",
|
||||||
gps.passedChecksum(), gps.failedChecksum(),
|
gps.passedChecksum(), gps.failedChecksum(),
|
||||||
gps.sentencesWithFix());
|
gps.sentencesWithFix());
|
||||||
|
@ -4,10 +4,6 @@
|
|||||||
//
|
//
|
||||||
// Note: After editing, before "build", use "clean" button in PlatformIO!
|
// Note: After editing, before "build", use "clean" button in PlatformIO!
|
||||||
|
|
||||||
//
|
|
||||||
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
|
|
||||||
#define HAS_SPI 1 // comment out if device shall not send data via SPI
|
|
||||||
|
|
||||||
// Verbose enables serial output
|
// Verbose enables serial output
|
||||||
#define VERBOSE 1 // comment out to silence the device, for mute use build option
|
#define VERBOSE 1 // comment out to silence the device, for mute use build option
|
||||||
|
|
||||||
@ -51,6 +47,8 @@
|
|||||||
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
|
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
|
||||||
#define RCMDPORT 2 // LoRaWAN Port on which device listenes for remote commands
|
#define RCMDPORT 2 // LoRaWAN Port on which device listenes for remote commands
|
||||||
#define PAYLOADPORT 1 // LoRaWAN Port on which device sends counts
|
#define PAYLOADPORT 1 // LoRaWAN Port on which device sends counts
|
||||||
|
#define STATUSPORT 2 // LoRaWAN Port on which device sends status query results
|
||||||
|
#define GPSPORT 3 // LoRaWAN Port on which device sends gps query results
|
||||||
|
|
||||||
// Default RGB LED luminosity (in %)
|
// Default RGB LED luminosity (in %)
|
||||||
#define RGBLUMINOSITY 30 // 30%
|
#define RGBLUMINOSITY 30 // 30%
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
|
||||||
// LMIC-Arduino LoRaWAN Stack
|
// LMIC-Arduino LoRaWAN Stack
|
||||||
#include <lmic.h>
|
//#include <lmic.h>
|
||||||
#include <hal/hal.h>
|
//#include <hal/hal.h>
|
||||||
|
|
||||||
// Local logging tag
|
// Local logging tag
|
||||||
static const char TAG[] = "main";
|
static const char TAG[] = "main";
|
||||||
@ -30,23 +30,7 @@ void antenna_select(const uint8_t _ant);
|
|||||||
uint16_t read_voltage(void);
|
uint16_t read_voltage(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// function sends result of get commands to LoRaWAN network
|
#ifdef HAS_LORA
|
||||||
void do_transmit(osjob_t *j) {
|
|
||||||
// check if there is a pending TX/RX job running, if yes then reschedule
|
|
||||||
// transmission
|
|
||||||
if (LMIC.opmode & OP_TXRXPEND) {
|
|
||||||
ESP_LOGI(TAG, "LoRa busy, rescheduling");
|
|
||||||
sprintf(display_lmic, "LORA BUSY");
|
|
||||||
os_setTimedCallback(&rcmdjob, os_getTime() + sec2osticks(RETRANSMIT_RCMD),
|
|
||||||
do_transmit);
|
|
||||||
}
|
|
||||||
// send payload
|
|
||||||
LMIC_setTxData2(RCMDPORT, payload.getBuffer(), payload.getSize(),
|
|
||||||
(cfg.countermode & 0x02));
|
|
||||||
ESP_LOGI(TAG, "%d bytes queued to send", payload.getSize());
|
|
||||||
sprintf(display_lmic, "PACKET QUEUED");
|
|
||||||
}
|
|
||||||
|
|
||||||
// help function to assign LoRa datarates to numeric spreadfactor values
|
// help function to assign LoRa datarates to numeric spreadfactor values
|
||||||
void switch_lora(uint8_t sf, uint8_t tx) {
|
void switch_lora(uint8_t sf, uint8_t tx) {
|
||||||
if (tx > 20)
|
if (tx > 20)
|
||||||
@ -93,13 +77,14 @@ void switch_lora(uint8_t sf, uint8_t tx) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
// set of functions that can be triggered by remote commands
|
// set of functions that can be triggered by remote commands
|
||||||
void set_reset(uint8_t val) {
|
void set_reset(uint8_t val) {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 0: // restart device
|
case 0: // restart device
|
||||||
ESP_LOGI(TAG, "Remote command: restart device");
|
ESP_LOGI(TAG, "Remote command: restart device");
|
||||||
sprintf(display_lora, "Reset pending");
|
sprintf(display_line6, "Reset pending");
|
||||||
vTaskDelay(
|
vTaskDelay(
|
||||||
10000 /
|
10000 /
|
||||||
portTICK_PERIOD_MS); // wait for LMIC to confirm LoRa downlink to server
|
portTICK_PERIOD_MS); // wait for LMIC to confirm LoRa downlink to server
|
||||||
@ -109,11 +94,11 @@ void set_reset(uint8_t val) {
|
|||||||
ESP_LOGI(TAG, "Remote command: reset MAC counter");
|
ESP_LOGI(TAG, "Remote command: reset MAC counter");
|
||||||
reset_counters(); // clear macs
|
reset_counters(); // clear macs
|
||||||
reset_salt(); // get new salt
|
reset_salt(); // get new salt
|
||||||
sprintf(display_lora, "Reset counter");
|
sprintf(display_line6, "Reset counter");
|
||||||
break;
|
break;
|
||||||
case 2: // reset device to factory settings
|
case 2: // reset device to factory settings
|
||||||
ESP_LOGI(TAG, "Remote command: reset device to factory settings");
|
ESP_LOGI(TAG, "Remote command: reset device to factory settings");
|
||||||
sprintf(display_lora, "Factory reset");
|
sprintf(display_line6, "Factory reset");
|
||||||
eraseConfig();
|
eraseConfig();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -208,11 +193,16 @@ void set_gps(uint8_t val) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void set_lorasf(uint8_t val) {
|
void set_lorasf(uint8_t val) {
|
||||||
|
#ifdef HAS_LORA
|
||||||
ESP_LOGI(TAG, "Remote command: set LoRa SF to %d", val);
|
ESP_LOGI(TAG, "Remote command: set LoRa SF to %d", val);
|
||||||
switch_lora(val, cfg.txpower);
|
switch_lora(val, cfg.txpower);
|
||||||
|
#else
|
||||||
|
ESP_LOGW(TAG, "Remote command: LoRa not implemented");
|
||||||
|
#endif // HAS_LORA
|
||||||
};
|
};
|
||||||
|
|
||||||
void set_loraadr(uint8_t val) {
|
void set_loraadr(uint8_t val) {
|
||||||
|
#ifdef HAS_LORA
|
||||||
ESP_LOGI(TAG, "Remote command: set LoRa ADR mode to %s", val ? "on" : "off");
|
ESP_LOGI(TAG, "Remote command: set LoRa ADR mode to %s", val ? "on" : "off");
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 1:
|
case 1:
|
||||||
@ -224,6 +214,9 @@ void set_loraadr(uint8_t val) {
|
|||||||
}
|
}
|
||||||
LMIC_setAdrMode(cfg.adrmode);
|
LMIC_setAdrMode(cfg.adrmode);
|
||||||
};
|
};
|
||||||
|
#else
|
||||||
|
ESP_LOGW(TAG, "Remote command: LoRa not implemented");
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
void set_blescan(uint8_t val) {
|
void set_blescan(uint8_t val) {
|
||||||
ESP_LOGI(TAG, "Remote command: set BLE scanner to %s", val ? "on" : "off");
|
ESP_LOGI(TAG, "Remote command: set BLE scanner to %s", val ? "on" : "off");
|
||||||
@ -280,15 +273,19 @@ void set_rgblum(uint8_t val) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void set_lorapower(uint8_t val) {
|
void set_lorapower(uint8_t val) {
|
||||||
|
#ifdef HAS_LORA
|
||||||
ESP_LOGI(TAG, "Remote command: set LoRa TXPOWER to %d", val);
|
ESP_LOGI(TAG, "Remote command: set LoRa TXPOWER to %d", val);
|
||||||
switch_lora(cfg.lorasf, val);
|
switch_lora(cfg.lorasf, val);
|
||||||
|
#else
|
||||||
|
ESP_LOGW(TAG, "Remote command: LoRa not implemented");
|
||||||
|
#endif // HAS_LORA
|
||||||
};
|
};
|
||||||
|
|
||||||
void get_config(uint8_t val) {
|
void get_config(uint8_t val) {
|
||||||
ESP_LOGI(TAG, "Remote command: get device configuration");
|
ESP_LOGI(TAG, "Remote command: get device configuration");
|
||||||
payload.reset();
|
payload.reset();
|
||||||
payload.addConfig(cfg);
|
payload.addConfig(cfg);
|
||||||
do_transmit(&rcmdjob);
|
senddata(STATUSPORT);
|
||||||
};
|
};
|
||||||
|
|
||||||
void get_status(uint8_t val) {
|
void get_status(uint8_t val) {
|
||||||
@ -300,7 +297,7 @@ void get_status(uint8_t val) {
|
|||||||
#endif
|
#endif
|
||||||
payload.reset();
|
payload.reset();
|
||||||
payload.addStatus(voltage, uptimecounter, temperatureRead());
|
payload.addStatus(voltage, uptimecounter, temperatureRead());
|
||||||
do_transmit(&rcmdjob);
|
senddata(STATUSPORT);
|
||||||
};
|
};
|
||||||
|
|
||||||
void get_gps(uint8_t val) {
|
void get_gps(uint8_t val) {
|
||||||
@ -309,7 +306,7 @@ void get_gps(uint8_t val) {
|
|||||||
gps_read();
|
gps_read();
|
||||||
payload.reset();
|
payload.reset();
|
||||||
payload.addGPS(gps_status);
|
payload.addGPS(gps_status);
|
||||||
do_transmit(&rcmdjob);
|
senddata(GPSPORT);
|
||||||
#else
|
#else
|
||||||
ESP_LOGW(TAG, "GPS function not supported");
|
ESP_LOGW(TAG, "GPS function not supported");
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,13 +18,14 @@ void senddata(uint8_t port) {
|
|||||||
#ifdef HAS_LORA
|
#ifdef HAS_LORA
|
||||||
// Check if there is a pending TX/RX job running
|
// Check if there is a pending TX/RX job running
|
||||||
if (LMIC.opmode & OP_TXRXPEND) {
|
if (LMIC.opmode & OP_TXRXPEND) {
|
||||||
ESP_LOGI(TAG, "LoRa busy, rescheduling");
|
ESP_LOGI(TAG, "LoRa busy, data not sent");
|
||||||
sprintf(display_lmic, "LORA BUSY");
|
sprintf(display_line7, "LORA BUSY");
|
||||||
} else {
|
} else {
|
||||||
// send payload via LoRa
|
// send payload via LoRa
|
||||||
LMIC_setTxData2(PAYLOADPORT, payload.getBuffer(), payload.getSize(), (cfg.countermode & 0x02));
|
LMIC_setTxData2(PAYLOADPORT, payload.getBuffer(), payload.getSize(),
|
||||||
|
(cfg.countermode & 0x02));
|
||||||
ESP_LOGI(TAG, "%d bytes queued to send on LoRa", payload.getSize());
|
ESP_LOGI(TAG, "%d bytes queued to send on LoRa", payload.getSize());
|
||||||
sprintf(display_lmic, "PACKET QUEUED");
|
sprintf(display_line7, "PACKET QUEUED");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user