From 4b37f1bb2fd00cd98da6a9f2ffd956c063eecfce Mon Sep 17 00:00:00 2001 From: Kyle Reed Date: Fri, 28 Apr 2023 19:26:53 -0700 Subject: [PATCH 1/6] Add a TestField widget that supports a cursor. --- firmware/application/ui/ui_alphanum.cpp | 17 +- firmware/application/ui/ui_alphanum.hpp | 1 - firmware/application/ui/ui_textentry.cpp | 213 +++++++++++++++++------ firmware/application/ui/ui_textentry.hpp | 59 +++++-- firmware/common/ui_painter.cpp | 4 +- firmware/common/ui_painter.hpp | 4 +- 6 files changed, 218 insertions(+), 80 deletions(-) diff --git a/firmware/application/ui/ui_alphanum.cpp b/firmware/application/ui/ui_alphanum.cpp index 16d2f300..f9161fc5 100644 --- a/firmware/application/ui/ui_alphanum.cpp +++ b/firmware/application/ui/ui_alphanum.cpp @@ -30,10 +30,6 @@ namespace ui { -void AlphanumView::paint(Painter&) { - draw_cursor(); -} - AlphanumView::AlphanumView( NavigationView& nav, std::string& str, @@ -41,7 +37,7 @@ AlphanumView::AlphanumView( ) : TextEntryView(nav, str, max_length) { size_t n; - + add_children({ &button_mode, &text_raw, @@ -77,16 +73,7 @@ AlphanumView::AlphanumView( field_raw.set_value('0'); field_raw.on_select = [this](NumberField&) { char_add(field_raw.value()); - update_text(); }; - - button_ok.on_select = [this, &nav](Button&) { - if (on_changed) - on_changed(_str); - nav.pop(); - }; - - update_text(); } void AlphanumView::set_mode(const uint32_t new_mode) { @@ -120,8 +107,6 @@ void AlphanumView::on_button(Button& button) { char_delete(); else char_add(c); - - update_text(); } bool AlphanumView::on_encoder(const EncoderEvent delta) { diff --git a/firmware/application/ui/ui_alphanum.hpp b/firmware/application/ui/ui_alphanum.hpp index 1e2e42ac..d61ee7fe 100644 --- a/firmware/application/ui/ui_alphanum.hpp +++ b/firmware/application/ui/ui_alphanum.hpp @@ -40,7 +40,6 @@ public: AlphanumView& operator=(const AlphanumView&) = delete; AlphanumView& operator=(AlphanumView&&) = delete; - void paint(Painter& painter) override; bool on_encoder(const EncoderEvent delta) override; private: diff --git a/firmware/application/ui/ui_textentry.cpp b/firmware/application/ui/ui_textentry.cpp index e4e008c1..d867ae62 100644 --- a/firmware/application/ui/ui_textentry.cpp +++ b/firmware/application/ui/ui_textentry.cpp @@ -45,76 +45,191 @@ void text_prompt(NavigationView& nav, std::string& str, const size_t max_length, }*/ } -void TextEntryView::update_text() { - if (cursor_pos < 30) - text_input.set(_str + std::string(_max_length - _str.length(), ' ')); - else - text_input.set('<' + _str.substr(cursor_pos - 29, 29)); - - draw_cursor(); +/* TextField ***********************************************************/ + +TextField::TextField( + std::string& str, + size_t max_length, + Point position, + uint32_t length +) : Widget{ { position, { 8 * static_cast(length), 16 } } }, + text_{ str }, + max_length_{ std::max(max_length, 1) }, + char_count_{ std::max(length, 1) }, + cursor_pos_{ text_.length() }, + insert_mode_{ true } +{ + set_focusable(true); } +const std::string& TextField::value() const { + return text_; +} + +void TextField::set(const std::string& str) { + // Assume that setting the string implies we want the whole thing. + max_length_ = std::max(max_length_, str.length()); + + text_ = str; + cursor_pos_ = str.length(); + set_cursor(str.length()); +} + +void TextField::set_cursor(uint32_t pos) { + cursor_pos_ = std::min(pos, text_.length()); + set_dirty(); +} + +void TextField::set_max_length(size_t max_length) { + // Doesn't make sense, ignore. + if (max_length == 0) + return; + + if (max_length < text_.length()) { + text_.erase(max_length - 1); + text_.shrink_to_fit(); + } else { + text_.reserve(max_length); + } + + max_length_ = max_length; + set_cursor(cursor_pos_); +} + +void TextField::set_insert_mode() { + insert_mode_ = true; +} + +void TextField::set_overwrite_mode() { + insert_mode_ = false; +} + +void TextField::char_add(char c) { + // Don't add if inserting and at max_length and + // don't overwrite if past the end of the text. + if ((text_.length() >= max_length_ && insert_mode_) || + (cursor_pos_ >= text_.length() && !insert_mode_)) + return; + + if (insert_mode_) + text_.insert(cursor_pos_, 1, c); + else + text_[cursor_pos_] = c; + + cursor_pos_++; + set_dirty(); +} + +void TextField::char_delete() { + if (cursor_pos_ == 0) + return; + + cursor_pos_--; + text_.erase(cursor_pos_, 1); + set_dirty(); +} + +void TextField::paint(Painter& painter) { + constexpr int char_width = 8; + + auto rect = screen_rect(); + auto text_style = has_focus() ? style().invert() : style(); + auto offset = 0; + + // Does the string need to be shifted? + if (cursor_pos_ >= char_count_) + offset = cursor_pos_ - char_count_ + 1; + + // Clear the control. + painter.fill_rectangle(rect, text_style.background); + + // Draw the text starting at the offset. + for (uint32_t i = 0; i < char_count_ && i + offset < text_.length(); i++) { + painter.draw_char( + { rect.location().x() + (static_cast(i) * char_width), rect.location().y() }, + text_style, + text_[i + offset] + ); + } + + // Determine cursor position on screen (either the cursor position or the last char). + int32_t cursor_x = char_width * (offset > 0 ? char_count_ - 1 : cursor_pos_); + Point cursor_point{ screen_pos().x() + cursor_x, screen_pos().y() }; + auto cursor_style = text_style.invert(); + + // Invert the cursor character when in overwrite mode. + if (!insert_mode_ && (cursor_pos_) < text_.length()) + painter.draw_char(cursor_point, cursor_style, text_[cursor_pos_]); + + // Draw the cursor. + Rect cursor_box{ cursor_point, { char_width, 16 } }; + painter.draw_rectangle(cursor_box, cursor_style.background); +} + +bool TextField::on_key(const KeyEvent key) { + if (key == KeyEvent::Left && cursor_pos_ > 0) + cursor_pos_--; + else if (key == KeyEvent::Right && cursor_pos_ < text_.length()) + cursor_pos_++; + else if (key == KeyEvent::Select) + insert_mode_ = !insert_mode_; + else + return false; + + set_dirty(); + return true; +} + +bool TextField::on_encoder(const EncoderEvent delta) { + int32_t new_pos = cursor_pos_ + delta; + + // Let the encoder wrap around the ends of the text. + if (new_pos < 0) + new_pos = text_.length(); + else if (static_cast(new_pos) > text_.length()) + new_pos = 0; + + set_cursor(new_pos); + return true; +} + +bool TextField::on_touch(const TouchEvent event) { + if (event.type == TouchEvent::Type::Start) + focus(); + + set_dirty(); + return true; +} + +/* TextEntryView ***********************************************************/ + void TextEntryView::char_delete() { - if (!cursor_pos) return; - - cursor_pos--; - _str.resize(cursor_pos); + text_input.char_delete(); } void TextEntryView::char_add(const char c) { - if (cursor_pos >= _max_length) return; - - _str += c; - cursor_pos++; -} - -void TextEntryView::draw_cursor() { - Point draw_pos; - - draw_pos = { text_input.screen_rect().location().x() + std::min((Coord)cursor_pos, (Coord)28) * 8, - text_input.screen_rect().location().y() + 16 }; - - // Erase previous - display.fill_rectangle( - { { text_input.screen_rect().location().x(), draw_pos.y() }, { text_input.screen_rect().size().width(), 4 } }, - Color::black() - ); - // Draw new - display.fill_rectangle( - { draw_pos, { 8, 4 } }, - Color::white() - ); + text_input.char_add(c); } void TextEntryView::focus() { - button_ok.focus(); + text_input.focus(); } TextEntryView::TextEntryView( NavigationView& nav, std::string& str, size_t max_length -) : _str(str), - _max_length(max_length) +) : text_input{ str, max_length, { 0, 0 } } { - - // Trim from right - //_str->erase(std::find_if(_str->rbegin(), _str->rend(), std::not1(std::ptr_fun(std::isspace))).base(), _str->end()); - if (_str.length() > _max_length) - _str.resize(_max_length); - _str.reserve(_max_length); - - cursor_pos = _str.length(); - add_children({ &text_input, &button_ok }); - - button_ok.on_select = [this, &nav](Button&) { - _str.resize(cursor_pos); + + button_ok.on_select = [this, &str, &nav](Button&) { + str.shrink_to_fit(); // NB: str is the TextField string. if (on_changed) - on_changed(_str); + on_changed(str); nav.pop(); }; } diff --git a/firmware/application/ui/ui_textentry.hpp b/firmware/application/ui/ui_textentry.hpp index 9cd6f519..3641f2be 100644 --- a/firmware/application/ui/ui_textentry.hpp +++ b/firmware/application/ui/ui_textentry.hpp @@ -28,6 +28,54 @@ namespace ui { +// A TextField is bound to a string reference and allows the string +// to be manipulated. The field itself does not provide the UI for +// setting the value. It provides the UI of rendering the text, +// a cursor, and an API to edit the string content. +class TextField : public Widget { +public: + TextField(std::string& str, Point position, uint32_t length = 30) + : TextField{str, 64, position, length} { } + + // Str: the string containing the content to edit. + // Max_length: max length the string is allowed to use. + // Position: the top-left corner of the control. + // Length: the number of characters to display. + // - Characters are 8 pixels wide. + // - The screen can show 30 characters max. + // - The control is 16 pixels tall. + TextField(std::string& str, size_t max_length, Point position, uint32_t length = 30); + + TextField(const TextField&) = delete; + TextField(TextField&&) = delete; + TextField& operator=(const TextField&) = delete; + TextField& operator=(TextField&&) = delete; + + const std::string& value() const; + + void set(const std::string& str); + void set_cursor(uint32_t pos); + void set_max_length(size_t max_length); + void set_insert_mode(); + void set_overwrite_mode(); + + void char_add(char c); + void char_delete(); + + void paint(Painter& painter) override; + + bool on_key(const KeyEvent key) override; + bool on_encoder(const EncoderEvent delta) override; + bool on_touch(const TouchEvent event) override; + +protected: + std::string& text_; + size_t max_length_; + uint32_t char_count_; + uint32_t cursor_pos_; + bool insert_mode_; +}; + class TextEntryView : public View { public: std::function on_changed { }; @@ -45,17 +93,8 @@ protected: void char_add(const char c); void char_delete(); - void draw_cursor(); - void update_text(); - - std::string& _str; - size_t _max_length; - uint32_t cursor_pos { 0 }; - - Text text_input { - { 0, 0, 240, 16 } - }; + TextField text_input; Button button_ok { { 10 * 8, 33 * 8, 9 * 8, 32 }, "OK" diff --git a/firmware/common/ui_painter.cpp b/firmware/common/ui_painter.cpp index 2cb0d93f..b390668b 100644 --- a/firmware/common/ui_painter.cpp +++ b/firmware/common/ui_painter.cpp @@ -43,7 +43,7 @@ int Painter::draw_char(const Point p, const Style& style, const char c) { } int Painter::draw_string(Point p, const Font& font, const Color foreground, - const Color background, const std::string text) { + const Color background, const std::string& text) { bool escape = false; size_t width = 0; @@ -71,7 +71,7 @@ int Painter::draw_string(Point p, const Font& font, const Color foreground, return width; } -int Painter::draw_string(Point p, const Style& style, const std::string text) { +int Painter::draw_string(Point p, const Style& style, const std::string& text) { return draw_string(p, style.font, style.foreground, style.background, text); } diff --git a/firmware/common/ui_painter.hpp b/firmware/common/ui_painter.hpp index 369e3a57..0fb867c7 100644 --- a/firmware/common/ui_painter.hpp +++ b/firmware/common/ui_painter.hpp @@ -49,8 +49,8 @@ public: int draw_char(const Point p, const Style& style, const char c); int draw_string(Point p, const Font& font, const Color foreground, - const Color background, const std::string text); - int draw_string(Point p, const Style& style, const std::string text); + const Color background, const std::string& text); + int draw_string(Point p, const Style& style, const std::string& text); void draw_bitmap(const Point p, const Bitmap& bitmap, const Color background, const Color foreground); From 98e7116230197d4287a608e27a2e5542c0eaf260 Mon Sep 17 00:00:00 2001 From: GullCode Date: Sat, 29 Apr 2023 21:46:19 +0200 Subject: [PATCH 2/6] Changed to per pixel marker, short freq display, adjusted <24Mhz view to look like SPEC one --- .../application/apps/ui_looking_glass_app.cpp | 93 +++++++++++-------- .../application/apps/ui_looking_glass_app.hpp | 17 ++-- 2 files changed, 60 insertions(+), 50 deletions(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index 5d696476..c41409bb 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -28,7 +28,7 @@ namespace ui { void GlassView::focus() { - field_marker.focus(); + button_marker.focus(); } GlassView::~GlassView() @@ -130,7 +130,7 @@ namespace ui last_max_freq = max_freq_hold ; freq_stats.set( "MAX HOLD: "+to_string_short_freq( max_freq_hold ) ); } - PlotMarker(field_marker.value()); + PlotMarker( marker ); } else { @@ -148,19 +148,38 @@ namespace ui if( fast_scan || ( LOOKING_GLASS_SLICE_WIDTH < LOOKING_GLASS_SLICE_WIDTH_MAX ) ) { // Convert bins of this spectrum slice into a representative max_power and when enough, into pixels - // Spectrum.db has 256 bins. Center 12 bins are ignored (DC spike is blanked) Leftmost and rightmost 2 bins are ignored - // All things said and done, we actually need 240 of those bins: + // Spectrum.db has 256 bins. + // All things said and done, we actually need 240 of those bins for (uint8_t bin = 0; bin < 240; bin++) { - if (bin < 120) + // if the view is done in one pass, show it like in analog_audio_app + if( ( LOOKING_GLASS_SLICE_WIDTH < LOOKING_GLASS_SLICE_WIDTH_MAX ) ) { - if (spectrum.db[134 + bin] > max_power) // 134 - max_power = spectrum.db[134 + bin]; + // Center 16 bins are ignored (DC spike is blanked) + if (bin < 120) + { + if (spectrum.db[256 - 120 + bin] > max_power) // 134 + max_power = spectrum.db[256 - 120 + bin]; + } + else + { + if (spectrum.db[ bin - 120] > max_power) // 118 + max_power = spectrum.db[bin - 120]; + } } - else + else // view is made in multiple pass, use original bin picking { - if (spectrum.db[bin - 118] > max_power) // 118 - max_power = spectrum.db[bin - 118]; + // Center 12 bins are ignored (DC spike is blanked) Leftmost and rightmost 2 bins are ignored + if (bin < 120) + { + if (spectrum.db[134 + bin] > max_power) // 134 + max_power = spectrum.db[134 + bin]; + } + else + { + if (spectrum.db[bin - 118] > max_power) // 118 + max_power = spectrum.db[bin - 118]; + } } bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" @@ -176,8 +195,8 @@ namespace ui if (!pixel_index) // Received indication that a waterfall line has been completed { - bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" - f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep + bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" + f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(10); baseband::spectrum_streaming_start(); // Do the RX @@ -186,14 +205,14 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 240 * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH + f_center += 238 * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH } else //slow scan { - for (uint8_t bin = 0; bin < 120 ; bin++) + for (uint8_t bin = 0 ; bin < 80 ; bin++) { if (spectrum.db[134 + bin] > max_power) // 134 - max_power = spectrum.db[134 + bin]; + max_power = spectrum.db[134 + bin]; bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" @@ -218,7 +237,7 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 120 * each_bin_size ; + f_center += 80 * each_bin_size ; } radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(5); @@ -243,9 +262,7 @@ namespace ui f_min = field_frequency_min.value(); f_max = field_frequency_max.value(); search_span = f_max - f_min; - - field_marker.set_range(f_min, f_max); // Move the marker between range - field_marker.set_value(f_min + (search_span / 2)); // Put MARKER AT MIDDLE RANGE + if( locked_range ) { button_range.set_text(">"+to_string_dec_uint(search_span)+"<"); @@ -260,19 +277,13 @@ namespace ui adjust_range( &f_min , &f_max , 240 ); marker_pixel_step = (f_max - f_min) / 240; // Each pixel value in Hz - text_marker_pm.set(to_string_dec_uint((marker_pixel_step / X2_MHZ_DIV) + 1)); // Give idea of +/- marker precision - - int32_t marker_step = marker_pixel_step / MHZ_DIV; - if (!marker_step) - field_marker.set_step(1); // in case selected range is less than 240 (pixels) - else - field_marker.set_step(marker_step); // step needs to be a pixel wide. f_center_ini = f_min + (LOOKING_GLASS_SLICE_WIDTH / 2); // Initial center frequency for sweep + marker = f_min + (f_max - f_min) / 2 ; + button_marker.set_text( to_string_short_freq( marker ) ); + PlotMarker( marker ); // Refresh marker on screen + - PlotMarker(field_marker.value()); // Refresh marker on screen - - f_center = f_center_ini; // Reset sweep into first slice pixel_index = 0; // reset pixel counter max_power = 0; bins_Hz_size = 0; // reset amount of Hz filled up by pixels @@ -290,18 +301,18 @@ namespace ui } receiver_model.set_squelch_level(0); each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 240 ; + f_center = f_center_ini - 2 * each_bin_size ; // Reset sweep into first slice baseband::set_spectrum(LOOKING_GLASS_SLICE_WIDTH, field_trigger.value()); receiver_model.set_tuning_frequency(f_center_ini); // tune rx for this slice } void GlassView::PlotMarker(rf::Frequency pos) { - pos = pos * MHZ_DIV; pos -= f_min; pos = pos / marker_pixel_step; // Real pixel uint8_t shift_y = 0 ; - if( live_frequency_view > 0 ) + if( live_frequency_view > 0 ) // plot one line down when in live view { shift_y = 16 ; } @@ -329,8 +340,7 @@ namespace ui &filter_config, &field_rf_amp, &range_presets, - &field_marker, - &text_marker_pm, + &button_marker, &field_trigger, &button_jump, &button_rst, @@ -509,16 +519,21 @@ namespace ui this->on_range_changed(); }; - field_marker.on_change = [this](int32_t v) + button_marker.on_change = [this]() { - PlotMarker(v); // Refresh marker on screen + marker = marker + button_marker.get_encoder_delta() * marker_pixel_step ; + if( marker < f_min ) + marker = f_min ; + if( marker > f_max ) + marker = f_max ; + button_marker.set_text( to_string_short_freq( marker ) ); + button_marker.set_encoder_delta( 0 ); + PlotMarker( marker ); // Refresh marker on screen }; - field_marker.on_select = [this](NumberField &) + button_marker.on_select = [this](ButtonWithEncoder &) { - f_center = field_marker.value(); - f_center = f_center * MHZ_DIV; - receiver_model.set_tuning_frequency(f_center); // Center tune rx in marker freq. + receiver_model.set_tuning_frequency(marker); // Center tune rx in marker freq. receiver_model.set_frequency_step(MHZ_DIV); // Preset a 1 MHz frequency step into RX -> AUDIO nav_.pop(); nav_.push(); // Jump into audio view diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index 5b1df967..cea5caf0 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -108,6 +108,7 @@ namespace ui rf::Frequency search_span { 0 }; rf::Frequency f_center { 0 }; rf::Frequency f_center_ini { 0 }; + rf::Frequency marker { 0 }; rf::Frequency marker_pixel_step { 0 }; rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 240 }; rf::Frequency bins_Hz_size { 0 }; @@ -129,7 +130,7 @@ namespace ui {{0, 0}, "MIN: MAX: LNA VGA ", Color::light_grey()}, {{0, 1 * 16}, "RANGE: FILTER: AMP:", Color::light_grey()}, {{0, 2 * 16}, "PRESET:", Color::light_grey()}, - {{0, 3 * 16}, "MARKER: MHz +/- MHz", Color::light_grey()}, + {{0, 3 * 16}, "MARKER: MHz", Color::light_grey()}, {{0, 4 * 16}, "RES: STEP:", Color::light_grey()} }; @@ -180,16 +181,10 @@ namespace ui {" NONE (WIFI 2.4GHz)", 0}, }}; - NumberField field_marker{ - {7 * 8, 3 * 16}, - 4, - {0, 7200}, - 25, - ' '}; - - Text text_marker_pm{ - {20 * 8, 3 * 16, 2 * 8, 16}, - ""}; + ButtonWithEncoder button_marker{ + {7 * 8, 3 * 16 , 10 * 8 , 16}, + " " + }; NumberField field_trigger{ {4 * 8, 4 * 16}, From 1135a42932aa9aad9b08a7f58c6cecff0a7b6996 Mon Sep 17 00:00:00 2001 From: GullCode Date: Sun, 30 Apr 2023 14:56:17 +0200 Subject: [PATCH 3/6] better roundings/per pixel marker --- .../application/apps/ui_looking_glass_app.cpp | 60 ++++++++++++------- .../application/apps/ui_looking_glass_app.hpp | 11 ++-- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index c41409bb..6e03eda2 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -43,11 +43,6 @@ namespace ui return ((num / multiplier) + 1) * multiplier; } - // Returns the previous multiple of num that is a multiple of multiplier - //int64_t GlassView::prev_mult_of(int64_t num, int64_t multiplier) { - // return (num / multiplier) * multiplier; - //} - void GlassView::adjust_range(int64_t* f_min, int64_t* f_max, int64_t width) { int64_t span = *f_max - *f_min; int64_t num_intervals = span / width; @@ -144,6 +139,8 @@ namespace ui // Each having the radio signal power for it's corresponding frequency slot void GlassView::on_channel_spectrum(const ChannelSpectrum &spectrum) { + // default fast scan offset + uint8_t offset = 2 ; baseband::spectrum_streaming_stop(); if( fast_scan || ( LOOKING_GLASS_SLICE_WIDTH < LOOKING_GLASS_SLICE_WIDTH_MAX ) ) { @@ -181,8 +178,15 @@ namespace ui max_power = spectrum.db[bin - 118]; } } - - bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" + + if( bin == 120 ) + { + bins_Hz_size += 12 * each_bin_size; // add DC bin Hz count into the "pixel fulfilled bag of Hz" + } + else + { + bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" + } if (bins_Hz_size >= marker_pixel_step) // new pixel fullfilled { @@ -196,7 +200,7 @@ namespace ui if (!pixel_index) // Received indication that a waterfall line has been completed { bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" - f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep + f_center = f_center_ini - offset * each_bin_size ; // Start a new sweep radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(10); baseband::spectrum_streaming_start(); // Do the RX @@ -205,14 +209,25 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 238 * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH + f_center += ( 256 - ( 2 * offset ) ) * each_bin_size ; // Move into the next bandwidth slice NOTE: spectrum.sampling_rate = LOOKING_GLASS_SLICE_WIDTH + // lost bins are taken in account so next slice first ignored bins overlap previous kept ones } else //slow scan { - for (uint8_t bin = 0 ; bin < 80 ; bin++) + offset = 32 ; + uint8_t bin_length = 80 ; + for (uint8_t bin = offset ; bin < bin_length + offset ; bin++) { - if (spectrum.db[134 + bin] > max_power) // 134 - max_power = spectrum.db[134 + bin]; + if (bin < 120) + { + if (spectrum.db[134 + bin] > max_power) // 134 + max_power = spectrum.db[134 + bin]; + } + else + { + if (spectrum.db[bin - 118] > max_power) // 118 + max_power = spectrum.db[bin - 118]; + } bins_Hz_size += each_bin_size; // add this bin Hz count into the "pixel fulfilled bag of Hz" @@ -228,7 +243,7 @@ namespace ui if (!pixel_index) // Received indication that a waterfall line has been completed { bins_Hz_size = 0; // Since this is an entire pixel line, we don't carry "Pixels into next bin" - f_center = f_center_ini - 2 * each_bin_size ; // Start a new sweep + f_center = f_center_ini - offset * each_bin_size ; // Start a new sweep radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(10); baseband::spectrum_streaming_start(); // Do the RX @@ -237,7 +252,7 @@ namespace ui bins_Hz_size -= marker_pixel_step; // reset bins size, but carrying the eventual excess Hz into next pixel } } - f_center += 80 * each_bin_size ; + f_center += bin_length * each_bin_size ; } radio::set_tuning_frequency(f_center); // tune rx for this new slice directly, faster than using persistent memory saving chThdSleepMilliseconds(5); @@ -277,19 +292,16 @@ namespace ui adjust_range( &f_min , &f_max , 240 ); marker_pixel_step = (f_max - f_min) / 240; // Each pixel value in Hz - - f_center_ini = f_min + (LOOKING_GLASS_SLICE_WIDTH / 2); // Initial center frequency for sweep marker = f_min + (f_max - f_min) / 2 ; button_marker.set_text( to_string_short_freq( marker ) ); PlotMarker( marker ); // Refresh marker on screen - pixel_index = 0; // reset pixel counter max_power = 0; bins_Hz_size = 0; // reset amount of Hz filled up by pixels - if( next_mult_of( (f_max - f_min) , 240 ) <= LOOKING_GLASS_SLICE_WIDTH_MAX ) + if( (f_max - f_min) <= LOOKING_GLASS_SLICE_WIDTH_MAX ) { - LOOKING_GLASS_SLICE_WIDTH = next_mult_of( (f_max - f_min) , 240 ); + LOOKING_GLASS_SLICE_WIDTH = (f_max - f_min) ; receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH); receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH/2); } @@ -299,9 +311,15 @@ namespace ui receiver_model.set_sampling_rate(LOOKING_GLASS_SLICE_WIDTH); receiver_model.set_baseband_bandwidth(LOOKING_GLASS_SLICE_WIDTH); } + if( next_mult_of( LOOKING_GLASS_SLICE_WIDTH , 256 ) > LOOKING_GLASS_SLICE_WIDTH_MAX ) + LOOKING_GLASS_SLICE_WIDTH = LOOKING_GLASS_SLICE_WIDTH_MAX ; + else + LOOKING_GLASS_SLICE_WIDTH = next_mult_of( LOOKING_GLASS_SLICE_WIDTH , 256 ); + receiver_model.set_squelch_level(0); - each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 240 ; - f_center = f_center_ini - 2 * each_bin_size ; // Reset sweep into first slice + each_bin_size = LOOKING_GLASS_SLICE_WIDTH / 256 ; + f_center_ini = f_min + (LOOKING_GLASS_SLICE_WIDTH / 2) ; // Initial center frequency for sweep + f_center = f_center_ini ; // Reset sweep into first slice baseband::set_spectrum(LOOKING_GLASS_SLICE_WIDTH, field_trigger.value()); receiver_model.set_tuning_frequency(f_center_ini); // tune rx for this slice } diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index cea5caf0..3b05edb7 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -37,7 +37,7 @@ namespace ui { -#define LOOKING_GLASS_SLICE_WIDTH_MAX 19999920 +#define LOOKING_GLASS_SLICE_WIDTH_MAX 20000000 #define MHZ_DIV 1000000 #define X2_MHZ_DIV 2000000 @@ -81,14 +81,13 @@ namespace ui std::vector presets_db{}; - // Each slice bandwidth 20 MHz and a multiple of 240 - // since we are using LOOKING_GLASS_SLICE_WIDTH/240 as the each_bin_size + // Each slice bandwidth 20 MHz and a multiple of 256 + // since we are using LOOKING_GLASS_SLICE_WIDTH/256 as the each_bin_size // it should also be a multiple of 2 since we are using LOOKING_GLASS_SLICE_WIDTH / 2 as centering freq - int64_t LOOKING_GLASS_SLICE_WIDTH = 19999920; + int64_t LOOKING_GLASS_SLICE_WIDTH = 20000000; // frequency rounding helpers int64_t next_mult_of(int64_t num, int64_t multiplier); - //int64_t prev_mult_of(int64_t num, int64_t multiplier); void adjust_range(int64_t* f_min, int64_t* f_max, int64_t width); void on_channel_spectrum(const ChannelSpectrum& spectrum); @@ -110,7 +109,7 @@ namespace ui rf::Frequency f_center_ini { 0 }; rf::Frequency marker { 0 }; rf::Frequency marker_pixel_step { 0 }; - rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 240 }; + rf::Frequency each_bin_size { LOOKING_GLASS_SLICE_WIDTH / 256 }; rf::Frequency bins_Hz_size { 0 }; uint8_t min_color_power { 0 }; uint32_t pixel_index { 0 }; From ee53b28e60ca272ff8ba5f6913ad635a6aa64dde Mon Sep 17 00:00:00 2001 From: Brumi-2021 Date: Sun, 30 Apr 2023 18:03:40 +0200 Subject: [PATCH 4/6] Solving Noise generation in Signal gen App --- firmware/application/apps/ui_siggen.hpp | 22 +++++++++------- firmware/baseband/proc_siggen.cpp | 35 ++++++++++++++++--------- firmware/baseband/proc_siggen.hpp | 11 ++++---- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/firmware/application/apps/ui_siggen.hpp b/firmware/application/apps/ui_siggen.hpp index f55d19d1..58ed49b8 100644 --- a/firmware/application/apps/ui_siggen.hpp +++ b/firmware/application/apps/ui_siggen.hpp @@ -48,14 +48,16 @@ private: void update_tone(); void on_tx_progress(const uint32_t progress, const bool done); - const std::string shape_strings[7] = { - "CW", - "Sine", - "Triangle", - "Saw up", - "Saw down", - "Square", - "Noise" + const std::string shape_strings[9] = { + "CW ", + "Sine ", + "Triangle ", + "Saw up ", + "Saw down ", + "Square ", + "Noise n20Khz", + "Noise n10khz", + "Noise n5khz " }; bool auto_update { false }; @@ -78,7 +80,9 @@ private: { &bitmap_sig_saw_up, 3 }, { &bitmap_sig_saw_down, 4 }, { &bitmap_sig_square, 5 }, - { &bitmap_sig_noise, 6 } + { &bitmap_sig_noise, 6 }, + { &bitmap_sig_noise, 7 }, + { &bitmap_sig_noise, 8 } } }; diff --git a/firmware/baseband/proc_siggen.cpp b/firmware/baseband/proc_siggen.cpp index dce9d479..2fdc5545 100644 --- a/firmware/baseband/proc_siggen.cpp +++ b/firmware/baseband/proc_siggen.cpp @@ -49,7 +49,7 @@ void SigGenProcessor::execute(const buffer_c8_t& buffer) { // Sine sample = (sine_table_i8[(tone_phase & 0xFF000000) >> 24]); } else if (tone_shape == 2) { - // Tri + // Triangle int8_t a = (tone_phase & 0xFF000000) >> 24; sample = (a & 0x80) ? ((a << 1) ^ 0xFF) - 0x80 : (a << 1) + 0x80; } else if (tone_shape == 3) { @@ -61,24 +61,34 @@ void SigGenProcessor::execute(const buffer_c8_t& buffer) { } else if (tone_shape == 5) { // Square sample = (((tone_phase & 0xFF000000) >> 24) & 0x80) ? 127 : -128; - } else if (tone_shape == 6) { - // Noise - sample = (lfsr & 0xFF000000) >> 24; - feedback = ((lfsr >> 31) ^ (lfsr >> 29) ^ (lfsr >> 15) ^ (lfsr >> 11)) & 1; - lfsr = (lfsr << 1) | feedback; - if (!lfsr) lfsr = 0x1337; // Shouldn't do this :( + } else if (tone_shape == 6) { // taps: 6 5; feedback polynomial: x^6 + x^5 + 1 , Periode 63 = 2^n-1,it generates armonincs n x 20Khz + // White Noise generator, pseudo random noise generator, 8 bits linear-feedback shift register (LFSR) algorithm, variant Fibonacci. + // https://en.wikipedia.org/wiki/Linear-feedback_shift_register + bit = ((lfsr >> 2) ^ (lfsr >> 3)) & 1; + lfsr = (lfsr >> 1) | (bit << 7); + sample = lfsr; + } else if (tone_shape == 7) { // taps: 7 6; feedback polynomial: x^7 + x^6 + 1 , Periode 127 = 2^n-1,it generates armonincs n x 10Khz + bit = ((lfsr >> 1) ^ (lfsr >> 2)) & 1; + lfsr = (lfsr >> 1) | (bit << 7); + sample = lfsr; + } else if (tone_shape == 8) { //taps:8,6,5,4;feedback polynomial: x^8 + x^6 + x^5 + x^4 + 1,Periode 255= 2^n-1, armonics n x 5khz + bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1; + lfsr = (lfsr >> 1) | (bit << 7); + sample = lfsr; + } + + if (tone_shape < 6) { + tone_phase += tone_delta; } - tone_phase += tone_delta; - - // Do FM + // Do FM modulation delta = sample * fm_delta; phase += delta; sphase = phase + (64 << 24); re = (sine_table_i8[(sphase & 0xFF000000) >> 24]); - im = (sine_table_i8[(phase & 0xFF000000) >> 24]); + im = (sine_table_i8[( phase & 0xFF000000) >> 24]); } buffer.p[i] = {re, im}; @@ -104,7 +114,8 @@ void SigGenProcessor::on_message(const Message* const msg) { fm_delta = message.bw * (0xFFFFFFULL / 1536000); tone_shape = message.shape; - lfsr = 0x54DF0119; + // lfsr = 0x54DF0119; + lfsr = seed_value ; configured = true; break; diff --git a/firmware/baseband/proc_siggen.hpp b/firmware/baseband/proc_siggen.hpp index f547cc0f..c4adcd8b 100644 --- a/firmware/baseband/proc_siggen.hpp +++ b/firmware/baseband/proc_siggen.hpp @@ -38,13 +38,14 @@ private: BasebandThread baseband_thread { 1536000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; - uint32_t tone_delta { 0 }, fm_delta { }; - uint32_t lfsr { }, feedback { }, tone_shape { }; + uint32_t tone_delta { 0 }, fm_delta { },tone_phase { 0 }; + uint8_t tone_shape { }; uint32_t sample_count { 0 }; bool auto_off { }; - uint32_t tone_phase { 0 }, phase { 0 }, delta { 0 }, sphase { 0 }; - int8_t sample { 0 }; - int8_t re { 0 }, im { 0 }; + int32_t phase { 0 }, sphase { 0 }, delta { 0 }; // they may have sign . + int8_t sample { 0 }, re { 0 }, im { 0 }; // they may have sign . + uint8_t seed_value = {0x56}; // seed : any nonzero start state will work. + uint8_t lfsr { }, bit { }; // bit must be 8-bit to allow bit<<7 later in the code */ TXProgressMessage txprogress_message { }; }; From 8e64221384ad48628022b26199cdcb54f5ed0e8f Mon Sep 17 00:00:00 2001 From: GullCode Date: Sun, 30 Apr 2023 18:26:22 +0200 Subject: [PATCH 5/6] Updating to release 2023.01.1 https://github.com/greatscottgadgets/hackrf/releases/tag/v2023.01.1 --- flashing/hackrf_one_usb.bin | Bin 35444 -> 42500 bytes flashing/hackrf_one_usb.dfu | Bin 35508 -> 42564 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 flashing/hackrf_one_usb.bin diff --git a/flashing/hackrf_one_usb.bin b/flashing/hackrf_one_usb.bin old mode 100644 new mode 100755 index 6e7935ec844831d1f7fe9230cdc2410e751d88ee..e35de2674a147fcd32418409fb67be36d9569a76 GIT binary patch literal 42500 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 literal 35444 zcmeFZd3;nw)<0Z#>F%4ovw)pN=p}?~V27ZhFxu%(Zk7guf(|NbL(u6cY5*T6E{`+> zC2WcWG=exN%se9EkU$(G#75AWK}RPIIul%@I5s4s-fZ+uchdL$*6jq5VV?QDpU?Yw z-+$iZQ(gB~ojP@@>eQ)Ir%v6@6@vc5+X*?2a9=thYZ2BXY(%*DkHXME|3;tR!~1B6 zx6adN-^6-Ln4AXr;A?vH)tS__f$ zf5A$thuh=~Yf?F9?rXIhg_??*%f-)y*jL%^)%>RpR?@MX$UIq}f7HfG2`p0>mCJNH z$Oi8(r&y;L^B6hVSW@$yFK)lJjkUy}^q^me5%l^NPAXA2X*@!XGNX)>-WcMf-wj{u zoL(`#e7$|a$!p3q(nrJBlrhqWL)VmFjW|x3R&iDNm3X>C;l)D4-wdU+PDR>cNcn9GS z!d#h;u_J8vGg8UmxA=Wz@N4|m1;6wYDLDL@pLlKd1Y%sN4x=%nj*xy{&_BMIkcuio zJR5H#lNdrWFctzU=-Uyy5E>B-c<)5K8}PLBq_a{fu`H0nIr@ZL12GZTwZ%mH-I@D1fRIHS^1T{E3cp}wAi;hwrD6tZAR4kCq2;@iWB>G+-DBIDqBzi$U27$>cu{~Y7u zxhu=#nV7VJ46<7%oo#oF6~~KNyH1`ZmL!9-$Rn;5C#dy4Zx_6q>^o$GZPLjlO=cCs ztmbS^eY7Z&Ydp#3kLxgriD=bHxk%I_zHF$qMDXq}nd)Us#1w}S%2sAJ#iF0B;x!mo z&G5?RD8TI+W{hoT+UrQ<*Gt<&`G(R>>7;F-G<&w4TA{X0JZ7OhmAy_5()Vogw;5nV z!a5mqnv0V@dz*MO$LnpJ^yS-Hr>?@_n(uPRQ)83eoGsbKJJZ~Ho5596TDy?gUPCyH zz*i)@4fY`)=QOyGkEfc_{YXEEz#`8fFz9g%mtaoFqS0AlfVU;KDNT(P3Mzc zLK|(vv=)uXS2L1#Ft3`I5_ra#3^)?xC4-mnZD*$0R`|JUn#MsgCODIeE4%7AeM_2~ z7gN0Ee!`k151Zylz|zd&)2un`e}c>f-oOJtJ2YEr)xCpqpQ!kU}UtHe@9_!z*|b-qwu}e z>F#Xt%ZG`yXb`J;_7y%>%&(^7x;jj9W4+*T2eCN1v<`xP^?#v9NC8 zv4z|sy>lgGWC9a|UM*QnhZQfy+hgVJx(&h*;*ZLD270;(}~l5J26P9f5D zgRJ;xtW}ivCY_ZXb1UXKGu%n;6kCRi$5mQePorlxZI43b^mvF8;4jEyuGCKI^tJj`EP@c!^d#6z+bOs94BPJ^ zxh3t%_mDh$yS`cpoEhFEXIqnNHpw~Gx%kbsHsCkUdJ@0+*5sv|KR!0#2- zlS><_QKGX>CY>mQm_eM2m_?k2m_wY8m`6Mbu?F#E#9G8xkdCFv_Y}DFSSKl!`+ar( z0@t7)JyBN%J}5?@<2@=bp%>M1l8ZCu@#5HaO~-9bqcWi8ZCjqc-IaIFCpbTIGo5rE zkh~w;=?YA;yM6jL)_I$Iz|T0hyL>-pG8r5!VDQf;LELUup7L23wiWWOj9=Pd%(wty?%;E-*Qdss(LvL2;UtQFs1nL!H)VFDJS)`n*MjzsBd5fc#%Fw91gpRMyaFQk-e~Z)O>uO9*?4&JT zGJ%<}u=8j=o6EE_6BcxumMvUHo{16p9)a13z8R--waj#F-ak8-m!Y9U zXZ$*rkRK6DafCdFm zNAAnDjE^z>=x0se`&ZREs((N`ZmA|YpZeyziDiy#(UY8g?c3}p+L^+DpXB_;x3ZRE zet4MD`DHj8^J(GslvSp2>T{XIkc{ zPOpw>y3NfkBNNEhJdrVb{K+lo0r8erMr6&5EL=evkcwKK3wPr8l`t`~`}J*CVyNPwjpV|t|585&_K3WM1z^z zL+f*@^({bspJA@>Vooa$njTYV&)k4iNN(@WCmHA!&?0JTNBWHp&howVo&kva14I`XIKe*p+q~QD`Lt} zaw%=Eu{8?2F#)>O&8@7FlL`mJ=l5ezp!`bUqI(3oH(0LrUQ=rva9tmctB5P7Sa&H} zF$(eg@ZC+cg}hm-_UNa>v`4##Y0uZRF~*Re;#r*}=;>aA>M+%MWMc&p&ZB| za909jjz}Z7TGzuD)J4nEx^6(paXC?F8*LRYJszU9EIwZg)qj6#)3}^Sn|Nt@=u&N( zs@79-K|QoQ<(q=mm9-pb%T(veR6yw4Mro*S6=n+MMmH}-V~yvf|B~r%uS_W!uTnz1 zdX1oea0M9|+n&~p*+=UOtG8j_R#abC@91J2P1Wn|c^%2c&)c(4(w-huegx&ahpg`8 za$fpk&f(y(s-L(2(D9VvfW7;q#>q?Xs}y`W zL^4nNnar>Kl!kin#ZPp6-TKG+G+=qrKIvyzvO3nKHrOpEQ=C&!t6!${OcC`ezr8#( zN<*SArsAFYWYjv)VXNO;zq#7cMH~&FA*Og6XgCAwy`MVU5bRJT?lozgPZI@ZXN(+aL zO|8!$xV zRDE(}KlO7=F)F51V2T5#Xkcn|pK{wkgE&O8`&1m`&g0kw928GYix#r6q<%sZGYM-8 zR<0b8@>XbYKkC#1zNU@t)-3lt9X$3BQShPslm8tq9*X zv-t__ntY5zex{GbF73WB-K#AMGbRIie(@l&M0e7Zg<){MbaU7wCLw+PAY&=40S2q1 ziIwgg-irDWhhynV;-Zq6mCC{tUrCslPJxH%o}ALh*AU~VEl#!b;GOdC!>x{b4Xk(! ziRmCgt~W`#Izijs(X0esP$)MJ1}Q%aEd{N-b5*UU8ZCwe><6R@Z4~eFmN8{xW{;hv z1jfpYv_$zK_L(%D2ZsfJhC@3F^~)Ai+0&>}{1zdJ$lzV*?y&SMwK zwaD8SWGvK{HA*)Dov@gww38#mxV#0co1K`_%F<`2&*G&$!N^+av8R@&qWs2SYFRkY zu0&{|depz8C0eEBzb;9OR;A@vBec-^Xou0+7IWT3c`grP~LI@t=N5Z5sA%TI04Vl6$&+ z+oLDt=+0yEj7}!EPPQ38?RcS{>q%f16Jq9i?Br!T)59`)-vQa~iYxnFh%m>_W-$8h zcv93um~fzVn6~(h!FGS5%siGTvrDwyx-6rdvQdqpOi zO!%b;%Up~SC=6?|*>(=Puk`e-(A*DzCksxlIWT|rbTOufi6IkjsOp_U*d&E$mJ+eIK9A*qheP5hvQY zR^+>%U_9bi^5>mRaxvK%if7is9_J~^KlxHUbLG}hPahLXp1Y%&@2=y}S1QE2=&8+O zROj;oa9M6NIC=<&Gz(fDEf`^w57G3_dy~3}fV?Q1ST2SG`eB-PHh90E>vnM41<(); z8e&j#@8A8j#7p;nCC}@;(LiaUI7ca358L7@d+f=VRf>B1*b6B#z8s3T(AwYe)44G^ zZ|V5Zc}ryv9Vfb;7PZ>yiPZq>5(gcg&WAtBbUsXLDZXDL3R9^j^Ip&-W@Eq3OYa6r z_J9w%;sq8t&IwC7A+2FQwb9JSJmcI+<>}Sbl69=_NHW)L=d3L^$QC2p6!sU%7P8vy zaGS*2$GvJ7PI5hDIWzq;<{JYseLZK+-PSfw0W+mY_GA>v8L{8{DL#D*!7k-JoCz#@ zRR;Xjc0sBeF|RJeD$%6WxwRt66Wd9T5LE`M?+TV<&qAP| zEmrAgESAM(y&lfdrE^p*&T#&Av1Y(?L#pj-#00Tsz;*{xN=$cMZj0~Y7-9RuyZ9a( z``f!F-uB z$O#9s!+m~gFQMtMV@ZlK>1G~&$Uyjg?X}4*Fw2D zO-x13KNN2N?J^&#QTyW;ibkZp{;r#Et!b-Tk}SCrK5b@vNjmaL*q^TL|2WJ2^8G)! zs+Qz7neOkr|5#tV<9OPpQd);znJS+4kCXU>SnrR0g6GG+C=Zdyn{+Q8_Sd7&!+!b? z-KvFm8!?vG3>)2?bk*=q{1y(o@O$MjO}7ub@O%Bgj{_9jnxG0rL=b_*`nOGLFEhG%x~OP?rnC? zw+p8_#B$no+HH2XFJKB!yYwo|v=$E5*f=pUqtOj6H*u0QWO3(Y&}Rc$adrsfG4gM5 z&qvDf3sPuKB(?Q?s>R)bmQ6#;K02(P&SdJudhr=?oHzk;j)^`9dkD3cN^7End=JwV z#ZD8ME&+OFtFqIkaWGTA_iHS~Jl^z`x+7HrvO>(*@mdm9Yw*Y5=RoBS*}8Kj`k_%w zp;%*zOW2bU$>|q(NvG+(JtnB>OS9b|mWfP*5?HVF-p*`)#b)l}Sk}>d6EpQ6z|&VW zMoa)@kna}8#H06qr##U_u!mEokEa7-o46ott=>HOc9HORJ6{I zH_%6+pHRqzUypk<{TBNzMJnA_DuJ2G>#)jv>!;dZoJcZXvlCxU8!?0XQQ{X0Gj+g! zbqixbo;elcs{|G)>>jjPW^N}I!K?)KC_7{wp(|c;ON3HCAc&<%=3xym0s`}5yQXZu z%_!B_jQyRq{Xvgpi=u0LgY=Jc`j#_l`~CupRb_wKQp$UOK>r?5Q>o=^F|3n%+dlM) zRLYA_?N7j%DS_*dLuCueCenKz1ua$ruPPqsV0Aj1bl5}R-%xYk7|GqP=ISL*W0PJR zNqa`c(x(2trT+c_eVU6|8^4cY=nns2(a4#<5YUT}Sze&9uMlZN_$%4CQrB}rs~gz% zh(Ttq-zaOXI&+F8u1Cwzl9wxsRhn*8EM~=&EppPiVPdK5U%M=VCvGI)u0ZFT&S6D5 z)_shdUQEn;7BntkY7Fp{X`0HZZ7x%P$HPt`H${3>jP;rKnUE6D}7GnfJ3&ahRCr*dx%eX9wREV}pe!`6vWbMWHE{q;y+ z3_V;4XqE3&Do(;~^_5(|=?c+e!D(XM7&*$ty~_0%V-4iza=bw&cV} z3t-s+EtiGkDAkbdXCky#KD}Rqna6Eb0&%dvDS_XI{TMwZ@L1S#J;}n1jv|xqZ0EKY z7QZPr$UYmloyU3myWQ{d8O4hx!?x*+>q&{Olq@XP4Q3APyJKZ;Kh>i+X<#TqJH_`l zxPdefGi|{QIHyqpox?iIt)O15b(olWi&lN!Gt8K&Ek2?B!6src$Q((NIen3>6Vj5g zvpDgSw3fz~t8LjiTqY*a_C5`Igkte`7$e$l zPSm#)4zf;SOcmcxOKRR?C!g!vpeyFtyND51R}1G^2^$+%&rFwEwl`OvQ+|EOo`E%s zF-mQk)Yog{Quo!SHKi2quFbMdurbqLw{LI$9&4f0#uOjz(XsWl`XYk4SyQTSVTzed zn#Kp&-VL>xT`V8dl;Zfdc|(o9t!a>0IS>8CTA9gAPj9|GgG!_i4X@XJVwhUIuQtE< zJ%f_}S`F;HnM~&Qe!BmP6(`7SI^R02En8$}5NYR7W;1i;IX`c#hlQH4#MEHFQ7W_u zBI(VtHVqo|O5ijs%K}!oSds6|wMEiSDSYqbIS1AJld9!eXkmI12xcAj_5vhaT#t^# zibQ%~h)O*sJE^0pHaSo58Cn@j)p9D+;t&(#pkI%aUCRgjTKt~#Ym7TxKf(qZD^d(Z zs#MF9?0|2li>pa zo)yNrKYF#Og_hu8@g+t>&HS4Au0~hKa>Mdlmv37>f1#nyfRkDDgk`iO9gk>{%55Tj z8luvIo-ciZ{X8(Jau@z6hp6PGy*yUj)=JMR{-J0lQrK+3dP5YFKD`xUuJ7|rtcmy= z#MExHk89WE8hqM3n^f;16DuW66kTU4C04N1zG&}iPspoPE%@m*=7MW%WwY;}bMyQ= z?p|_#e6HUYmv`E)&DFqut_1ceI*X;|3x8bhUF!R9m3Rx}i^|!*QC7=j=imIoWbG+N zO?g&{0`!L?`A;jHCE({LYkU#-HA+^E*B^mgNy~0})32Q@wMSBF(XX8&xyw-Nrzk0n zV7f<%ww&R4E zJWAkkJoBcBD{yY0&T>Q8@~ERkBWl|1IP-{Q=t@3L$-#GIuDa6){V*1PWuu;z!k86b{{B(vm0Iiq^sWQ`cRAjE3 z)RfiAfFGuzhCc*jAdy%TeQpX;E}14)cHI^O8+)+0iKhNNNP>c7>xz!PGq^5Dxre51 z4+=euFt+K<9wFfqAIU%7&dbbe%#8Qwx?lOk{swV}TxR4pYayMJU)Ukf*?GBG)tZ6x zCXFi57-$-MVd0^zYzk7XokaavycL=eZU2j5ZhQQ;L){z){Sk6EM@-mG(^o6{?T)6z zZ3)jC@b>gDbQ8IcoagoX!#Lgz~HZ9lgyQsVY7$^WO1;`(iSR1ZUZB}bYu8-#zJq&ry#_N#6F zRVDd2H|LC7p^vTG4~?v6qAG2s1$W33^*khmuHd*{9sgldwdNUOUiheXGye>?ncd86 z28@+#je$KPGUin(|3t%zB&pJ6?S36N4QEQ2QHzHu7H(LuymR?8@Gy#MZh{QaikE#( z({CEKRBNy{RZ;8>5$t4Zp%}qE4G>qVxT9dr&>DlFHddtkSr3}2B&9eChfhDMZJ>B| zJ<2!my;+4^13&Qeau&~K3)4WhR#o%oX^m6y37|DH+VNui3;G?*rpus-C2V6i8^tf= zVh=cA(--p0of!T79CT-9ctR7mJzL#lg@)MeOk+X=Z=Nm|h#vytLqL9r5+9^kuKv%xp%BSh6`*tf-DH zPyz==DAZ%kaMsqt3Qo-NIE7t{J~DWDlV)?IpD;=+{|woTRm8fenvMmP=X53ukn^Ku z6RFQ18!1goqGwPqdd5s~F`F-iW!ZTwR32ntrZS=jJ$={ELCn@S21(7v3~2iW4@fLG zp}44ciqHormZX?K5cmDs`MGzh6H@$1_SD+vtW1$2@vF#=0j~ zh}zE3@xSInId&6ymX3OnI0q$@!`KIBJADTSCy&vIta!3{y*>3a-PLhD*JFizTQ2SU zD;I;3ljp|bH`hTX^1V~;jceE;UvCUGZ?ngDWQ&RF+_w}r$kr=kTA3-I`#ESCy5ie} zfIsH>`KaZ`Q0(@&ZMUdWph~%zK1$ogbp2_Vxte5u(7w~95kFM*3jy;+3CtT}#hor= zYit4K@BbRw>DuY0tMhs{mEd))F}2HE%QA3!Ay>JX!YWr)?PYno4o!tgr2e1utee8~ zmR+tO^sbpWKc%bhz5)Mz)#}dbeT8k*x9*S$&Q9Zys&A`S_iZ03y@1CW|3H@46D?Q; zBQ!@ZQ`l$^!Doxf5n7^r#Qg|t*^c4jb4C|EtyBVjFPp>oJn%RmIek8x`v*TOO&k6J zJ1Z)a=}zt&<T(Yz61CyXv5O5wEfC&F>}HB2EyT%TL^DXMDU%YU>s>l1}@< z0$oshuFyvEV!ak|HT;|w2%qW7ybiafhtZUI7ude@vu=-jj;*Ft_ziut@HV$)(S*8x`2VqR!XmyW6RRdGtqKnK3Gk1e0g^eqZ9MEc z8)d<`QI558uVO9P%rvmCveE~GJLFiRQSChATQxZLDZd}j2l zy$kMHP$m60m+Y`O81b`a#;nEp%1h7(ph4y`9V8Q$Xgm`y#X<2~TViMBKcdS|>d<1x z#?R$)w=I8uWuw=8d8MRd>ah!9rk+}!zwFcH^H&lhJzKV__ItS{$(j1dGdRQ0W^p~y znhkd0Q*DUv{pD?I>`@)L#W&V(vTHh`XWdh~1r{O3D7P_F|LND7m=IrJsD1y@wT~)+ z9m*1D@v@4Kwv*~B6*DchkRf@nF?l3YSs5!uE0U=cu@erEO?70hF?sqT^zR? zD?eeTi3T-|mFmuyZ4WOd>0O%uq3vO`k$lbM_kEXv_Uh1B{NAnpR)xmk*`@y89wKTx z;z0Y+Fy*5hF&fW@vBRa>8g^?B4*F@Id8!24CWI{rjR-Fw&~e?5yu%28M)(+^6G7ji znQ3&h(zwu~YIuY8uW%&8GDp1sL>~N3;VZ;S6Awk+DMvG~Oc`da6pKZYRh98dH?L!T zR$6~uo;!!y(YLRZn8^enSM`PSw(fIrkQ&7rQ*b6Pl0Jc(cMl?(I+_kew*~ z+DM%d%O@-S=B-G(;G6om1yaf2&_DD!WH7}=*WNL+?ybfM3c$CL>QrMf>c3Lx*kg?b z&BXf(u&xZ=TYWvPbLmfM%YwA-JC&^BgOG%DWloV9oUlBrU_YbchwOmeqYdXkZG*fO za>STi%uG*=PK$;#(QlOFjocpIoQqu6woy)i2jm+{+n|<0+AM%HQ#d1qjzH!?QcCxnV<7U^Oz7fKr(-ew$T$qx+>&gRXFG8oUC|@+u&9L zU!!*<$P?O+Pwr=4<2J26qeXkQHni8ZPfkG?YlAI$lXh?NS&k@yhk)Pex!b`^B$@k~ zsg+hsSN)aW2<-E)sB-JDig0~t_7rcnI{&0FGqoE!Y5XHi=p&~)uKrnjbjRlOkKE06 z?TM&rjfV-bQ;I!yob_rv#U2Me^Tp~?Q~KvI^o-v-^M(CJoblWNdo$(O{}~iaLG;^( zu+c;i*M|j@M*Ip-b(mq{z>=W@&K-7}bmz)ua2YJ#6CUVaVaK=|5pGbuPVMkXl^z^) zfh(2{QhvREkn-KVgH)54A2#CoQn|+J-^^sCUk%PTy;#OdFAU8$?Lgd!_yxpU5N}7k z3Gp_>8xTK_xE^sM;?;vz@eldZy*Lj;z4|>Z zC}qWaGD*aH;+{9~o(-%F{N0w^cLZ-Hyd|LyH|lr?@2TN~@@3Y2@GfP|F?-%aiXIT# z0kIemf5N+f_YS!wbbZ($&&!d|25$E!Fnj{NyO7D!sKEXa* z*pq|zov=DGc)k*SXvDZR4qsMbaHhF3Fk6Xv5ObgUpnWkXnx*qx#yq8K#%hFmgbfH6 zuOCwv3N}4LCIUg=5sqA=#pN4Zdss%u6a;l%!R`co4H}8mvSxouCAW!ho;{A=2kZA0 zx3=z+V_`|vi`$wP^(Bz>*s8wqHXU}C(dCr$Qp2Hj6k;EAI(#mA->d|w_E$Pj1?eGaKXR{4nlekajjr$<07?eJ&P`evn z-jA}y@VgNq0__ObAw)ZMEpx%)>+G@ZLWM)N>bdSC=^ZQ9L{sXISir`g*8d5t+REI?8-Q={`g z^2MmTr+sp?@l&)-*opQTx36Oxx1*1hz~o_gm3lu$`{3z7Xd7oD2ray`V;wwI;2#&+ zX?%K^=1s#IOTC&%wt$}2h+1&lZ3;6<+s;nXwVOm9(9>);`1u|^BjeY=4EP^JIofZ} zi);52j8}RypMn#C{oJNaBHKXMfo&q0Fs5mKR}^Y@P%b&+FSc@CXqOD zkBXJXgjg{~B;c+sN-XGD7q<86m*GrXz1PLUmw@KeRdKbVLH;9Qx=Kd)kDlvSfcIu1 zNG%Do5@w%S_r!jjw+&G_oISL6-H#Zfcq_@g84?wB*J!)nC2dHtxwY>zQ85%7jhfg4*Bq7d zP#PVMamJQ^wk}djnK{}?>m>OC@@Z{*hAC!E`5FHx-L#Hhq7F*;gP>Pv!Hz9NvY9f$ zOV0=nBdxvZI8JJ8T?~6d7yHRkUHm8SBdoMv2S0s5OcbNi&iNX#r?m;?0#n%Kw+a9B zmm>%cNJvW^J%cT!JN!XE^&(1uPxXf3{F%qxZlSUCe?mNy3yxx?F9#oUkkFW7@K=6u zd*oE{sA8#X2}uKO_Jbj*KkgKT+#S*}tn{bBYt&tTlR|U;0GK`<`FP#|Y7MvyYs5n3 zTjpSBppWbRV-l042_-u=o^cV9`SJi+MobBS_yH@o8MZZM3)w>bn!gLvCz{5Zba?*~ zXMmJ5mx%*l{(Z_Z2W z%txxDo$ts)d~G{1=5^-a>H2nVz?;ks%&BU$V+W=}lf_(TnK|21)O%nmGl67nJd+8> zeX}?Ylsq3U1XVd=dYRe=>6vh<`b1M%6Oq=!POi>871O49U-~QiH!VA2v7Hkaclaat zU5i1#nxDP+BmX9I4RTNM$Nj`}h>)Edi09cxLXsXq5A_q{;kOB~r82agINuVrxW~Fw z=0#%@BmI8Jfm=b1rAF$xVAQu!A5VI||H#ZoXFpo`Sh>+%DS4JpcNMxA>9>RQ^yL7( znIn1C-}lwu&(z=V=;I1d&gW-Gk;7V)MJVGF<=o^T%ek}T5T6qMN- zNlOe@VLx~s&H!kswa{8=S^7Iad>bfOFpGhfxj?-?#pABg=shY(uNv$x!Z(-w(#g3f zjXCa{oHtjb+A_qOoY9V4*ER5d87Gc+E4raiZUjuE#Ex*D+hTJ_N2?sTtC#00bbp0> zr_)(xa5>9(QRDs|ce5(WDrRY16|+iQ2DeSRoEQ)rVZAfBEbh+$U*aqQd`a01;Dz^` ztGEL94_%DKE-#*8muDiBArvFnX3V%Y+10Qxd13ORxr>sk=2kUS&0XBE_~hc`yXM~2 zaQDf(lYix&!Vavzkyw&lc3D6f!wkcT20T=2@22wp%UjTG#p^ekf4eG2^RFy^a?#^ynAL2gjq zDaNw_VF>~eh<3(bNT-eHw6@55lo2t5^bEwA2*DL&wTs|V>x$&-79-w*fEznA^Knz= z#X)@&-JMtl$6yBR9wvvDw31Ad>Mx^5%2T)_T^(}VtMVf5_CV7gq+Ypnb%`2`qPBx! z>N~n-7<}8R1QZ$PV3}X~+04)Vz5=4oVe6lDxO2*tH@d;!*dx<+Ek=9PwEMwBBWX*J z#$XPF@ID9nBz+E!JnP|m`pAQHhV%q^{GJUmGXg#qcP#WaM)JS4USraZ(+h;tFghZmS~5Jw|F8?hGY6A`nBvk-@e=a?oS4i57@ z^@NeyV3F8@xE1kE#4SN3@S4K+)ZqE|!8xXMz z=WK-4O9UJ3OL}i11L>?Y*35HVgQ-fvXj9pk895AEp%Z=C_W&=NO` z$7v7l;{;=ndZqe11@|13z=uP${|kZ|{7zPX^VIZrhQ9ODx*kOEATY~nN~wOvX*d} zDJ<&xvk6{T1J9Qvx@=tJ9FIwQ%Cf$qzhc2dfO!~T>cy)6Ub zF^sDLu~DzLO+(Q0ynX><^`3LTr;6UQrm*V0>kHm-H{0#$_qdMqd9ZIHUJ64Bs0SQz zGm^Vi-_nPZd&=ie4fUyfzHX>jvdd1R)l@Za@&QPxRou5%VDy{Qf4M-$nQ{f)VeT2-yfVEr}AZ zrTe2J)hX?a+HsYrD2Xd$T4y?9EWf$Jwg|{@kv{lGf`7FNh za7ax*Aa`k9?gEs0UET>w_se^Ao%dXU_ut`O3M0KD?*#6hvhiLv&lHi(dp~kEk^) zQ)_ro{t)>~)s*|yl)KeBtJFI0lHY}%9J#+FVSEeF&o71~lNIqc#Pquv&myK@&e)8Y zel_DM#8fV>3-zmV@kzu~F0MjM<>KSWr*iQT#FSqiLQLi2GQ?Ca-jA5_%RQk^v~{xD z7M%W|wb?376J(d0k<4m~#;a}2PgB8Q=vYLJIgH6LB`;d;}}y59Cj4iJwVtTz`nWIz)OFzcDj$FK-C4 zSxq?x$wj325M8?lhO|zc2G`P^<~QFFZy975)wgJ09z>{VVR9%ZakWY9Y|drv4oTp+ z8hV@J+aXge<>NnxiS#$+*gcVZ^M+E3WZ*0{JRp2S-}^0qcSw3};QaW+0#{ShtvaXI zB5@oX?~rdqV1SpYg}nv%URUa>BibLG6^2rWWZ{0qIUFs!w86ZN8t2zIMU)u)Ox$ZRgboqNDGEe`?skr;?bf^;5Lo4$bj^cQS=%T$Uk)uy{f@V*JW)|MysA1A^K zQ9IztYRfI4eP+Tbf<}L|k0~nZ(j;z_b?C(?V`6k>?6E%1Ztvn#=sAOc)EM+_lzF2Z zZNupU>YS#~n}Fjn-(tN+oFC{_x{7f702r-B(tN~P#CNboQW;ky&0>JvO0gdSWVAlY z%0rq2t8)=QRlvrm2YPogX zT>IRj|7yC8aY&V1GWsnRr#dV=Y3aGK5_mq$!!C5h(gQg|X*hP@2exF1NuYO-n4VaT zzCFfC+>Wl578cfRlg$1CcfN+`DGc9Tg1Z}0+*}Wycvn4bA=Y4zqM&cOi?}%P*1Ds8 zQLMddCFsQsJDHtC+&KT2HV(nd6W?bzeV?U^;ZEO0OVTrb0>2)T*>~S*+h;odlid2R zo2mV(1E)I1d`%Cl>4A5qquNl);oAW`{o;YD51doR;~YMX<$7$)=vSB4+XsErJK*$P zv@d+hL3y5a;f8PS+qvFBWoQ3m%XcH?^i!7p#^qGXo_?}wBh9ILV%G+XG#)a@!0lRH z)IW21)#}shEz&SjuH;VFX`MzXgCsk4)=|t<#$x=uhrth56~UJCculF}X?+Wo$&NM0 z?sN2e3VHF^U9f{u&j)pN!tTj?3>aha4H&v69IFEyBvl0NF~G4SaO*CB<1d191CASk zd&o=cRHgIJ>bw~+5x+|KV0q=1T<7z4UMxSAgSh-ub|sV5YTx2zCvp?BDw;yQQi_EQ z=@ZF>8-;baDOIAG;VqFE&Du0(`hf4Cj74(&H}_fkZOcu#tzOh6ns775varrD`|GDU zoY-=X-GC{uz1O$af-i}fQyq5r<{8DW*L;Ka>y=$kzt;Sq|b;s_a-k{sU3`%G%-}^aBw_j(0mD=L>Ct`f{Ey=#? z;Nh@p!?F9yg?DWdL#@87tRE;Q2VZ&kC_BsUp!FS!eMXVf7S7}r|apOC0ZS+@xr=jfl zLNJFfUvh3f!Z5j-7^H`AQc!$P-CTOu;ozi$7y{kPo$^Dy;Wf`kOM!y26Y z_tKTeO}_^P-WaYvU&kMZ?}7&tt?Rcv25!E6ei6nKI*AT)KccbFRg6f@@H*0v$QTjt zCiG2mi{RwNxiXtTaK37EQ++^Vt_H3b0Lv4q5m7ko;g{n(GYb*VbdooT*i$={z{jdb{3*o}OILjhG!mTf z?ZtZBfECV?O?v>RojM!*PoL8~OQf_xda_9CruF>ld`s!u>yXdX*OT4zrwb^8+yfod zV?hV~o8J4Qep(ghOCG8|V4r+)uRZ_dGJJg@=j4p)mQa5mkDHy}rtNP2oqd}3U~_Sk z0~TqsTJl+CLh;VxtJ1Hne%7u#@f32Jo6&RNI;m)lpTcc!rZucmrdMBH+*o`r?JT}a zB(0QM#)zw`Uqv5i(Ffzj@h8{WFF$#&VVgbeq!O5;#6Wi1H)h+SPSe)*q zV(SUeG)Ilc4V8)gcu#|m0*%KaeE@M1(rFw&WCI2wMURx% zj+AF%r=WKe!XXzp>j3tz1iOCvd>GH@(^7b>zqtu}%`FH!5jG$+BD{b=<;O7u4*Ct% zaacEYqt0!1-n(ny`a*=|xIIF@^o8%CX~Z&MU8UlFO3rf=^R2FzYtt5*>*@E%Zgnkj zVFp|A9T_!8wW}3vI#Wh2$DFHiZ^9{$MoQ2S>28^r?IpaghEi8Vq+8z9bsyz)ljggB z2~Ug5PjTHg(g^<=W=gleP-eSLZl4@`Btv2og6;3fLMPrj$4UBxpfB>oBYmygBC{E% z{f6Q?`#0^$GV^~}ij$d)fB3O~qUWWMAxdEPh_+3<8k~Ak+aA6F=t^EVcVWZAlek+# z?L7&$P0)H_H#66iMxH$9pNOTV)b3{7$?g~jwR%OKsm4j)>fH33Z|HS*?-B3fn`QyMXRD37MoaUmo^iSaDiW{(W^=PBzX!-FuRQpcw{RXQV<$Tr* zzq;kjo_&}d)aMV{H{`Ijt!_y~S7&;7=;`>59Yf(zLa$0}l%?>0qwv;Dd5m?cJcfLO zTOcu)LmuIqtZ}f|uHXQr?p7mp;kH;fqMh$rLi=jh;-9p00owV2CI70Ok3X-S>kmdb zaibc#_zbFxJMk?%C)LH%>yteXNW@XMn68e{&b*x?GTH_|t;-b`esff*@Flz>Pp__e z>g6R5bU7Rkbj@{CJ-O>Cd;dEu)ysB0`SRjXy}QL*^wg>)Saa8#`i~UZF*Dxni|32_ z$qjg3^ln|zldDE*+v!yTXTA2P%>5p_{mE5JDD0}mI5|g}{i3vWUdK~M*IW8M4(R7k z)`1GU9olO016?=LxQZ8#*43fxL!dUI|9|17{-MN-d-A=8xefH@f8Hm}+$m;?Hunyn zW&)G-x@~NTIrm1hW$nvL-WVu*zyeRQd8g=pgX+kZl`k)@l=$fA?se=N%_qpo%W8Bz z0=+-861Q3A7$%gJb-m+WFFK=M#n%=bj!Mb1Ob9WBuiAEo1SYlkm0h>|S4r0g8b{ZA$#l2j=&ImOuik<$-Q5|immOU~w!Pmq1yI+}TP{X% zx17Ccx18&F8Eq33`VCR)&v~q`l6%fid;TX%+2}pc(aEigSm+a2qm;mn>S>=6cy#3U z^*pSS@MCSW9;|!ni6t8d-yeREqx&vLNxuga6`7t`yz)uwVR(e&egy7=c_|m9g^4#} z&4m}v+jIq-JC4cH;coMbwlU%_aL0`c^1aNpY!`!54{7D2?gH#niiAdY3bj&0Qyvqp z1)jetkGdNXCx)3{*l?%%YpVBv&V{bzGAhp}4@#>3oIB_S)DOc|Ds$~=27DL3t;yi)ZqzgAPmo!VTL+)iiS6^ok=&y8_nSG9?M&%WrcOTznVPplC;Pbk z$)`SSF6q)tNXW-;N$M%CN6%)7`s)%V;~ZoG&Os0a1bzXFoZgPz_%-9(4D^ep`YBv~ za&g?LanLCEYq?xe=5Gsjn8%wXj^(E$7vsCpe16mM=8R(0m;M61DS+?(!Ea1FO8Mjx zf16|?-G}c78{x?fsSu01zx*>YtRqsnr&1#P1Coy5YrU3dWSazOLRJN5_U;aD=&cLR z?0Y%5q0f29cb2u#RGNEX&goX)S?uR7k@F~Wp!xL}nM>u8yg#;+T;9uD)5N5=nuDu) zhtIGjr27P^DW#O4jhc6RpviWQlCGwH#tcBaM!i#c+q?pejYpv0ji9(DS6l%tC-y|U!%%FLIFj$= zt%hQ(9qHi4^g65^InEq>3q1P7r;h022+ySz6O#kE4d6A)%*%kv;_YPP0>^tfzfV6lzCU1@x21>Yuo zXCCd(6yTq8h9uDEqBDduh&82iTPs>g4t$2PGrX{h6(B%cex!9@j}Uv`S^gt@PfY#- zC#YXwR>2xb&tXe9K#K9A@FK~(!MDzSnRwqR%!=^a*t5p8e}sGUOfY`H7>pfagYkix zU7A=DjPI}Px~yVC?BP&Q9v@sY7#%YFrKBsiLf2P(qZE3i=#?*(*m`v<*=aM1cXvne zkmxpIB9j-kXQD=8nd(~Z!fLQ)yojtkA zPI`l$)oFKia~j6@nn)&J-~QwoJ=|oZHA$_^#6N_31AhpvQQJ7x*PVWCELt(dm=1(` zzX0BOv~Kh!uL;KY>CltLATM7VJ0ZyTmvwQ%!BB5cWtX9Z4J8&+ zT1vY35+)Rj`e|=Rfd<@!uzI9*XrHZjjfcJF7scIae%Nc{ZFus*EbJ#|2=(U7~1}nS9p+%`TjStqz z7^RY^kkJ2{oeeU*B*+AXQ{Nk+K#AkTYxbg3dvJUA^5RM93lFuAN!(M{$-o=44X)%}sB0$8(FjH9Q~G1wOEi zcl^b6wd+9_wP;Ff45IwqCb9Foqa|G@-t1=MtLd0d`_`W={@rgApYhY%u#8yir(9Fw z7ev7y;kGPE#^c&;J(DkHBB>M@ggKzQ5p)yWsiXJYEdKc*g%HER09@A3@}Q z#ll|Vk6{=Mho4JiT`~!v48vaQvr z1^H?eLK(cUqG2SDfY8U0KU8!vEowz8MgbHB74_1$w|`W;N(jHoimxufK(l^Uk@6L- zh$dh7cZrHF%%;!hTNKF%Tms7=`RgdTU#U=$7L9fRO?qdvU+BvU8h#xPQks7H8|3On zvHX4HXFHuprdo(iwI@+SIBClxC zo#Eh$(HAwoL`6T##|y^j=PdQF!}x!Hj4rN(z7LYhkv3i`S55nni<19sW+dYj_wYqy zr2FooBE#%oajNsb{(Zt!^oQXts_4hjiWFr8{W}*|q=I}!OOO72&0bUymZnhXZAJ0^sDyu1=G~N6 z_%Nx&)A_%E^5f%=Um#N{!L&t@74`qB?RsF_sLuFzJ~wuPXM0)NU5ZJr#%U8)nA1Pt zY^J`rAtaQxS(|JHhH(Cr{(*sM3vH(;xs-q?>ZWRRQW#~6hLG4O8WTwE0MYBR6}DBZ z6HEh*sYcyYrVSQp6a@(Je&2g{{u|m#bkFa*``-KhzVE$v_k6xP+iafl(ndY1!~G#Bn{-ZM}OW{ z+DCb!#NIz|i!icg8FhtvKEYtvUAWvTB-;3UXV9XuIHPiDpHW*47E@&`ZEJNkSOKLtXTUVDb zps12=q;Ppn<99~z*V9Qd6nZN()86ixIBl;aBFrG>Ckl>fR$#m^`z04sAebbNkq8{&?0Dl zn!Yz*7ebwe&-iw^Z`&dF`|SN2_Wn-DFyHgo2eF^pCijiD+y?Ad!@xhU!80p>1y|!* z0LpL0h#tf5g^vJ!2>2f0a?ljiH(>t&U=e^+sz~`W_zCtz?ZMiyT5V~x;G-=aL+y!L zE0po2{DhwfElT0h&8R1)jx8N)8LK^^o$wWWw6R*$E{&;CPr4$7mp)&#q;VWRe|DkQ zCJ{6I;~tc0G!2}F$jYjj5l@=@F$#q!=2z1XdQ!&&sR^HTI%M^0$C1_8D{6G2VzR#? z)9bg=U;{HmAP8|NDbX`XE8eG_$4B}foaj~0Sn80a#zh8l#zG}XU;tZ*9yxSXvU2%! zy>&WascB11S*j(nc}zv736YPhgq-Iu9Q=j#>eMUh^ed|0QY$P~<$S-wd4f3ii(JSr z^>Cab7=N-1fod|h?vpJ$5 zTRh0r6k+(_#tk1b>?8Xqid;b{#qYsV3r-QPZlfQpv}WBTNYsywk)}q=IIKXNC)CDJx+Og9rL;ogu2Ddh=4NHlwAr zm=@Al0Lga(E$5c(kG6MxUIbq*vtCY*r zgm=SJcjx`gWIa>adgM68G1||a!6TU=MZ1UwMaK`5xs$BzWZgqnn&^DF+#;UL7dcMT z^%-`?GwtDl6cTwln~>QNOvD{OZNZrY&ESe&LKbBcz%!Liz*~0J43LFKd;^3RaSR5i zE`T@HTAn~g2~1L8kOFnQh{Ga{GcMHSa?Z5$1lzaaTecoqhO5|OJ~)o6g;6b)&4s!! zs?*tFnZ-;(4C>e!)5G&Vqu_A?oX|M(IZBQ=TR%$8li7gi-+bp5TAa;Q<`g^#U?P+K zI-2Q3HQz=YQ%jRqCj6!)DG{VXo{o-=Y$TGcuEqsyq~NZani?(I)zuXbii-B8rrLR% z#||9m6GhS@k(!6Pw}tx-$}+2$nB4NyYFrl#>IT=i+>CRb+r?$?6`?DN1PH_#022#R zu~x*kBsp|l*mJvGLOYIhk!14bo0G{14tbn>RqPGY3R$kxk%Dk0Uk>_$sKNz(PSI#% zVVzBhJ_GGdR^Mlin!5(n)WI4{J;X~5q4~3J-zHb|b9+Gry zh3k(0MDPAIJrmivni2md&%2x=kCnuOSZS)aKpNFeSNlm5o=JL{zltYNCi?~ zo*qnbjc9*$IA<@Obh&&{!*Kd**zwnnr!dVMyFXi7!{IQ;)TXz#wsv+R;Nh^e2Xc+q zTN4i3@s?#)D(M(6ax&QMi{Z@Ifi#||(rBsoLg%4q?(FU4FYh7K+Z8|MCcrI#TLJe1ZUgiJ z`T-xmJYe+fcU^h((9uJU)QH8rz6as&I57Y5H)-!^-J5&qas7&%E1e@QtbdS*iovDxr`@_J3j+)gDmckSGcd3aCAgW6cT zq*T40cx|e0ckc^*FQx|juI*J{i}kgnDl=1CcW-%N>x-KQw_dv?aXhxQWwUy`vLkA= zwtG`=oFQ6_|0|CI_4=f;2Jk|0=8T2AWUTgv8y0pxj601^t~4}tL1fiK zE8S5`bN#{f>-%x1(SlVAa34}7?n7D!>ccB(fqTi1G}pu<_&@W|n$W5rL-OoOioB;i z<5iYFLI2&LEaN+pKKj$VHDCS=>XV@2-G15Nn&3G&rqLG{3TF0RsRp{y&%5 zHMJWr?CGVuXgl@OM%qI6VY`jy;Q`xT)Z9Vqph>5-;Mj;4Kwb~pMo@O3ZawIC17rMp z)D6%k&~`wRTdj0gx^z+$)%>^;#~Byq6nW;1xG>Q@b1)Hb%$c3Rz;i2Lz>caan2j$Q zRVxzfx@>QXf7Ev?Rd^}&jc5m99|wRB-&}Ce;fWl%;e$ovdB)0SgC4e!%q+0{58 zGcM%(d3{VPOl;4QyAm?ZfF;o-%~wU2Ueyf7$HGKU0M;%d`V^439M`E(X7~%>7L=dC z06Pr)bQ96PfIF}VWd~XsaNi4f7#@e72FTrtI)&#Yg5tyd{NvvU7-UHN2;-*2Ut%1s zVxDIi*CqZua4(*_*8w$v7+^7g`BbQ7J~!~^yC8!=F#Z&94p0s7{p$jT%f?56!wpey z0uSLjiVkPq#dW8z;4H=O;L<5&mv_-VQ8w-J7!8W@xLrOX-ZiF^WtZQy=^48`MWceB z6sccR4vMmFmt)EYuzQkph2K?%uW|A;Ezi~B9my&9x)0B-AH;ciKVTGab`8_o-9$}2xXuJ<25{C-=e~%uE$C-FYWu*pOxqUMFJ>NeB;$=X597F5PWZ$657|0d_9fdl#*YAp zSs@z&Kev}L!L(G diff --git a/flashing/hackrf_one_usb.dfu b/flashing/hackrf_one_usb.dfu index be690312fe8863d0aa6e828af6661c787d38f9af..2e9d5f7200d56b3a6863a128d798e0ad6b083b22 100644 GIT binary patch literal 42564 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 From 81752c8d78e54a535077a3ac2cf99c363e3ff469 Mon Sep 17 00:00:00 2001 From: GullCode Date: Sun, 30 Apr 2023 18:41:24 +0200 Subject: [PATCH 6/6] Added SETTINGS folder creating for PMem files --- firmware/application/apps/ui_settings.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/firmware/application/apps/ui_settings.cpp b/firmware/application/apps/ui_settings.cpp index bb92087c..1e11e9cf 100644 --- a/firmware/application/apps/ui_settings.cpp +++ b/firmware/application/apps/ui_settings.cpp @@ -410,6 +410,10 @@ namespace ui { bool load_mem_at_startup = false ; File pmem_flag_file_handle ; + + std::string folder = "SETTINGS"; + make_new_directory(folder); + std::string pmem_flag_file = "/SETTINGS/PMEM_FILEFLAG" ; auto result = pmem_flag_file_handle.open(pmem_flag_file); if(!result.is_valid())