added priority control for lora and spi sendqueue
This commit is contained in:
parent
cd08335634
commit
06a1775779
@ -92,13 +92,15 @@ typedef struct {
|
||||
float gas; // raw gas sensor signal
|
||||
} bmeStatus_t;
|
||||
|
||||
enum sendprio_t { prio_low, prio_normal, prio_high };
|
||||
|
||||
// global variables
|
||||
extern configData_t cfg; // current device configuration
|
||||
extern char display_line6[], display_line7[]; // screen buffers
|
||||
extern uint8_t volatile channel; // wifi channel rotation counter
|
||||
extern uint16_t volatile macs_total, macs_wifi, macs_ble,
|
||||
batt_voltage; // display values
|
||||
extern hw_timer_t *channelSwitch, *sendCycle, *displaytimer;
|
||||
extern hw_timer_t *sendCycle, *displaytimer;
|
||||
extern SemaphoreHandle_t I2Caccess;
|
||||
|
||||
extern std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs;
|
||||
@ -150,4 +152,8 @@ extern Timezone myTZ;
|
||||
#include "if482.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAS_DCF77
|
||||
#include "dcf77.h"
|
||||
#endif
|
||||
|
||||
#endif
|
@ -33,7 +33,7 @@ void os_getDevEui(u1_t *buf);
|
||||
void showLoraKeys(void);
|
||||
void switch_lora(uint8_t sf, uint8_t tx);
|
||||
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_housekeeping(void);
|
||||
void user_request_network_time_callback(void *pVoidUserUTCTime,
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include "lorawan.h"
|
||||
#include "cyclic.h"
|
||||
|
||||
void SendPayload(uint8_t port);
|
||||
void SendPayload(uint8_t port, sendprio_t prio);
|
||||
void sendCounter(void);
|
||||
void checkSendQueues(void);
|
||||
void flushQueues();
|
||||
|
@ -28,7 +28,7 @@ licenses. Refer to LICENSE.txt file in repository for more details.
|
||||
|
||||
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_housekeeping();
|
||||
|
@ -10,6 +10,6 @@ void readButton() {
|
||||
ESP_LOGI(TAG, "Button pressed");
|
||||
payload.reset();
|
||||
payload.addButton(0x01);
|
||||
SendPayload(BUTTONPORT);
|
||||
SendPayload(BUTTONPORT, prio_normal);
|
||||
}
|
||||
#endif
|
@ -85,7 +85,7 @@ void doHousekeeping() {
|
||||
"Memory full, counter cleared (heap low water mark = %d Bytes / "
|
||||
"free heap = %d bytes)",
|
||||
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
|
||||
get_salt(); // get new salt for salting hashes
|
||||
|
||||
@ -97,7 +97,7 @@ void doHousekeeping() {
|
||||
#ifdef BOARD_HAS_PSRAM
|
||||
if (ESP.getMinFreePsram() <= MEM_LOW) {
|
||||
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
|
||||
get_salt(); // get new salt for salting hashes
|
||||
|
||||
|
@ -358,6 +358,7 @@ esp_err_t lora_stack_init() {
|
||||
#ifndef HAS_LORA
|
||||
return ESP_OK; // continue main program
|
||||
#else
|
||||
assert(SEND_QUEUE_SIZE);
|
||||
LoraSendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t));
|
||||
if (LoraSendQueue == 0) {
|
||||
ESP_LOGE(TAG, "Could not create LORA send queue. Aborting.");
|
||||
@ -397,11 +398,20 @@ esp_err_t lora_stack_init() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void lora_enqueuedata(MessageBuffer_t *message) {
|
||||
void lora_enqueuedata(MessageBuffer_t *message, sendprio_t prio) {
|
||||
// enqueue message in LORA send queue
|
||||
#ifdef HAS_LORA
|
||||
BaseType_t ret =
|
||||
xQueueSendToBack(LoraSendQueue, (void *)message, (TickType_t)0);
|
||||
BaseType_t ret;
|
||||
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) {
|
||||
ESP_LOGI(TAG, "%d bytes enqueued for LORA interface", message->MessageSize);
|
||||
} else {
|
||||
|
@ -107,7 +107,7 @@ bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) {
|
||||
#endif
|
||||
payload.reset();
|
||||
payload.addAlarm(rssi, beaconID);
|
||||
SendPayload(BEACONPORT);
|
||||
SendPayload(BEACONPORT, prio_high);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
||||
#define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit
|
||||
#define LORASFDEFAULT 9 // 7 ... 12 SF, according to LoRaWAN specs
|
||||
#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
|
||||
#define COUNTERPORT 1 // Port on which device sends counts
|
||||
|
@ -233,7 +233,7 @@ void get_config(uint8_t val[]) {
|
||||
ESP_LOGI(TAG, "Remote command: get device configuration");
|
||||
payload.reset();
|
||||
payload.addConfig(cfg);
|
||||
SendPayload(CONFIGPORT);
|
||||
SendPayload(CONFIGPORT, prio_high);
|
||||
};
|
||||
|
||||
void get_status(uint8_t val[]) {
|
||||
@ -247,7 +247,7 @@ void get_status(uint8_t val[]) {
|
||||
payload.addStatus(voltage, uptime() / 1000, temperatureRead(),
|
||||
getFreeRAM(), rtc_get_reset_reason(0),
|
||||
rtc_get_reset_reason(1));
|
||||
SendPayload(STATUSPORT);
|
||||
SendPayload(STATUSPORT, prio_high);
|
||||
};
|
||||
|
||||
void get_gps(uint8_t val[]) {
|
||||
@ -256,7 +256,7 @@ void get_gps(uint8_t val[]) {
|
||||
gps_read();
|
||||
payload.reset();
|
||||
payload.addGPS(gps_status);
|
||||
SendPayload(GPSPORT);
|
||||
SendPayload(GPSPORT, prio_high);
|
||||
#else
|
||||
ESP_LOGW(TAG, "GPS function not supported");
|
||||
#endif
|
||||
@ -267,7 +267,7 @@ void get_bme(uint8_t val[]) {
|
||||
#ifdef HAS_BME
|
||||
payload.reset();
|
||||
payload.addBME(bme_status);
|
||||
SendPayload(BMEPORT);
|
||||
SendPayload(BMEPORT, prio_high);
|
||||
#else
|
||||
ESP_LOGW(TAG, "BME680 sensor not supported");
|
||||
#endif
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include "senddata.h"
|
||||
|
||||
// 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[]
|
||||
|
||||
@ -24,8 +24,8 @@ void SendPayload(uint8_t port) {
|
||||
memcpy(SendBuffer.Message, payload.getBuffer(), payload.getSize());
|
||||
|
||||
// enqueue message in device's send queues
|
||||
lora_enqueuedata(&SendBuffer);
|
||||
spi_enqueuedata(&SendBuffer);
|
||||
lora_enqueuedata(&SendBuffer, prio);
|
||||
spi_enqueuedata(&SendBuffer, prio);
|
||||
|
||||
} // SendPayload
|
||||
|
||||
@ -55,7 +55,7 @@ void sendCounter() {
|
||||
}
|
||||
#endif
|
||||
|
||||
SendPayload(COUNTERPORT);
|
||||
SendPayload(COUNTERPORT, prio_normal);
|
||||
// clear counter if not in cumulative counter mode
|
||||
if (cfg.countermode != 1) {
|
||||
reset_counters(); // clear macs container and reset all counters
|
||||
@ -68,7 +68,7 @@ void sendCounter() {
|
||||
case MEMS_DATA:
|
||||
payload.reset();
|
||||
payload.addBME(bme_status);
|
||||
SendPayload(BMEPORT);
|
||||
SendPayload(BMEPORT, prio_normal);
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -79,7 +79,7 @@ void sendCounter() {
|
||||
gps_read();
|
||||
payload.reset();
|
||||
payload.addGPS(gps_status);
|
||||
SendPayload(GPSPORT);
|
||||
SendPayload(GPSPORT, prio_high);
|
||||
} else
|
||||
ESP_LOGD(TAG, "No valid GPS position");
|
||||
break;
|
||||
@ -89,17 +89,17 @@ void sendCounter() {
|
||||
case SENSOR1_DATA:
|
||||
payload.reset();
|
||||
payload.addSensor(sensor_read(1));
|
||||
SendPayload(SENSOR1PORT);
|
||||
SendPayload(SENSOR1PORT, prio_normal);
|
||||
break;
|
||||
case SENSOR2_DATA:
|
||||
payload.reset();
|
||||
payload.addSensor(sensor_read(2));
|
||||
SendPayload(SENSOR2PORT);
|
||||
SendPayload(SENSOR2PORT, prio_normal);
|
||||
break;
|
||||
case SENSOR3_DATA:
|
||||
payload.reset();
|
||||
payload.addSensor(sensor_read(3));
|
||||
SendPayload(SENSOR3PORT);
|
||||
SendPayload(SENSOR3PORT, prio_normal);
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -107,7 +107,7 @@ void sendCounter() {
|
||||
case BATT_DATA:
|
||||
payload.reset();
|
||||
payload.addVoltage(read_voltage());
|
||||
SendPayload(BATTPORT);
|
||||
SendPayload(BATTPORT, prio_normal);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
@ -66,7 +66,8 @@ void spi_slave_task(void *param) {
|
||||
uint8_t *messageSize = txbuf + 3;
|
||||
*messageSize = 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;
|
||||
*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
|
||||
ESP_LOGI(TAG, "Prepared SPI transaction for %zu byte(s)", transaction_size);
|
||||
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_LOGI(TAG, "Transaction finished with size %zu bits",
|
||||
spi_transaction.trans_len);
|
||||
@ -103,7 +105,7 @@ esp_err_t spi_init() {
|
||||
#ifndef HAS_SPI
|
||||
return ESP_OK;
|
||||
#else
|
||||
|
||||
assert(SEND_QUEUE_SIZE);
|
||||
SPISendQueue = xQueueCreate(SEND_QUEUE_SIZE, sizeof(MessageBuffer_t));
|
||||
if (SPISendQueue == 0) {
|
||||
ESP_LOGE(TAG, "Could not create SPI send queue. Aborting.");
|
||||
@ -148,11 +150,20 @@ esp_err_t spi_init() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void spi_enqueuedata(MessageBuffer_t *message) {
|
||||
void spi_enqueuedata(MessageBuffer_t *message, sendprio_t prio) {
|
||||
// enqueue message in SPI send queue
|
||||
#ifdef HAS_SPI
|
||||
BaseType_t ret =
|
||||
xQueueSendToBack(SPISendQueue, (void *)message, (TickType_t)0);
|
||||
BaseType_t ret;
|
||||
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) {
|
||||
ESP_LOGI(TAG, "%d byte(s) enqueued for SPI interface",
|
||||
message->MessageSize);
|
||||
|
Loading…
Reference in New Issue
Block a user