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! <---
|
||||
; 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_INFO
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
||||
; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||
;
|
||||
|
@ -44,16 +44,10 @@ typedef struct {
|
||||
} configData_t;
|
||||
|
||||
extern configData_t cfg;
|
||||
extern uint8_t mydata[];
|
||||
extern uint64_t uptimecounter;
|
||||
extern osjob_t sendjob;
|
||||
extern char display_lora[], display_lmic[];
|
||||
extern int countermode, screensaver, adrmode, lorasf, txpower, rlim;
|
||||
extern uint16_t macs_total, macs_wifi, macs_ble; // MAC counters
|
||||
extern bool joinstate;
|
||||
extern std::set<uint16_t> macs;
|
||||
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;
|
||||
}
|
||||
|
||||
uint8_t mydata[4];
|
||||
|
||||
// prepare payload with sum of unique WIFI MACs seen
|
||||
static uint8_t mydata[4];
|
||||
|
||||
mydata[0] = (macs_wifi & 0xff00) >> 8;
|
||||
mydata[1] = macs_wifi & 0xff;
|
||||
|
||||
@ -169,13 +169,12 @@ void onEvent (ev_t ev) {
|
||||
|
||||
case EV_JOINED:
|
||||
|
||||
joinstate=true;
|
||||
strcpy_P(buff, PSTR("JOINED"));
|
||||
sprintf(display_lora, ""); // clear previous lmic status message from display
|
||||
|
||||
// Disable link check validation (automatically enabled
|
||||
// during join, but not supported by TTN at this time).
|
||||
// LMIC_setLinkCheckMode(0); -> do we need this?
|
||||
// during join, but not supported by TTN at this time). -> do we need this?
|
||||
LMIC_setLinkCheckMode(0);
|
||||
|
||||
// set data rate adaptation
|
||||
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
|
||||
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
|
||||
uint8_t DisplayState = 0; // globals for state machine
|
||||
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)
|
||||
uint16_t LEDBlinkDuration = 0; // How long the blink need to be
|
||||
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 * channelSwitch = NULL; // configure hardware timer used for wifi channel switching
|
||||
|
||||
@ -128,34 +126,20 @@ const lmic_pinmap lmic_pins = {
|
||||
.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
|
||||
void lorawan_loop(void * pvParameters) {
|
||||
|
||||
configASSERT( ( ( uint32_t ) pvParameters ) == 1 ); // FreeRTOS check
|
||||
|
||||
static uint16_t lorawait = 0;
|
||||
//static uint16_t lorawait = 0;
|
||||
|
||||
while(1) {
|
||||
|
||||
// execute LMIC jobs
|
||||
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
|
||||
while(LMIC.opmode & OP_TXRXPEND) {
|
||||
if(!lorawait)
|
||||
@ -169,13 +153,14 @@ void lorawan_loop(void * pvParameters) {
|
||||
};
|
||||
vTaskDelay(1000/portTICK_PERIOD_MS);
|
||||
}
|
||||
*/
|
||||
*/
|
||||
|
||||
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
||||
}
|
||||
}
|
||||
|
||||
/* end LMIC specific parts --------------------------------------------------------------- */
|
||||
|
||||
/* end LMIC specific parts --------------------------------------------------------------- */
|
||||
|
||||
|
||||
/* beginn hardware specific parts -------------------------------------------------------- */
|
||||
@ -384,6 +369,7 @@ uint64_t uptime() {
|
||||
#endif
|
||||
|
||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
||||
|
||||
void blink_LED(uint16_t set_color, uint16_t set_blinkduration) {
|
||||
LEDColor = set_color; // set color for RGB LED
|
||||
LEDBlinkDuration = set_blinkduration; // duration
|
||||
@ -457,7 +443,6 @@ uint64_t uptime() {
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* begin Aruino SETUP ------------------------------------------------------------ */
|
||||
|
||||
void setup() {
|
||||
@ -575,10 +560,16 @@ ESP_LOGI(TAG, "Features %s", features);
|
||||
printKeys();
|
||||
#endif
|
||||
|
||||
os_init(); // initialize lmic run-time environment
|
||||
os_setCallback(&initjob, lora_init); // setup initial job & join LoRaWAN network
|
||||
// initialize LoRaWAN LMIC run-time environment
|
||||
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");
|
||||
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
|
||||
|
||||
// kickoff first sendjob -> joins network and transmits initial payload "0000"
|
||||
uint8_t mydata[] = "0000";
|
||||
// kickoff sendjob -> joins network and rescedules sendjob for cyclic transmitting payload
|
||||
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() {
|
||||
|
||||
// simple state machine for controlling display, LED, button, etc.
|
||||
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
||||
while (1) {
|
||||
|
||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
||||
led_loop();
|
||||
#endif
|
||||
// simple state machine for controlling uptime, display, LED, button, memory.
|
||||
|
||||
#ifdef HAS_BUTTON
|
||||
readButton();
|
||||
#endif
|
||||
uptimecounter = uptime() / 1000; // counts uptime in seconds (64bit)
|
||||
|
||||
#ifdef HAS_DISPLAY
|
||||
updateDisplay();
|
||||
#endif
|
||||
#if (HAS_LED != NOT_A_PIN) || defined (HAS_RGB_LED)
|
||||
led_loop();
|
||||
#endif
|
||||
|
||||
// check free memory
|
||||
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_get_minimum_free_heap_size(), ESP.getFreeHeap());
|
||||
do_send(&sendjob); // send count
|
||||
reset_counters(); // clear macs container and reset all counters
|
||||
reset_salt(); // get new salt for salting hashes
|
||||
}
|
||||
#ifdef HAS_BUTTON
|
||||
readButton();
|
||||
#endif
|
||||
|
||||
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
||||
#ifdef HAS_DISPLAY
|
||||
updateDisplay();
|
||||
#endif
|
||||
|
||||
}
|
||||
// check free memory
|
||||
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_get_minimum_free_heap_size(), ESP.getFreeHeap());
|
||||
do_send(&sendjob); // send count
|
||||
reset_counters(); // clear macs container and reset all counters
|
||||
reset_salt(); // get new salt for salting hashes
|
||||
}
|
||||
|
||||
/* end Aruino LOOP ------------------------------------------------------------ */
|
||||
vTaskDelay(10/portTICK_PERIOD_MS); // reset watchdog
|
||||
|
||||
} // end of infinite main loop
|
||||
}
|
||||
|
||||
/* end Arduino main loop ------------------------------------------------------------ */
|
||||
|
Loading…
Reference in New Issue
Block a user