Skip to content

Commit

Permalink
BLE Rx/Tx App Cleanup (#1570)
Browse files Browse the repository at this point in the history
* Showing highest dB first
* Including namestring in search
* Using replace seems to work better.
* bletx cleanup
* removing pop
* pop is needed on this view.
* cleanup switching
* reduce to 1 entry list
* Setting to use the name of BLE with a toggle checkbox.
* Removed &nav reference.
* Removing const
* Fixed issue with memory being run out when switching from a previous app
* Fixed not setting updated progressbar for each new packet.
  • Loading branch information
iNetro authored Nov 11, 2023
1 parent f7f784c commit a3249ca
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 159 deletions.
192 changes: 70 additions & 122 deletions firmware/application/apps/ble_rx_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
*/

#include "ble_rx_app.hpp"
#include "ble_tx_app.hpp"

#include "ui_modemsetup.hpp"

Expand Down Expand Up @@ -65,8 +64,9 @@ void RecentEntriesTable<BleRecentEntries>::draw(
Painter& painter,
const Style& style) {
std::string line{};
line.reserve(30);

if (!entry.nameString.empty()) {
if (!entry.nameString.empty() && entry.include_name) {
line = entry.nameString;

if (line.length() < 17) {
Expand Down Expand Up @@ -107,13 +107,16 @@ BleRecentEntryDetailView::BleRecentEntryDetailView(NavigationView& nav, const Bl

text_mac_address.set(to_string_mac_address(entry.packetData.macAddress, 6, false));

button_done.on_select = [this](const ui::Button&) {
nav_.pop();
button_done.on_select = [&nav](const ui::Button&) {
nav.pop();
};

button_send.on_select = [this](const ui::Button&) {
nav_.set_on_pop([this]() { launch_bletx(entry_); });
nav_.pop();
button_send.on_select = [this, &nav](const ui::Button&) {
auto packetToSend = build_packet();
nav.set_on_pop([packetToSend, &nav]() {
nav.replace<BLETxView>(packetToSend);
});
nav.pop();
};
}

Expand Down Expand Up @@ -199,18 +202,18 @@ void BleRecentEntryDetailView::set_entry(const BleRecentEntry& entry) {
set_dirty();
}

void BleRecentEntryDetailView::launch_bletx(BleRecentEntry packetEntry) {
BLETxPacket BleRecentEntryDetailView::build_packet() {
BLETxPacket bleTxPacket;
memset(&bleTxPacket, 0, sizeof(BLETxPacket));

std::string macAddressStr = to_string_mac_address(packetEntry.packetData.macAddress, 6, true);
std::string macAddressStr = to_string_mac_address(entry_.packetData.macAddress, 6, true);

strncpy(bleTxPacket.macAddress, macAddressStr.c_str(), 12);
strncpy(bleTxPacket.advertisementData, packetEntry.dataString.c_str(), packetEntry.packetData.dataLen * 2);
strncpy(bleTxPacket.advertisementData, entry_.dataString.c_str(), entry_.packetData.dataLen * 2);
strncpy(bleTxPacket.packetCount, "50", 3);
bleTxPacket.packet_count = 50;

nav_.replace<BLETxView>(bleTxPacket);
return bleTxPacket;
}

static std::uint64_t get_freq_by_channel_number(uint8_t channel_number) {
Expand Down Expand Up @@ -255,38 +258,29 @@ BLERxView::BLERxView(NavigationView& nav)
&options_channel,
&field_frequency,
&check_log,
&check_name,
&label_sort,
&options_sort,
&button_filter,
&button_switch,
&recent_entries_view,
&recent_entries_filter_view,
&recent_entry_detail_view});

recent_entry_detail_view.hidden(true);
recent_entries_filter_view.hidden(true);
&recent_entries_view});

recent_entries_view.on_select = [this](const BleRecentEntry& entry) {
nav_.push<BleRecentEntryDetailView>(entry);
};

recent_entries_filter_view.on_select = [this](const BleRecentEntry& entry) {
nav_.push<BleRecentEntryDetailView>(entry);
};

button_filter.on_select = [this, &nav](Button&) {
button_filter.on_select = [this](Button&) {
text_prompt(
nav,
nav_,
filterBuffer,
64,
[this](std::string& buffer) {
on_switch_table(buffer);
});
};

button_switch.on_select = [this, &nav](Button&) {
nav_.set_on_pop([this]() { nav_.push<BLETxView>(); });
nav_.pop();
button_switch.on_select = [&nav](Button&) {
nav.replace<BLETxView>();
};

field_frequency.set_step(0);
Expand All @@ -301,51 +295,22 @@ BLERxView::BLERxView(NavigationView& nav)
logger->append(LOG_ROOT_DIR "/BLELOG_" + to_string_timestamp(rtc_time::now()) + ".TXT");
};

check_name.set_value(true);

check_name.on_select = [this](Checkbox&, bool v) {
setAllMembersToValue(recent, &BleRecentEntry::include_name, v);
recent_entries_view.set_dirty();
};

options_channel.on_change = [this](size_t, int32_t i) {
field_frequency.set_value(get_freq_by_channel_number(i));
channel_number = i;

baseband::set_btlerx(channel_number);
};

options_sort.on_change = [this](size_t, int32_t i) {
switch (i) {
case 0:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.macAddress; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.macAddress; }, true);
break;
case 1:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.numHits; }, false);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.numHits; }, false);
break;
case 2:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.dbValue; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.dbValue; }, true);
break;
case 3:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.timestamp; }, false);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.timestamp; }, false);
break;
case 4:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.nameString; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.nameString; }, true);
break;
default:
break;
}

