Subghz app example (#365)

* Gui: ported submenu and view_dispatcher_remove_view from iButton branch

* App gui-test: use backported submenu api

* App subghz: initial commit

* App subghz: syntax fix

* App gui-test: fix submenu callback

* App subghz: add subfolders to build

* Gui view: c++ verison of with_view_model

* Subghz app: simple spectrum settings view

* Subghz app: add spectrum settings view to view manager

* Subghz app: spectrum settings scene

Co-authored-by: coreglitch <mail@s3f.ru>
This commit is contained in:
SG
2021-03-05 19:47:27 +10:00
committed by GitHub
parent 025b77ecc1
commit 7afdd14a4c
21 changed files with 648 additions and 18 deletions

View File

@@ -0,0 +1,13 @@
#pragma once
#include "../subghz-event.h"
class SubghzApp;
class SubghzScene {
public:
virtual void on_enter(SubghzApp* app) = 0;
virtual bool on_event(SubghzApp* app, SubghzEvent* event) = 0;
virtual void on_exit(SubghzApp* app) = 0;
private:
};

View File

@@ -0,0 +1,48 @@
#include "subghz-scene-spectrum-settings.h"
#include "../subghz-app.h"
#include "../subghz-view-manager.h"
#include "../subghz-event.h"
#include <callback-connector.h>
void SubghzSceneSpectrumSettings::on_enter(SubghzApp* app) {
SubghzAppViewManager* view_manager = app->get_view_manager();
SubghzViewSpectrumSettings* spectrum_settings = view_manager->get_spectrum_settings();
auto callback = cbc::obtain_connector(this, &SubghzSceneSpectrumSettings::ok_callback);
spectrum_settings->set_ok_callback(callback, app);
spectrum_settings->set_start_freq(433);
view_manager->switch_to(SubghzAppViewManager::ViewType::SpectrumSettings);
}
bool SubghzSceneSpectrumSettings::on_event(SubghzApp* app, SubghzEvent* event) {
bool consumed = false;
if(event->type == SubghzEvent::Type::NextScene) {
// save data
// uint32_t start_freq = app->get_view_manager()->get_spectrum_settings()->get_start_freq();
// app->get_spectrum_analyzer()->set_start_freq(start_freq);
// switch to next scene
// app->switch_to_next_scene(SubghzApp::Scene::SceneSpectrumAnalyze);
consumed = true;
}
return consumed;
}
void SubghzSceneSpectrumSettings::on_exit(SubghzApp* app) {
SubghzAppViewManager* view_manager = app->get_view_manager();
SubghzViewSpectrumSettings* spectrum_settings = view_manager->get_spectrum_settings();
spectrum_settings->set_ok_callback(nullptr, nullptr);
spectrum_settings->set_start_freq(0);
}
void SubghzSceneSpectrumSettings::ok_callback(void* context) {
SubghzApp* app = static_cast<SubghzApp*>(context);
SubghzEvent event;
event.type = SubghzEvent::Type::NextScene;
app->get_view_manager()->send_event(&event);
}

View File

@@ -0,0 +1,12 @@
#pragma once
#include "subghz-scene-generic.h"
class SubghzSceneSpectrumSettings : public SubghzScene {
public:
void on_enter(SubghzApp* app) final;
bool on_event(SubghzApp* app, SubghzEvent* event) final;
void on_exit(SubghzApp* app) final;
private:
void ok_callback(void* context);
};

View File

@@ -0,0 +1,67 @@
#include "subghz-scene-start.h"
#include "../subghz-app.h"
#include "../subghz-view-manager.h"
#include "../subghz-event.h"
#include <callback-connector.h>
typedef enum {
SubmenuIndexSpectrumAnalyzer,
SubmenuIndexFrequencyScanner,
SubmenuIndexSignalAnalyzer,
SubmenuIndexSignalTransmitter,
SubmenuIndexApplications,
} SubmenuIndex;
void SubghzSceneStart::on_enter(SubghzApp* app) {
SubghzAppViewManager* view_manager = app->get_view_manager();
Submenu* submenu = view_manager->get_submenu();
auto callback = cbc::obtain_connector(this, &SubghzSceneStart::submenu_callback);
submenu_add_item(submenu, "Spectrum Analyzer", SubmenuIndexSpectrumAnalyzer, callback, app);
submenu_add_item(submenu, "Frequency Scanner", SubmenuIndexFrequencyScanner, callback, app);
submenu_add_item(submenu, "Signal Analyzer", SubmenuIndexSignalAnalyzer, callback, app);
submenu_add_item(submenu, "Signal Transmitter", SubmenuIndexSignalTransmitter, callback, app);
submenu_add_item(submenu, "Applications", SubmenuIndexApplications, callback, app);
view_manager->switch_to(SubghzAppViewManager::ViewType::Submenu);
}
bool SubghzSceneStart::on_event(SubghzApp* app, SubghzEvent* event) {
bool consumed = false;
if(event->type == SubghzEvent::Type::MenuSelected) {
switch(event->payload.menu_index) {
case SubmenuIndexSpectrumAnalyzer:
app->switch_to_next_scene(SubghzApp::Scene::SceneSpectrumSettings);
break;
case SubmenuIndexFrequencyScanner:
break;
case SubmenuIndexSignalAnalyzer:
break;
case SubmenuIndexSignalTransmitter:
break;
case SubmenuIndexApplications:
break;
}
consumed = true;
}
return consumed;
}
void SubghzSceneStart::on_exit(SubghzApp* app) {
SubghzAppViewManager* view_manager = app->get_view_manager();
Submenu* submenu = view_manager->get_submenu();
submenu_clean(submenu);
}
void SubghzSceneStart::submenu_callback(void* context, uint32_t index) {
SubghzApp* app = static_cast<SubghzApp*>(context);
SubghzEvent event;
event.type = SubghzEvent::Type::MenuSelected;
event.payload.menu_index = index;
app->get_view_manager()->send_event(&event);
}

View File

@@ -0,0 +1,12 @@
#pragma once
#include "subghz-scene-generic.h"
class SubghzSceneStart : public SubghzScene {
public:
void on_enter(SubghzApp* app) final;
bool on_event(SubghzApp* app, SubghzEvent* event) final;
void on_exit(SubghzApp* app) final;
private:
void submenu_callback(void* context, uint32_t index);
};