added priority control for lora and spi sendqueue

This commit is contained in:
Klaus K Wilting 2019-02-03 14:12:21 +01:00
parent cd08335634
commit 06a1775779
12 changed files with 59 additions and 32 deletions

View File

@ -92,13 +92,15 @@ typedef struct {
float gas; // raw gas sensor signal float gas; // raw gas sensor signal
} bmeStatus_t; } bmeStatus_t;
enum sendprio_t { prio_low, prio_normal, prio_high };
// global variables // global variables
extern configData_t cfg; // current device configuration extern configData_t cfg; // current device configuration
extern char display_line6[], display_line7[]; // screen buffers extern char display_line6[], display_line7[]; // screen buffers
extern uint8_t volatile channel; // wifi channel rotation counter extern uint8_t volatile channel; // wifi channel rotation counter
extern uint16_t volatile macs_total, macs_wifi, macs_ble, extern uint16_t volatile macs_total, macs_wifi, macs_ble,
batt_voltage; // display values batt_voltage; // display values
extern hw_timer_t *channelSwitch, *sendCycle, *displaytimer; extern hw_timer_t *sendCycle, *displaytimer;
extern SemaphoreHandle_t I2Caccess; extern SemaphoreHandle_t I2Caccess;
extern std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs; extern std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs;
@ -150,4 +152,8 @@ extern Timezone myTZ;
#include "if482.h" #include "if482.h"
#endif #endif
#ifdef HAS_DCF77
#include "dcf77.h"
#endif
#endif #endif

View File

@ -33,7 +33,7 @@ void os_getDevEui(u1_t *buf);
void showLoraKeys(void); void showLoraKeys(void);
void switch_lora(uint8_t sf, uint8_t tx); void switch_lora(uint8_t sf, uint8_t tx);
void lora_send(osjob_t *job); void lora_send(osjob_t *job);
void lora_enqueuedata(MessageBuffer_t *message); void lora_enqueuedata(MessageBuffer_t *message, sendprio_t prio);
void lora_queuereset(void); void lora_queuereset(void);
void lora_housekeeping(void); void lora_housekeeping(void);
void user_request_network_time_callback(void *pVoidUserUTCTime, void user_request_network_time_callback(void *pVoidUserUTCTime,

View File

@ -5,7 +5,7 @@
#include "lorawan.h" #include "lorawan.h"
#include "cyclic.h" #include "cyclic.h"
void SendPayload(uint8_t port); void SendPayload(uint8_t port, sendprio_t prio);
void sendCounter(void); void sendCounter(void);
void checkSendQueues(void); void checkSendQueues(void);
void flushQueues(); void flushQueues();

View File

@ -28,7 +28,7 @@ licenses. Refer to LICENSE.txt file in repository for more details.
esp_err_t spi_init(); esp_err_t spi_init();
void spi_enqueuedata(MessageBuffer_t *message); void spi_enqueuedata(MessageBuffer_t *message, sendprio_t prio);
void spi_queuereset(); void spi_queuereset();
void spi_housekeeping(); void spi_housekeeping();

View File

@ -10,6 +10,6 @@ void readButton() {
ESP_LOGI(TAG, "Button pressed"); ESP_LOGI(TAG, "Button pressed");
payload.reset(); payload.reset();
payload.addButton(0x01); payload.addButton(0x01);
SendPayload(BUTTONPORT); SendPayload(BUTTONPORT, prio_normal);
} }
#endif #endif

View File

@ -85,7 +85,7 @@ void doHousekeeping() {
"Memory full, counter cleared (heap low water mark = %d Bytes / " "Memory full, counter cleared (heap low water mark = %d Bytes / "
"free heap = %d bytes)", "free heap = %d bytes)",
ESP.getMinFreeHeap(), ESP.getFreeHeap()); ESP.getMinFreeHeap(), ESP.getFreeHeap());
SendPayload(COUNTERPORT); // send data before clearing counters SendPayload(COUNTERPORT, prio_high); // send data before clearing counters
reset_counters(); // clear macs container and reset all counters reset_counters(); // clear macs container and reset all counters
get_salt(); // get new salt for salting hashes get_salt(); // get new salt for salting hashes
@ -97,7 +97,7 @@ void doHousekeeping() {
#ifdef BOARD_HAS_PSRAM #ifdef BOARD_HAS_PSRAM
if (ESP.getMinFreePsram() <= MEM_LOW) { if (ESP.getMinFreePsram() <= MEM_LOW) {
ESP_LOGI(TAG, "PSRAM full, counter cleared"); ESP_LOGI(TAG, "PSRAM full, counter cleared");
SendPayload(COUNTERPORT); // send data before clearing counters SendPayload(COUNTERPORT, prio_high); // send data before clearing counters
reset_counters(); // clear macs container and reset all counters reset_counters(); // clear macs container and reset all counters
get_salt(); // get new salt for salting hashes get_salt(); // get new salt for salting hashes

View File

@ -358,6 +358,7 @@ esp_err_t lora_stack_init() {
#ifndef HAS_LORA #ifndef HAS_LORA
return ESP_OK; // continue main program return ESP_OK; // continue main program
#else #else
assert(SEND_QUEUE_SIZE);
LoraSendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t)); LoraSendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t));
if (LoraSendQueue == 0) { if (LoraSendQueue == 0) {
ESP_LOGE(TAG, "Could not create LORA send queue. Aborting."); ESP_LOGE(TAG, "Could not create LORA send queue. Aborting.");
@ -397,11 +398,20 @@ esp_err_t lora_stack_init() {
#endif #endif
} }
void lora_enqueuedata(MessageBuffer_t *message) { void lora_enqueuedata(MessageBuffer_t *message, sendprio_t prio) {
// enqueue message in LORA send queue // enqueue message in LORA send queue
#ifdef HAS_LORA #ifdef HAS_LORA
BaseType_t ret = BaseType_t ret;
xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0); switch (prio) {
case prio_high:
ret = xQueueSendToFront(LoraSendQueue, (void *)message, (TickType_t)0);
break;
case prio_low:
case prio_normal:
default:
ret = xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0);
break;
}
if (ret == pdTRUE) { if (ret == pdTRUE) {
ESP_LOGI(TAG, "%d bytes enqueued for LORA interface", message->MessageSize); ESP_LOGI(TAG, "%d bytes enqueued for LORA interface", message->MessageSize);
} else { } else {

View File

@ -107,7 +107,7 @@ bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) {
#endif #endif
payload.reset(); payload.reset();
payload.addAlarm(rssi, beaconID); payload.addAlarm(rssi, beaconID);
SendPayload(BEACONPORT); SendPayload(BEACONPORT, prio_high);
} }
}; };

