2023-01-18 20:18:19 +03:00
|
|
|
/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved
|
|
|
|
* See the LICENSE file for information about the license. */
|
|
|
|
|
|
|
|
#include "app.h"
|
|
|
|
|
|
|
|
/* Renders a single view with frequency and modulation setting. However
|
|
|
|
* this are logically two different views, and only one of the settings
|
|
|
|
* will be highlighted. */
|
2023-01-18 22:25:39 +03:00
|
|
|
void render_view_settings(Canvas* const canvas, ProtoViewApp* app) {
|
2023-01-18 20:18:19 +03:00
|
|
|
canvas_set_font(canvas, FontPrimary);
|
2023-01-18 22:25:39 +03:00
|
|
|
if(app->current_view == ViewFrequencySettings)
|
|
|
|
canvas_draw_str_with_border(canvas, 1, 10, "Frequency", ColorWhite, ColorBlack);
|
2023-01-18 20:18:19 +03:00
|
|
|
else
|
2023-01-18 22:25:39 +03:00
|
|
|
canvas_draw_str(canvas, 1, 10, "Frequency");
|
2023-01-18 20:18:19 +03:00
|
|
|
|
2023-01-18 22:25:39 +03:00
|
|
|
if(app->current_view == ViewModulationSettings)
|
|
|
|
canvas_draw_str_with_border(canvas, 70, 10, "Modulation", ColorWhite, ColorBlack);
|
2023-01-18 20:18:19 +03:00
|
|
|
else
|
2023-01-18 22:25:39 +03:00
|
|
|
canvas_draw_str(canvas, 70, 10, "Modulation");
|
2023-01-18 20:18:19 +03:00
|
|
|
canvas_set_font(canvas, FontSecondary);
|
2023-01-18 22:25:39 +03:00
|
|
|
canvas_draw_str(canvas, 10, 61, "Use up and down to modify");
|
2023-01-18 20:18:19 +03:00
|
|
|
|
2023-01-18 22:25:39 +03:00
|
|
|
if(app->txrx->debug_timer_sampling)
|
|
|
|
canvas_draw_str(canvas, 3, 52, "(DEBUG timer sampling is ON)");
|
2023-01-18 20:18:19 +03:00
|
|
|
|
|
|
|
/* Show frequency. We can use big numbers font since it's just a number. */
|
2023-01-18 22:25:39 +03:00
|
|
|
if(app->current_view == ViewFrequencySettings) {
|
2023-01-18 20:18:19 +03:00
|
|
|
char buf[16];
|
2023-01-18 22:25:39 +03:00
|
|
|
snprintf(buf, sizeof(buf), "%.2f", (double)app->frequency / 1000000);
|
2023-01-18 20:18:19 +03:00
|
|
|
canvas_set_font(canvas, FontBigNumbers);
|
|
|
|
canvas_draw_str(canvas, 30, 40, buf);
|
2023-01-18 22:25:39 +03:00
|
|
|
} else if(app->current_view == ViewModulationSettings) {
|
2023-01-18 20:18:19 +03:00
|
|
|
int current = app->modulation;
|
|
|
|
canvas_set_font(canvas, FontPrimary);
|
|
|
|
canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Handle input for the settings view. */
|
2023-01-18 22:25:39 +03:00
|
|
|
void process_input_settings(ProtoViewApp* app, InputEvent input) {
|
|
|
|
if(input.type == InputTypeLong && input.key == InputKeyOk) {
|
2023-01-18 20:18:19 +03:00
|
|
|
/* Long pressing to OK sets the default frequency and
|
|
|
|
* modulation. */
|
|
|
|
app->frequency = subghz_setting_get_default_frequency(app->setting);
|
|
|
|
app->modulation = 0;
|
2023-01-18 22:25:39 +03:00
|
|
|
} else if(0 && input.type == InputTypeLong && input.key == InputKeyDown) {
|
2023-01-18 20:18:19 +03:00
|
|
|
/* Long pressing to down switches between normal and debug
|
|
|
|
* timer sampling mode. NOTE: this feature is disabled for users,
|
|
|
|
* only useful for devs (if useful at all). */
|
|
|
|
|
|
|
|
/* We have to stop the previous sampling system. */
|
|
|
|
radio_rx_end(app);
|
|
|
|
|
|
|
|
/* Then switch mode and start the new one. */
|
|
|
|
app->txrx->debug_timer_sampling = !app->txrx->debug_timer_sampling;
|
|
|
|
radio_begin(app);
|
|
|
|
radio_rx(app);
|
2023-01-18 22:25:39 +03:00
|
|
|
} else if(input.type == InputTypePress && (input.key != InputKeyDown || input.key != InputKeyUp)) {
|
2023-01-18 20:18:19 +03:00
|
|
|
/* Handle up and down to change frequency or modulation. */
|
2023-01-18 22:25:39 +03:00
|
|
|
if(app->current_view == ViewFrequencySettings) {
|
2023-01-18 20:18:19 +03:00
|
|
|
size_t curidx = 0, i;
|
|
|
|
size_t count = subghz_setting_get_frequency_count(app->setting);
|
|
|
|
|
|
|
|
/* Scan the list of frequencies to check for the index of the
|
|
|
|
* currently set frequency. */
|
|
|
|
for(i = 0; i < count; i++) {
|
2023-01-18 22:25:39 +03:00
|
|
|
uint32_t freq = subghz_setting_get_frequency(app->setting, i);
|
|
|
|
if(freq == app->frequency) {
|
2023-01-18 20:18:19 +03:00
|
|
|
curidx = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-01-18 22:25:39 +03:00
|
|
|
if(i == count) return; /* Should never happen. */
|
2023-01-18 20:18:19 +03:00
|
|
|
|
2023-01-18 22:25:39 +03:00
|
|
|
if(input.key == InputKeyUp) {
|
|
|
|
curidx = curidx == 0 ? count - 1 : curidx - 1;
|
|
|
|
} else if(input.key == InputKeyDown) {
|
|
|
|
curidx = (curidx + 1) % count;
|
2023-01-18 20:18:19 +03:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
2023-01-18 22:25:39 +03:00
|
|
|
app->frequency = subghz_setting_get_frequency(app->setting, curidx);
|
|
|
|
} else if(app->current_view == ViewModulationSettings) {
|
2023-01-18 20:18:19 +03:00
|
|
|
uint32_t count = 0;
|
|
|
|
uint32_t modid = app->modulation;
|
|
|
|
|
|
|
|
while(ProtoViewModulations[count].name != NULL) count++;
|
2023-01-18 22:25:39 +03:00
|
|
|
if(input.key == InputKeyUp) {
|
|
|
|
modid = modid == 0 ? count - 1 : modid - 1;
|
|
|
|
} else if(input.key == InputKeyDown) {
|
|
|
|
modid = (modid + 1) % count;
|
2023-01-18 20:18:19 +03:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
app->modulation = modid;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Apply changes when switching to other views. */
|
|
|
|
app->txrx->freq_mod_changed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* When the user switches to some other view, if they changed the parameters
|
|
|
|
* we need to restart the radio with the right frequency and modulation. */
|
2023-01-18 22:25:39 +03:00
|
|
|
void view_exit_settings(ProtoViewApp* app) {
|
|
|
|
if(app->txrx->freq_mod_changed) {
|
|
|
|
FURI_LOG_E(
|
|
|
|
TAG,
|
|
|
|
"Setting view, setting frequency/modulation to %lu %s",
|
|
|
|
app->frequency,
|
|
|
|
ProtoViewModulations[app->modulation].name);
|
2023-01-18 20:18:19 +03:00
|
|
|
radio_rx_end(app);
|
|
|
|
radio_begin(app);
|
|
|
|
radio_rx(app);
|
|
|
|
app->txrx->freq_mod_changed = false;
|
|
|
|
}
|
|
|
|
}
|