diff --git a/firmware/application/apps/ble_tx_app.cpp b/firmware/application/apps/ble_tx_app.cpp index 07b5ff13c..a33f6a53b 100644 --- a/firmware/application/apps/ble_tx_app.cpp +++ b/firmware/application/apps/ble_tx_app.cpp @@ -116,7 +116,7 @@ static std::uint64_t get_freq_by_channel_number(uint8_t channel_number) { freq_hz = 2'428'000'000ull + (channel_number - 11) * 2'000'000ull; break; default: - freq_hz = UINT64_MAX; + freq_hz = 2'402'000'000ull; // Default to channel 37 frequency if invalid channel number } return freq_hz; @@ -254,7 +254,7 @@ void BLETxView::send_packet() { } void BLETxView::start() { - if (file_path.empty()) { + if (file_path.empty() || num_packets == 0) { file_error(); check_loop.set_value(false); return; @@ -266,6 +266,8 @@ void BLETxView::start() { button_play.set_bitmap(&bitmap_stop); is_running = true; + advCount = 0; + send_packet(); } @@ -296,55 +298,61 @@ void BLETxView::on_timer() { void BLETxView::on_tx_progress(const bool done, uint32_t progress) { // TODO: make use of progress variable (void)progress; + if (!is_active() || num_packets == 0) { + return; + } if (done) { if (is_active()) { transmitter_model.disable(); + if (auto_channel) { - switch (advCount) { - case 0: - channel_number = 37; - break; - case 1: - channel_number = 38; - break; - case 2: - channel_number = 39; - break; - } - - field_frequency.set_value(get_freq_by_channel_number(channel_number)); - + advCount++; if (advCount == 3) { channel_number = 37; - packet_counter--; + field_frequency.set_value(get_freq_by_channel_number(channel_number)); + if (packet_counter > 0) packet_counter--; packetDone = true; advCount = 0; } else { + channel_number = 37 + advCount; + field_frequency.set_value(get_freq_by_channel_number(channel_number)); + send_packet(); + } + } else if (all_channels) { + advCount++; + if (advCount == 40) { + channel_number = 0; + field_frequency.set_value(get_freq_by_channel_number(channel_number)); + if (packet_counter > 0) packet_counter--; + packetDone = true; + advCount = 0; + } else { + channel_number = advCount; + field_frequency.set_value(get_freq_by_channel_number(channel_number)); send_packet(); - advCount++; } } else { - packet_counter--; + if (packet_counter > 0) packet_counter--; packetDone = true; } } + } - // Reached end of current packet repeats. - if (packet_counter == 0) { - // Done sending all packets. - if (current_packet == (num_packets - 1)) { - current_packet = 0; + // Reached end of current packet repeats. + if (packet_counter == 0) { + // Done sending all packets. + current_packet++; + if (current_packet >= num_packets) { + current_packet = 0; - // If looping, restart from beginning. - if (check_loop.value()) { - update_current_packet(packets[current_packet], current_packet); - } else { - stop(); - } - } else { - current_packet++; + // If looping, restart from beginning. + if (check_loop.value()) { update_current_packet(packets[current_packet], current_packet); + } else { + stop(); } + } else { + update_current_packet(packets[current_packet], current_packet); } } } @@ -385,16 +393,20 @@ BLETxView::BLETxView(NavigationView& nav) }; options_channel.on_change = [this](size_t, int32_t i) { - // If we selected Auto don't do anything and Auto will handle changing. - if (i == 40) { - auto_channel = true; - return; + auto_channel = (i == BLT_CHAN_AUTO); + all_channels = (i == BLT_CHAN_ALL); + + advCount = 0; + + if (auto_channel) { + channel_number = 37; + } else if (all_channels) { + channel_number = 0; } else { - auto_channel = false; + channel_number = i; } - field_frequency.set_value(get_freq_by_channel_number(i)); - channel_number = i; + field_frequency.set_value(get_freq_by_channel_number(channel_number)); }; options_speed.on_change = [this](size_t, int32_t i) { @@ -403,7 +415,7 @@ BLETxView::BLETxView(NavigationView& nav) }; options_speed.set_selected_index(0); - options_channel.set_selected_index(3); + options_channel.set_by_value(BLT_CHAN_AUTO); check_rand_mac.set_value(false); check_rand_mac.on_select = [this](Checkbox&, bool v) { @@ -413,8 +425,7 @@ BLETxView::BLETxView(NavigationView& nav) button_open.on_select = [this](Button&) { auto open_view = nav_.push(".TXT"); open_view->on_changed = [this](std::filesystem::path new_file_path) { - on_file_changed(new_file_path); - + this->on_file_changed(new_file_path); nav_.set_on_pop([this]() { button_play.focus(); }); }; }; @@ -427,7 +438,7 @@ BLETxView::BLETxView(NavigationView& nav) 64, ENTER_KEYBOARD_MODE_ALPHA, [this](std::string& buffer) { - on_save_file(buffer); + this->on_save_file(buffer); }); }; @@ -506,10 +517,10 @@ void BLETxView::on_file_changed(const fs::path& new_file_path) { } do { - readUntil(data_file, packets[num_packets].macAddress, mac_address_size_str, ' '); - readUntil(data_file, packets[num_packets].advertisementData, max_packet_size_str, ' '); - readUntil(data_file, packets[num_packets].packetType, max_packet_type_str, ' '); - readUntil(data_file, packets[num_packets].packetCount, max_packet_repeat_str, '\n'); + readUntil(data_file, packets[num_packets].macAddress, sizeof(packets[num_packets].macAddress), ' '); + readUntil(data_file, packets[num_packets].advertisementData, sizeof(packets[num_packets].advertisementData), ' '); + readUntil(data_file, packets[num_packets].packetType, sizeof(packets[num_packets].packetType), ' '); + readUntil(data_file, packets[num_packets].packetCount, sizeof(packets[num_packets].packetCount), '\n'); uint64_t macAddressSize = strlen(packets[num_packets].macAddress); uint64_t advertisementDataSize = strlen(packets[num_packets].advertisementData); @@ -542,10 +553,8 @@ void BLETxView::on_file_changed(const fs::path& new_file_path) { num_packets++; } while (num_packets < max_num_packets); - - update_current_packet(packets[0], 0); - data_file.close(); + update_current_packet(packets[0], 0); } } @@ -570,6 +579,9 @@ void BLETxView::update_current_packet(BLETxPacket packet, uint32_t currentIndex) std::vector strings = splitIntoStrings(packet.advertisementData); + packet_counter = packet.packet_count; + current_packet = currentIndex; + text_packet_index.set(to_string_dec_uint(current_packet)); text_packets_sent.set(to_string_dec_uint(packet.packet_count)); @@ -578,9 +590,6 @@ void BLETxView::update_current_packet(BLETxPacket packet, uint32_t currentIndex) progressbar.set_max(packet.packet_count); - packet_counter = packet.packet_count; - current_packet = currentIndex; - dataFile.create(dataTempFilePath); for (const std::string& str : strings) { diff --git a/firmware/application/apps/ble_tx_app.hpp b/firmware/application/apps/ble_tx_app.hpp index bf05d4dc3..bcb2d35c3 100644 --- a/firmware/application/apps/ble_tx_app.hpp +++ b/firmware/application/apps/ble_tx_app.hpp @@ -45,6 +45,9 @@ #include #include +#define BLT_CHAN_AUTO 40 +#define BLT_CHAN_ALL 41 + class BLELoggerTx { public: Optional append(const std::filesystem::path& filename) { @@ -94,7 +97,7 @@ struct BLETxPacket { char advertisementData[63]; char packetCount[11]; char packetType[17]; - uint32_t packet_count; + uint32_t packet_count; // repeat the same packet count times PKT_TYPE pduType; }; @@ -145,6 +148,7 @@ class BLETxView : public View { std::filesystem::path packet_save_path{bletx_dir / u"BLETX_????.TXT"}; uint8_t channel_number = 37; bool auto_channel = false; + bool all_channels = false; char randomMac[13] = "010203040506"; @@ -156,10 +160,10 @@ class BLETxView : public View { int16_t auto_channel_period{6}; bool repeatLoop = false; - uint32_t packet_counter{0}; - uint32_t num_packets{0}; - uint32_t current_packet{0}; - uint8_t packetTxCount{0}; + uint32_t packet_counter{0}; // the counter (decr) of the actual packet as it can be sent multiple times + uint32_t num_packets{0}; // how many packets in the file + uint32_t current_packet{0}; // the actual packet's num, i'm sending if i have multiple packets + uint8_t packetTxCount{0}; // not used bool packetDone = false; bool random_mac = false; bool file_override = false; @@ -241,10 +245,48 @@ class BLETxView : public View { OptionsField options_channel{ {11 * 8, 6 * 8}, 5, - {{"Ch.37 ", 37}, + {{"Ch.0", 0}, + {"Ch.1", 1}, + {"Ch.2", 2}, + {"Ch.3", 3}, + {"Ch.4", 4}, + {"Ch.5", 5}, + {"Ch.6", 6}, + {"Ch.7", 7}, + {"Ch.8", 8}, + {"Ch.9", 9}, + {"Ch.10", 10}, + {"Ch.11", 11}, + {"Ch.12", 12}, + {"Ch.13", 13}, + {"Ch.14", 14}, + {"Ch.15", 15}, + {"Ch.16", 16}, + {"Ch.17", 17}, + {"Ch.18", 18}, + {"Ch.19", 19}, + {"Ch.20", 20}, + {"Ch.21", 21}, + {"Ch.22", 22}, + {"Ch.23", 23}, + {"Ch.24", 24}, + {"Ch.25", 25}, + {"Ch.26", 26}, + {"Ch.27", 27}, + {"Ch.28", 28}, + {"Ch.29", 29}, + {"Ch.30", 30}, + {"Ch.31", 31}, + {"Ch.32", 32}, + {"Ch.33", 33}, + {"Ch.34", 34}, + {"Ch.35", 35}, + {"Ch.36", 36}, + {"Ch.37", 37}, {"Ch.38", 38}, {"Ch.39", 39}, - {"Auto", 40}}}; + {"Auto", BLT_CHAN_AUTO}, + {"All", BLT_CHAN_ALL}}}; OptionsField options_adv_type{ {17 * 8, 6 * 8},