recent_entries_view.set_dirty();
recent_entries_filter_view.set_dirty();
options_sort.on_change = [this](size_t, int32_t index) {
handle_entries_sort(index);
};

options_channel.set_selected_index(0, true);
Expand Down Expand Up @@ -428,42 +393,66 @@ void BLERxView::on_data(BlePacketData* packet) {
// Start of Packet stuffing.
// Masking off the top 2 bytes to avoid invalid keys.
auto& entry = ::on_packet(recent, macAddressEncoded & 0xFFFFFFFFFFFF);
truncate_entries(recent, 32);
updateEntry(packet, entry);

// Add entries if they meet the criteria.
auto value = filter;
resetFilteredEntries(recent, [&value](const BleRecentEntry& entry) {
return (entry.dataString.find(value) == std::string::npos) && (entry.nameString.find(value) == std::string::npos);
});

handle_entries_sort(options_sort.selected_index());

// Log at End of Packet.
if (logger && logging) {
logger->log_raw_data(str_console);
}
}

void BLERxView::on_switch_table(const std::string value) {
filter = value;

if (!value.empty()) {
removeEntriesWithoutKey(recent, filterEntries, [&value](const BleRecentEntry& entry) {
return entry.dataString.find(value) == std::string::npos;
void BLERxView::on_switch_table(std::string value) {
// New filter? Reset list from recent entries.
if (filter != value) {
resetFilteredEntries(recent, [&value](const BleRecentEntry& entry) {
return (entry.dataString.find(value) == std::string::npos) && (entry.nameString.find(value) == std::string::npos);
});
}

recent_entries_view.set_dirty();
filter = value;
}

recent_entries_filter_view.hidden(false);
recent_entries_view.hidden(true);
} else {
recent_entries_view.hidden(false);
recent_entries_filter_view.hidden(true);
void BLERxView::handle_entries_sort(uint8_t index) {
switch (index) {
case 0:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.macAddress; }, true);
break;
case 1:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.numHits; }, false);
break;
case 2:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.dbValue; }, false);
break;
case 3:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.timestamp; }, false);
break;
case 4:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.nameString; }, true);
break;
default:
break;
}

recent_entries_view.set_dirty();
recent_entries_filter_view.set_dirty();
}

