diff --git a/loraprs_service.cpp b/loraprs_service.cpp index f54e144..bb41ac2 100644 --- a/loraprs_service.cpp +++ b/loraprs_service.cpp @@ -6,6 +6,7 @@ byte Service::rxBuf_[CfgMaxPacketSize]; #ifdef USE_RADIOLIB #pragma message("Using RadioLib") +TaskHandle_t Service::rxTaskHandle_; volatile bool Service::loraDataAvailable_ = false; bool Service::interruptEnabled_ = true; std::shared_ptr Service::radio_; @@ -73,7 +74,7 @@ void Service::setup(const Config &conf) #ifdef USE_RADIOLIB if (!config_.LoraUseIsr) { LOG_INFO("Reading data on separate task"); - xTaskCreate(processIncomingDataTask, "processIncomingDataTask", 10000, NULL, 1, NULL); + xTaskCreate(processIncomingDataTask, "processIncomingDataTask", 10000, NULL, 1, &rxTaskHandle_); } #endif @@ -395,8 +396,13 @@ bool Service::isLoraRxBusy() { #ifdef USE_RADIOLIB ICACHE_RAM_ATTR void Service::onLoraDataAvailableIsrNoRead() { + BaseType_t xHigherPriorityTaskWoken; + uint32_t interruptStatusBits = 0; + if (interruptEnabled_) { loraDataAvailable_ = true; + interruptStatusBits |= 1; + xTaskNotifyFromISR(rxTaskHandle_, interruptStatusBits, eSetBits, &xHigherPriorityTaskWoken); } } @@ -423,9 +429,12 @@ ICACHE_RAM_ATTR void Service::onLoraDataAvailableIsr() { void Service::processIncomingDataTask(void *param) { LOG_INFO("Incoming data process task started"); + uint32_t interruptStatusBits; while (true) { - if (loraDataAvailable_) { + xTaskNotifyWait(0, 0x00, &interruptStatusBits, portMAX_DELAY); + + if (interruptStatusBits & 0x01) { int packetSize = radio_->getPacketLength(); if (packetSize > 0) { @@ -444,7 +453,6 @@ void Service::processIncomingDataTask(void *param) { } loraDataAvailable_ = false; } - delay(CfgPollDelayMs); } } diff --git a/loraprs_service.h b/loraprs_service.h index 0a4f19b..8474afe 100644 --- a/loraprs_service.h +++ b/loraprs_service.h @@ -124,7 +124,7 @@ private: // processor config const int CfgConnRetryMs = 500; // connection retry delay, e.g. wifi - static const int CfgPollDelayMs = 5; // main loop delay + static const int CfgPollDelayMs = 20; // main loop delay const int CfgConnRetryMaxTimes = 10; // number of connection retries static const int CfgMaxPacketSize = 256; // maximum packet size @@ -152,6 +152,7 @@ private: // peripherals static byte rxBuf_[CfgMaxPacketSize]; #ifdef USE_RADIOLIB + static TaskHandle_t rxTaskHandle_; static volatile bool loraDataAvailable_; static bool interruptEnabled_; CircularBuffer txQueue_;