| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /* 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. */
- void render_view_settings(Canvas* const canvas, ProtoViewApp* app) {
- canvas_set_font(canvas, FontPrimary);
- if(app->current_view == ViewFrequencySettings)
- canvas_draw_str_with_border(canvas, 1, 10, "Frequency", ColorWhite, ColorBlack);
- else
- canvas_draw_str(canvas, 1, 10, "Frequency");
- if(app->current_view == ViewModulationSettings)
- canvas_draw_str_with_border(canvas, 70, 10, "Modulation", ColorWhite, ColorBlack);
- else
- canvas_draw_str(canvas, 70, 10, "Modulation");
- canvas_set_font(canvas, FontSecondary);
- canvas_draw_str(canvas, 10, 61, "Use up and down to modify");
- if(app->txrx->debug_timer_sampling)
- canvas_draw_str(canvas, 3, 52, "(DEBUG timer sampling is ON)");
- /* Show frequency. We can use big numbers font since it's just a number. */
- if(app->current_view == ViewFrequencySettings) {
- char buf[16];
- snprintf(buf, sizeof(buf), "%.2f", (double)app->frequency / 1000000);
- canvas_set_font(canvas, FontBigNumbers);
- canvas_draw_str(canvas, 30, 40, buf);
- } else if(app->current_view == ViewModulationSettings) {
- int current = app->modulation;
- canvas_set_font(canvas, FontPrimary);
- canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name);
- }
- }
- /* Handle input for the settings view. */
- void process_input_settings(ProtoViewApp* app, InputEvent input) {
- if(input.type == InputTypeLong && input.key == InputKeyOk) {
- /* Long pressing to OK sets the default frequency and
- * modulation. */
- app->frequency = subghz_setting_get_default_frequency(app->setting);
- app->modulation = 0;
- } else if(0 && input.type == InputTypeLong && input.key == InputKeyDown) {
- /* 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);
- } else if(input.type == InputTypePress && (input.key != InputKeyDown || input.key != InputKeyUp)) {
- /* Handle up and down to change frequency or modulation. */
- if(app->current_view == ViewFrequencySettings) {
- 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++) {
- uint32_t freq = subghz_setting_get_frequency(app->setting, i);
- if(freq == app->frequency) {
- curidx = i;
- break;
- }
- }
- if(i == count) return; /* Should never happen. */
- if(input.key == InputKeyUp) {
- curidx = curidx == 0 ? count - 1 : curidx - 1;
- } else if(input.key == InputKeyDown) {
- curidx = (curidx + 1) % count;
- } else {
- return;
- }
- app->frequency = subghz_setting_get_frequency(app->setting, curidx);
- } else if(app->current_view == ViewModulationSettings) {
- uint32_t count = 0;
- uint32_t modid = app->modulation;
- while(ProtoViewModulations[count].name != NULL)
- count++;
- if(input.key == InputKeyUp) {
- modid = modid == 0 ? count - 1 : modid - 1;
- } else if(input.key == InputKeyDown) {
- modid = (modid + 1) % count;
- } 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. */
- 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);
- radio_rx_end(app);
- radio_begin(app);
- radio_rx(app);
- app->txrx->freq_mod_changed = false;
- }
- }
|