mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-12 17:37:37 +00:00
Csv from subghzd (#2375)
This commit is contained in:
@@ -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.
|
||||||
|
@@ -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},
|
||||||
|
Reference in New Issue
Block a user