Skip to content

Commit

Permalink
Weather csv log (#2369)
Browse files Browse the repository at this point in the history
  • Loading branch information
htotoo authored Nov 19, 2024
1 parent ff54f59 commit 4a83118
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
31 changes: 31 additions & 0 deletions firmware/application/apps/ui_weatherstation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "audio.hpp"
#include "baseband_api.hpp"
#include "string_format.hpp"
#include "file_path.hpp"
#include "portapack_persistent_memory.hpp"
#include "../baseband/fprotos/fprotogeneral.hpp"

Expand All @@ -35,6 +36,21 @@ namespace pmem = portapack::persistent_memory;

namespace ui {

std::string WeatherRecentEntry::to_csv() {
std::string csv = ";";
csv += WeatherView::getWeatherSensorTypeName((FPROTO_WEATHER_SENSOR)sensorType);
csv += ";" + to_string_dec_uint(id) + ";";
csv += to_string_decimal(temp, 2) + ";";
csv += to_string_dec_uint(humidity) + ";";
csv += to_string_dec_uint(channel) + ";";
csv += to_string_dec_uint(battery_low);
return csv;
}

void WeatherLogger::log_data(WeatherRecentEntry& data) {
log_file.write_entry(data.to_csv());
}

void WeatherRecentEntryDetailView::update_data() {
// set text elements
text_type.set(WeatherView::getWeatherSensorTypeName((FPROTO_WEATHER_SENSOR)entry_.sensorType));
Expand Down Expand Up @@ -98,8 +114,11 @@ WeatherView::WeatherView(NavigationView& nav)
&field_frequency,
&options_temperature,
&button_clear_list,
&check_log,
&recent_entries_view});

logger = std::make_unique<WeatherLogger>();

baseband::run_image(portapack::spi_flash::image_tag_weather);

button_clear_list.on_select = [this](Button&) {
Expand All @@ -114,6 +133,15 @@ WeatherView::WeatherView(NavigationView& nav)
};
options_temperature.set_selected_index(weather_units_fahr, false);

check_log.on_select = [this](Checkbox&, bool v) {
logging = v;
if (logger && logging) {
logger->append(logs_dir.string() + "/WEATHERLOG_" + 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};
recent_entries_view.set_parent_rect(content_rect);
recent_entries_view.on_select = [this](const WeatherRecentEntry& entry) {
Expand All @@ -140,6 +168,9 @@ void WeatherView::on_tick_second() {

void WeatherView::on_data(const WeatherDataMessage* data) {
WeatherRecentEntry key = process_data(data);
if (logger && logging) {
logger->log_data(key);
}
// WeatherRecentEntry key{data->sensorType, data->id, data->temp, data->humidity, data->channel, data->battery_low};
auto matching_recent = find(recent, key.key());
if (matching_recent != std::end(recent)) {
Expand Down
29 changes: 29 additions & 0 deletions firmware/application/apps/ui_weatherstation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "app_settings.hpp"
#include "radio_state.hpp"
#include "utility.hpp"
#include "log_file.hpp"
#include "recent_entries.hpp"

#include "../baseband/fprotos/weathertypes.hpp"
Expand Down Expand Up @@ -78,7 +79,25 @@ struct WeatherRecentEntry {
void reset_age() {
age = 0;
}

std::string to_csv();
};

class WeatherLogger {
public:
Optional<File::Error> append(const std::filesystem::path& filename) {
return log_file.append(filename);
}

void log_data(WeatherRecentEntry& data);
void write_header() {
log_file.write_entry(";Type; id; Temp; Hum; CH; Batt");
}

private:
LogFile log_file{};
};

using WeatherRecentEntries = RecentEntries<WeatherRecentEntry>;
using WeatherRecentEntriesView = RecentEntriesView<WeatherRecentEntries>;

Expand All @@ -103,11 +122,13 @@ class WeatherView : public View {
1'750'000 /* bandwidth */,
2'000'000 /* sampling rate */,
ReceiverModel::Mode::AMAudio};
bool logging = false;
app_settings::SettingsManager settings_{
"rx_weather",
app_settings::Mode::RX,
{
{"units_fahr"sv, &weather_units_fahr},
{"log"sv, &logging},
}};

WeatherRecentEntries recent{};
Expand Down Expand Up @@ -140,8 +161,16 @@ class WeatherView : public View {
{0, 16, 7 * 8, 32},
"Clear"};

Checkbox check_log{
{10 * 8, 18},
3,
"Log",
true};

static constexpr auto header_height = 3 * 16;

std::unique_ptr<WeatherLogger> logger{};

const RecentEntriesColumns columns{{
{"Type", 10},
{"Temp", 5},
Expand Down

0 comments on commit 4a83118

Please sign in to comment.