void BLERxView::set_parent_rect(const Rect new_parent_rect) {
View::set_parent_rect(new_parent_rect);
const Rect content_rect{0, header_height, new_parent_rect.width(), new_parent_rect.height() - header_height - switch_button_height};
recent_entries_view.set_parent_rect(content_rect);
recent_entry_detail_view.set_parent_rect(content_rect);
recent_entries_filter_view.set_parent_rect(content_rect);
}

BLERxView::~BLERxView() {
Expand Down Expand Up @@ -502,6 +491,7 @@ void BLERxView::updateEntry(const BlePacketData* packet, BleRecentEntry& entry)
}

entry.nameString = "";
entry.include_name = check_name.value();

uint8_t currentByte = 0;
uint8_t length = 0;
Expand All @@ -526,48 +516,6 @@ void BLERxView::updateEntry(const BlePacketData* packet, BleRecentEntry& entry)
stringFound = true;
}
}

switch (options_sort.selected_index()) {
case 0:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.macAddress; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.macAddress; }, true);
break;
case 1:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.numHits; }, false);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.numHits; }, false);
break;
case 2:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.dbValue; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.dbValue; }, true);
break;
case 3:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.timestamp; }, false);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.timestamp; }, false);
break;
case 4:
sortEntriesBy(
recent, [](const BleRecentEntry& entry) { return entry.nameString; }, true);
sortEntriesBy(
filterEntries, [](const BleRecentEntry& entry) { return entry.nameString; }, true);
break;
default:
break;
}

on_switch_table(filter);

// TODO: Crude hack, should be a more formal listener arrangement...
if (entry.key() == recent_entry_detail_view.entry().key()) {
recent_entry_detail_view.set_entry(entry);
}
}

} /* namespace ui */
22 changes: 15 additions & 7 deletions firmware/application/apps/ble_rx_app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#ifndef __BLE_RX_APP_H__
#define __BLE_RX_APP_H__

#include "ble_tx_app.hpp"

#include "ui.hpp"
#include "ui_navigation.hpp"
#include "ui_receiver.hpp"
Expand Down Expand Up @@ -79,6 +81,7 @@ struct BleRecentEntry {
std::string timestamp;
std::string dataString;
std::string nameString;
bool include_name;
uint16_t numHits;

BleRecentEntry()
Expand All @@ -93,6 +96,7 @@ struct BleRecentEntry {
timestamp{},
dataString{},
nameString{},
include_name{},
numHits{} {
}

Expand All @@ -118,7 +122,7 @@ class BleRecentEntryDetailView : public View {
private:
NavigationView& nav_;
BleRecentEntry entry_{};
void launch_bletx(BleRecentEntry packetEntry);
BLETxPacket build_packet();

static constexpr uint8_t total_data_lines{5};

Expand Down Expand Up @@ -167,7 +171,8 @@ class BLERxView : public View {

private:
void on_data(BlePacketData* packetData);
void on_switch_table(const std::string value);
void on_switch_table(std::string value);
void handle_entries_sort(uint8_t index);
void updateEntry(const BlePacketData* packet, BleRecentEntry& entry);

NavigationView& nav_;
Expand Down Expand Up @@ -228,15 +233,21 @@ class BLERxView : public View {
{"Name", 4}}};

Button button_filter{
{12 * 8, 3 * 8, 4 * 8, 16},
{11 * 8, 3 * 8, 4 * 8, 16},
"Filter"};

Checkbox check_log{
{20 * 8, 3 * 8},
{17 * 8, 3 * 8},
3,
"Log",
true};

Checkbox check_name{
{23 * 8, 3 * 8},
3,
"Name",
true};

Console console{
{0, 4 * 16, 240, 240}};

Expand All @@ -258,10 +269,7 @@ class BLERxView : public View {
{"dB", 4},
}};

BleRecentEntry entry_{};
BleRecentEntriesView recent_entries_view{columns, recent};
BleRecentEntriesView recent_entries_filter_view{columns, filterEntries};
BleRecentEntryDetailView recent_entry_detail_view{nav_, entry_};

MessageHandlerRegistration message_handler_packet{
Message::ID::BlePacket,
Expand Down
Loading

0 comments on commit a3249ca

Please sign in to comment.