Csv from subghzd (#2375)

This commit is contained in:
Totoo
2024-11-20 09:22:55 +01:00
committed by GitHub
parent 24d15c1643
commit 131523d726
2 changed files with 56 additions and 2 deletions

View File

@@ -24,6 +24,7 @@
#include "audio.hpp" #include "audio.hpp"
#include "baseband_api.hpp" #include "baseband_api.hpp"
#include "string_format.hpp" #include "string_format.hpp"
#include "file_path.hpp"
#include "portapack_persistent_memory.hpp" #include "portapack_persistent_memory.hpp"
using namespace portapack; using namespace portapack;
@@ -31,6 +32,18 @@ using namespace ui;
namespace ui { namespace ui {
std::string SubGhzDRecentEntry::to_csv() {
std::string csv = ";";
csv += SubGhzDView::getSensorTypeName((FPROTO_SUBGHZD_SENSOR)sensorType);
csv += ";" + to_string_dec_uint(bits) + ";";
csv += to_string_hex(data, 64 / 4);
return csv;
}
void SubGhzDLogger::log_data(SubGhzDRecentEntry& data) {
log_file.write_entry(data.to_csv());
}
void SubGhzDRecentEntryDetailView::update_data() { void SubGhzDRecentEntryDetailView::update_data() {
// process protocol data // process protocol data
parseProtocol(); parseProtocol();
@@ -76,16 +89,25 @@ SubGhzDView::SubGhzDView(NavigationView& nav)
&field_vga, &field_vga,
&field_frequency, &field_frequency,
&button_clear_list, &button_clear_list,
&check_log,
&recent_entries_view}); &recent_entries_view});
baseband::run_image(portapack::spi_flash::image_tag_subghzd); baseband::run_image(portapack::spi_flash::image_tag_subghzd);
logger = std::make_unique<SubGhzDLogger>();
button_clear_list.on_select = [this](Button&) { button_clear_list.on_select = [this](Button&) {
recent.clear(); recent.clear();
recent_entries_view.set_dirty(); recent_entries_view.set_dirty();
}; };
field_frequency.set_step(10000); field_frequency.set_step(10000);
check_log.on_select = [this](Checkbox&, bool v) {
logging = v;
if (logger && logging) {
logger->append(logs_dir.string() + "/SUBGHZDLOG_" + to_string_timestamp(rtc_time::now()) + ".CSV");
logger->write_header();
}
};
check_log.set_value(logging);
const Rect content_rect{0, header_height, screen_width, screen_height - header_height}; const Rect content_rect{0, header_height, screen_width, screen_height - header_height};
recent_entries_view.set_parent_rect(content_rect); recent_entries_view.set_parent_rect(content_rect);
recent_entries_view.on_select = [this](const SubGhzDRecentEntry& entry) { recent_entries_view.on_select = [this](const SubGhzDRecentEntry& entry) {
@@ -107,6 +129,9 @@ void SubGhzDView::on_tick_second() {
void SubGhzDView::on_data(const SubGhzDDataMessage* data) { void SubGhzDView::on_data(const SubGhzDDataMessage* data) {
SubGhzDRecentEntry key{data->sensorType, data->data, data->bits}; SubGhzDRecentEntry key{data->sensorType, data->data, data->bits};
if (logger && logging) {
logger->log_data(key);
}
auto matching_recent = find(recent, key.key()); auto matching_recent = find(recent, key.key());
if (matching_recent != std::end(recent)) { if (matching_recent != std::end(recent)) {
// Found within. Move to front of list, increment counter. // Found within. Move to front of list, increment counter.

View File

@@ -34,6 +34,7 @@
#include "app_settings.hpp" #include "app_settings.hpp"
#include "radio_state.hpp" #include "radio_state.hpp"
#include "utility.hpp" #include "utility.hpp"
#include "log_file.hpp"
#include "recent_entries.hpp" #include "recent_entries.hpp"
#include "../baseband/fprotos/subghztypes.hpp" #include "../baseband/fprotos/subghztypes.hpp"
@@ -68,6 +69,23 @@ struct SubGhzDRecentEntry {
void reset_age() { void reset_age() {
age = 0; age = 0;
} }
std::string to_csv();
};
class SubGhzDLogger {
public:
Optional<File::Error> append(const std::filesystem::path& filename) {
return log_file.append(filename);
}
void log_data(SubGhzDRecentEntry& data);
void write_header() {
log_file.write_entry(";Type; Bits; Data;");
}
private:
LogFile log_file{};
}; };
using SubGhzDRecentEntries = RecentEntries<SubGhzDRecentEntry>; using SubGhzDRecentEntries = RecentEntries<SubGhzDRecentEntry>;
using SubGhzDRecentEntriesView = RecentEntriesView<SubGhzDRecentEntries>; using SubGhzDRecentEntriesView = RecentEntriesView<SubGhzDRecentEntries>;
@@ -93,10 +111,13 @@ class SubGhzDView : public View {
1'750'000 /* bandwidth */, 1'750'000 /* bandwidth */,
4'000'000 /* sampling rate */, 4'000'000 /* sampling rate */,
ReceiverModel::Mode::AMAudio}; ReceiverModel::Mode::AMAudio};
bool logging = false;
app_settings::SettingsManager settings_{ app_settings::SettingsManager settings_{
"rx_subghzd", "rx_subghzd",
app_settings::Mode::RX, app_settings::Mode::RX,
{}}; {
{"log"sv, &logging},
}};
SubGhzDRecentEntries recent{}; SubGhzDRecentEntries recent{};
@@ -118,8 +139,16 @@ class SubGhzDView : public View {
{0, 16, 7 * 8, 32}, {0, 16, 7 * 8, 32},
"Clear"}; "Clear"};
Checkbox check_log{
{10 * 8, 18},
3,
"Log",
true};
static constexpr auto header_height = 3 * 16; static constexpr auto header_height = 3 * 16;
std::unique_ptr<SubGhzDLogger> logger{};
const RecentEntriesColumns columns{{ const RecentEntriesColumns columns{{
{"Type", 19}, {"Type", 19},
{"Bits", 4}, {"Bits", 4},