reworked rtos tasking & minor core sanitizations
This commit is contained in:
parent
61bd56860f
commit
7b8367fa4a
@ -33,8 +33,8 @@ build_flags =
|
|||||||
; ---> NOTE: For production run set DEBUG_LEVEL level to NONE! <---
|
; ---> NOTE: For production run set DEBUG_LEVEL level to NONE! <---
|
||||||
; otherwise device may crash in dense environments due to serial buffer overflow
|
; otherwise device may crash in dense environments due to serial buffer overflow
|
||||||
;
|
;
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO
|
||||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
;
|
;
|
||||||
|
@ -44,16 +44,10 @@ typedef struct {
|
|||||||
} configData_t;
|
} configData_t;
|
||||||
|
|
||||||
extern configData_t cfg;
|
extern configData_t cfg;
|
||||||
extern uint8_t mydata[];
|
|
||||||
extern uint64_t uptimecounter;
|
extern uint64_t uptimecounter;
|
||||||
extern osjob_t sendjob;
|
extern osjob_t sendjob;
|
||||||
extern char display_lora[], display_lmic[];
|
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 bool joinstate;
|
|
||||||
extern std::set<uint16_t> macs;
|
extern std::set<uint16_t> macs;
|
||||||
extern hw_timer_t * channelSwitch; // hardware timer used for wifi channel switching
|
extern hw_timer_t * channelSwitch; // hardware timer used for wifi channel switching
|
||||||
|
|
||||||
#ifdef HAS_DISPLAY
|
|
||||||
extern HAS_DISPLAY u8x8;
|
|
||||||
#endif
|
|
@ -116,9 +116,9 @@ void do_send(osjob_t* j){
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t mydata[4];
|
|
||||||
|
|
||||||
// prepare payload with sum of unique WIFI MACs seen
|
// prepare payload with sum of unique WIFI MACs seen
|
||||||
|
static uint8_t mydata[4];
|
||||||
|
|
||||||
mydata[0] = (macs_wifi & 0xff00) >> 8;
|
mydata[0] = (macs_wifi & 0xff00) >> 8;
|
||||||
mydata[1] = macs_wifi & 0xff;
|
mydata[1] = macs_wifi & 0xff;
|
||||||
|
|
||||||
@ -169,13 +169,12 @@ void onEvent (ev_t ev) {
|
|||||||
|
|
||||||
case EV_JOINED:
|
case EV_JOINED:
|
||||||
|
|
||||||
joinstate=true;
|
|
||||||
strcpy_P(buff, PSTR("JOINED"));
|
strcpy_P(buff, PSTR("JOINED"));
|
||||||
sprintf(display_lora, ""); // clear previous lmic status message from display
|
sprintf(display_lora, ""); // clear previous lmic status message from display
|
||||||
|
|
||||||
// Disable link check validation (automatically enabled
|
// Disable link check validation (automatically enabled
|
||||||
// during join, but not supported by TTN at this time).
|
// during join, but not supported by TTN at this time). -> do we need this?
|
||||||
// LMIC_setLinkCheckMode(0); -> do we need this?
|
LMIC_setLinkCheckMode(0);
|
||||||
|
|
||||||
// set data rate adaptation
|
// set data rate adaptation
|
||||||
LMIC_setAdrMode(cfg.adrmode);
|
LMIC_setAdrMode(cfg.adrmode);
|
||||||
|
100
src/main.cpp
100
src/main.cpp
@ -39,7 +39,7 @@ 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, initjob; // LMIC jobs
|
osjob_t sendjob; // LMIC job handler
|
||||||
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, macs_ble = 0; // MAC counters globals for display
|
uint16_t macs_total = 0, macs_wifi = 0, macs_ble = 0; // MAC counters globals for display
|
||||||
@ -50,8 +50,6 @@ led_states previousLEDState = LED_ON; // This will force LED to be off at boo
|
|||||||
unsigned long LEDBlinkStarted = 0; // When (in millis() led blink started)
|
unsigned long LEDBlinkStarted = 0; // When (in millis() led blink started)
|
||||||
uint16_t LEDBlinkDuration = 0; // How long the blink need to be
|
uint16_t LEDBlinkDuration = 0; // How long the blink need to be
|
||||||
uint16_t LEDColor = COLOR_NONE; // state machine variable to set RGB LED color
|
uint16_t LEDColor = COLOR_NONE; // state machine variable to set RGB LED color
|
||||||
bool joinstate = false; // LoRa network joined? global flag
|
|
||||||
bool blinkdone = true; // flag for state machine for blinking LED once
|
|
||||||
hw_timer_t * displaytimer = NULL; // configure hardware timer used for cyclic display refresh
|
hw_timer_t * displaytimer = NULL; // configure hardware timer used for cyclic display refresh
|
||||||
hw_timer_t * channelSwitch = NULL; // configure hardware timer used for wifi channel switching
|
hw_timer_t * channelSwitch = NULL; // configure hardware timer used for wifi channel switching
|
||||||
|
|
||||||
@ -128,34 +126,20 @@ const lmic_pinmap lmic_pins = {
|
|||||||
.dio = {DIO0, DIO1, DIO2}
|
.dio = {DIO0, DIO1, DIO2}
|
||||||
};
|
};
|
||||||
|
|
||||||
// LoRaWAN Initjob
|
|
||||||
static void lora_init (osjob_t* j) {
|
|
||||||
// reset MAC state
|
|
||||||
LMIC_reset();
|
|
||||||
// This tells LMIC to make the receive windows bigger, in case your clock is 1% faster or slower.
|
|
||||||
LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100);
|
|
||||||
// start joining -> will happen automatically after first do_send job
|
|
||||||
// LMIC_startJoining();
|
|
||||||
// lmic init done - onEvent() callback will be invoked when events occur
|
|
||||||
}
|
|
||||||
|
|
||||||
// LMIC FreeRTos Task
|
// LMIC FreeRTos Task
|
||||||
void lorawan_loop(void * pvParameters) {
|
void lorawan_loop(void * pvParameters) {
|
||||||
|
|
||||||
configASSERT( ( ( uint32_t ) pvParameters ) == 1 ); // FreeRTOS check
|
configASSERT( ( ( uint32_t ) pvParameters ) == 1 ); // FreeRTOS check
|
||||||
|
|
||||||
static uint16_t lorawait = 0;
|
//static uint16_t lorawait = 0;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
|
|
||||||
// execute LMIC jobs
|
// execute LMIC jobs
|
||||||
os_runloop_once();
|
os_runloop_once();
|
||||||
|
|
||||||
// indicate LMIC state on LEDs if present
|
/*
|
||||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
|
||||||
led_loop();
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
// check if payload is sent
|
// check if payload is sent
|
||||||
while(LMIC.opmode & OP_TXRXPEND) {
|
while(LMIC.opmode & OP_TXRXPEND) {
|
||||||
if(!lorawait)
|
if(!lorawait)
|
||||||
@ -169,13 +153,14 @@ void lorawan_loop(void * pvParameters) {
|
|||||||
};
|
};
|
||||||
vTaskDelay(1000/portTICK_PERIOD_MS);
|
vTaskDelay(1000/portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* end LMIC specific parts --------------------------------------------------------------- */
|
|
||||||
|
|
||||||
|
/* end LMIC specific parts --------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
/* beginn hardware specific parts -------------------------------------------------------- */
|
/* beginn hardware specific parts -------------------------------------------------------- */
|
||||||
@ -384,6 +369,7 @@ uint64_t uptime() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
||||||
|
|
||||||
void blink_LED(uint16_t set_color, uint16_t set_blinkduration) {
|
void blink_LED(uint16_t set_color, uint16_t set_blinkduration) {
|
||||||
LEDColor = set_color; // set color for RGB LED
|
LEDColor = set_color; // set color for RGB LED
|
||||||
LEDBlinkDuration = set_blinkduration; // duration
|
LEDBlinkDuration = set_blinkduration; // duration
|
||||||
@ -457,7 +443,6 @@ uint64_t uptime() {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* begin Aruino SETUP ------------------------------------------------------------ */
|
/* begin Aruino SETUP ------------------------------------------------------------ */
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
@ -575,10 +560,16 @@ ESP_LOGI(TAG, "Features %s", features);
|
|||||||
printKeys();
|
printKeys();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
os_init(); // initialize lmic run-time environment
|
// initialize LoRaWAN LMIC run-time environment
|
||||||
os_setCallback(&initjob, lora_init); // setup initial job & join LoRaWAN network
|
os_init();
|
||||||
|
// reset LMIC MAC state
|
||||||
|
LMIC_reset();
|
||||||
|
// This tells LMIC to make the receive windows bigger, in case your clock is 1% faster or slower.
|
||||||
|
LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100);
|
||||||
|
|
||||||
|
// start lmic runloop in rtos task on core 1 (note: arduino main loop runs on core 1, too)
|
||||||
|
// https://techtutorialsx.com/2017/05/09/esp32-get-task-execution-core/
|
||||||
|
|
||||||
// start lmic runloop in rtos task on core 1 (arduino main loop runs on core 1)
|
|
||||||
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, ( 5 | portPRIVILEGE_BIT ), NULL, 1);
|
xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, ( void * ) 1, ( 5 | portPRIVILEGE_BIT ), NULL, 1);
|
||||||
|
|
||||||
@ -597,46 +588,47 @@ xTaskCreatePinnedToCore(sniffer_loop, "wifisniffer", 2048, ( void * ) 1, 1, NULL
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// kickoff first sendjob -> joins network and transmits initial payload "0000"
|
// kickoff sendjob -> joins network and rescedules sendjob for cyclic transmitting payload
|
||||||
uint8_t mydata[] = "0000";
|
|
||||||
do_send(&sendjob);
|
do_send(&sendjob);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* end Aruino SETUP ------------------------------------------------------------ */
|
/* end Arduino SETUP ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* begin Arduino main loop ------------------------------------------------------ */
|
||||||
|
|
||||||
/* begin Aruino LOOP ------------------------------------------------------------ */
|
|
||||||
|
|
||||||
// Arduino main moop, runs on core 1
|
|
||||||
// https://techtutorialsx.com/2017/05/09/esp32-get-task-execution-core/
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
// simple state machine for controlling display, LED, button, etc.
|
while (1) {
|
||||||
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
|
||||||
|
|
||||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
// simple state machine for controlling uptime, display, LED, button, memory.
|
||||||
led_loop();
|
|
||||||
#endif
|
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
||||||
|
|
||||||
|
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
||||||
|
led_loop();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_BUTTON
|
#ifdef HAS_BUTTON
|
||||||
readButton();
|
readButton();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_DISPLAY
|
#ifdef HAS_DISPLAY
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// check free memory
|
// check free memory
|
||||||
if (esp_get_minimum_free_heap_size() <= MEM_LOW) {
|
if (esp_get_minimum_free_heap_size() <= MEM_LOW) {
|
||||||
ESP_LOGI(TAG, "Memory full, counter cleared (heap low water mark = %d Bytes / free heap = %d bytes)", \
|
ESP_LOGI(TAG, "Memory full, counter cleared (heap low water mark = %d Bytes / free heap = %d bytes)", \
|
||||||
esp_get_minimum_free_heap_size(), ESP.getFreeHeap());
|
esp_get_minimum_free_heap_size(), ESP.getFreeHeap());
|
||||||
do_send(&sendjob); // send count
|
do_send(&sendjob); // send count
|
||||||
reset_counters(); // clear macs container and reset all counters
|
reset_counters(); // clear macs container and reset all counters
|
||||||
reset_salt(); // get new salt for salting hashes
|
reset_salt(); // get new salt for salting hashes
|
||||||
}
|
}
|
||||||
|
|
||||||
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
||||||
|
|
||||||
}
|
} // end of infinite main loop
|
||||||
|
}
|
||||||
|
|
||||||
/* end Aruino LOOP ------------------------------------------------------------ */
|
/* end Arduino main loop ------------------------------------------------------------ */
|
||||||
|
Loading…
Reference in New Issue
Block a user