167 lines
4.9 KiB
C++

#include "Utils.h"
#include <ctype.h>
#include <tt_app_alertdialog.h>
void crash(const char* const message) {
tt_app_alertdialog_start("RadioSet has crashed!", message, nullptr, 0);
}
void crashassert(bool assertion, const char* const message) {
if (!assertion) {
crash(message);
}
}
void hexdump(Str& out, const uint8_t* data, size_t size) {
out.clear();
for (size_t i = 0; i < size; ++i) {
out.appendf("%02X ", data[i]);
}
}
bool isPrintable(const uint8_t* data, size_t size) {
for (size_t i = 0; i < (size - 1); ++i) {
if (!isprint(data[i])) {
return false;
}
}
return true;
}
char *const toString(Modulation m) {
switch (m) {
case MODULATION_NONE:
return "None";
case MODULATION_LORA:
return "LoRa";
case MODULATION_FSK:
return "FSK";
case MODULATION_LRFHSS:
return "LR-FHSS";
default:
break;
}
crash("Unknown modulation passed.");
return "Unknown";
}
char *const toString(RadioParameter p) {
switch (p) {
case RADIO_POWER:
return "Power";
case RADIO_BOOSTEDGAIN:
return "RX Boosted Gain";
case RADIO_FREQUENCY:
return "Center Frequency";
case RADIO_BANDWIDTH:
return "Bandwidth";
case RADIO_SPREADFACTOR:
return "Spread Factor";
case RADIO_CODINGRATE:
return "Coding Rate";
case RADIO_SYNCWORD:
return "Sync Word";
case RADIO_PREAMBLES:
return "Preamble Length";
case RADIO_FREQDIV:
return "Frequency Deviation";
case RADIO_DATARATE:
return "Data Rate";
case RADIO_ADDRWIDTH:
return "Address Width";
case RADIO_NARROWGRID:
return "Narrow Grid";
default:
break;
}
crash("Unknown parameter passed.");
return "Unknown";
}
char *const toString(RadioTxState state) {
switch (state) {
case RADIO_TX_QUEUED:
return "QUEUED";
case RADIO_TX_PENDING_TRANSMIT:
return "TRANSMIT";
case RADIO_TX_TRANSMITTED:
return "SENT";
case RADIO_TX_TIMEOUT:
return "TIMEOUT";
case RADIO_TX_ERROR:
return "ERROR";
default:
break;
}
crash("Unknown parameter passed.");
return "Unknown";
}
void clownvomit(lv_obj_t *obj) {
static auto rng = []() {
static int color = 0xCCC0FE;
const int a = 4711;
const int m = 0x10001;
color = (a * color) % m;
return color;
};
const int darken = 0x0E0E0E;
const int lighten = 0xFEFEFE;
auto bg = lv_color_darken(lv_color_hex(rng()), 100);
lv_obj_set_style_bg_color(obj, bg, 0);
uint32_t i;
for(i = 0; i < lv_obj_get_child_count(obj); i++) {
auto light = lv_color_lighten(lv_color_hex(rng()), 100);
auto dark = lv_color_darken(lv_color_hex(rng()), 100);
lv_obj_t * child = lv_obj_get_child(obj, i);
lv_obj_set_style_bg_color(child, dark, 0);
lv_obj_set_style_border_color(child, light, 0);
lv_obj_set_style_border_width(child, 1, 0);
clownvomit(child);
}
}
static void apply_scroll_styles(lv_obj_t* obj) {
static bool init = false;
static lv_style_t style_scroll_focus;
static lv_style_t style_scrolling;
if (!init) {
// Style which applies if scrollbar is focused
lv_style_init(&style_scroll_focus);
lv_style_set_bg_color(&style_scroll_focus, lv_color_make(0x40,0xA0,0xFF));
lv_style_set_bg_opa(&style_scroll_focus, LV_OPA_COVER);
lv_style_set_border_width(&style_scroll_focus, 1);
lv_style_set_border_color(&style_scroll_focus, lv_theme_get_color_primary(nullptr));
// Style which applies if scrollbar is clicked enough that it defocuses
lv_style_init(&style_scrolling);
lv_style_set_bg_color(&style_scrolling, lv_color_make(0x40,0xA0,0xFF));
lv_style_set_bg_opa(&style_scrolling, LV_OPA_COVER);
lv_style_set_border_width(&style_scrolling, 1);
auto lightprimary = lv_color_lighten(lv_theme_get_color_primary(nullptr), 50);
lv_style_set_border_color(&style_scrolling, lightprimary);
init = true;
}
lv_obj_add_style(obj, &style_scroll_focus, (lv_style_selector_t)(LV_PART_SCROLLBAR | LV_STATE_FOCUSED));
lv_obj_add_style(obj, &style_scrolling, (lv_style_selector_t)(LV_PART_SCROLLBAR | LV_STATE_PRESSED));
}
void make_scrollable(lv_obj_t* obj) {
// Make the object interactive, i.e focusable
lv_obj_add_flag(obj, (lv_obj_flag_t)(LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLL_ON_FOCUS));
// Add to default group to get it into the focus list
auto* group = lv_group_get_default();
lv_group_add_obj(group, obj);
// Apply style to scrollbar to make it visible if focused
apply_scroll_styles(obj);
}