rcommand flush send queue added
This commit is contained in:
parent
0a52b16c78
commit
95983bd3fc
@ -277,6 +277,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
|
|||||||
0 = restart device
|
0 = restart device
|
||||||
1 = reset MAC counter to zero
|
1 = reset MAC counter to zero
|
||||||
2 = reset device to factory settings
|
2 = reset device to factory settings
|
||||||
|
3 = flush send queues
|
||||||
|
|
||||||
0x0A set LoRaWAN payload send cycle
|
0x0A set LoRaWAN payload send cycle
|
||||||
|
|
||||||
|
@ -228,4 +228,51 @@ void lorawan_loop(void *pvParameters) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// helper function to assign LoRa datarates to numeric spreadfactor values
|
||||||
|
void switch_lora(uint8_t sf, uint8_t tx) {
|
||||||
|
if (tx > 20)
|
||||||
|
return;
|
||||||
|
cfg.txpower = tx;
|
||||||
|
switch (sf) {
|
||||||
|
case 7:
|
||||||
|
LMIC_setDrTxpow(DR_SF7, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
LMIC_setDrTxpow(DR_SF8, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
LMIC_setDrTxpow(DR_SF9, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
LMIC_setDrTxpow(DR_SF10, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
#if defined(CFG_eu868)
|
||||||
|
LMIC_setDrTxpow(DR_SF11, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
#elif defined(CFG_us915)
|
||||||
|
LMIC_setDrTxpow(DR_SF11CR, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 12:
|
||||||
|
#if defined(CFG_eu868)
|
||||||
|
LMIC_setDrTxpow(DR_SF12, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
#elif defined(CFG_us915)
|
||||||
|
LMIC_setDrTxpow(DR_SF12CR, tx);
|
||||||
|
cfg.lorasf = sf;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // HAS_LORA
|
#endif // HAS_LORA
|
@ -15,5 +15,6 @@ void os_getArtEui(u1_t *buf);
|
|||||||
void os_getDevEui(u1_t *buf);
|
void os_getDevEui(u1_t *buf);
|
||||||
void showLoraKeys(void);
|
void showLoraKeys(void);
|
||||||
void lorawan_loop(void *pvParameters);
|
void lorawan_loop(void *pvParameters);
|
||||||
|
void switch_lora(uint8_t sf, uint8_t tx);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -8,55 +8,6 @@
|
|||||||
// Local logging tag
|
// Local logging tag
|
||||||
static const char TAG[] = "main";
|
static const char TAG[] = "main";
|
||||||
|
|
||||||
#ifdef HAS_LORA
|
|
||||||
// helper function to assign LoRa datarates to numeric spreadfactor values
|
|
||||||
void switch_lora(uint8_t sf, uint8_t tx) {
|
|
||||||
if (tx > 20)
|
|
||||||
return;
|
|
||||||
cfg.txpower = tx;
|
|
||||||
switch (sf) {
|
|
||||||
case 7:
|
|
||||||
LMIC_setDrTxpow(DR_SF7, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
LMIC_setDrTxpow(DR_SF8, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
LMIC_setDrTxpow(DR_SF9, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
LMIC_setDrTxpow(DR_SF10, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
#if defined(CFG_eu868)
|
|
||||||
LMIC_setDrTxpow(DR_SF11, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
#elif defined(CFG_us915)
|
|
||||||
LMIC_setDrTxpow(DR_SF11CR, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 12:
|
|
||||||
#if defined(CFG_eu868)
|
|
||||||
LMIC_setDrTxpow(DR_SF12, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
#elif defined(CFG_us915)
|
|
||||||
LMIC_setDrTxpow(DR_SF12CR, tx);
|
|
||||||
cfg.lorasf = sf;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // HAS_LORA
|
|
||||||
|
|
||||||
// set of functions that can be triggered by remote commands
|
// set of functions that can be triggered by remote commands
|
||||||
void set_reset(uint8_t val[]) {
|
void set_reset(uint8_t val[]) {
|
||||||
switch (val[0]) {
|
switch (val[0]) {
|
||||||
@ -78,6 +29,11 @@ void set_reset(uint8_t val[]) {
|
|||||||
sprintf(display_line6, "Factory reset");
|
sprintf(display_line6, "Factory reset");
|
||||||
eraseConfig();
|
eraseConfig();
|
||||||
break;
|
break;
|
||||||
|
case 3: // reset send queues
|
||||||
|
ESP_LOGI(TAG, "Remote command: flush send queue");
|
||||||
|
sprintf(display_line6, "Flush queues");
|
||||||
|
flushQueues();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ESP_LOGW(TAG, "Remote command: reset called with invalid parameter(s)");
|
ESP_LOGW(TAG, "Remote command: reset called with invalid parameter(s)");
|
||||||
}
|
}
|
||||||
@ -304,7 +260,8 @@ void get_status(uint8_t val[]) {
|
|||||||
uint16_t voltage = 0;
|
uint16_t voltage = 0;
|
||||||
#endif
|
#endif
|
||||||
payload.reset();
|
payload.reset();
|
||||||
payload.addStatus(voltage, uptime() / 1000, temperatureRead(), ESP.getFreeHeap());
|
payload.addStatus(voltage, uptime() / 1000, temperatureRead(),
|
||||||
|
ESP.getFreeHeap());
|
||||||
SendData(STATUSPORT);
|
SendData(STATUSPORT);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
124
src/senddata.cpp
124
src/senddata.cpp
@ -102,127 +102,11 @@ void processSendBuffer() {
|
|||||||
|
|
||||||
} // processSendBuffer
|
} // processSendBuffer
|
||||||
|
|
||||||
/* old version with pointers
|
void flushQueues() {
|
||||||
|
|
||||||
// Basic Config
|
|
||||||
#include "globals.h"
|
|
||||||
|
|
||||||
// put data to send in RTos Queues used for transmit over channels Lora and SPI
|
|
||||||
void SendData(uint8_t port, uint8_t data[], uint8_t size) {
|
|
||||||
|
|
||||||
MessageBuffer_t *xMsg = &SendBuffer;
|
|
||||||
|
|
||||||
SendBuffer.MessageSize = size;
|
|
||||||
SendBuffer.MessagePort = PAYLOAD_ENCODER <= 2
|
|
||||||
? port
|
|
||||||
: (PAYLOAD_ENCODER == 4 ? LPP2PORT : LPP1PORT);
|
|
||||||
memcpy(SendBuffer.Message, data, size);
|
|
||||||
|
|
||||||
// enqueue message in LoRa send queue
|
|
||||||
#ifdef HAS_LORA
|
#ifdef HAS_LORA
|
||||||
if (uxQueueSpacesAvailable(LoraSendQueue)) {
|
xQueueReset(LoraSendQueue);
|
||||||
xQueueSend(LoraSendQueue, (void *)&xMsg, (TickType_t)0);
|
|
||||||
ESP_LOGI(TAG, "%d bytes enqueued to send on LoRa", size);
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// enqueue message in SPI send queue
|
|
||||||
#ifdef HAS_SPI
|
#ifdef HAS_SPI
|
||||||
if (uxQueueSpacesAvailable(SPISendQueue)) {
|
xQueueReset(SPISendQueue);
|
||||||
xQueueSend(SPISendQueue, (void *)&xMsg, (TickType_t)0);
|
|
||||||
ESP_LOGI(TAG, "%d bytes enqueued to send on SPI", size);
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
// clear counter if not in cumulative counter mode
|
|
||||||
if ((port == COUNTERPORT) && (cfg.countermode != 1)) {
|
|
||||||
reset_counters(); // clear macs container and reset all counters
|
|
||||||
reset_salt(); // get new salt for salting hashes
|
|
||||||
ESP_LOGI(TAG, "Counter cleared");
|
|
||||||
}
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "%d Bytes left", ESP.getFreeHeap());
|
|
||||||
|
|
||||||
} // senddata
|
|
||||||
|
|
||||||
// cyclic called function to prepare payload to send
|
|
||||||
void sendPayload() {
|
|
||||||
if (SendCycleTimerIRQ) {
|
|
||||||
portENTER_CRITICAL(&timerMux);
|
|
||||||
SendCycleTimerIRQ = 0;
|
|
||||||
portEXIT_CRITICAL(&timerMux);
|
|
||||||
|
|
||||||
// append counter data to payload
|
|
||||||
payload.reset();
|
|
||||||
payload.addCount(macs_wifi, cfg.blescan ? macs_ble : 0);
|
|
||||||
// append GPS data, if present
|
|
||||||
|
|
||||||
#ifdef HAS_GPS
|
|
||||||
// show NMEA data in debug mode, useful for debugging GPS on board
|
|
||||||
// connection
|
|
||||||
ESP_LOGD(TAG, "GPS NMEA data: passed %d / failed: %d / with fix: %d",
|
|
||||||
gps.passedChecksum(), gps.failedChecksum(),
|
|
||||||
gps.sentencesWithFix());
|
|
||||||
// log GPS position if we have a fix and gps data mode is enabled
|
|
||||||
if ((cfg.gpsmode) && (gps.location.isValid())) {
|
|
||||||
gps_read();
|
|
||||||
payload.addGPS(gps_status);
|
|
||||||
ESP_LOGD(TAG, "lat=%.6f | lon=%.6f | %u Sats | HDOP=%.1f | Altitude=%um",
|
|
||||||
gps_status.latitude / (float)1e6,
|
|
||||||
gps_status.longitude / (float)1e6, gps_status.satellites,
|
|
||||||
gps_status.hdop / (float)100, gps_status.altitude);
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "No valid GPS position or GPS data mode disabled");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
SendData(COUNTERPORT, payload.getBuffer(), payload.getSize());
|
|
||||||
}
|
|
||||||
} // sendpayload()
|
|
||||||
|
|
||||||
// interrupt handler used for payload send cycle timer
|
|
||||||
void IRAM_ATTR SendCycleIRQ() {
|
|
||||||
portENTER_CRITICAL(&timerMux);
|
|
||||||
SendCycleTimerIRQ++;
|
|
||||||
portEXIT_CRITICAL(&timerMux);
|
|
||||||
}
|
|
||||||
|
|
||||||
// cyclic called function to eat data from RTos send queues and transmit it
|
|
||||||
void processSendBuffer() {
|
|
||||||
|
|
||||||
MessageBuffer_t *xMsg;
|
|
||||||
|
|
||||||
#ifdef HAS_LORA
|
|
||||||
// Check if there is a pending TX/RX job running
|
|
||||||
if ((LMIC.opmode & (OP_JOINING | OP_REJOIN | OP_TXDATA | OP_POLL)) != 0) {
|
|
||||||
// LoRa Busy -> don't eat data from queue, since it cannot be sent
|
|
||||||
} else {
|
|
||||||
if (uxQueueMessagesWaiting(LoraSendQueue)) // check if msg are waiting on
|
|
||||||
queue if (xQueueReceive(LoraSendQueue, &xMsg, (TickType_t)10)) {
|
|
||||||
// xMsg now holds the struct MessageBuffer from queue
|
|
||||||
LMIC_setTxData2(xMsg->MessagePort, xMsg->Message, xMsg->MessageSize,
|
|
||||||
(cfg.countermode & 0x02));
|
|
||||||
ESP_LOGI(TAG, "%d bytes sent to LORA", xMsg->MessageSize);
|
|
||||||
sprintf(display_line7, "PACKET QUEUED");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAS_SPI
|
|
||||||
if (uxQueueMessagesWaiting(SPISendQueue)) // check if msg are waiting on queue
|
|
||||||
if (xQueueReceive(SPISendQueue, &xMsg, (TickType_t)10)) {
|
|
||||||
|
|
||||||
// to come here: send data over SPI
|
|
||||||
// use these pointers to the payload:
|
|
||||||
// xMsg->MessagePort
|
|
||||||
// xMsg->MessageSize
|
|
||||||
// xMsg->Message
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "%d bytes sent to SPI", xMsg->MessageSize);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "%d Bytes left", ESP.getFreeHeap());
|
|
||||||
|
|
||||||
} // processSendBuffer
|
|
||||||
|
|
||||||
*/
|
|
@ -12,5 +12,6 @@ void SendData(uint8_t port);
|
|||||||
void sendPayload(void);
|
void sendPayload(void);
|
||||||
void SendCycleIRQ(void);
|
void SendCycleIRQ(void);
|
||||||
void processSendBuffer(void);
|
void processSendBuffer(void);
|
||||||
|
void flushQueues();
|
||||||
|
|
||||||
#endif // _SENDDATA_H_
|
#endif // _SENDDATA_H_
|
Loading…
Reference in New Issue
Block a user