master
Mark Qvist 2 months ago
parent 5ec063c939
commit 7ce2ed6155
  1. 8
      Config.h
  2. 69
      RNode_Firmware.ino

@ -96,13 +96,7 @@
long cw_wait_passed = 0; long cw_wait_passed = 0;
int csma_cw = -1; int csma_cw = -1;
//////////////////////////////////////// // LoRa settings
float csma_p_min = 0.15;
float csma_p_max = 0.333;
float csma_b_speed = 0.15;
uint8_t csma_p = 85;
////////////////////////////////////////
int lora_sf = 0; int lora_sf = 0;
int lora_cr = 5; int lora_cr = 5;
int lora_txp = 0xFF; int lora_txp = 0xFF;

@ -519,9 +519,7 @@ void update_radio_lock() {
} }
} }
bool queueFull() { bool queue_full() { return (queue_height >= CONFIG_QUEUE_MAX_LENGTH || queued_bytes >= CONFIG_QUEUE_SIZE); }
return (queue_height >= CONFIG_QUEUE_MAX_LENGTH || queued_bytes >= CONFIG_QUEUE_SIZE);
}
volatile bool queue_flushing = false; volatile bool queue_flushing = false;
void flush_queue(void) { void flush_queue(void) {
@ -561,10 +559,13 @@ void flush_queue(void) {
queue_height = 0; queue_height = 0;
queued_bytes = 0; queued_bytes = 0;
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
update_airtime(); update_airtime();
#endif #endif
queue_flushing = false; queue_flushing = false;
#if HAS_DISPLAY #if HAS_DISPLAY
display_tx = true; display_tx = true;
#endif #endif
@ -614,24 +615,20 @@ void update_airtime() {
uint16_t cb = current_airtime_bin(); uint16_t cb = current_airtime_bin();
uint16_t pb = cb-1; if (cb-1 < 0) { pb = AIRTIME_BINS-1; } uint16_t pb = cb-1; if (cb-1 < 0) { pb = AIRTIME_BINS-1; }
uint16_t nb = cb+1; if (nb == AIRTIME_BINS) { nb = 0; } uint16_t nb = cb+1; if (nb == AIRTIME_BINS) { nb = 0; }
airtime_bins[nb] = 0; airtime_bins[nb] = 0; airtime = (float)(airtime_bins[cb]+airtime_bins[pb])/(2.0*AIRTIME_BINLEN_MS);
airtime = (float)(airtime_bins[cb]+airtime_bins[pb])/(2.0*AIRTIME_BINLEN_MS);
uint32_t longterm_airtime_sum = 0; uint32_t longterm_airtime_sum = 0;
for (uint16_t bin = 0; bin < AIRTIME_BINS; bin++) { for (uint16_t bin = 0; bin < AIRTIME_BINS; bin++) { longterm_airtime_sum += airtime_bins[bin]; }
longterm_airtime_sum += airtime_bins[bin];
}
longterm_airtime = (float)longterm_airtime_sum/(float)AIRTIME_LONGTERM_MS; longterm_airtime = (float)longterm_airtime_sum/(float)AIRTIME_LONGTERM_MS;
float longterm_channel_util_sum = 0.0; float longterm_channel_util_sum = 0.0;
for (uint16_t bin = 0; bin < AIRTIME_BINS; bin++) { for (uint16_t bin = 0; bin < AIRTIME_BINS; bin++) { longterm_channel_util_sum += longterm_bins[bin]; }
longterm_channel_util_sum += longterm_bins[bin];
}
longterm_channel_util = (float)longterm_channel_util_sum/(float)AIRTIME_BINS; longterm_channel_util = (float)longterm_channel_util_sum/(float)AIRTIME_BINS;
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
update_csma_parameters(); update_csma_parameters();
#endif #endif
kiss_indicate_channel_stats(); kiss_indicate_channel_stats();
#endif #endif
} }
@ -641,18 +638,13 @@ void transmit(uint16_t size) {
if (!promisc) { if (!promisc) {
uint16_t written = 0; uint16_t written = 0;
uint8_t header = random(256) & 0xF0; uint8_t header = random(256) & 0xF0;
if (size > SINGLE_MTU - HEADER_L) { header = header | FLAG_SPLIT; }
if (size > SINGLE_MTU - HEADER_L) {
header = header | FLAG_SPLIT;
}
LoRa->beginPacket(); LoRa->beginPacket();
LoRa->write(header); written++; LoRa->write(header); written++;
for (uint16_t i=0; i < size; i++) { for (uint16_t i=0; i < size; i++) {
LoRa->write(tbuf[i]); LoRa->write(tbuf[i]); written++;
written++;
if (written == 255 && isSplitPacket(header)) { if (written == 255 && isSplitPacket(header)) {
if (!LoRa->endPacket()) { if (!LoRa->endPacket()) {
@ -661,6 +653,7 @@ void transmit(uint16_t size) {
led_indicate_error(5); led_indicate_error(5);
hard_reset(); hard_reset();
} }
add_airtime(written); add_airtime(written);
LoRa->beginPacket(); LoRa->beginPacket();
LoRa->write(header); LoRa->write(header);
@ -674,39 +667,19 @@ void transmit(uint16_t size) {
led_indicate_error(5); led_indicate_error(5);
hard_reset(); hard_reset();
} }
add_airtime(written);
} else { add_airtime(written);
// In promiscuous mode, we only send out
// plain raw LoRa packets with a maximum
// payload of 255 bytes
led_tx_on();
uint16_t written = 0;
// Cap packets at 255 bytes
if (size > SINGLE_MTU) {
size = SINGLE_MTU;
}
// If implicit header mode has been set,
// set packet length to payload data length
if (!implicit) {
LoRa->beginPacket();
} else { } else {
LoRa->beginPacket(size); led_tx_on(); uint16_t written = 0;
} if (size > SINGLE_MTU) { size = SINGLE_MTU; }
if (!implicit) { LoRa->beginPacket(); }
for (uint16_t i=0; i < size; i++) { else { LoRa->beginPacket(size); }
LoRa->write(tbuf[i]); for (uint16_t i=0; i < size; i++) { LoRa->write(tbuf[i]); written++; }
written++;
}
LoRa->endPacket(); add_airtime(written); LoRa->endPacket(); add_airtime(written);
} }
} else {
kiss_indicate_error(ERROR_TXFAILED); } else { kiss_indicate_error(ERROR_TXFAILED); led_indicate_error(5); }
led_indicate_error(5);
}
} }
void serialCallback(uint8_t sbyte) { void serialCallback(uint8_t sbyte) {
@ -950,7 +923,7 @@ void serialCallback(uint8_t sbyte) {
} }
kiss_indicate_promisc(); kiss_indicate_promisc();
} else if (command == CMD_READY) { } else if (command == CMD_READY) {
if (!queueFull()) { if (!queue_full()) {
kiss_indicate_ready(); kiss_indicate_ready();
} else { } else {
kiss_indicate_not_ready(); kiss_indicate_not_ready();
@ -1390,7 +1363,7 @@ void validate_status() {
#define _S 12.5 #define _S 12.5
float csma_slope(float u) { return (pow(_e,_S*u-_S/2.0))/(pow(_e,_S*u-_S/2.0)+1.0); } float csma_slope(float u) { return (pow(_e,_S*u-_S/2.0))/(pow(_e,_S*u-_S/2.0)+1.0); }
void update_csma_parameters() { void update_csma_parameters() {
csma_p = (uint8_t)((1.0-(csma_p_min+(csma_p_max-csma_p_min)*csma_slope(airtime+csma_b_speed)))*255.0); // TODO: Implement
} }
#endif #endif

Loading…
Cancel
Save