View File

@ -47,7 +47,7 @@
#define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit #define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit
#define LORASFDEFAULT 9 // 7 ... 12 SF, according to LoRaWAN specs #define LORASFDEFAULT 9 // 7 ... 12 SF, according to LoRaWAN specs
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy #define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
#define SEND_QUEUE_SIZE 10 // maximum number of messages in payload send queue #define SEND_QUEUE_SIZE 10 // maximum number of messages in payload send queue [1 = no queue]
// Ports on which the device sends and listenes on LoRaWAN and SPI // Ports on which the device sends and listenes on LoRaWAN and SPI
#define COUNTERPORT 1 // Port on which device sends counts #define COUNTERPORT 1 // Port on which device sends counts

View File

@ -233,7 +233,7 @@ 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);
SendPayload(CONFIGPORT); SendPayload(CONFIGPORT, prio_high);
}; };
void get_status(uint8_t val[]) { void get_status(uint8_t val[]) {
@ -247,7 +247,7 @@ void get_status(uint8_t val[]) {
payload.addStatus(voltage, uptime() / 1000, temperatureRead(), payload.addStatus(voltage, uptime() / 1000, temperatureRead(),
getFreeRAM(), rtc_get_reset_reason(0), getFreeRAM(), rtc_get_reset_reason(0),
rtc_get_reset_reason(1)); rtc_get_reset_reason(1));
SendPayload(STATUSPORT); SendPayload(STATUSPORT, prio_high);
}; };
void get_gps(uint8_t val[]) { void get_gps(uint8_t val[]) {
@ -256,7 +256,7 @@ void get_gps(uint8_t val[]) {
gps_read(); gps_read();
payload.reset(); payload.reset();
payload.addGPS(gps_status); payload.addGPS(gps_status);
SendPayload(GPSPORT); SendPayload(GPSPORT, prio_high);
#else #else
ESP_LOGW(TAG, "GPS function not supported"); ESP_LOGW(TAG, "GPS function not supported");
#endif #endif
@ -267,7 +267,7 @@ void get_bme(uint8_t val[]) {
#ifdef HAS_BME #ifdef HAS_BME
payload.reset(); payload.reset();
payload.addBME(bme_status); payload.addBME(bme_status);
SendPayload(BMEPORT); SendPayload(BMEPORT, prio_high);
#else #else
ESP_LOGW(TAG, "BME680 sensor not supported"); ESP_LOGW(TAG, "BME680 sensor not supported");
#endif #endif

View File

@ -2,7 +2,7 @@
#include "senddata.h" #include "senddata.h"
// put data to send in RTos Queues used for transmit over channels Lora and SPI // put data to send in RTos Queues used for transmit over channels Lora and SPI
void SendPayload(uint8_t port) { void SendPayload(uint8_t port, sendprio_t prio) {
MessageBuffer_t SendBuffer; // contains MessageSize, MessagePort, Message[] MessageBuffer_t SendBuffer; // contains MessageSize, MessagePort, Message[]
@ -24,8 +24,8 @@ void SendPayload(uint8_t port) {
memcpy(SendBuffer.Message, payload.getBuffer(), payload.getSize()); memcpy(SendBuffer.Message, payload.getBuffer(), payload.getSize());
// enqueue message in device's send queues // enqueue message in device's send queues
lora_enqueuedata(&SendBuffer); lora_enqueuedata(&SendBuffer, prio);
spi_enqueuedata(&SendBuffer); spi_enqueuedata(&SendBuffer, prio);
} // SendPayload } // SendPayload
@ -55,7 +55,7 @@ void sendCounter() {
} }
#endif #endif
SendPayload(COUNTERPORT); SendPayload(COUNTERPORT, prio_normal);
// clear counter if not in cumulative counter mode // clear counter if not in cumulative counter mode
if (cfg.countermode != 1) { if (cfg.countermode != 1) {
reset_counters(); // clear macs container and reset all counters reset_counters(); // clear macs container and reset all counters
@ -68,7 +68,7 @@ void sendCounter() {
case MEMS_DATA: case MEMS_DATA:
payload.reset(); payload.reset();
payload.addBME(bme_status); payload.addBME(bme_status);
SendPayload(BMEPORT); SendPayload(BMEPORT, prio_normal);
break; break;
#endif #endif
@ -79,7 +79,7 @@ void sendCounter() {
gps_read(); gps_read();
payload.reset(); payload.reset();
payload.addGPS(gps_status); payload.addGPS(gps_status);
SendPayload(GPSPORT); SendPayload(GPSPORT, prio_high);
} else } else
ESP_LOGD(TAG, "No valid GPS position"); ESP_LOGD(TAG, "No valid GPS position");
break; break;
@ -89,17 +89,17 @@ void sendCounter() {
case SENSOR1_DATA: case SENSOR1_DATA:
payload.reset(); payload.reset();
payload.addSensor(sensor_read(1)); payload.addSensor(sensor_read(1));
SendPayload(SENSOR1PORT); SendPayload(SENSOR1PORT, prio_normal);
break; break;
case SENSOR2_DATA: case SENSOR2_DATA:
payload.reset(); payload.reset();
payload.addSensor(sensor_read(2)); payload.addSensor(sensor_read(2));
SendPayload(SENSOR2PORT); SendPayload(SENSOR2PORT, prio_normal);
break; break;
case SENSOR3_DATA: case SENSOR3_DATA:
payload.reset(); payload.reset();
payload.addSensor(sensor_read(3)); payload.addSensor(sensor_read(3));
SendPayload(SENSOR3PORT); SendPayload(SENSOR3PORT, prio_normal);
break; break;
#endif #endif
@ -107,7 +107,7 @@ void sendCounter() {
case BATT_DATA: case BATT_DATA:
payload.reset(); payload.reset();
payload.addVoltage(read_voltage()); payload.addVoltage(read_voltage());
SendPayload(BATTPORT); SendPayload(BATTPORT, prio_normal);
break; break;
#endif #endif

View File

@ -66,7 +66,8 @@ void spi_slave_task(void *param) {
uint8_t *messageSize = txbuf + 3; uint8_t *messageSize = txbuf + 3;
*messageSize = msg.MessageSize; *messageSize = msg.MessageSize;
memcpy(txbuf + HEADER_SIZE, &msg.Message, msg.MessageSize); memcpy(txbuf + HEADER_SIZE, &msg.Message, msg.MessageSize);
// calculate crc16 checksum over txbuf and insert checksum at pos 0+1 of txbuf // calculate crc16 checksum over txbuf and insert checksum at pos 0+1 of
// txbuf
uint16_t *crc = (uint16_t *)txbuf; uint16_t *crc = (uint16_t *)txbuf;
*crc = crc16_be(0, messageType, msg.MessageSize + HEADER_SIZE - 2); *crc = crc16_be(0, messageType, msg.MessageSize + HEADER_SIZE - 2);
@ -87,7 +88,8 @@ void spi_slave_task(void *param) {
// wait until spi master clocks out the data, and read results in rx buffer // wait until spi master clocks out the data, and read results in rx buffer
ESP_LOGI(TAG, "Prepared SPI transaction for %zu byte(s)", transaction_size); ESP_LOGI(TAG, "Prepared SPI transaction for %zu byte(s)", transaction_size);
ESP_LOG_BUFFER_HEXDUMP(TAG, txbuf, transaction_size, ESP_LOG_DEBUG); ESP_LOG_BUFFER_HEXDUMP(TAG, txbuf, transaction_size, ESP_LOG_DEBUG);
ESP_ERROR_CHECK_WITHOUT_ABORT(spi_slave_transmit(HSPI_HOST, &spi_transaction, portMAX_DELAY)); ESP_ERROR_CHECK_WITHOUT_ABORT(
spi_slave_transmit(HSPI_HOST, &spi_transaction, portMAX_DELAY));
ESP_LOG_BUFFER_HEXDUMP(TAG, rxbuf, transaction_size, ESP_LOG_DEBUG); ESP_LOG_BUFFER_HEXDUMP(TAG, rxbuf, transaction_size, ESP_LOG_DEBUG);
ESP_LOGI(TAG, "Transaction finished with size %zu bits", ESP_LOGI(TAG, "Transaction finished with size %zu bits",
spi_transaction.trans_len); spi_transaction.trans_len);
@ -103,7 +105,7 @@ esp_err_t spi_init() {
#ifndef HAS_SPI #ifndef HAS_SPI
return ESP_OK; return ESP_OK;
#else #else
assert(SEND_QUEUE_SIZE);
SPISendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t)); SPISendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t));
if (SPISendQueue == 0) { if (SPISendQueue == 0) {
ESP_LOGE(TAG, "Could not create SPI send queue. Aborting."); ESP_LOGE(TAG, "Could not create SPI send queue. Aborting.");
@ -148,11 +150,20 @@ esp_err_t spi_init() {
#endif #endif
} }
void spi_enqueuedata(MessageBuffer_t *message) { void spi_enqueuedata(MessageBuffer_t *message, sendprio_t prio) {
// enqueue message in SPI send queue // enqueue message in SPI send queue
#ifdef HAS_SPI #ifdef HAS_SPI
BaseType_t ret = BaseType_t ret;
xQueueSendToBack(SPISendQueue, (void *)message, (TickType_t)0); switch (prio) {
case prio_high:
ret = xQueueSendToFront(SPISendQueue, (void *)message, (TickType_t)0);
break;
case prio_low:
case prio_normal:
default:
ret = xQueueSendToBack(SPISendQueue, (void *)message, (TickType_t)0);
break;
}
if (ret == pdTRUE) { if (ret == pdTRUE) {
ESP_LOGI(TAG, "%d byte(s) enqueued for SPI interface", ESP_LOGI(TAG, "%d byte(s) enqueued for SPI interface",
message->MessageSize); message->MessageSize);