Added channel load and airtime stats to display
This commit is contained in:
parent
fb113b1782
commit
f4cdd5ea4a
4
Config.h
4
Config.h
@ -19,7 +19,7 @@
|
|||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
#define MAJ_VERS 0x01
|
#define MAJ_VERS 0x01
|
||||||
#define MIN_VERS 0x3F
|
#define MIN_VERS 0x40
|
||||||
|
|
||||||
#define PLATFORM_AVR 0x90
|
#define PLATFORM_AVR 0x90
|
||||||
#define PLATFORM_ESP32 0x80
|
#define PLATFORM_ESP32 0x80
|
||||||
@ -349,9 +349,11 @@
|
|||||||
#define AIRTIME_BINS ((AIRTIME_LONGTERM*1000)/AIRTIME_BINLEN_MS)
|
#define AIRTIME_BINS ((AIRTIME_LONGTERM*1000)/AIRTIME_BINLEN_MS)
|
||||||
bool util_samples[DCD_SAMPLES];
|
bool util_samples[DCD_SAMPLES];
|
||||||
uint16_t airtime_bins[AIRTIME_BINS];
|
uint16_t airtime_bins[AIRTIME_BINS];
|
||||||
|
float longterm_bins[AIRTIME_BINS];
|
||||||
int dcd_sample = 0;
|
int dcd_sample = 0;
|
||||||
float local_channel_util = 0.0;
|
float local_channel_util = 0.0;
|
||||||
float total_channel_util = 0.0;
|
float total_channel_util = 0.0;
|
||||||
|
float longterm_channel_util = 0.0;
|
||||||
float airtime = 0.0;
|
float airtime = 0.0;
|
||||||
float longterm_airtime = 0.0;
|
float longterm_airtime = 0.0;
|
||||||
float us_per_byte = 0.0;
|
float us_per_byte = 0.0;
|
||||||
|
89
Display.h
89
Display.h
@ -17,6 +17,7 @@
|
|||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
#include <Adafruit_SSD1306.h>
|
#include <Adafruit_SSD1306.h>
|
||||||
|
#include "Fonts/Org_01.h"
|
||||||
#define DISP_W 128
|
#define DISP_W 128
|
||||||
#define DISP_H 64
|
#define DISP_H 64
|
||||||
#if BOARD_MODEL == BOARD_RNODE_NG_20 || BOARD_MODEL == BOARD_LORA32_V2_0
|
#if BOARD_MODEL == BOARD_RNODE_NG_20 || BOARD_MODEL == BOARD_LORA32_V2_0
|
||||||
@ -36,6 +37,8 @@
|
|||||||
#define DISP_ADDR 0x3C
|
#define DISP_ADDR 0x3C
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define SMALL_FONT &Org_01
|
||||||
|
|
||||||
Adafruit_SSD1306 display(DISP_W, DISP_H, &Wire, DISP_RST);
|
Adafruit_SSD1306 display(DISP_W, DISP_H, &Wire, DISP_RST);
|
||||||
|
|
||||||
#define DISP_MODE_UNKNOWN 0x00
|
#define DISP_MODE_UNKNOWN 0x00
|
||||||
@ -359,11 +362,45 @@ void draw_disp_area() {
|
|||||||
if (firmware_update_mode) disp_area.drawBitmap(0, p_by, bm_fw_update, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
if (firmware_update_mode) disp_area.drawBitmap(0, p_by, bm_fw_update, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
} else {
|
} else {
|
||||||
if (!disp_ext_fb or bt_ssp_pin != 0) {
|
if (!disp_ext_fb or bt_ssp_pin != 0) {
|
||||||
|
if (radio_online && display_diagnostics) {
|
||||||
|
disp_area.fillRect(0,8,disp_area.width(),37, SSD1306_BLACK);
|
||||||
|
disp_area.setFont(SMALL_FONT);
|
||||||
|
disp_area.setTextColor(SSD1306_WHITE);
|
||||||
|
disp_area.setTextWrap(false);
|
||||||
|
|
||||||
|
disp_area.setCursor(1, 14);
|
||||||
|
disp_area.print("On");
|
||||||
|
disp_area.setCursor(1+12, 14);
|
||||||
|
disp_area.print("@");
|
||||||
|
disp_area.setCursor(1+12+1+6, 14);
|
||||||
|
disp_area.printf("%.1fKbps", (float)lora_bitrate/1000.0);
|
||||||
|
|
||||||
|
disp_area.setCursor(2, 23);
|
||||||
|
disp_area.print("Channel Load");
|
||||||
|
|
||||||
|
disp_area.setCursor(11, 33);
|
||||||
|
if (total_channel_util < 0.099) {
|
||||||
|
disp_area.printf("%.1f%%", total_channel_util*100.0);
|
||||||
|
} else {
|
||||||
|
disp_area.printf("%.0f%%", total_channel_util*100.0);
|
||||||
|
}
|
||||||
|
disp_area.drawBitmap(2, 26, bm_hg_low, 5, 9, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
|
|
||||||
|
disp_area.setCursor(32+11, 33);
|
||||||
|
if (longterm_channel_util < 0.099) {
|
||||||
|
disp_area.printf("%.1f%%", longterm_channel_util*100.0);
|
||||||
|
} else {
|
||||||
|
disp_area.printf("%.0f%%", longterm_channel_util*100.0);
|
||||||
|
}
|
||||||
|
disp_area.drawBitmap(32+2, 26, bm_hg_high, 5, 9, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
|
|
||||||
|
} else {
|
||||||
if (device_signatures_ok()) {
|
if (device_signatures_ok()) {
|
||||||
disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
} else {
|
} else {
|
||||||
disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!hw_ready || radio_error || !device_firmware_ok()) {
|
if (!hw_ready || radio_error || !device_firmware_ok()) {
|
||||||
if (!device_firmware_ok()) {
|
if (!device_firmware_ok()) {
|
||||||
@ -393,30 +430,49 @@ void draw_disp_area() {
|
|||||||
if (not community_fw and disp_page == 0) disp_page = 1;
|
if (not community_fw and disp_page == 0) disp_page = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disp_page == 0) {
|
|
||||||
if (true || device_signatures_ok()) {
|
|
||||||
if (radio_online) {
|
if (radio_online) {
|
||||||
disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
if (display_diagnostics) {
|
||||||
|
disp_area.fillRect(0,37,disp_area.width(),27, SSD1306_WHITE);
|
||||||
|
disp_area.setFont(SMALL_FONT);
|
||||||
|
disp_area.setTextColor(SSD1306_BLACK);
|
||||||
|
disp_area.setTextWrap(false);
|
||||||
|
|
||||||
|
disp_area.setCursor(1+20+10, 37+3+7-3+1+1);
|
||||||
|
disp_area.print("Airtime");
|
||||||
|
|
||||||
|
disp_area.setCursor(11, 37+13+10-4+1);
|
||||||
|
if (total_channel_util < 0.099) {
|
||||||
|
disp_area.printf("%.1f%%", airtime*100.0);
|
||||||
} else {
|
} else {
|
||||||
disp_area.drawBitmap(0, 37, bm_checks, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.printf("%.0f%%", airtime*100.0);
|
||||||
}
|
}
|
||||||
|
disp_area.drawBitmap(2, 37+6+10-4+1, bm_hg_low, 5, 9, SSD1306_BLACK, SSD1306_WHITE);
|
||||||
|
|
||||||
|
disp_area.setCursor(32+11, 37+13+10-4+1);
|
||||||
|
if (longterm_channel_util < 0.099) {
|
||||||
|
disp_area.printf("%.1f%%", longterm_airtime*100.0);
|
||||||
|
} else {
|
||||||
|
disp_area.printf("%.0f%%", longterm_airtime*100.0);
|
||||||
|
}
|
||||||
|
disp_area.drawBitmap(32+2, 37+6+10-4+1, bm_hg_high, 5, 9, SSD1306_BLACK, SSD1306_WHITE);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (disp_page == 0) {
|
||||||
|
if (device_signatures_ok()) {
|
||||||
|
disp_area.drawBitmap(0, 37, bm_checks, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
} else {
|
} else {
|
||||||
disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
}
|
}
|
||||||
} else if (disp_page == 1) {
|
} else if (disp_page == 1) {
|
||||||
if (radio_online) {
|
|
||||||
disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
|
||||||
} else{
|
|
||||||
if (!console_active) {
|
if (!console_active) {
|
||||||
disp_area.drawBitmap(0, 37, bm_hwok, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 37, bm_hwok, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
} else {
|
} else {
|
||||||
disp_area.drawBitmap(0, 37, bm_console_active, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 37, bm_console_active, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if (disp_page == 2) {
|
} else if (disp_page == 2) {
|
||||||
if (radio_online) {
|
|
||||||
disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
|
||||||
} else{
|
|
||||||
disp_area.drawBitmap(0, 37, bm_version, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 37, bm_version, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
|
||||||
char *v_str = (char*)malloc(3+1);
|
char *v_str = (char*)malloc(3+1);
|
||||||
sprintf(v_str, "%01d%02d", MAJ_VERS, MIN_VERS);
|
sprintf(v_str, "%01d%02d", MAJ_VERS, MIN_VERS);
|
||||||
@ -436,17 +492,6 @@ void draw_disp_area() {
|
|||||||
} else {
|
} else {
|
||||||
disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
|
disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
|
||||||
}
|
}
|
||||||
if (display_diagnostics) {
|
|
||||||
disp_area.setCursor(0, 0);
|
|
||||||
disp_area.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
|
|
||||||
disp_area.setTextSize(1);
|
|
||||||
disp_area.printf("B:%.1fK\r\n", (float)lora_bitrate/1000.0);
|
|
||||||
disp_area.printf("U:%.1f%%\r\n", total_channel_util*100.0);
|
|
||||||
disp_area.printf("L:%.1f%%\r\n", local_channel_util*100.0);
|
|
||||||
disp_area.printf("A:%.2f%%\r\n", airtime*100.0);
|
|
||||||
disp_area.printf("a:%.2f%%\r\n", longterm_airtime*100.0);
|
|
||||||
disp_area.printf("C:%d\r\n", current_airtime_bin());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,3 +407,11 @@ const unsigned char bm_plug [] PROGMEM = {
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x7f, 0x80, 0x55, 0xfc, 0x00, 0xaa, 0xfc, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x7f, 0x80, 0x55, 0xfc, 0x00, 0xaa, 0xfc, 0x00, 0x00,
|
||||||
0x7f, 0x80, 0x00, 0x1c, 0x00
|
0x7f, 0x80, 0x00, 0x1c, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const unsigned char bm_hg_low [] PROGMEM = {
|
||||||
|
0xf8, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0xf8, 0xf8
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char bm_hg_high [] PROGMEM = {
|
||||||
|
0xf8, 0x88, 0xf8, 0x70, 0x20, 0x70, 0xf8, 0xf8, 0xf8
|
||||||
|
};
|
@ -89,8 +89,7 @@ void setup() {
|
|||||||
LoRa.setPins(pin_cs, pin_reset, pin_dio);
|
LoRa.setPins(pin_cs, pin_reset, pin_dio);
|
||||||
|
|
||||||
#if MCU_VARIANT == MCU_ESP32
|
#if MCU_VARIANT == MCU_ESP32
|
||||||
for (uint16_t ai = 0; ai < DCD_SAMPLES; ai++) { util_samples[ai] = false; }
|
init_channel_stats();
|
||||||
for (uint16_t ai = 0; ai < AIRTIME_BINS; ai++) { airtime_bins[ai] = 0; }
|
|
||||||
|
|
||||||
// Check installed transceiver chip and
|
// Check installed transceiver chip and
|
||||||
// probe boot parameters.
|
// probe boot parameters.
|
||||||
@ -402,14 +401,19 @@ void flushQueue(void) {
|
|||||||
void add_airtime(uint16_t written) {
|
void add_airtime(uint16_t written) {
|
||||||
#if MCU_VARIANT == MCU_ESP32
|
#if MCU_VARIANT == MCU_ESP32
|
||||||
float ms_cost = ((float)written * us_per_byte)/1000.0;
|
float ms_cost = ((float)written * us_per_byte)/1000.0;
|
||||||
airtime_bins[current_airtime_bin()] += ms_cost;
|
uint16_t cb = current_airtime_bin();
|
||||||
|
uint16_t nb = cb+1; if (nb == AIRTIME_BINS) { nb = 0; }
|
||||||
|
airtime_bins[cb] += ms_cost;
|
||||||
|
airtime_bins[nb] = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_airtime() {
|
void update_airtime() {
|
||||||
#if MCU_VARIANT == MCU_ESP32
|
#if MCU_VARIANT == MCU_ESP32
|
||||||
uint16_t cb = current_airtime_bin();
|
uint16_t cb = current_airtime_bin();
|
||||||
uint16_t pb = cb-1; if (cb < 0) { cb = AIRTIME_BINS-1; }
|
uint16_t pb = cb-1; if (pb < 0) { pb = AIRTIME_BINS-1; }
|
||||||
|
uint16_t nb = cb+1; if (nb == 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;
|
||||||
@ -417,6 +421,12 @@ void update_airtime() {
|
|||||||
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;
|
||||||
|
for (uint16_t bin = 0; bin < AIRTIME_BINS; bin++) {
|
||||||
|
longterm_channel_util_sum += longterm_bins[bin];
|
||||||
|
}
|
||||||
|
longterm_channel_util = (float)longterm_channel_util_sum/(float)AIRTIME_BINS;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -895,6 +905,8 @@ void checkModemStatus() {
|
|||||||
total_channel_util = local_channel_util + airtime;
|
total_channel_util = local_channel_util + airtime;
|
||||||
if (total_channel_util > 1.0) total_channel_util = 1.0;
|
if (total_channel_util > 1.0) total_channel_util = 1.0;
|
||||||
|
|
||||||
|
longterm_bins[current_airtime_bin()] = total_channel_util;
|
||||||
|
|
||||||
update_airtime();
|
update_airtime();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
10
Utilities.h
10
Utilities.h
@ -1181,6 +1181,16 @@ void unlock_rom() {
|
|||||||
eeprom_erase();
|
eeprom_erase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_channel_stats() {
|
||||||
|
for (uint16_t ai = 0; ai < DCD_SAMPLES; ai++) { util_samples[ai] = false; }
|
||||||
|
for (uint16_t ai = 0; ai < AIRTIME_BINS; ai++) { airtime_bins[ai] = 0; }
|
||||||
|
for (uint16_t ai = 0; ai < AIRTIME_BINS; ai++) { longterm_bins[ai] = 0.0; }
|
||||||
|
local_channel_util = 0.0;
|
||||||
|
total_channel_util = 0.0;
|
||||||
|
airtime = 0.0;
|
||||||
|
longterm_airtime = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct FIFOBuffer
|
typedef struct FIFOBuffer
|
||||||
{
|
{
|
||||||
unsigned char *begin;
|
unsigned char *begin;
|
||||||
|
Loading…
Reference in New Issue
Block a user