diff --git a/firmware/application/freqman.cpp b/firmware/application/freqman.cpp index e7daa0a6..93ad444b 100644 --- a/firmware/application/freqman.cpp +++ b/firmware/application/freqman.cpp @@ -43,25 +43,27 @@ bool load_freqman_file(std::string& file_stem, freqman_db &db) { char * line_end; std::string description; rf::Frequency frequency_a, frequency_b; - char file_data[256]; + char file_data[257]; freqman_entry_type type; - db.entries.clear(); + db.clear(); auto result = freqman_file.open("FREQMAN/" + file_stem + ".TXT"); if (result.is_valid()) return false; while (1) { + // Read a 256 bytes block from file freqman_file.seek(file_position); - memset(file_data, 0, 256); + memset(file_data, 0, 257); auto read_size = freqman_file.read(file_data, 256); if (read_size.is_error()) return false; // Read error - file_position += sizeof(file_data); + file_position += 256; + // Reset line_start to beginning of buffer line_start = file_data; if (!strstr(file_data, "f=") && !strstr(file_data, "a=")) @@ -102,18 +104,20 @@ bool load_freqman_file(std::string& file_stem, freqman_db &db) { } else description = "-"; - db.entries.push_back({ frequency_a, frequency_b, description, type }); + db.push_back({ frequency_a, frequency_b, description, type }); n++; if (n >= FREQMAN_MAX_PER_FILE) return true; line_start = line_end + 1; + if (line_start - file_data >= 256) break; } - if (read_size.value() != sizeof(file_data)) - return true; // End of file + if (read_size.value() != 256) + break; // End of file - file_position -= (file_data + sizeof(file_data) - line_start); + // Restart at beginning of last incomplete line + file_position -= (file_data + 256 - line_start); } return true; @@ -127,8 +131,8 @@ bool save_freqman_file(std::string& file_stem, freqman_db &db) { if (!create_freqman_file(file_stem, freqman_file)) return false; - for (size_t n = 0; n < db.entries.size(); n++) { - auto& entry = db.entries[n]; + for (size_t n = 0; n < db.size(); n++) { + auto& entry = db[n]; frequency_a = entry.frequency_a; diff --git a/firmware/application/freqman.hpp b/firmware/application/freqman.hpp index 3da0cbb6..162d0c22 100644 --- a/firmware/application/freqman.hpp +++ b/firmware/application/freqman.hpp @@ -30,8 +30,8 @@ #define __FREQMAN_H__ #define FREQMAN_DESC_MAX_LEN 30 -#define FREQMAN_MAX_PER_FILE 50 -#define FREQMAN_MAX_PER_FILE_STR "50" +#define FREQMAN_MAX_PER_FILE 30 +#define FREQMAN_MAX_PER_FILE_STR "30" using namespace ui; using namespace std; @@ -55,9 +55,7 @@ struct freqman_entry { freqman_entry_type type { }; }; -struct freqman_db { - std::vector<freqman_entry> entries; -}; +using freqman_db = std::vector<freqman_entry>; std::vector<std::string> get_freqman_files(); bool load_freqman_file(std::string& file_stem, freqman_db &db); diff --git a/firmware/application/ui_freqman.cpp b/firmware/application/ui_freqman.cpp index fca5d94e..f6bf45a7 100644 --- a/firmware/application/ui_freqman.cpp +++ b/firmware/application/ui_freqman.cpp @@ -82,7 +82,7 @@ void FreqManBaseView::populate_categories() { options_category.set_options(categories); options_category.set_selected_index(0); - options_category.on_change = [this](size_t, int32_t category_id) { + options_category.on_change = [this](size_t category_id, int32_t) { if (on_change_category) on_change_category(category_id); }; @@ -94,14 +94,14 @@ void FreqManBaseView::change_category(int32_t category_id) { current_category_id = category_id; - if (!load_freqman_file(file_list[current_category_id], database)) + if (!load_freqman_file(file_list[categories[current_category_id].second], database)) error_ = ERROR_ACCESS; else refresh_list(); } void FreqManBaseView::refresh_list() { - if (!database.entries.size()) { + if (!database.size()) { if (on_refresh_widgets) on_refresh_widgets(true); } else { @@ -110,9 +110,9 @@ void FreqManBaseView::refresh_list() { menu_view.clear(); - for (size_t n = 0; n < database.entries.size(); n++) { + for (size_t n = 0; n < database.size(); n++) { menu_view.add_item({ - freqman_item_string(database.entries[n], 26), + freqman_item_string(database[n], 26), ui::Color::white(), nullptr, [this](){ @@ -127,33 +127,33 @@ void FreqManBaseView::refresh_list() { } void FrequencySaveView::save_current_file() { - if (database.entries.size() > FREQMAN_MAX_PER_FILE) { + if (database.size() > FREQMAN_MAX_PER_FILE) { nav_.display_modal( "Error", "Too many entries, maximum is\n" FREQMAN_MAX_PER_FILE_STR ". Trim list ?", YESNO, [this](bool choice) { if (choice) { - database.entries.resize(FREQMAN_MAX_PER_FILE); - save_freqman_file(file_list[current_category_id], database); + database.resize(FREQMAN_MAX_PER_FILE); + save_freqman_file(file_list[categories[current_category_id].second], database); } nav_.pop(); } ); } else { - save_freqman_file(file_list[current_category_id], database); + save_freqman_file(file_list[categories[current_category_id].second], database); nav_.pop(); } } void FrequencySaveView::on_save_name() { text_prompt(nav_, &desc_buffer, 28, [this](std::string * buffer) { - database.entries.push_back({ value_, 0, *buffer, SINGLE }); + database.push_back({ value_, 0, *buffer, SINGLE }); save_current_file(); }); } void FrequencySaveView::on_save_timestamp() { - database.entries.push_back({ value_, 0, live_timestamp.string(), SINGLE }); + database.push_back({ value_, 0, live_timestamp.string(), SINGLE }); save_current_file(); } @@ -166,8 +166,8 @@ FrequencySaveView::FrequencySaveView( desc_buffer.reserve(28); // Todo: add back ? - /*for (size_t n = 0; n < database.entries.size(); n++) { - if (database.entries[n].value == value_) { + /*for (size_t n = 0; n < database.size(); n++) { + if (database[n].value == value_) { error_ = ERROR_DUPLICATE; break; } @@ -225,7 +225,7 @@ FrequencyLoadView::FrequencyLoadView( on_select_frequency = [&nav, this]() { nav_.pop(); - auto& entry = database.entries[menu_view.highlighted()]; + auto& entry = database[menu_view.highlighted_index()]; if (entry.type == RANGE) { // User chose a frequency range entry @@ -243,16 +243,16 @@ FrequencyLoadView::FrequencyLoadView( } void FrequencyManagerView::on_edit_freq(rf::Frequency f) { - database.entries[menu_view.highlighted()].frequency_a = f; - save_freqman_file(file_list[current_category_id], database); + database[menu_view.highlighted_index()].frequency_a = f; + save_freqman_file(file_list[categories[current_category_id].second], database); refresh_list(); } void FrequencyManagerView::on_edit_desc(NavigationView& nav) { text_prompt(nav, &desc_buffer, 28, [this](std::string * buffer) { - database.entries[menu_view.highlighted()].description = *buffer; + database[menu_view.highlighted_index()].description = *buffer; refresh_list(); - save_freqman_file(file_list[current_category_id], database); + save_freqman_file(file_list[categories[current_category_id].second], database); }); } @@ -266,8 +266,8 @@ void FrequencyManagerView::on_new_category(NavigationView& nav) { } void FrequencyManagerView::on_delete() { - database.entries.erase(database.entries.begin() + menu_view.highlighted()); - save_freqman_file(file_list[current_category_id], database); + database.erase(database.begin() + menu_view.highlighted_index()); + save_freqman_file(file_list[categories[current_category_id].second], database); refresh_list(); } @@ -282,7 +282,7 @@ void FrequencyManagerView::refresh_widgets(const bool v) { } FrequencyManagerView::~FrequencyManagerView() { - //save_freqman_file(file_list[current_category_id], database); + //save_freqman_file(file_list[categories[current_category_id].second], database); } FrequencyManagerView::FrequencyManagerView( @@ -321,14 +321,14 @@ FrequencyManagerView::FrequencyManagerView( }; button_edit_freq.on_select = [this, &nav](Button&) { - auto new_view = nav.push<FrequencyKeypadView>(database.entries[menu_view.highlighted()].frequency_a); + auto new_view = nav.push<FrequencyKeypadView>(database[menu_view.highlighted_index()].frequency_a); new_view->on_changed = [this](rf::Frequency f) { on_edit_freq(f); }; }; button_edit_desc.on_select = [this, &nav](Button&) { - desc_buffer = database.entries[menu_view.highlighted()].description; + desc_buffer = database[menu_view.highlighted_index()].description; on_edit_desc(nav); }; diff --git a/firmware/application/ui_soundboard.cpp b/firmware/application/ui_soundboard.cpp index 97f5f86a..3a540850 100644 --- a/firmware/application/ui_soundboard.cpp +++ b/firmware/application/ui_soundboard.cpp @@ -119,7 +119,7 @@ void SoundBoardView::play_sound(uint16_t id) { transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); - tone_key_index = options_tone_key.selected_index(); + tone_key_index = 0; //options_tone_key.selected_index(); divider = (1536000 / sounds[id].sample_rate) - 1; @@ -164,19 +164,22 @@ void SoundBoardView::refresh_buttons(uint16_t id) { show_infos(id); } -void SoundBoardView::change_page(Button& button, const KeyEvent key) { +bool SoundBoardView::change_page(Button& button, const KeyEvent key) { // Stupid way to find out if the button is on the sides if (button.screen_pos().x() < 32) { if ((key == KeyEvent::Left) && (page > 0)) { page--; refresh_buttons(button.id); + return true; } } else if (button.screen_pos().x() > 120) { if ((key == KeyEvent::Right) && (page < max_page - 1)) { page++; refresh_buttons(button.id); + return true; } } + return false; } SoundBoardView::SoundBoardView( @@ -210,7 +213,7 @@ SoundBoardView::SoundBoardView( else sounds[c].title = "-"; c++; - if (c == 108) break; // Limit to 108 files (6 pages) + if (c == 54) break; // Limit to 54 files (3 pages) } } } @@ -221,10 +224,10 @@ SoundBoardView::SoundBoardView( max_page = (max_sound + 18 - 1) / 18; // 3 * 6 = 18 buttons per page add_children({ + &labels, &field_frequency, &number_bw, - &text_kHz, - &options_tone_key, + //&options_tone_key, &text_title, &text_page, &text_duration, @@ -234,8 +237,8 @@ SoundBoardView::SoundBoardView( &button_exit }); - tone_keys_populate(options_tone_key); - options_tone_key.set_selected_index(0); + //tone_keys_populate(options_tone_key); + //options_tone_key.set_selected_index(0); const auto button_fn = [this](Button& button) { tx_mode = NORMAL; @@ -247,8 +250,7 @@ SoundBoardView::SoundBoardView( }; const auto button_dir = [this](Button& button, const KeyEvent key) { - this->change_page(button, key); - return false; + return change_page(button, key); }; // Generate buttons diff --git a/firmware/application/ui_soundboard.hpp b/firmware/application/ui_soundboard.hpp index 013645b4..5dd9fc88 100644 --- a/firmware/application/ui_soundboard.hpp +++ b/firmware/application/ui_soundboard.hpp @@ -75,7 +75,7 @@ private: std::unique_ptr<WAVFileReader> reader { }; - sound sounds[108]; // 6 pages * 18 buttons + sound sounds[54]; // 3 pages * 18 buttons uint32_t max_sound { }; uint8_t max_page { }; @@ -109,29 +109,28 @@ private: void do_random(); void show_infos(uint16_t id); - void change_page(Button& button, const KeyEvent key); + bool change_page(Button& button, const KeyEvent key); void refresh_buttons(uint16_t id); void play_sound(uint16_t id); void prepare_audio(); void on_ctcss_changed(uint32_t v); + Labels labels { + { { 10 * 8, 4 }, "BW: kHz", Color::light_grey() } + }; + FrequencyField field_frequency { { 0, 4 }, }; NumberField number_bw { - { 10 * 8, 4 }, + { 13 * 8, 4 }, 3, - {1, 150}, + { 1, 150 }, 1, ' ' }; - Text text_kHz { - { 13 * 8, 4, 8 * 8, 16 }, - "k CTCSS:" - }; - OptionsField options_tone_key { { 21 * 8, 4 }, 8, @@ -153,7 +152,7 @@ private: }; ProgressBar pbar { - { 9 * 8, 30 * 8, 19 * 8, 16 } + { 9 * 8, 30 * 8, 20 * 8, 16 } }; Checkbox check_loop { diff --git a/firmware/portapack-h1-havoc.bin b/firmware/portapack-h1-havoc.bin index dc69e7d5..52ba799e 100644 Binary files a/firmware/portapack-h1-havoc.bin and b/firmware/portapack-h1-havoc.bin differ diff --git a/sdcard/FREQMAN/GSM.TXT b/sdcard/FREQMAN/GSM.TXT new file mode 100644 index 00000000..9df34deb --- /dev/null +++ b/sdcard/FREQMAN/GSM.TXT @@ -0,0 +1,8 @@ +a=935000000,b=945000000,d=GSM900 Orange FR +a=1808000000,b=1832000000,d=GSM1800 Orange FR +a=950000000,b=960000000,d=GSM900 SFR FR +a=1832000000,b=1853000000,d=GSM1800 SFR FR +a=925000000,b=935000000,d=GSM900 Bouygues FR +a=1858000000,b=1880000000,d=GSM1800 Bouygues FR +a=945000000,b=950000000,d=GSM Free FR +a=921000000,b=925000000,d=GSM-R FR diff --git a/sdcard/FREQMAN/OTHERS.TXT b/sdcard/FREQMAN/OTHERS.TXT new file mode 100644 index 00000000..3adeab1f --- /dev/null +++ b/sdcard/FREQMAN/OTHERS.TXT @@ -0,0 +1,6 @@ +a=1880000000,b=1900000000,d=DECT +a=162930000,b=162970000,d=PMV AFSK +a=433050000,b=434790000,d=ISM 433 +a=868000000,b=868200000,d=ISM 868 +a=1574920000,b=1575920000,d=GPS L1 +a=1226600000,b=1228600000,d=GPS L2 diff --git a/sdcard/FREQMAN/WLAN2_4.TXT b/sdcard/FREQMAN/WLAN2_4.TXT new file mode 100644 index 00000000..c14ab007 --- /dev/null +++ b/sdcard/FREQMAN/WLAN2_4.TXT @@ -0,0 +1,13 @@ +a=2401000000,b=2423000000,d=WLAN 2.4G CH1 +a=2406000000,b=2428000000,d=WLAN 2.4G CH2 +a=2411000000,b=2433000000,d=WLAN 2.4G CH3 +a=2416000000,b=2438000000,d=WLAN 2.4G CH4 +a=2421000000,b=2443000000,d=WLAN 2.4G CH5 +a=2426000000,b=2448000000,d=WLAN 2.4G CH6 +a=2431000000,b=2453000000,d=WLAN 2.4G CH7 +a=2436000000,b=2458000000,d=WLAN 2.4G CH8 +a=2441000000,b=2463000000,d=WLAN 2.4G CH9 +a=2446000000,b=2468000000,d=WLAN 2.4G CH10 +a=2451000000,b=2473000000,d=WLAN 2.4G CH11 +a=2456000000,b=2478000000,d=WLAN 2.4G CH12 +a=2461000000,b=2483000000,d=WLAN 2.4G CH13 diff --git a/sdcard/FREQMAN/WLAN5-1.TXT b/sdcard/FREQMAN/WLAN5-1.TXT new file mode 100644 index 00000000..c97ca8bd --- /dev/null +++ b/sdcard/FREQMAN/WLAN5-1.TXT @@ -0,0 +1,28 @@ +a=5170000000,b=5190000000,d=WLAN 5G CH36 +a=5170000000,b=5210000000,d=WLAN 5G CH38 +a=5190000000,b=5210000000,d=WLAN 5G CH40 +a=5170000000,b=5250000000,d=WLAN 5G CH42 +a=5210000000,b=5230000000,d=WLAN 5G CH44 +a=5210000000,b=5250000000,d=WLAN 5G CH46 +a=5230000000,b=5250000000,d=WLAN 5G CH48 +a=5170000000,b=5330000000,d=WLAN 5G CH50 +a=5250000000,b=5270000000,d=WLAN 5G CH52 +a=5250000000,b=5290000000,d=WLAN 5G CH54 +a=5270000000,b=5290000000,d=WLAN 5G CH56 +a=5250000000,b=5330000000,d=WLAN 5G CH58 +a=5290000000,b=5310000000,d=WLAN 5G CH60 +a=5290000000,b=5330000000,d=WLAN 5G CH62 +a=5310000000,b=5330000000,d=WLAN 5G CH64 +a=5490000000,b=5510000000,d=WLAN 5G CH100 +a=5490000000,b=5530000000,d=WLAN 5G CH102 +a=5510000000,b=5530000000,d=WLAN 5G CH104 +a=5490000000,b=5570000000,d=WLAN 5G CH106 +a=5530000000,b=5550000000,d=WLAN 5G CH108 +a=5530000000,b=5570000000,d=WLAN 5G CH110 +a=5550000000,b=5570000000,d=WLAN 5G CH112 +a=5490000000,b=5650000000,d=WLAN 5G CH114 +a=5570000000,b=5590000000,d=WLAN 5G CH116 +a=5570000000,b=5610000000,d=WLAN 5G CH118 +a=5590000000,b=5610000000,d=WLAN 5G CH120 +a=5570000000,b=5650000000,d=WLAN 5G CH122 +a=5610000000,b=5630000000,d=WLAN 5G CH124 diff --git a/sdcard/FREQMAN/WLAN5-2.TXT b/sdcard/FREQMAN/WLAN5-2.TXT new file mode 100644 index 00000000..266f254a --- /dev/null +++ b/sdcard/FREQMAN/WLAN5-2.TXT @@ -0,0 +1,19 @@ +a=5610000000,b=5650000000,d=WLAN 5G CH126 +a=5630000000,b=5650000000,d=WLAN 5G CH128 +a=5650000000,b=5670000000,d=WLAN 5G CH132 +a=5650000000,b=5690000000,d=WLAN 5G CH134 +a=5670000000,b=5690000000,d=WLAN 5G CH136 +a=5650000000,b=5730000000,d=WLAN 5G CH138 +a=5690000000,b=5710000000,d=WLAN 5G CH140 +a=5690000000,b=5730000000,d=WLAN 5G CH142 +a=5710000000,b=5730000000,d=WLAN 5G CH144 +a=5735000000,b=5755000000,d=WLAN 5G CH149 +a=5735000000,b=5775000000,d=WLAN 5G CH151 +a=5755000000,b=5775000000,d=WLAN 5G CH153 +a=5735000000,b=5815000000,d=WLAN 5G CH155 +a=5775000000,b=5795000000,d=WLAN 5G CH157 +a=5775000000,b=5815000000,d=WLAN 5G CH159 +a=5795000000,b=5815000000,d=WLAN 5G CH161 +a=5815000000,b=5835000000,d=WLAN 5G CH165 +a=5835000000,b=5855000000,d=WLAN 5G CH169 +a=5855000000,b=5875000000,d=WLAN 5G CH173