refactoring LMIC send queueing

This commit is contained in:
Verkehrsrot 2019-08-28 21:55:50 +02:00
parent 1c5edbb6a4
commit 78c8ed3e97
2 changed files with 29 additions and 20 deletions

View File

@ -248,6 +248,11 @@ void onEvent(ev_t ev) {
: PSTR("TX COMPLETE")); : PSTR("TX COMPLETE"));
sprintf(display_line6, " "); // clear previous lmic status sprintf(display_line6, " "); // clear previous lmic status
// schedule next transmission with some random delay to prevent systematic
// collisions
os_setTimedCallback(&sendjob, os_getTime() + ms2osticks(random(500)),
lora_send);
if (LMIC.dataLen) { // did we receive payload data -> display info if (LMIC.dataLen) { // did we receive payload data -> display info
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, LMIC.snr / 4); LMIC.dataLen, LMIC.rssi, LMIC.snr / 4);
@ -391,23 +396,23 @@ void switch_lora(uint8_t sf, uint8_t tx) {
void lora_send(osjob_t *job) { void lora_send(osjob_t *job) {
MessageBuffer_t SendBuffer; MessageBuffer_t SendBuffer;
if (xQueueReceive(LoraSendQueue, &SendBuffer, (TickType_t)0) == pdTRUE) {
// SendBuffer now filled with next payload from queue // Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
ESP_LOGE(TAG, "LMIC busy, data not sent and lost");
return;
}
// fetch next payload to send from queue or wait until new payload shows up in
// queue
if (xQueueReceive(LoraSendQueue, &SendBuffer, portMAX_DELAY) == pdTRUE) {
if (LMIC_setTxData2(SendBuffer.MessagePort, SendBuffer.Message, if (LMIC_setTxData2(SendBuffer.MessagePort, SendBuffer.Message,
SendBuffer.MessageSize, SendBuffer.MessageSize, (cfg.countermode & 0x02)) == 0)
(cfg.countermode & 0x02)) == 0) { ESP_LOGI(TAG, "%d byte(s) delivered to LMIC", SendBuffer.MessageSize);
ESP_LOGI(TAG, "%d byte(s) sent to LoRa", SendBuffer.MessageSize); else
} else { lora_enqueuedata(&SendBuffer); // re-enqueue unsent message
lora_enqueuedata(&SendBuffer);
// ESP_LOGE(TAG, "could not send %d byte(s) to LoRa, rescheduled",
// SendBuffer.MessageSize);
} }
} }
// reschedule job every 0,5 - 1 sec. including a bit of random to prevent
// systematic collisions
os_setTimedCallback(job, os_getTime() + 500 + ms2osticks(random(500)),
lora_send);
}
esp_err_t lora_stack_init() { esp_err_t lora_stack_init() {
assert(SEND_QUEUE_SIZE); assert(SEND_QUEUE_SIZE);
@ -438,15 +443,17 @@ esp_err_t lora_stack_init() {
void lora_enqueuedata(MessageBuffer_t *message) { void lora_enqueuedata(MessageBuffer_t *message) {
// enqueue message in LORA send queue // enqueue message in LORA send queue
BaseType_t ret; BaseType_t ret = pdFALSE;
MessageBuffer_t DummyBuffer; MessageBuffer_t DummyBuffer;
sendprio_t prio = message->MessagePrio; sendprio_t prio = message->MessagePrio;
switch (prio) { switch (prio) {
case prio_high: case prio_high:
// clear space in queue if full, then fallthrough to normal // clear some space in queue if full, then fallthrough to prio_normal
if (uxQueueSpacesAvailable(LoraSendQueue) == 0) if (uxQueueSpacesAvailable(LoraSendQueue) == 0) {
xQueueReceive(LoraSendQueue, &DummyBuffer, (TickType_t)0); xQueueReceive(LoraSendQueue, &DummyBuffer, (TickType_t)0);
ESP_LOGW(TAG, "LORA sendqueue purged, data is lost");
}
case prio_normal: case prio_normal:
ret = xQueueSendToFront(LoraSendQueue, (void *)message, (TickType_t)0); ret = xQueueSendToFront(LoraSendQueue, (void *)message, (TickType_t)0);
break; break;
@ -455,7 +462,9 @@ void lora_enqueuedata(MessageBuffer_t *message) {
ret = xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0); ret = xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0);
break; break;
} }
if (ret != pdTRUE) if (ret == pdTRUE)
ESP_LOGD(TAG, "LORA sendqueue data enqueued");
else
ESP_LOGW(TAG, "LORA sendqueue is full"); ESP_LOGW(TAG, "LORA sendqueue is full");
} }

View File

@ -40,7 +40,7 @@ void SendPayload(uint8_t port, sendprio_t prio) {
default: default:
SendBuffer.MessagePort = port; SendBuffer.MessagePort = port;
} }
memcpy(SendBuffer.Message, payload.getBuffer(), payload.getSize()); memcpy(SendBuffer.Message, payload.getBuffer(), SendBuffer.MessageSize);
// enqueue message in device's send queues // enqueue message in device's send queues
#if (HAS_LORA) #if (HAS_LORA)