From e15f659a6a9e4093f8d6102dd82264e6aabaac1e Mon Sep 17 00:00:00 2001 From: furrtek Date: Sun, 29 May 2016 12:06:47 +0200 Subject: [PATCH] RDS radiotext transmit (group 2A) Keyboard/Unistroke text input method selection --- firmware/application/Makefile | 1 + firmware/application/bitmap.hpp | 46 ++++ firmware/application/main.cpp | 7 +- firmware/application/ui_alphanum.cpp | 5 +- firmware/application/ui_alphanum.hpp | 5 + firmware/application/ui_handwrite.cpp | 13 +- firmware/application/ui_handwrite.hpp | 6 + firmware/application/ui_lcr.cpp | 32 ++- firmware/application/ui_lcr.hpp | 1 + firmware/application/ui_navigation.cpp | 28 ++- firmware/application/ui_navigation.hpp | 12 +- firmware/application/ui_rds.cpp | 162 ++++++++++---- firmware/application/ui_rds.hpp | 204 ++++++++++++++---- firmware/application/ui_setup.cpp | 28 ++- firmware/application/ui_setup.hpp | 15 +- firmware/application/ui_textentry.cpp | 43 ++++ firmware/application/ui_textentry.hpp | 33 +++ firmware/application/ui_xylos.cpp | 1 - firmware/application/ui_xylos.hpp | 7 +- firmware/baseband-tx.bin | Bin 33280 -> 33280 bytes firmware/baseband-tx/Makefile | 1 + firmware/baseband-tx/baseband_thread.cpp | 2 + firmware/baseband-tx/proc_fsk_lcr.cpp | 4 +- firmware/baseband-tx/proc_rds.cpp | 25 ++- firmware/baseband-tx/proc_rds.hpp | 4 +- firmware/common/modules.h | 2 +- .../common/portapack_persistent_memory.cpp | 12 +- .../common/portapack_persistent_memory.hpp | 4 + firmware/common/portapack_shared_memory.hpp | 7 +- firmware/common/ui_painter.cpp | 2 +- firmware/common/ui_painter.hpp | 1 - firmware/common/ui_widget.cpp | 30 ++- firmware/portapack-h1-firmware.bin | Bin 476784 -> 484272 bytes sdcard/baseband-tx.bin | Bin 33280 -> 33280 bytes 34 files changed, 574 insertions(+), 169 deletions(-) create mode 100644 firmware/application/ui_textentry.cpp create mode 100644 firmware/application/ui_textentry.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 553af8458..d4192e14b 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -184,6 +184,7 @@ CPPSRC = main.cpp \ ui_soundboard.cpp \ ui_spectrum.cpp \ ui_text.cpp \ + ui_textentry.cpp \ ui_widget.cpp \ ui_xylos.cpp \ recent_entries.cpp \ diff --git a/firmware/application/bitmap.hpp b/firmware/application/bitmap.hpp index 79906dfbd..78f0fa9f8 100644 --- a/firmware/application/bitmap.hpp +++ b/firmware/application/bitmap.hpp @@ -26,6 +26,52 @@ namespace ui { +static constexpr uint8_t bitmap_keyboard_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x0F, + 0x88, 0x08, + 0x88, 0x08, + 0x88, 0x08, + 0xFE, 0x3F, + 0x22, 0x22, + 0x22, 0x22, + 0x22, 0x22, + 0xFE, 0x3F, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_keyboard { + { 16, 16 }, bitmap_keyboard_data +}; + +static constexpr uint8_t bitmap_unistroke_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0xA2, 0x73, + 0xA2, 0x24, + 0xA2, 0x24, + 0xA2, 0x24, + 0xA2, 0x24, + 0x9C, 0x74, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_unistroke { + { 16, 16 }, bitmap_unistroke_data +}; + static constexpr uint8_t bitmap_record_data[] = { 0x00, 0x00, 0x00, 0x00, diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index e0568b3a9..1d71aa8f5 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -20,7 +20,7 @@ */ // Bitmaps generated with: -// Gimp :(, then "xxd -i *.bmp" +// Gimp :( > indexed colors, then "xxd -i *.bmp" //BUG: No audio in about when shown second time //BUG: Description doesn't show up first time going to system>module info (UI drawn on top) @@ -35,18 +35,14 @@ //TODO: Morse coder //TODO: Playdead amnesia and login //TODO: Touch screen calibration -//TODO: Display module info (name, desc) somewhere //TODO: Show MD5 mismatches for modules not found, etc... -//TODO: More gfx, cute icons :) //TODO: Check jammer bandwidths //TODO: GSM channel detector //TODO: AFSK receiver //TODO: SIGFOX RX/TX -//TODO: Reset baseband if module not found (instead of lockup in RAM loop) //TODO: Module name/filename in modules.hpp to indicate requirement in case it's not found ui_loadmodule //BUG: Crash after TX stop (unregister message !) //TODO: Check bw setting in LCR TX -//TODO: BUG: Crash after PSN entry in RDS TX //TODO: Bodet :) //TODO: Whistler //TODO: Setup: Play dead by default ? Enable/disable ? @@ -54,7 +50,6 @@ //TODO: Persistent playdead ! //TODO: LCR EC=A,J,N //TODO: LCR full message former (see norm) -//TODO: LCR address scan //TODO: AFSK NRZI //TODO: TX power diff --git a/firmware/application/ui_alphanum.cpp b/firmware/application/ui_alphanum.cpp index eb38732c4..eaf8f1ba6 100644 --- a/firmware/application/ui_alphanum.cpp +++ b/firmware/application/ui_alphanum.cpp @@ -37,6 +37,7 @@ using namespace hackrf::one; namespace ui { void AlphanumView::paint(Painter& painter) { + (void)painter; move_cursor(); } @@ -51,13 +52,13 @@ AlphanumView::AlphanumView( static constexpr Style style_alpha { .font = font::fixed_8x16, .background = Color::red(), - .foreground = Color::black(), + .foreground = Color::black() }; static constexpr Style style_num { .font = font::fixed_8x16, .background = Color::yellow(), - .foreground = Color::black(), + .foreground = Color::black() }; txtidx = strlen(txt); diff --git a/firmware/application/ui_alphanum.hpp b/firmware/application/ui_alphanum.hpp index 9f1c8fd37..150303f1e 100644 --- a/firmware/application/ui_alphanum.hpp +++ b/firmware/application/ui_alphanum.hpp @@ -19,6 +19,9 @@ * Boston, MA 02110-1301, USA. */ +#ifndef __ALPHANUM_H__ +#define __ALPHANUM_H__ + #include "ui.hpp" #include "ui_widget.hpp" #include "ui_painter.hpp" @@ -81,3 +84,5 @@ private: }; } /* namespace ui */ + +#endif/*__ALPHANUM_H__*/ diff --git a/firmware/application/ui_handwrite.cpp b/firmware/application/ui_handwrite.cpp index a6276091d..021988ad1 100644 --- a/firmware/application/ui_handwrite.cpp +++ b/firmware/application/ui_handwrite.cpp @@ -51,7 +51,8 @@ HandWriteView::HandWriteView( // Handwriting alphabet definition here handwriting = &handwriting_unistroke; - //memcpy(txtinput, txt, max_len+1); + txtidx = strlen(txt); + memcpy(txtinput, txt, max_len + 1); add_children({ { &text_input, @@ -108,12 +109,12 @@ HandWriteView::HandWriteView( }; button_ok.on_select = [this, &nav, txt, max_len](Button&) { - //memcpy(txt, txtinput, max_len+1); - //on_changed(this->value()); + memcpy(txt, txtinput, max_len + 1); + on_changed(this->value()); nav.pop(); }; - //update_text(); + update_text(); } bool HandWriteView::on_touch(const TouchEvent event) { @@ -385,6 +386,10 @@ void HandWriteView::on_show() { clear_zone(Color::black(), false); } +void HandWriteView::on_hide() { + EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); +} + char * HandWriteView::value() { return txtinput; } diff --git a/firmware/application/ui_handwrite.hpp b/firmware/application/ui_handwrite.hpp index 29add26c3..4a86a8056 100644 --- a/firmware/application/ui_handwrite.hpp +++ b/firmware/application/ui_handwrite.hpp @@ -20,6 +20,9 @@ * Boston, MA 02110-1301, USA. */ +#ifndef __UNISTROKE_H__ +#define __UNISTROKE_H__ + #include "ui.hpp" #include "ui_widget.hpp" #include "ui_painter.hpp" @@ -38,6 +41,7 @@ public: void paint(Painter& painter) override; void on_show() override; + void on_hide() override; bool on_touch(const TouchEvent event) override; char * value(); @@ -88,3 +92,5 @@ private: }; } /* namespace ui */ + +#endif/*__UNISTROKE_H__*/ diff --git a/firmware/application/ui_lcr.cpp b/firmware/application/ui_lcr.cpp index ceb4dd04c..d259b1724 100644 --- a/firmware/application/ui_lcr.cpp +++ b/firmware/application/ui_lcr.cpp @@ -20,8 +20,6 @@ * Boston, MA 02110-1301, USA. */ -#include "ui_alphanum.hpp" -#include "ui_rds.hpp" #include "ui_lcr.hpp" #include "ui_receiver.hpp" #include "ui_afsksetup.hpp" @@ -180,6 +178,8 @@ void LCRView::paint(Painter& painter) { ); offset.y += 32; } + + button_setrgsb.set_text(rgsb); } void LCRView::start_tx() { @@ -200,8 +200,8 @@ void LCRView::start_tx() { shared_memory.afsk_fmmod = portapack::persistent_memory::afsk_bw() * 8; - memset(shared_memory.lcrdata, 0, 256); - memcpy(shared_memory.lcrdata, lcrframe_f, 256); + memset(shared_memory.radio_data, 0, 256); + memcpy(shared_memory.radio_data, lcrframe_f, 256); shared_memory.afsk_transmit_done = false; shared_memory.afsk_repeat = 5; //(portapack::persistent_memory::afsk_config() >> 8) & 0xFF; @@ -249,8 +249,8 @@ void LCRView::start_tx() { strcpy(rgsb, RGSB_list[scan_index]); make_frame(); - memset(shared_memory.lcrdata, 0, 256); - memcpy(shared_memory.lcrdata, lcrframe_f, 256); + memset(shared_memory.radio_data, 0, 256); + memcpy(shared_memory.radio_data, lcrframe_f, 256); shared_memory.afsk_transmit_done = false; shared_memory.afsk_repeat = 5; @@ -352,31 +352,23 @@ LCRView::LCRView( button_scan.set_style(&style_val); button_setrgsb.on_select = [this,&nav](Button&) { - auto an_view = nav.push(rgsb, 4); - an_view->on_changed = [this](char *rgsb) { - button_setrgsb.set_text(rgsb); - }; + textentry(nav, rgsb, 4); }; button_setam_a.on_select = [this,&nav](Button&) { - auto an_view = nav.push(litteral[0], 7); - an_view->on_changed = [this](char *) {}; + textentry(nav, litteral[0], 7); }; button_setam_b.on_select = [this,&nav](Button&) { - auto an_view = nav.push(litteral[1], 7); - an_view->on_changed = [this](char *) {}; + textentry(nav, litteral[1], 7); }; button_setam_c.on_select = [this,&nav](Button&) { - auto an_view = nav.push(litteral[2], 7); - an_view->on_changed = [this](char *) {}; + textentry(nav, litteral[2], 7); }; button_setam_d.on_select = [this,&nav](Button&) { - auto an_view = nav.push(litteral[3], 7); - an_view->on_changed = [this](char *) {}; + textentry(nav, litteral[3], 7); }; button_setam_e.on_select = [this,&nav](Button&) { - auto an_view = nav.push(litteral[4], 7); - an_view->on_changed = [this](char *) {}; + textentry(nav, litteral[4], 7); }; button_txsetup.on_select = [&nav](Button&) { diff --git a/firmware/application/ui_lcr.hpp b/firmware/application/ui_lcr.hpp index ed19d11ec..c042ba20d 100644 --- a/firmware/application/ui_lcr.hpp +++ b/firmware/application/ui_lcr.hpp @@ -25,6 +25,7 @@ #include "ui_painter.hpp" #include "ui_menu.hpp" #include "ui_navigation.hpp" +#include "ui_textentry.hpp" #include "ui_font_fixed_8x16.hpp" #include "clock_manager.hpp" #include "message.hpp" diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 7d0e82e2d..fde5a1350 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -53,19 +53,33 @@ namespace ui { /* SystemStatusView ******************************************************/ SystemStatusView::SystemStatusView() { + uint8_t cfg; + add_children({ { &button_back, &title, + &button_textentry, &button_camera, &button_sleep, &sd_card_status_view, } }); + + cfg = portapack::persistent_memory::ui_config_textentry(); + + if (!cfg) + button_textentry.set_bitmap(&bitmap_keyboard); + else + button_textentry.set_bitmap(&bitmap_unistroke); button_back.on_select = [this](Button&){ if( this->on_back ) { this->on_back(); } }; + + button_textentry.on_select = [this](ImageButton&) { + this->on_textentry(); + }; button_camera.on_select = [this](ImageButton&) { this->on_camera(); @@ -90,6 +104,18 @@ void SystemStatusView::set_title(const std::string new_value) { } } +void SystemStatusView::on_textentry() { + uint8_t cfg; + + cfg = portapack::persistent_memory::ui_config_textentry(); + portapack::persistent_memory::set_config_textentry(cfg ^ 1); + + if (!cfg) + button_textentry.set_bitmap(&bitmap_unistroke); + else + button_textentry.set_bitmap(&bitmap_keyboard); +} + void SystemStatusView::on_camera() { const auto filename_stem = next_filename_stem_matching_pattern("SCR_????"); if( filename_stem.empty() ) { @@ -219,7 +245,7 @@ SystemMenuView::SystemMenuView(NavigationView& nav) { static constexpr ui::Style style_default { .font = ui::font::fixed_8x16, .background = ui::Color::black(), - .foreground = ui::Color::white(), + .foreground = ui::Color::white() }; SystemView::SystemView( diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 6bc532f80..3947dc38b 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -62,16 +62,23 @@ private: { 3 * 8, 0, 16 * 8, 1 * 16 }, default_title, }; + + ImageButton button_textentry { + { 164, 0, 2 * 8, 1 * 16 }, + &bitmap_unistroke, + Color::white(), + Color::black() + }; ImageButton button_camera { - { 22 * 8, 0, 2 * 8, 1 * 16 }, + { 184, 0, 2 * 8, 1 * 16 }, &bitmap_camera, Color::white(), Color::black() }; ImageButton button_sleep { - { 25 * 8, 0, 2 * 8, 1 * 16 }, + { 204, 0, 2 * 8, 1 * 16 }, &bitmap_sleep, Color::white(), Color::black() @@ -82,6 +89,7 @@ private: }; void on_camera(); + void on_textentry(); }; class NavigationView : public View { diff --git a/firmware/application/ui_rds.cpp b/firmware/application/ui_rds.cpp index 16b0d4809..18a7a1ad0 100644 --- a/firmware/application/ui_rds.cpp +++ b/firmware/application/ui_rds.cpp @@ -23,8 +23,6 @@ #include "ui_rds.hpp" #include "ch.h" - -#include "ui_alphanum.hpp" #include "ff.h" #include "hackrf_gpio.hpp" #include "portapack.hpp" @@ -40,7 +38,7 @@ using namespace portapack; namespace ui { void RDSView::focus() { - button_setpsn.focus(); + button_editpsn.focus(); } RDSView::~RDSView() { @@ -86,7 +84,7 @@ uint8_t RDSView::b2b(const bool in) { } void RDSView::make_0B_group(uint32_t group[], const uint16_t PI_code, const bool TP, const uint8_t PTY, const bool TA, - const bool MS, const bool DI, const uint8_t C, char * chars) { + const bool MS, const bool DI, const uint8_t C, const char * chars) { group[0] = PI_code; group[1] = (0x0 << 12) | (1 << 11) | (b2b(TP) << 10) | (PTY << 5) | (b2b(TA) << 4) | (b2b(MS) << 3) | (b2b(DI) << 2) | (C & 3); @@ -94,14 +92,23 @@ void RDSView::make_0B_group(uint32_t group[], const uint16_t PI_code, const bool group[3] = (chars[0] << 8) | chars[1]; } -void RDSView::paint(Painter& painter) { +void RDSView::make_2A_group(uint32_t group[], const uint16_t PI_code, const bool TP, const uint8_t PTY, const bool AB, + const bool segment, const char * chars) { + + group[0] = PI_code; + group[1] = (0x0 << 12) | (1 << 11) | (b2b(TP) << 10) | (PTY << 5) | (b2b(AB) << 4) | (segment & 15); + group[2] = (chars[0] << 8) | chars[1]; + group[3] = (chars[2] << 8) | chars[3]; +} + +void RDSView::gen_PSN(const char * psname) { uint8_t c; uint32_t group[4][4] = { 0 }; - make_0B_group(&group[0][0], 0xF849, true, 7, false, true, false, 0, &psname[0]); - make_0B_group(&group[1][0], 0xF849, true, 7, false, true, false, 1, &psname[2]); - make_0B_group(&group[2][0], 0xF849, true, 7, false, true, false, 2, &psname[4]); - make_0B_group(&group[3][0], 0xF849, true, 7, false, true, false, 3, &psname[6]); + make_0B_group(&group[0][0], 0xF849, true, options_pty.selected_index(), false, true, false, 0, &psname[0]); + make_0B_group(&group[1][0], 0xF849, true, options_pty.selected_index(), false, true, false, 1, &psname[2]); + make_0B_group(&group[2][0], 0xF849, true, options_pty.selected_index(), false, true, false, 2, &psname[4]); + make_0B_group(&group[3][0], 0xF849, true, options_pty.selected_index(), false, true, false, 3, &psname[6]); /*uint32_t group[4][4] = { { @@ -140,42 +147,98 @@ void RDSView::paint(Painter& painter) { group[3][3] = (psname[6] << 8) | psname[7]; */ - //Generate checkbits + // Generate checkbits for (c = 0; c < 4; c++) { group[c][0] = makeblock(group[c][0], RDS_OFFSET_A); group[c][1] = makeblock(group[c][1], RDS_OFFSET_B); - group[c][2] = makeblock(group[c][2], RDS_OFFSET_Cp); //C' + group[c][2] = makeblock(group[c][2], RDS_OFFSET_Cp); // C' ! group[c][3] = makeblock(group[c][3], RDS_OFFSET_D); } - - const Point offset = { - static_cast(64), - static_cast(32) - }; - - const auto text = psname; - painter.draw_string( - screen_pos() + offset, - style(), - text - ); - for (c = 0; c < 16; c++) { - shared_memory.rdsdata[c] = group[c >> 2][c & 3]; + for (c = 0; c < 16; c++) + shared_memory.radio_data[c] = group[c >> 2][c & 3]; + + shared_memory.bit_length = 4 * 4 * 26; +} + +void RDSView::gen_RadioText(const char * radiotext) { + size_t c, i; + uint32_t * group; + char radiotext_buffer[65] = { 0 }; + uint8_t rtlen, groups; + + strcpy(radiotext_buffer, radiotext); + + rtlen = strlen(radiotext_buffer); + + radiotext_buffer[rtlen] = 0x0D; + + // Pad to multiple of 4 + while(rtlen & 3) { + radiotext_buffer[rtlen] = ' '; + rtlen++; } + + groups = rtlen >> 2; // 4 characters per group + + group = (uint32_t*)chHeapAlloc(0x0, 4 * groups * sizeof(uint32_t)); + + for (c = 0; c < groups; c++) + make_2A_group(&group[c << 2], 0xF849, true, options_pty.selected_index(), false, c, &radiotext_buffer[c << 2]); + + // Generate checkbits + for (c = 0; c < groups; c++) { + i = c * 4; + group[i + 0] = makeblock(group[i + 0], RDS_OFFSET_A); + group[i + 1] = makeblock(group[i + 1], RDS_OFFSET_B); + group[i + 2] = makeblock(group[i + 2], RDS_OFFSET_C); + group[i + 3] = makeblock(group[i + 3], RDS_OFFSET_D); + } + + for (c = 0; c < (groups * 4); c++) + shared_memory.radio_data[c] = group[c]; + + shared_memory.bit_length = groups * 4 * 26; +} + +void RDSView::paint(Painter& painter) { + char RadioTextA[17]; + + (void)painter; + + text_psn.set(PSN); + memcpy(RadioTextA, RadioText, 16); + RadioTextA[16] = 0; + text_radiotexta.set(RadioTextA); + text_radiotextb.set(&RadioText[16]); } RDSView::RDSView( NavigationView& nav ) { - strcpy(psname, "TEST1234"); + transmitter_model.set_baseband_configuration({ + .mode = 5, + .sampling_rate = 2280000, + .decimation_factor = 1, + }); + + strcpy(PSN, "TEST1234"); + strcpy(RadioText, "Radiotext test !"); add_children({ { &field_frequency, &options_pty, - &button_setpsn, - &button_transmit, + &options_countrycode, + &options_coverage, + &text_tx, + &button_editpsn, + &text_psn, + &button_txpsn, + &button_editradiotext, + &text_radiotexta, + &text_radiotextb, + &button_txradiotext, &button_exit } }); @@ -188,17 +251,44 @@ RDSView::RDSView( }; }; - options_pty.set_selected_index(0); + options_pty.set_selected_index(0); // None + options_countrycode.set_selected_index(18); // France + options_coverage.set_selected_index(0); // Local - button_setpsn.on_select = [this,&nav](Button&){ - auto an_view = nav.push(psname, 8); - an_view->on_changed = [this](char *value) { - memcpy(psname, value, 9); - }; + button_editpsn.on_select = [this,&nav](Button&){ + textentry(nav, PSN, 8); + }; + button_txpsn.on_select = [this](Button&){ + if (txing) { + transmitter_model.disable(); + button_txpsn.set_text("PSN"); + button_txradiotext.set_text("Radiotext"); + txing = false; + } else { + gen_PSN(PSN); + transmitter_model.set_tuning_frequency(field_frequency.value()); + button_txpsn.set_text("STOP"); + txing = true; + transmitter_model.enable(); + } }; - button_transmit.on_select = [this](Button&){ - transmitter_model.enable(); + button_editradiotext.on_select = [this,&nav](Button&){ + textentry(nav, RadioText, 24); + }; + button_txradiotext.on_select = [this](Button&){ + if (txing) { + transmitter_model.disable(); + button_txpsn.set_text("PSN"); + button_txradiotext.set_text("Radiotext"); + txing = false; + } else { + gen_RadioText(RadioText); + transmitter_model.set_tuning_frequency(field_frequency.value()); + button_txradiotext.set_text("STOP"); + txing = true; + transmitter_model.enable(); + } }; button_exit.on_select = [&nav](Button&){ diff --git a/firmware/application/ui_rds.hpp b/firmware/application/ui_rds.hpp index 257710639..07686e829 100644 --- a/firmware/application/ui_rds.hpp +++ b/firmware/application/ui_rds.hpp @@ -25,6 +25,7 @@ #include "ui_navigation.hpp" #include "ui_font_fixed_8x16.hpp" #include "ui_receiver.hpp" +#include "ui_textentry.hpp" #include "clock_manager.hpp" #include "message.hpp" #include "rf_path.hpp" @@ -50,67 +51,192 @@ public: void paint(Painter& painter) override; private: - char psname[9]; + char PSN[9]; + char RadioText[25]; + bool txing = false; uint8_t b2b(const bool in); + + void gen_PSN(const char * psname); + void gen_RadioText(const char * radiotext); + void make_0B_group(uint32_t group[], const uint16_t PI_code, const bool TP, const uint8_t PTY, const bool TA, - const bool MS, const bool DI, const uint8_t C, char * TWOCHARs); + const bool MS, const bool DI, const uint8_t C, const char * chars); + void make_2A_group(uint32_t group[], const uint16_t PI_code, const bool TP, const uint8_t PTY, const bool AB, + const bool segment, const char * chars); FrequencyField field_frequency { { 1 * 8, 1 * 16 }, }; OptionsField options_pty { - { 1 * 8, 3 * 16 }, - 32, + { 1 * 8, 2 * 16 }, + 8, { - { "None ", 0 }, - { "News ", 1 }, - { "Affairs ", 2 }, - { "Info ", 3 }, - { "Sport ", 4 }, - { "Educate ", 5 }, - { "Drama ", 6 }, - { "Culture ", 7 }, - { "Science ", 8 }, - { "Varied ", 9 }, - { "Pop ", 10 }, - { "Rock ", 11 }, - { "Easy ", 12 }, - { "Light ", 13 }, + { "None", 0 }, + { "News", 1 }, + { "Affairs", 2 }, + { "Info", 3 }, + { "Sport", 4 }, + { "Educate", 5 }, + { "Drama", 6 }, + { "Culture", 7 }, + { "Science", 8 }, + { "Varied", 9 }, + { "Pop", 10 }, + { "Rock", 11 }, + { "Easy", 12 }, + { "Light", 13 }, { "Classics", 14 }, - { "Other ", 15 }, - { "Weather ", 16 }, - { "Finance ", 17 }, + { "Other", 15 }, + { "Weather", 16 }, + { "Finance", 17 }, { "Children", 18 }, - { "Social ", 19 }, + { "Social", 19 }, { "Religion", 20 }, - { "PhoneIn ", 21 }, - { "Travel ", 22 }, - { "Leisure ", 23 }, - { "Jazz ", 24 }, - { "Country ", 25 }, + { "PhoneIn", 21 }, + { "Travel", 22 }, + { "Leisure", 23 }, + { "Jazz", 24 }, + { "Country", 25 }, { "National", 26 }, - { "Oldies ", 27 }, - { "Folk ", 28 }, - { "Docs ", 29 }, + { "Oldies", 27 }, + { "Folk", 28 }, + { "Docs", 29 }, { "AlarmTst", 30 }, - { "Alarm ", 31 } + { "Alarm", 31 } + } + }; + + OptionsField options_countrycode { + { 1 * 8, 3 * 16 }, + 11, + { + { "Albania", 9 }, + { "Algeria", 2 }, + { "Andorra", 3 }, + { "Austria", 10 }, + { "Azores", 8 }, + { "Belgium", 6 }, + { "Belarus", 15 }, + { "Bosnia", 15 }, + { "Bulgaria", 8 }, + { "Canaries", 14 }, + { "Croatia", 12 }, + { "Cyprus", 2 }, + { "Czech-Rep", 2 }, + { "Denmark", 9 }, + { "Egypt", 15 }, + { "Estonia", 2 }, + { "Faroe", 9 }, + { "Finland", 6 }, + { "France", 15 }, + { "Germany 1", 13 }, + { "Germany 2", 1 }, + { "Gibraltar", 10 }, + { "Greece", 1 }, + { "Hungary", 11 }, + { "Iceland", 10 }, + { "Iraq", 11 }, + { "Ireland", 2 }, + { "Israel", 4 }, + { "Italy", 5 }, + { "Jordan", 5 }, + { "Latvia", 9 }, + { "Lebanon", 10 }, + { "Libya", 13 }, + { "Liechtenst.", 9 }, + { "Lithuania", 12 }, + { "Luxembourg", 7 }, + { "Macedonia", 4 }, + { "Madeira", 8 }, + { "Malta", 12 }, + { "Moldova", 1 }, + { "Monaco", 11 }, + { "Morocco", 1 }, + { "Netherlands", 8 }, + { "Norway", 15 }, + { "Palestine", 8 }, + { "Poland", 3 }, + { "Portugal", 8 }, + { "Romania", 14 }, + { "Russia", 7 }, + { "San Marino", 3 }, + { "Slovakia", 5 }, + { "Slovenia", 9 }, + { "Spain", 14 }, + { "Sweden", 14 }, + { "Switzerland", 4 }, + { "Syria", 6 }, + { "Tunisia", 7 }, + { "Turkey", 3 }, + { "Ukraine", 6 }, + { "U.K.", 12 }, + { "Vatican", 4 }, + { "Yugoslavia", 13 } + } + }; + + OptionsField options_coverage { + { 1 * 8, 4 * 16 }, + 8, + { + { "Local", 0 }, + { "International", 1 }, + { "National", 2 }, + { "Supra-regional", 3 }, + { "R11", 4 }, + { "R12", 5 }, + { "R13", 6 }, + { "R14", 7 }, + { "R15", 8 }, + { "R16", 9 }, + { "R17", 10 }, + { "R18", 11 }, + { "R19", 12 }, + { "R110", 13 }, + { "R111", 14 }, + { "R112", 15 } } }; - Button button_setpsn { - { 72, 92, 96, 32 }, - "Set PSN" + Text text_tx { + { 19 * 8, 4 * 16, 9 * 8, 16 }, + "Transmit:" }; - - Button button_transmit { - { 72, 130, 96, 32 }, - "Transmit" + + Button button_editpsn { + { 2 * 8, 6 * 16, 64, 24 }, + "Set" + }; + Text text_psn { + { 2 * 8, 15 * 8, 8 * 8, 16 }, + "TEST1234" + }; + Button button_txpsn { + { 19 * 8, 6 * 16, 10 * 8, 32 }, + "PSN" + }; + + Button button_editradiotext { + { 2 * 8, 9 * 16, 64, 24 }, + "Set" + }; + Text text_radiotexta { + { 2 * 8, 21 * 8, 16 * 8, 16 }, + "Radiotext test !" + }; + Text text_radiotextb { + { 2 * 8, 23 * 8, 16 * 8, 16 }, + "--------" + }; + Button button_txradiotext { + { 19 * 8, 9 * 16, 10 * 8, 32 }, + "Radiotext" }; Button button_exit { - { 72, 270, 96, 32 }, + { 72, 260, 96, 32 }, "Exit" }; }; diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index 4bd2ae3b6..57b1c3a78 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -257,7 +257,7 @@ SetUIView::SetUIView(NavigationView& nav) { uint32_t ui_config = 0; if (checkbox_showsplash.value() == true) ui_config |= 1; if (checkbox_bloff.value() == true) ui_config |= 2; - + ui_config |= (portapack::persistent_memory::ui_config_textentry() << 2); ui_config |= (options_bloff.selected_index() << 5); portapack::persistent_memory::set_ui_config(ui_config); @@ -270,7 +270,7 @@ void SetUIView::focus() { } void ModInfoView::on_show() { - update_infos(0); + if (modules_nb) update_infos(0); } void ModInfoView::update_infos(uint8_t modn) { @@ -331,10 +331,10 @@ ModInfoView::ModInfoView(NavigationView& nav) { FIL modfile; DIR rootdir; FRESULT res; + uint8_t c; using option_t = std::pair; using options_t = std::vector; - uint8_t c; option_t opt; options_t opts; @@ -414,11 +414,13 @@ ModInfoView::ModInfoView(NavigationView& nav) { } f_closedir(&rootdir); - memcpy(info_str, "Found ", 7); - strcat(info_str, to_string_dec_uint(c, 1).c_str()); - strcat(info_str, " module(s)"); + modules_nb = c; - if (c) { + if (modules_nb) { + strcpy(info_str, "Found "); + strcat(info_str, to_string_dec_uint(modules_nb, 1).c_str()); + strcat(info_str, " module(s)"); + text_modcount.set(info_str); option_modules.set_options(opts); @@ -428,6 +430,9 @@ ModInfoView::ModInfoView(NavigationView& nav) { (void)n; update_infos(v); }; + } else { + strcpy(info_str, "No modules found"); + text_modcount.set(info_str); } button_ok.on_select = [&nav,this](Button&){ @@ -436,18 +441,21 @@ ModInfoView::ModInfoView(NavigationView& nav) { } void ModInfoView::focus() { - option_modules.focus(); + if (modules_nb) + option_modules.focus(); + else + button_ok.focus(); } SetupMenuView::SetupMenuView(NavigationView& nav) { add_items<7>({ { + { "UI", ui::Color::white(), [&nav](){ nav.push(); } }, { "SD card modules", ui::Color::white(), [&nav](){ nav.push(); } }, { "Date/Time", ui::Color::white(), [&nav](){ nav.push(); } }, { "Frequency correction", ui::Color::white(), [&nav](){ nav.push(); } }, { "Antenna Bias Voltage", ui::Color::white(), [&nav](){ nav.push(); } }, { "Touch screen", ui::Color::white(), [&nav](){ nav.push(); } }, - { "Play dead", ui::Color::red(), [&nav](){ nav.push(); } }, - { "UI", ui::Color::white(), [&nav](){ nav.push(); } }, + { "Play dead", ui::Color::red(), [&nav](){ nav.push(); } } } }); on_left = [&nav](){ nav.pop(); }; } diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index a11f60e89..ba116e1b2 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -269,17 +269,17 @@ private: { 10 * 8, 5 * 16 + 4 }, 10, { - { "5 seconds ", 0 }, + { "5 seconds", 0 }, { "15 seconds", 1 }, - { "1 minute ", 2 }, - { "5 minutes ", 3 }, + { "1 minute", 2 }, + { "5 minutes", 3 }, { "10 minutes", 4 } } }; Button button_ok { - { 4 * 8, 272, 64, 24 }, - "Ok" + { 72, 260, 96, 32 }, + "OK" }; }; @@ -328,6 +328,8 @@ private: moduleinfo_t module_list[8]; // 8 max for now + uint8_t modules_nb; + Text text_modcount { { 2 * 8, 1 * 16, 18 * 8, 16 }, "Searching..." @@ -336,7 +338,8 @@ private: OptionsField option_modules { { 2 * 8, 2 * 16 }, 24, - { { "-", 0 } + { + { "-", 0 } } }; diff --git a/firmware/application/ui_textentry.cpp b/firmware/application/ui_textentry.cpp new file mode 100644 index 000000000..83048e97c --- /dev/null +++ b/firmware/application/ui_textentry.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_textentry.hpp" + +namespace ui { + +bool textentry(NavigationView& nav, char * str, uint16_t max_length) { + if (portapack::persistent_memory::ui_config_textentry() == 0) { + auto an_view = nav.push(str, max_length); + an_view->on_changed = [str, max_length](char * value) { + memcpy(str, value, max_length + 1); + }; + } else { + auto an_view = nav.push(str, max_length); + an_view->on_changed = [str, max_length](char * value) { + memcpy(str, value, max_length + 1); + }; + } + + return true; +} + +} /* namespace ui */ diff --git a/firmware/application/ui_textentry.hpp b/firmware/application/ui_textentry.hpp new file mode 100644 index 000000000..98b86cd35 --- /dev/null +++ b/firmware/application/ui_textentry.hpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui.hpp" +#include "ui_navigation.hpp" +#include "ui_handwrite.hpp" +#include "ui_alphanum.hpp" +#include "portapack_persistent_memory.hpp" + +namespace ui { + +bool textentry(NavigationView& nav, char * str, uint16_t max_length); + +} /* namespace ui */ diff --git a/firmware/application/ui_xylos.cpp b/firmware/application/ui_xylos.cpp index 54e150019..1ef6ac325 100644 --- a/firmware/application/ui_xylos.cpp +++ b/firmware/application/ui_xylos.cpp @@ -435,7 +435,6 @@ XylosView::XylosView( transmitter_model.enable(); } }; - } } /* namespace ui */ diff --git a/firmware/application/ui_xylos.hpp b/firmware/application/ui_xylos.hpp index 5601d0164..132b204b2 100644 --- a/firmware/application/ui_xylos.hpp +++ b/firmware/application/ui_xylos.hpp @@ -23,21 +23,20 @@ #include "ui.hpp" #include "ui_widget.hpp" #include "ui_painter.hpp" -#include "ui_menu.hpp" #include "ui_navigation.hpp" +#include "ui_menu.hpp" #include "ui_font_fixed_8x16.hpp" #include "bulb_on_bmp.hpp" #include "bulb_off_bmp.hpp" #include "bulb_ignore_bmp.hpp" -#include "clock_manager.hpp" #include "message.hpp" -#include "rf_path.hpp" #include "max2837.hpp" #include "volume.hpp" #include "transmitter_model.hpp" -#include "receiver_model.hpp" +//#include "receiver_model.hpp" +#include "portapack.hpp" namespace ui { diff --git a/firmware/baseband-tx.bin b/firmware/baseband-tx.bin index 0bbd08fbfa90f76ef58db22acd2eab6e84654518..f37fb9eeb82e81ff34a97ec87f9db963346a2732 100644 GIT binary patch delta 5092 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 Z?He*!ojMRHAb+4$pA{FWdGud){{g!Wyp#X{ delta 2115 zcmZWr4Nz3q6+ZXwF7CcXcq*(2i@e?Cck$-|R$^$9MaZ&fm7gSSG!wG~HA@>ER3<|v zmV!f4$MnbaSVJYYs7*&nr-SY|u|)!!m^K=$Hq%zfjL4V-8f^QpZuZH8w>>K~L-o#l z@1Aq-Ip?19y>s_%b1QFd#%VK@J`=tuZ8}o~Ap=##!QQ3xTP^{u`J-(GH$X+{ECLnmIN-#c+lds1vTb!`Nf{uK_8Ow zGHt!7!2??!8DoTO-l(B0*tt)}^@7Bo*07$mN*RA5*u{stXUBS4#y<#)C094}&R+J< zt)<--O5{K{G0W1Og)*9*crQ%R)UM?F5|p|&Wo?+ii}6&Gr1=Z zFUEf*`11f72$iIYzlrH0@vS_3Y2JFiB0u=yyks8JL9Fi24}P&=F%uurFN~S_+%Xe4 z0!&${V?tsn>&6X5B12!l(3#JIx-7qS3tC=miH;IyCer2j)I;7qUOUVmo0y4$2n%Yw|1NLQQ;Uqt`Gd zFo_Np$t%!l2TOmT?2R|rhI?Gc1nLWz^OG%Z`C26GRBLvZL$Sh`)w^}XwY#L$Kwj~V3>Ly+Dbcj{njTiM!treG zJe9Q@4h^aRi@dyjQ7Kc*YVUuZ`zb|~g@TLp)Wh#aDv63#{JZ1XrJ#Hq`F{^k-jCex zvGbnCV_4%%;c_81IWvu*lt%El)5(VLlJno}I(EBqNdDZF!S@1$iCRY< z8mTYiZGaFOdd50#wnC_7<7NkQ4%Z6fBD_w_>EW&V?Al?bb}!XchuhMh%WcsQkH$i@ zF2k6Wf%39`e~#IDrB@G!A_s9tdI7pKB+qIc+Sv>j2I2ygRS$TLPDQ;=N1ksg962`@ zXJ9xu0=;cE5SxpF`!d>Cl0M1WEQg8%?+2Rc-K8X3a_3N1hADhFE8w+FSx&@#L^QW2 z1we_PiYCPlVL&KAzaH)-S3UeA{ap$Pps$XG-TzqhMo$m%G~FTP*ONG!mC0{RqL{ss zH%tb7*+xcGuFLsOR*yD7EiphXF+eTxKU#7qfj;ekS|tl(2F^p*@ls9(dlScV7P5A< zxNF>}v?yHzU(?m8MKhxq)C3>hYl01$j|$J6!UOJ2k8amCdWA7Fi#mYv!UM*(d&V~> z52)30+DISWL4Y67bGjs~T)HQ@i7qO5CbK|3y1UJQhrA zV#<3)MUNgn(=F5Y@#GTv>=CXK-dKV^%lnsDrmeeO?Ti`=<$Bno;r@I(mwouV{7sx` z7*}AEHHQ+fjPMqBUBnW!8c)B3Hib>ipu_+&wSX8&2}t&ciJjeJw#3#9L!rT37& z*N0ygGz9~XNOLU1c7SmL3%*gBWwfwVfO!N5p7SlV6iY+{p(Z%&D>TOyyD0q(TB7+# tMsO?r7+Z!(A15%ZdTIf#@T3b@-2lUcad+_ihGp5o%8ecI;{E>!{tMS7CYJyJ diff --git a/firmware/baseband-tx/Makefile b/firmware/baseband-tx/Makefile index db9f9a07d..2079d1b67 100755 --- a/firmware/baseband-tx/Makefile +++ b/firmware/baseband-tx/Makefile @@ -143,6 +143,7 @@ CPPSRC = main.cpp \ proc_epar.cpp \ proc_playaudio.cpp \ proc_xylos.cpp \ + proc_rds.cpp \ dsp_squelch.cpp \ clock_recovery.cpp \ packet_builder.cpp \ diff --git a/firmware/baseband-tx/baseband_thread.cpp b/firmware/baseband-tx/baseband_thread.cpp index eeb1fdea8..83118ff60 100644 --- a/firmware/baseband-tx/baseband_thread.cpp +++ b/firmware/baseband-tx/baseband_thread.cpp @@ -33,6 +33,7 @@ #include "proc_xylos.hpp" #include "proc_epar.hpp" #include "proc_fsk_lcr.hpp" +#include "proc_rds.hpp" #include "rssi.hpp" #include "i2s.hpp" @@ -126,6 +127,7 @@ BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { case 2: return new XylosProcessor(); case 3: return new LCRFSKProcessor(); case 4: return new EPARProcessor(); + case 5: return new RDSProcessor(); default: return nullptr; } } diff --git a/firmware/baseband-tx/proc_fsk_lcr.cpp b/firmware/baseband-tx/proc_fsk_lcr.cpp index a7de6a094..a76b002cf 100644 --- a/firmware/baseband-tx/proc_fsk_lcr.cpp +++ b/firmware/baseband-tx/proc_fsk_lcr.cpp @@ -35,13 +35,13 @@ void LCRFSKProcessor::execute(const buffer_c8_t& buffer) { if (sample_count >= shared_memory.afsk_samples_per_bit) { if (shared_memory.afsk_transmit_done == false) - cur_byte = shared_memory.lcrdata[byte_pos]; + cur_byte = shared_memory.radio_data[byte_pos]; if (!cur_byte) { if (shared_memory.afsk_repeat) { shared_memory.afsk_repeat--; bit_pos = 0; byte_pos = 0; - cur_byte = shared_memory.lcrdata[0]; + cur_byte = shared_memory.radio_data[0]; message.n = shared_memory.afsk_repeat; shared_memory.application_queue.push(message); } else { diff --git a/firmware/baseband-tx/proc_rds.cpp b/firmware/baseband-tx/proc_rds.cpp index d6fb366f0..cc05fe308 100644 --- a/firmware/baseband-tx/proc_rds.cpp +++ b/firmware/baseband-tx/proc_rds.cpp @@ -27,21 +27,24 @@ #include void RDSProcessor::execute(const buffer_c8_t& buffer) { + uint32_t * rdsdata; - for (size_t i = 0; i= 9) { s = 0; if(sample_count >= SAMPLES_PER_BIT) { - cur_bit = (shared_memory.rdsdata[(bit_pos / 26) & 15]>>(25-(bit_pos % 26))) & 1; + cur_bit = (rdsdata[(bit_pos / 26) & 15] >> (25 - (bit_pos % 26))) & 1; prev_output = cur_output; cur_output = prev_output ^ cur_bit; - int32_t *src = waveform_biphase; + const int32_t *src = waveform_biphase; // const ok ? int idx = in_sample_index; - for(int j=0; j= SAMPLE_BUFFER_SIZE) in_sample_index -= SAMPLE_BUFFER_SIZE; - bit_pos++; + if (bit_pos < shared_memory.bit_length) + bit_pos++; + else + bit_pos = 0; sample_count = 0; } @@ -60,7 +66,7 @@ void RDSProcessor::execute(const buffer_c8_t& buffer) { out_sample_index++; if (out_sample_index >= SAMPLE_BUFFER_SIZE) out_sample_index = 0; - //AM @ 228k/4=57kHz + //AM @ 228k/4 = 57kHz switch (mphase) { case 0: case 2: sample = 0; break; @@ -80,11 +86,10 @@ void RDSProcessor::execute(const buffer_c8_t& buffer) { phase = (phase + frq); sphase = phase + (256<<16); - - //re = sintab[(sphase & 0x03FF0000)>>16]; - //im = sintab[(phase & 0x03FF0000)>>16]; + + re = (sine_table_f32[(sphase & 0x03FF0000)>>18]*127); + im = (sine_table_f32[(phase & 0x03FF0000)>>18]*127); buffer.p[i] = {(int8_t)re,(int8_t)im}; } } - diff --git a/firmware/baseband-tx/proc_rds.hpp b/firmware/baseband-tx/proc_rds.hpp index 17faadaae..adbecadd8 100644 --- a/firmware/baseband-tx/proc_rds.hpp +++ b/firmware/baseband-tx/proc_rds.hpp @@ -45,12 +45,12 @@ private: int sample_count = SAMPLES_PER_BIT; int in_sample_index = 0; int32_t sample; - int out_sample_index = SAMPLE_BUFFER_SIZE-1; + int out_sample_index = SAMPLE_BUFFER_SIZE - 1; uint32_t phase, sphase; int32_t sig, frq, frq_im, rdsc; int32_t k; - int32_t waveform_biphase[576] = { + const int32_t waveform_biphase[576] = { 165,167,168,168,167,166,163,160, 157,152,147,141,134,126,118,109, 99,88,77,66,53,41,27,14, diff --git a/firmware/common/modules.h b/firmware/common/modules.h index aefa79ff0..dfaf5445c 100644 --- a/firmware/common/modules.h +++ b/firmware/common/modules.h @@ -1,2 +1,2 @@ const char md5_baseband[16] = {0xb8,0x9e,0x9b,0x08,0x44,0x34,0x04,0x20,0x0b,0xbc,0x60,0x7e,0x67,0x88,0x53,0xf7,}; -const char md5_baseband_tx[16] = {0xf2,0x82,0xb2,0x1e,0xc7,0xaa,0x15,0x73,0x02,0x74,0xbf,0x51,0xbe,0x6c,0xca,0xd0,}; +const char md5_baseband_tx[16] = {0x76,0x21,0x56,0xb0,0x12,0x45,0xdd,0x66,0x87,0xee,0x8a,0x97,0xda,0xee,0xc5,0xac,}; diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 88f55dea9..4354ea696 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -72,7 +72,7 @@ struct data_t { uint32_t playing_dead; uint32_t playdead_sequence; - int32_t ui_config; + uint32_t ui_config; }; static_assert(sizeof(data_t) <= backup_ram.size(), "Persistent memory structure too large for VBAT-maintained region"); @@ -164,7 +164,7 @@ uint32_t ui_config() { // Cap value bloff_value = (data->ui_config >> 5) & 7; - if (bloff_value > 4) bloff_value = 1; + if (bloff_value > 4) bloff_value = 1; // 15s default data->ui_config = (data->ui_config & 0x1F) | (bloff_value << 5); @@ -184,6 +184,14 @@ uint16_t ui_config_bloff() { return bloff_seconds[bloff_value]; } +void set_config_textentry(uint8_t new_value) { + data->ui_config = (data->ui_config & ~0b1100) | ((new_value & 1) << 2); +} + +uint8_t ui_config_textentry() { + return ((data->ui_config >> 2) & 1); +} + void set_ui_config(const uint32_t new_value) { data->ui_config = new_value; } diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 294d9ebe4..7646ec808 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -60,8 +60,12 @@ void set_playdead_sequence(const uint32_t new_value); uint32_t ui_config(); void set_ui_config(const uint32_t new_value); + uint16_t ui_config_bloff(); +uint8_t ui_config_textentry(); +void set_config_textentry(uint8_t new_value); + } /* namespace persistent_memory */ } /* namespace portapack */ diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index acc2881ab..1995aadd0 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -53,10 +53,10 @@ struct SharedMemory { TouchADCFrame touch_adc_frame; int test; + + uint8_t radio_data[256]; + size_t bit_length; - uint32_t rdsdata[16]; - - uint8_t lcrdata[256]; uint32_t afsk_samples_per_bit; uint32_t afsk_phase_inc_mark; uint32_t afsk_phase_inc_space; @@ -69,6 +69,7 @@ struct SharedMemory { char xylosdata[21]; char epardata[13]; int32_t excursion; + bool transmit_done; }; diff --git a/firmware/common/ui_painter.cpp b/firmware/common/ui_painter.cpp index 2b54e1948..b97caf3c3 100644 --- a/firmware/common/ui_painter.cpp +++ b/firmware/common/ui_painter.cpp @@ -32,7 +32,7 @@ Style Style::invert() const { return { .font = font, .background = foreground, - .foreground = background, + .foreground = background }; } diff --git a/firmware/common/ui_painter.hpp b/firmware/common/ui_painter.hpp index 98d6d36e7..dd3938843 100644 --- a/firmware/common/ui_painter.hpp +++ b/firmware/common/ui_painter.hpp @@ -60,7 +60,6 @@ public: private: void draw_hline(Point p, int width, const Color c); void draw_vline(Point p, int height, const Color c); - void paint_widget(Widget* const w); }; diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index b6f8afbe7..2484b3d7d 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -538,23 +538,19 @@ void Button::paint(Painter& painter) { const auto paint_style = (has_focus() || highlighted()) ? style().invert() : style(); - painter.draw_rectangle(r, style().foreground); + painter.draw_rectangle(r, paint_style.foreground); painter.fill_rectangle( { r.pos.x + 1, r.pos.y + 1, r.size.w - 2, r.size.h - 2 }, paint_style.background ); - //char *token = strtok(text_.c_str(), "\n"); - //while(token) { - const auto label_r = paint_style.font.size_of(text_); - painter.draw_string( - { r.pos.x + (r.size.w - label_r.w) / 2, r.pos.y + (r.size.h - label_r.h) / 2 }, - paint_style, - text_ - ); - // token = strtok(NULL, " "); - //} + const auto label_r = paint_style.font.size_of(text_); + painter.draw_string( + { r.pos.x + (r.size.w - label_r.w) / 2, r.pos.y + (r.size.h - label_r.h) / 2 }, + paint_style, + text_ + ); } bool Button::on_key(const KeyEvent key) { @@ -735,10 +731,10 @@ size_t ImageOptionsField::selected_index_value() const { } void ImageOptionsField::set_selected_index(const size_t new_index) { - if( new_index < options.size() ) { - if( new_index != selected_index() ) { + if ( new_index < options.size() ) { + if ( new_index != selected_index() ) { selected_index_ = new_index; - if( on_change ) { + if ( on_change ) { on_change(selected_index(), options[selected_index()].second); } set_dirty(); @@ -768,7 +764,7 @@ void ImageOptionsField::paint(Painter& painter) { if( selected_index() < options.size() ) { const auto bmp_ptr = options[selected_index()].first; - portapack::display.fill_rectangle({screen_rect().pos, {screen_rect().size.w + 4, screen_rect().size.h + 4}}, ui::Color::black()); + painter.fill_rectangle({screen_rect().pos, {screen_rect().size.w + 4, screen_rect().size.h + 4}}, ui::Color::black()); painter.draw_rectangle({screen_rect().pos, {screen_rect().size.w + 4, screen_rect().size.h + 4}}, paint_style.background); portapack::display.drawBMP({screen_pos().x + 2, screen_pos().y + 1}, bmp_ptr, true); } @@ -844,7 +840,9 @@ void OptionsField::set_options(options_t new_options) { void OptionsField::paint(Painter& painter) { const auto paint_style = has_focus() ? style().invert() : style(); - + + painter.fill_rectangle({screen_rect().pos, {length_ * 8, 16}}, ui::Color::black()); + if( selected_index() < options.size() ) { const auto text = options[selected_index()].first; painter.draw_string( diff --git a/firmware/portapack-h1-firmware.bin b/firmware/portapack-h1-firmware.bin index 93c8b6b72ebe1bfa298ce3761ded3995464bdc95..74ab82e9175f7c0708adec4bf0773d4e2bf81310 100644 GIT binary patch delta 72755 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 QXtEFKlRZJTFG4B&Uu~7A{{R30 delta 62400 zcmaHT2Y6IP_xIeJxtq9i<(+a&i2WeT>*dBuc59Sumx;4&W0YJSWyyV|_M#Wl zi1`(`y>MnH(SPhigKSAw{*h{RvYyehHR^XwVoRgt6gl6?u0n*|uCe-PIaPK#+4^YN zp8lLBIUH{Dp7XOVb+V5|8q>(X(#o97V3hOag&K1jv>GbH>dw%`C+o|Q zmj=I_RuG%SH*3sokv;L3_(=Z2_Vkw6X2P#wUs&YZ%^8|``_zi4qbA9U3YdYIDNnqP z_FnY$k4Ge)J?x@6QKZZ&@jLxx_DE(&{Emvj)q|@>dE>Ipo^{JR-I8rneX4z#cYxVi z@z_l7o{`7jB@&sEiB z%i*?Gc=s$skwg4B<8v-vXeTyWA@Rrj?B*j+rwB1+l`t#<3hc z!w6{}g=syQkXFE7UqnddFqV}q4;pqjm|p#(L_?%((#!mcJ$BFn-2qTg1N}JaQSn_Q*W_- zd2()1SncNB?~SwW_fqqIuaQVirqRh+F$K=A!>Zjo{f;U!l1ox-#kGeWcZ?bx1+v6$ zau4YgJCG-*DXy1T2&X%2n*%GVVlM+5U%$lvTUHXxIV3q%p zeqb-#b(Ry`P!95a?+J~@9pTziq+NE*ngAFqf#W{f4LmQI~zlk5j( znvR*t{piP#dTr?ZZXjLVP=N-{W;fX7s|%NgHXVs0qJdFIVUZ5tudXL>xZ?i zbjXd8B@~bvV>XWTyy2b^pRn*Rg*N zto2TGc00TmYm|^W{70I`Y6|7MvX)>ald?cBVkY^-Y}|D*4;LwwA$5L`{az^dNtlaO zKCd?+6W~ZC>)A(sUH&%E_FEr0S(3N-Sg5a@EHXxpj5B?rdQOdP?uY&C-Y|Q! zpS-R6UX31$BTBWQYR?gKSx9~HWoIQJ&-TGi3fBR*x({2^U;fj4kv8u5M7zK?RfW_t zjjeKGpK(^Q9ZvZwS<+ZSk(}=a;NQ=}=&YC6q$0Vt=SQ!Q z*J=f&z^V+YZvnpJJa`Y_<(2HWB6&%hXP9h_jyaG+$T2vnZFRZai^fQ~ge1Y)*uDxm zBW9!(y#hDA?LdV**qAWVfrj)z9Q-Xk+O8cT+iA=JL>z;Y*n~^u6gFUl+ßRF=l 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 diff --git a/sdcard/baseband-tx.bin b/sdcard/baseband-tx.bin index 0bbd08fbfa90f76ef58db22acd2eab6e84654518..f37fb9eeb82e81ff34a97ec87f9db963346a2732 100644 GIT binary patch delta 5092 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 Z?He*!ojMRHAb+4$pA{FWdGud){{g!Wyp#X{ delta 2115 zcmZWr4Nz3q6+ZXwF7CcXcq*(2i@e?Cck$-|R$^$9MaZ&fm7gSSG!wG~HA@>ER3<|v zmV!f4$MnbaSVJYYs7*&nr-SY|u|)!!m^K=$Hq%zfjL4V-8f^QpZuZH8w>>K~L-o#l z@1Aq-Ip?19y>s_%b1QFd#%VK@J`=tuZ8}o~Ap=##!QQ3xTP^{u`J-(GH$X+{ECLnmIN-#c+lds1vTb!`Nf{uK_8Ow zGHt!7!2??!8DoTO-l(B0*tt)}^@7Bo*07$mN*RA5*u{stXUBS4#y<#)C094}&R+J< zt)<--O5{K{G0W1Og)*9*crQ%R)UM?F5|p|&Wo?+ii}6&Gr1=Z zFUEf*`11f72$iIYzlrH0@vS_3Y2JFiB0u=yyks8JL9Fi24}P&=F%uurFN~S_+%Xe4 z0!&${V?tsn>&6X5B12!l(3#JIx-7qS3tC=miH;IyCer2j)I;7qUOUVmo0y4$2n%Yw|1NLQQ;Uqt`Gd zFo_Np$t%!l2TOmT?2R|rhI?Gc1nLWz^OG%Z`C26GRBLvZL$Sh`)w^}XwY#L$Kwj~V3>Ly+Dbcj{njTiM!treG zJe9Q@4h^aRi@dyjQ7Kc*YVUuZ`zb|~g@TLp)Wh#aDv63#{JZ1XrJ#Hq`F{^k-jCex zvGbnCV_4%%;c_81IWvu*lt%El)5(VLlJno}I(EBqNdDZF!S@1$iCRY< z8mTYiZGaFOdd50#wnC_7<7NkQ4%Z6fBD_w_>EW&V?Al?bb}!XchuhMh%WcsQkH$i@ zF2k6Wf%39`e~#IDrB@G!A_s9tdI7pKB+qIc+Sv>j2I2ygRS$TLPDQ;=N1ksg962`@ zXJ9xu0=;cE5SxpF`!d>Cl0M1WEQg8%?+2Rc-K8X3a_3N1hADhFE8w+FSx&@#L^QW2 z1we_PiYCPlVL&KAzaH)-S3UeA{ap$Pps$XG-TzqhMo$m%G~FTP*ONG!mC0{RqL{ss zH%tb7*+xcGuFLsOR*yD7EiphXF+eTxKU#7qfj;ekS|tl(2F^p*@ls9(dlScV7P5A< zxNF>}v?yHzU(?m8MKhxq)C3>hYl01$j|$J6!UOJ2k8amCdWA7Fi#mYv!UM*(d&V~> z52)30+DISWL4Y67bGjs~T)HQ@i7qO5CbK|3y1UJQhrA zV#<3)MUNgn(=F5Y@#GTv>=CXK-dKV^%lnsDrmeeO?Ti`=<$Bno;r@I(mwouV{7sx` z7*}AEHHQ+fjPMqBUBnW!8c)B3Hib>ipu_+&wSX8&2}t&ciJjeJw#3#9L!rT37& z*N0ygGz9~XNOLU1c7SmL3%*gBWwfwVfO!N5p7SlV6iY+{p(Z%&D>TOyyD0q(TB7+# tMsO?r7+Z!(A15%ZdTIf#@T3b@-2lUcad+_ihGp5o%8ecI;{E>!{tMS7CYJyJ