diff --git a/firmware/application/apps/ble_rx_app.cpp b/firmware/application/apps/ble_rx_app.cpp index 5d050214..71300d2c 100644 --- a/firmware/application/apps/ble_rx_app.cpp +++ b/firmware/application/apps/ble_rx_app.cpp @@ -206,6 +206,7 @@ void BleRecentEntryDetailView::launch_bletx(BleRecentEntry packetEntry) { strncpy(bleTxPacket.macAddress, macAddressStr.c_str(), 13); strncpy(bleTxPacket.advertisementData, packetEntry.dataString.c_str(), (packetEntry.packetData.dataLen * 2) + 1); + strncpy(bleTxPacket.packetCount, "50", 3); bleTxPacket.packet_count = 50; nav_.replace(bleTxPacket); diff --git a/firmware/application/apps/ble_tx_app.cpp b/firmware/application/apps/ble_tx_app.cpp index 34b24de1..5aa1ef07 100644 --- a/firmware/application/apps/ble_tx_app.cpp +++ b/firmware/application/apps/ble_tx_app.cpp @@ -172,6 +172,30 @@ void BLETxView::file_error() { nav_.display_modal("Error", "File read error."); } +bool BLETxView::saveFile(const std::filesystem::path& path) { + File f; + auto error = f.create(path); + if (error) + return false; + + for (uint32_t i = 0; i < num_packets; i++) { + std::string macAddressStr = packets[i].macAddress; + std::string advertisementDataStr = packets[i].advertisementData; + std::string packetCountStr = packets[i].packetCount; + + std::string packetString = macAddressStr + ' ' + advertisementDataStr + ' ' + packetCountStr; + + // Are we on the last line? + if (i != num_packets - 1) { + packetString += '\n'; + } + + f.write(packetString.c_str(), packetString.length()); + } + + return true; +} + void BLETxView::toggle() { if (is_active()) { stop(); @@ -286,11 +310,14 @@ BLETxView::BLETxView(NavigationView& nav) &label_mac_address, &text_mac_address, &label_data_packet, + &button_save_packet, &button_switch, &console}); field_frequency.set_step(0); + ensure_directory(packet_save_path); + button_play.on_select = [this](ImageButton&) { this->toggle(); }; @@ -326,6 +353,17 @@ BLETxView::BLETxView(NavigationView& nav) }; }; + button_save_packet.on_select = [this, &nav](Button&) { + packetFileBuffer = ""; + text_prompt( + nav, + packetFileBuffer, + 64, + [this](std::string& buffer) { + on_save_file(buffer); + }); + }; + button_switch.on_select = [this, &nav](Button&) { nav_.set_on_pop([this]() { nav_.push(); }); nav_.pop(); @@ -391,6 +429,14 @@ void BLETxView::on_file_changed(const fs::path& new_file_path) { } } +void BLETxView::on_save_file(const std::string value) { + auto folder = packet_save_path.parent_path(); + auto ext = packet_save_path.extension(); + auto new_path = folder / value + ext; + + saveFile(new_path); +} + void BLETxView::on_data(uint32_t value, bool is_data) { std::string str_console = ""; diff --git a/firmware/application/apps/ble_tx_app.hpp b/firmware/application/apps/ble_tx_app.hpp index 90e140d3..75612fb8 100644 --- a/firmware/application/apps/ble_tx_app.hpp +++ b/firmware/application/apps/ble_tx_app.hpp @@ -79,6 +79,7 @@ class BLETxView : public View { void stop(); void handle_replay_thread_done(const uint32_t return_code); void file_error(); + bool saveFile(const std::filesystem::path& path); std::string title() const override { return "BLE TX"; }; @@ -87,6 +88,7 @@ class BLETxView : public View { void on_tx_progress(const bool done); void on_file_changed(const std::filesystem::path& new_file_path); void update_packet_display(BLETxPacket packet); + void on_save_file(const std::string value); NavigationView& nav_; TxRadioState radio_state_{ @@ -101,6 +103,7 @@ class BLETxView : public View { uint32_t prev_value{0}; std::filesystem::path file_path{}; + std::filesystem::path packet_save_path{u"BLETX/BLETX_????.TXT"}; uint8_t channel_number = 37; char randomMac[13] = "010203040506"; @@ -252,13 +255,18 @@ class BLETxView : public View { Console console{ {0, 8 * 16, 240, 240}}; + Button button_save_packet{ + {1 * 8, 16 * 16, 13 * 8, 2 * 16}, + "Save Packet"}; + Button button_switch{ - {8 * 8, 16 * 16, 14 * 8, 2 * 16}, + {16 * 8, 16 * 16, 13 * 8, 2 * 16}, "Switch to Rx"}; std::string str_log{""}; bool logging{true}; bool logging_done{false}; + std::string packetFileBuffer{}; std::unique_ptr logger{};