diff --git a/1.Firmware/src/app/Pages/AppFactory.cpp b/1.Firmware/src/app/Pages/AppFactory.cpp index 81cebbe..7a17ecc 100644 --- a/1.Firmware/src/app/Pages/AppFactory.cpp +++ b/1.Firmware/src/app/Pages/AppFactory.cpp @@ -26,6 +26,8 @@ #include "StartUp/StartUp.h" #include "Menu/Menu.h" #include "Playground/Playground.h" +#include "HASS/Hass.h" +#include "SurfaceDial/SurfaceDial.h" // #include "Scene3D/Scene3D.h" @@ -41,8 +43,10 @@ PageBase* AppFactory::CreatePage(const char* name) { APP_CLASS_MATCH(Template); APP_CLASS_MATCH(Menu); - APP_CLASS_MATCH(Playground); - APP_CLASS_MATCH(Startup); + APP_CLASS_MATCH(Playground); + APP_CLASS_MATCH(SurfaceDial); + APP_CLASS_MATCH(Startup); + APP_CLASS_MATCH(Hass); // APP_CLASS_MATCH(Scene3D); return nullptr; diff --git a/1.Firmware/src/app/Pages/HASS/Hass.cpp b/1.Firmware/src/app/Pages/HASS/Hass.cpp new file mode 100644 index 0000000..9ae08b8 --- /dev/null +++ b/1.Firmware/src/app/Pages/HASS/Hass.cpp @@ -0,0 +1,195 @@ +#include "Hass.h" +#include "hal/hal.h" +#include "config.h" + +using namespace Page; + +const char* playload_str[] { + [SUPER_DIAL_NULL] = "NULL", + [HASS_LEFT] = "LEFT", + [HASS_RIGHT] = "RIGHT", + [HASS_PUSH] = "ON/OFF" +}; +const int motor_mode = MOTOR_SUPER_DIAL; +const int app_mode = APP_MODE_HOME_ASSISTANT; + +void hass_hal_init(void) +{ + HAL::mqtt_init(); +} + +int hass_hal_send(const char *device_name, int knob_value) +{ + char topic_name[128]; + + snprintf(topic_name, sizeof(topic_name),"%s/HOME/%s", MQTT_HOST, device_name); + if (knob_value < HASS_MAX && playload_str[knob_value] != NULL) { + printf("mqtt send: %s:%s\n", topic_name, playload_str[knob_value]); + return HAL::mqtt_publish(topic_name, playload_str[knob_value]); + } else { + printf("hass_hal_send: xknob_value is invalid\n"); + return -1; + } + return 0; +} + +Hass::Hass() +{ +} + +Hass::~Hass() +{ + +} + +void Hass::onCustomAttrConfig() +{ + SetCustomCacheEnable(false); + // SetCustomLoadAnimType(PageManager::LOAD_ANIM_OVER_BOTTOM, 500, lv_anim_path_bounce); +} + +void Hass::onViewLoad() +{ + printf("Hass: onViewLoad\n"); + Model = new HassModel(); + View = new HassView(); + + hass_hal_init(); + + Model->Init(); + View->Create(root); + + AttachEvent(root); + AttachEvent(View->ui.meter); + //APP_MODE_HOME_ASSISTANT + + AttachEvent(((HassView*)View)->m_ui.fan.cont); + AttachEvent(((HassView*)View)->m_ui.monitor_light.cont); + AttachEvent(((HassView*)View)->m_ui.air_conditioning.cont); + AttachEvent(((HassView*)View)->m_ui.wash_machine.cont); +} + +void Hass::AttachEvent(lv_obj_t* obj) +{ + lv_obj_set_user_data(obj, this); + lv_obj_add_event_cb(obj, onEvent, LV_EVENT_ALL, this); +} + +void Hass::onViewDidLoad() +{ + +} + +void Hass::onViewWillAppear() +{ + printf("Hass: onViewWillAppear\n"); + Model->ChangeMotorMode(motor_mode); + Model->SetPlaygroundMode(app_mode); + View->SetPlaygroundMode(app_mode); + + timer = lv_timer_create(onTimerUpdate, 10, this); +} + +void Hass::onViewDidAppear() +{ + +} + +void Hass::onViewWillDisappear() +{ + +} + +void Hass::onViewDidDisappear() +{ + lv_timer_del(timer); +} + +void Hass::onViewDidUnload() +{ + View->Delete(); + Model->Deinit(); + + delete View; + delete Model; + +} + +void Hass::Update() +{ + HassInfo info; + Model->GetKnobStatus(&info); + if (info.konb_direction != SUPER_DIAL_NULL) + { + char* name = ((HassView*)View)->GetEditedDeviceName(); + if (name != NULL) + { + hass_hal_send(name, info.konb_direction); + } + } + View->UpdateView(&info); +} + +void Hass::onTimerUpdate(lv_timer_t* timer) +{ + Hass* instance = (Hass*)timer->user_data; + + instance->Update(); +} + +void Hass::HassEventHandler(lv_event_t* event, lv_event_code_t code) +{ + lv_obj_t* obj = lv_event_get_target(event); + lv_obj_t* label = lv_obj_get_child(obj, 1); + + if (code < LV_EVENT_RELEASED) { + printf("code: %d\n", code); + } + + if (code == LV_EVENT_FOCUSED) { + if (label != NULL) { + printf("fouces, name:%s\n", lv_label_get_text(label)); + ((HassView*)View)->UpdateFocusedDevice(lv_label_get_text(label)); + } + } + if (code == LV_EVENT_PRESSED) + { + if (!lv_obj_has_state(obj, LV_STATE_EDITED)) { + if (label != NULL) { + printf("Control device: %s\n", lv_label_get_text(label)); + } + lv_obj_add_state(obj, LV_STATE_EDITED); + ((HassView*)View)->SetCtrView(obj); + HAL::encoder_disable(); + if (((HassView*)View)->GetViewMode() == VIEW_MODE_ON_OFF) { + Model->ChangeMotorMode(MOTOR_ON_OFF_STRONG_DETENTS); + } + } else { + hass_hal_send(lv_label_get_text(label), HASS_PUSH); + } + } else if (code == LV_EVENT_LONG_PRESSED) { + printf("Hass: LV_EVENT_LONG_PRESSED\n"); + if (lv_obj_has_state(obj, LV_STATE_EDITED)) { + ((HassView*)View)->ClearCtrView(obj); + lv_obj_clear_state(obj, LV_STATE_EDITED); + HAL::encoder_enable(); + Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); + } + } else if (code == LV_EVENT_LONG_PRESSED_REPEAT) { + // return to memu + if (!lv_obj_has_state(obj, LV_STATE_EDITED)){ + printf("Hass: LV_EVENT_LONG_PRESSED_REPEAT\n"); + Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); + Manager->Pop(); + } + } +} + +void Hass::onEvent(lv_event_t* event) +{ + lv_obj_t* obj = lv_event_get_target(event); + lv_event_code_t code = lv_event_get_code(event); + auto* instance = (Hass*)lv_obj_get_user_data(obj); + + instance->HassEventHandler(event, code); +} \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/Hass.h b/1.Firmware/src/app/Pages/HASS/Hass.h new file mode 100644 index 0000000..f47c247 --- /dev/null +++ b/1.Firmware/src/app/Pages/HASS/Hass.h @@ -0,0 +1,43 @@ +#ifndef __HASS_H__ +#define __HASS_H__ + +#include "HassModel.h" +#include "HassView.h" + +void hass_hal_init(void); +int hass_hal_send(const char *device_name, int knob_value); + +namespace Page +{ + class Hass : public PageBase + { + public: + Hass(); + virtual ~Hass(); + + virtual void onCustomAttrConfig(); + virtual void onViewLoad(); + virtual void onViewDidLoad(); + virtual void onViewWillAppear(); + virtual void onViewDidAppear(); + virtual void onViewWillDisappear(); + virtual void onViewDidDisappear(); + virtual void onViewDidUnload(); + + void HassEventHandler(lv_event_t* event, lv_event_code_t code); + + private: + void Update(); + void AttachEvent(lv_obj_t* obj); + static void onTimerUpdate(lv_timer_t* timer); + static void onEvent(lv_event_t* event); + + private: + HassView* View; + HassModel* Model; + lv_timer_t* timer; + }; +} + + +#endif /* __HASS_H__ */ \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/HassHalComm.cpp b/1.Firmware/src/app/Pages/HASS/HassHalComm.cpp deleted file mode 100644 index 415ad88..0000000 --- a/1.Firmware/src/app/Pages/HASS/HassHalComm.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "HassHalComm.h" -#include "hal/hal.h" -#include "config.h" - -const char* playload_str[] { - [SUPER_DIAL_NULL] = "NULL", - [HASS_LEFT] = "LEFT", - [HASS_RIGHT] = "RIGHT", - [HASS_PUSH] = "ON/OFF" -}; - -void hass_hal_init(void) -{ - HAL::mqtt_init(); -} - -int hass_hal_send(const char *device_name, int knob_value) -{ - char topic_name[128]; - - snprintf(topic_name, sizeof(topic_name),"%s/HOME/%s", MQTT_HOST, device_name); - if (knob_value < HASS_MAX && playload_str[knob_value] != NULL) { - printf("mqtt send: %s:%s\n", topic_name, playload_str[knob_value]); - return HAL::mqtt_publish(topic_name, playload_str[knob_value]); - } else { - printf("hass_hal_send: xknob_value is invalid\n"); - return -1; - } - return 0; -} \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/HassHalComm.h b/1.Firmware/src/app/Pages/HASS/HassHalComm.h deleted file mode 100644 index f25f23a..0000000 --- a/1.Firmware/src/app/Pages/HASS/HassHalComm.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __HASS_HAL_COMM_H__ -#define __HASS_HAL_COMM_H__ - -void hass_hal_init(void); -int hass_hal_send(const char *device_name, int knob_value); -#endif /* __HASS_HAL_COMM_H__ */ \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/HassModel.cpp b/1.Firmware/src/app/Pages/HASS/HassModel.cpp index ad31694..bb79ac9 100644 --- a/1.Firmware/src/app/Pages/HASS/HassModel.cpp +++ b/1.Firmware/src/app/Pages/HASS/HassModel.cpp @@ -1,29 +1,35 @@ #include "HassModel.h" #include "app/Accounts/Account_Master.h" -#include -#include "hal/motor.h" -#include "hal/hal.h" using namespace Page; HassModel::HassModel() { - app = APP_MODE_HOME_ASSISTANT; + app = APP_MODE_HOME_ASSISTANT; } -void HassModel::GetKnobStatus(PlaygroundInfo *info) +void HassModel::GetKnobStatus(HassInfo* info) { - PlaygroundModel::GetKnobStatus(info); - info->is_ble_connected = HAL::surface_dial_is_connected(); + PlaygroundModel::GetKnobStatus(info); } - void HassModel::Init() { - PlaygroundModel::Init(); + PlaygroundModel::Init(); + printf("HassModel: Init start\n"); } void HassModel::Deinit() { - PlaygroundModel::Deinit(); + PlaygroundModel::Deinit(); +} + +void HassModel::ChangeMotorMode(int mode) +{ + PlaygroundModel::ChangeMotorMode(mode); +} + +void HassModel::SetPlaygroundMode(int16_t mode) +{ + PlaygroundModel::SetPlaygroundMode(mode); } \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/HassModel.h b/1.Firmware/src/app/Pages/HASS/HassModel.h index b65a1df..7cc67e7 100644 --- a/1.Firmware/src/app/Pages/HASS/HassModel.h +++ b/1.Firmware/src/app/Pages/HASS/HassModel.h @@ -1,27 +1,38 @@ #ifndef __HOME_ASSISTANT_MODEL_H -#define __HOME_ASSISTANTL_MODEL_H +#define __HOME_ASSISTANT_MODEL_H #include "app/Utils/AccountSystem/Account.h" #include "lvgl.h" #include "../Playground/PlaygroundView.h" #include "../Playground/PlaygroundModel.h" +#include + +typedef struct HassInfo : PlaygroundInfo +{ + /** + * 正在被操作的设备 + */ + const char* busy_device_entity_id; +} HassInfo; namespace Page { class HassModel: public PlaygroundModel { -public: - HassModel(); - void Init(); - void Deinit(); - void Update(void* pg_ui); - void GetKnobStatus(PlaygroundInfo *info); - void ChangeMotorMode(int mode); - void SetPlaygroundMode(int16_t mode); - void onEvent(Account* account, Account::EventParam_t* param); -private: - Account* account; + public: + HassModel(); + void Init(); + void Deinit(); + void Update(void* pg_ui); + void GetKnobStatus(HassInfo* info); + static std::map getStateMap(); + static void setStateMap(const char* entity_id, const char* state); + void setBusyDeviceEntityId(const char* entity_id); + const char* getBusyDeviceEntityId(); + void ChangeMotorMode(int mode); + void SetPlaygroundMode(int16_t mode); + }; } diff --git a/1.Firmware/src/app/Pages/HASS/HassView.cpp b/1.Firmware/src/app/Pages/HASS/HassView.cpp index eeab827..c30cd04 100644 --- a/1.Firmware/src/app/Pages/HASS/HassView.cpp +++ b/1.Firmware/src/app/Pages/HASS/HassView.cpp @@ -1,27 +1,27 @@ #include "HassView.h" -#include "app/app.h" +#include "Hass.h" +#include "HassModel.h" using namespace Page; #define ITEM_PAD 60 - /* * 默认视图显示: 圆点,原点所在位置 label_value * 此函数根据需要增加或 hidden 对象 */ -void Page::HassView::SetPlaygroundMode(int16_t mode) +void HassView::SetPlaygroundMode(int16_t mode) { lv_obj_add_flag(ui.lable_value, LV_OBJ_FLAG_HIDDEN); // lv_label_set_text(ui.lable_value, "Smart Home"); lv_meter_set_scale_ticks(ui.meter, ui.scale_pot, 73, 2, 0, lv_color_make(0xff, 0x00, 0x00)); lv_meter_set_scale_range(ui.meter, ui.scale_pot, 0, 72, 360, 270); } - + void HassView::UpdateFocusedDevice(const char* name) { lv_label_set_text(m_ui.foucs_label, name); } -void HassView::SetCtrView(lv_obj_t *obj) +void HassView::SetCtrView(lv_obj_t* obj) { device_t *device = device_map[obj]; @@ -77,7 +77,7 @@ int HassView::GetViewMode(void) { return current_view; } -void HassView::UpdateCtrlView(PlaygroundInfo *info) +void HassView::UpdateCtrlView(HassInfo* info) { int _value = 0; int32_t motor_pos = info->motor_pos; @@ -86,7 +86,7 @@ void HassView::UpdateCtrlView(PlaygroundInfo *info) switch (current_view) { case VIEW_MODE_ON_OFF: _value = info->xkonb_value; - PlaygroundView::UpdateBackgroundView(info); + HassView::UpdateBackgroundView(info); break; default: break; @@ -98,7 +98,7 @@ void HassView::UpdateCtrlView(PlaygroundInfo *info) _value?"ON":"OFF" ); } -void HassView::UpdateView(PlaygroundInfo *info) +void HassView::UpdateView(HassInfo* info) { if (current_view) { UpdateCtrlView(info); @@ -113,12 +113,12 @@ void HassView::UpdateView(PlaygroundInfo *info) } -void Page::HassView::device_item_create( +void HassView::device_item_create( device_t* item, lv_obj_t* par, const char* name, const char* img_src, - bool is_on_off, + bool is_on_off, bool is_set_value) { @@ -170,7 +170,7 @@ void on_focus(lv_group_t* g) lv_obj_scroll_to_x(cont_row, x, LV_ANIM_ON); } -void Page::HassView::group_init(void) +void HassView::group_init(void) { m_ui.group = lv_group_create(); lv_group_set_focus_cb(m_ui.group, on_focus); @@ -184,8 +184,7 @@ void Page::HassView::group_init(void) lv_group_focus_obj(m_ui.monitor_light.cont); } - -void Page::HassView::style_init(void) +void HassView::style_init(void) { lv_style_init(&style.cont); lv_style_set_width(&style.cont, ITEM_PAD); @@ -307,7 +306,6 @@ void HassView::Delete() lv_style_reset(&style.focus); lv_style_reset(&style.edit); lv_style_reset(&style.label_name); - - PlaygroundView:Delete(); - + PlaygroundView::Delete(); + printf("Delete done HassView\n"); } \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/HASS/HassView.h b/1.Firmware/src/app/Pages/HASS/HassView.h index 31955df..0e71cb9 100644 --- a/1.Firmware/src/app/Pages/HASS/HassView.h +++ b/1.Firmware/src/app/Pages/HASS/HassView.h @@ -4,6 +4,7 @@ #include "app/app.h" #include "../Page.h" #include "../Playground/PlaygroundView.h" +#include "HassModel.h" #include enum HASS_VIEW_MODE { @@ -27,14 +28,14 @@ class HassView: public PlaygroundView HassView(){} void Create(lv_obj_t* root); void Delete(); - void UpdateView(PlaygroundInfo *info); + void UpdateView(HassInfo *info); void SetPlaygroundMode(int16_t mode); void UpdateFocusedDevice(const char* name); - void SetCtrView(lv_obj_t *obj); + void SetCtrView(lv_obj_t *obj); void ClearCtrView(lv_obj_t *obj); - void UpdateCtrlView(PlaygroundInfo *info); - char* GetEditedDeviceName(void); - int GetViewMode(void); + void UpdateCtrlView(HassInfo *info); + char* GetEditedDeviceName(void); + int GetViewMode(void); struct { device_t fan; diff --git a/1.Firmware/src/app/Pages/Menu/Menu.cpp b/1.Firmware/src/app/Pages/Menu/Menu.cpp index 5ccf731..4722d94 100644 --- a/1.Firmware/src/app/Pages/Menu/Menu.cpp +++ b/1.Firmware/src/app/Pages/Menu/Menu.cpp @@ -134,11 +134,12 @@ void Menu::onSuperDialEvent(lv_event_t* event) if (code == LV_EVENT_PRESSED) { // instance->Model.ChangeMotorMode(MOTOR_FINE_DETENTS); - int16_t mode = APP_MODE_SUPER_DIAL; - Stash_t stash; - stash.ptr = &mode; - stash.size = sizeof(int16_t); - instance->Manager->Push("Pages/Playground", &stash); +// int16_t mode = APP_MODE_SUPER_DIAL; +// Stash_t stash; +// stash.ptr = &mode; +// stash.size = sizeof(int16_t); +// instance->Manager->Push("Pages/SurfaceDial", &stash); + instance->Manager->Push("Pages/SurfaceDial"); } } @@ -150,11 +151,12 @@ void Menu::onHassEvent(lv_event_t* event) if (code == LV_EVENT_PRESSED) { + printf("Menu: onHassEvent LV_EVENT_PRESSED\n"); // instance->Model.ChangeMotorMode(MOTOR_FINE_DETENTS); - int16_t mode = APP_MODE_HOME_ASSISTANT; - Stash_t stash; - stash.ptr = &mode; - stash.size = sizeof(int16_t); - instance->Manager->Push("Pages/Playground", &stash); +// int16_t mode = APP_MODE_HOME_ASSISTANT; +// Stash_t stash; +// stash.ptr = &mode; +// stash.size = sizeof(int16_t); + instance->Manager->Push("Pages/Hass"); } } diff --git a/1.Firmware/src/app/Pages/Playground/Playground.cpp b/1.Firmware/src/app/Pages/Playground/Playground.cpp index 0d831c8..3bb19be 100644 --- a/1.Firmware/src/app/Pages/Playground/Playground.cpp +++ b/1.Firmware/src/app/Pages/Playground/Playground.cpp @@ -1,10 +1,6 @@ #include "Playground.h" #include -#include "SurfaceDialView.h" -#include "SurfaceDialModel.h" -#include "../HASS/HassModel.h" -#include "../HASS/HassView.h" -#include "../HASS/HassHalComm.h" + using namespace Page; typedef struct { @@ -54,23 +50,13 @@ void Playground::onViewLoad() app = PLAYGROUND_MODE_NO_EFFECTS; // default if (priv.Stash.ptr) { app = *((int16_t *)priv.Stash.ptr); - Serial.printf("\nPlayground: app = %d\n", app); + printf("\nPlayground: app = %d\n", app); } switch (app) { case PLAYGROUND_MODE_NO_EFFECTS: Model = new PlaygroundModel(); View = new PlaygroundView(); break; - case APP_MODE_SUPER_DIAL: - Model = (SurfaceDialModel*) new SurfaceDialModel(); - View = (PlaygroundView*) new SurfaceDialView(); - HAL::surface_dial_init(); - break; - case APP_MODE_HOME_ASSISTANT: - Model = (SurfaceDialModel*) new HassModel(); - View = (PlaygroundView*) new HassView(); - hass_hal_init(); - break; default: break; }; @@ -84,13 +70,6 @@ void Playground::onViewLoad() AttachEvent(root); AttachEvent(View->ui.meter); - if (app == APP_MODE_HOME_ASSISTANT) { - AttachEvent(((HassView*)View)->m_ui.fan.cont); - AttachEvent(((HassView*)View)->m_ui.monitor_light.cont); - AttachEvent(((HassView*)View)->m_ui.air_conditioning.cont); - AttachEvent(((HassView*)View)->m_ui.wash_machine.cont); - } - } void Playground::onViewDidLoad() @@ -150,12 +129,6 @@ void Playground::Update() case APP_MODE_SUPER_DIAL: HAL::surface_dial_update(info.konb_direction); break; - case APP_MODE_HOME_ASSISTANT: - char *name = ((HassView*)View)->GetEditedDeviceName(); - if(name != NULL) { - hass_hal_send(name, info.konb_direction); - } - break; } } @@ -170,26 +143,6 @@ void Playground::onTimerUpdate(lv_timer_t* timer) instance->Update(); } -void Playground::SurfaceDialEventHandler(lv_event_t* event, lv_event_code_t code) -{ - if (code == LV_EVENT_PRESSED) { - if (app == APP_MODE_SUPER_DIAL) { - Serial.printf("Playground: press\n"); - HAL::surface_dial_press(); - } - } else if (code == LV_EVENT_LONG_PRESSED_REPEAT) { - // return to memu - Serial.printf("Playground: LV_EVENT_LONG_PRESSED_REPEAT\n"); - Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); - Manager->Pop(); - } else if (code == LV_EVENT_RELEASED) { - if (app == APP_MODE_SUPER_DIAL) { - Serial.printf("Playground: realse\n"); - HAL::surface_dial_release(); - } - } -} - void Playground::PlayEventHandler(lv_event_t* event, lv_event_code_t code) { if (code == LV_EVENT_PRESSED) { @@ -205,68 +158,14 @@ void Playground::PlayEventHandler(lv_event_t* event, lv_event_code_t code) Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); Manager->Pop(); } - - if (app == APP_MODE_SUPER_DIAL) { - Serial.printf("Playground: press\n"); - HAL::surface_dial_press(); - } } else if (code == LV_EVENT_LONG_PRESSED) { // return to memu - Serial.printf("Playground: LV_EVENT_LONG_PRESSED\n"); + printf("Playground: LV_EVENT_LONG_PRESSED\n"); Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); Manager->Pop(); } } -void Playground::HassEventHandler(lv_event_t* event, lv_event_code_t code) -{ - lv_obj_t* obj = lv_event_get_target(event); - lv_obj_t* label = lv_obj_get_child(obj, 1); - - if (code < LV_EVENT_RELEASED) { - printf("code: %d\n", code); - } - - if (code == LV_EVENT_FOCUSED) { - if (label != NULL) { - printf("fouces, name:%s\n", lv_label_get_text(label)); - ((HassView*)View)->UpdateFocusedDevice(lv_label_get_text(label)); - } - } - if (code == LV_EVENT_PRESSED) - { - if (!lv_obj_has_state(obj, LV_STATE_EDITED)) { - if (label != NULL) { - printf("Control device: %s\n", lv_label_get_text(label)); - } - lv_obj_add_state(obj, LV_STATE_EDITED); - ((HassView*)View)->SetCtrView(obj); - HAL::encoder_disable(); - if (((HassView*)View)->GetViewMode() == VIEW_MODE_ON_OFF) { - Model->ChangeMotorMode(MOTOR_ON_OFF_STRONG_DETENTS); - } - } else { - hass_hal_send(lv_label_get_text(label), HASS_PUSH); - } - } else if (code == LV_EVENT_LONG_PRESSED) { - Serial.printf("Hass: LV_EVENT_LONG_PRESSED\n"); - if (lv_obj_has_state(obj, LV_STATE_EDITED)) { - ((HassView*)View)->ClearCtrView(obj); - lv_obj_clear_state(obj, LV_STATE_EDITED); - HAL::encoder_enable(); - Model->ChangeMotorMode(app_config[app].motor_mode); - } - } else if (code == LV_EVENT_LONG_PRESSED_REPEAT) { - // return to memu - if (!lv_obj_has_state(obj, LV_STATE_EDITED)){ - Serial.printf("Playground: LV_EVENT_LONG_PRESSED_REPEAT\n"); - Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); - Manager->Pop(); - } - } - -} - void Playground::onEvent(lv_event_t* event) { lv_obj_t* obj = lv_event_get_target(event); @@ -280,12 +179,6 @@ void Playground::onEvent(lv_event_t* event) case PLAYGROUND_MODE_ON_OFF: instance->PlayEventHandler(event, code); break; - case APP_MODE_SUPER_DIAL: - instance->SurfaceDialEventHandler(event, code); - break; - case APP_MODE_HOME_ASSISTANT: - instance->HassEventHandler(event, code); - break; default: break; } diff --git a/1.Firmware/src/app/Pages/Playground/Playground.h b/1.Firmware/src/app/Pages/Playground/Playground.h index d6b97ea..926ea09 100644 --- a/1.Firmware/src/app/Pages/Playground/Playground.h +++ b/1.Firmware/src/app/Pages/Playground/Playground.h @@ -29,8 +29,6 @@ class Playground : public PageBase virtual void onViewDidDisappear(); virtual void onViewDidUnload(); void PlayEventHandler(lv_event_t* event, lv_event_code_t code); - void SurfaceDialEventHandler(lv_event_t* event, lv_event_code_t code); - void HassEventHandler(lv_event_t* event, lv_event_code_t code); private: void Update(); diff --git a/1.Firmware/src/app/Pages/Playground/PlaygroundModel.cpp b/1.Firmware/src/app/Pages/Playground/PlaygroundModel.cpp index 59f055e..e52b836 100644 --- a/1.Firmware/src/app/Pages/Playground/PlaygroundModel.cpp +++ b/1.Firmware/src/app/Pages/Playground/PlaygroundModel.cpp @@ -1,9 +1,8 @@ #include "PlaygroundModel.h" #include "app/Accounts/Account_Master.h" -#include #include "hal/motor.h" #include "hal/hal.h" - +#include "Playground.h" using namespace Page; int32_t MAX_VALUE = 100; @@ -54,7 +53,7 @@ void PlaygroundModel::SetPlaygroundMode(int16_t mode) void PlaygroundModel::ChangeMotorMode(int mode) { knob_value = 0; - Serial.printf("MenuModel: Change Motor Mode [%d]\n", mode); + printf("MenuModel: Change Motor Mode [%d]\n", mode); AccountSystem::Motor_Info_t info; info.cmd = AccountSystem::MOTOR_CMD_CHANGE_MODE; info.motor_mode = mode; diff --git a/1.Firmware/src/app/Pages/Playground/PlaygroundModel.h b/1.Firmware/src/app/Pages/Playground/PlaygroundModel.h index 7a0e6d0..df37287 100644 --- a/1.Firmware/src/app/Pages/Playground/PlaygroundModel.h +++ b/1.Firmware/src/app/Pages/Playground/PlaygroundModel.h @@ -2,7 +2,15 @@ #define __PLAGROUND_MODEL_H #include "app/Utils/AccountSystem/Account.h" #include "lvgl.h" -#include "PlaygroundView.h" +#include "hal/hal.h" + +typedef struct +{ + int32_t xkonb_value; + int32_t motor_pos; + int32_t angle_offset; + SuperDialMotion konb_direction; +} PlaygroundInfo; namespace Page { diff --git a/1.Firmware/src/app/Pages/Playground/PlaygroundView.h b/1.Firmware/src/app/Pages/Playground/PlaygroundView.h index 9b9321b..d3df11c 100644 --- a/1.Firmware/src/app/Pages/Playground/PlaygroundView.h +++ b/1.Firmware/src/app/Pages/Playground/PlaygroundView.h @@ -3,15 +3,7 @@ #include "Arduino.h" #include "app/app.h" #include "../Page.h" - - -typedef struct { - int32_t xkonb_value; - int32_t motor_pos; - int32_t angle_offset; - SuperDialMotion konb_direction; - bool is_ble_connected; -}PlaygroundInfo; +#include "PlaygroundModel.h" namespace Page { diff --git a/1.Firmware/src/app/Pages/Playground/SurfaceDialModel.h b/1.Firmware/src/app/Pages/Playground/SurfaceDialModel.h deleted file mode 100644 index b64e9c1..0000000 --- a/1.Firmware/src/app/Pages/Playground/SurfaceDialModel.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __SURFACE_DIAL_MODEL_H -#define __SURFACE_DIAL_MODEL_H -#include "app/Utils/AccountSystem/Account.h" -#include "lvgl.h" -#include "PlaygroundView.h" -#include "PlaygroundModel.h" - -namespace Page -{ - -class SurfaceDialModel: public PlaygroundModel -{ -public: - SurfaceDialModel(); - void Init(); - void Deinit(); - void Update(void* pg_ui); - void GetKnobStatus(PlaygroundInfo *info); - void ChangeMotorMode(int mode); - void SetPlaygroundMode(int16_t mode); - - void onEvent(Account* account, Account::EventParam_t* param); -private: - -}; - -} - -#endif diff --git a/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.cpp b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.cpp new file mode 100644 index 0000000..aff8eb1 --- /dev/null +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.cpp @@ -0,0 +1,116 @@ +#include "SurfaceDial.h" +using namespace Page; + +const int motor_mode = MOTOR_UNBOUND_COARSE_DETENTS; +const int app_mode = APP_MODE_SUPER_DIAL; + +SurfaceDial::SurfaceDial() +{ +} + +SurfaceDial::~SurfaceDial() +{ +} + +void SurfaceDial::onCustomAttrConfig() +{ + SetCustomCacheEnable(false); +} + +void SurfaceDial::onViewLoad() +{ + printf("SurfaceDial: onViewLoad\n"); + Model = new SurfaceDialModel(); + View = new SurfaceDialView(); + HAL::surface_dial_init(); + + Model->Init(); + View->Create(root); + + AttachEvent(root); + AttachEvent(View->ui.meter); +} + +void SurfaceDial::onViewDidAppear() +{ + +} + +void SurfaceDial::onViewWillDisappear() +{ + +} + +void SurfaceDial::onViewDidDisappear() +{ + lv_timer_del(timer); +} + +void SurfaceDial::onViewDidUnload() +{ + View->Delete(); + Model->Deinit(); + + delete View; + delete Model; +} + +void SurfaceDial::SurfaceDialEventHandler(lv_event_t* event, lv_event_code_t code) +{ + if (code == LV_EVENT_PRESSED) + { + printf("SurfaceDial: press\n"); + HAL::surface_dial_press(); + } + else if (code == LV_EVENT_LONG_PRESSED_REPEAT) + { + // return to memu + printf("SurfaceDial: LV_EVENT_LONG_PRESSED_REPEAT\n"); + Model->ChangeMotorMode(MOTOR_UNBOUND_COARSE_DETENTS); + Manager->Pop(); + } + else if (code == LV_EVENT_RELEASED) + { + printf("SurfaceDial: release\n"); + HAL::surface_dial_release(); + } +} +void SurfaceDial::AttachEvent(lv_obj_t* obj) +{ + lv_obj_set_user_data(obj, this); + lv_obj_add_event_cb(obj, onEvent, LV_EVENT_ALL, this); +} + +void SurfaceDial::onEvent(lv_event_t* event) +{ + lv_obj_t* obj = lv_event_get_target(event); + lv_event_code_t code = lv_event_get_code(event); + auto* instance = (SurfaceDial*)lv_obj_get_user_data(obj); + instance->SurfaceDialEventHandler(event, code); +} + +void SurfaceDial::onViewDidLoad() +{ +} + +void SurfaceDial::onViewWillAppear() +{ + Model->ChangeMotorMode(motor_mode); + Model->SetPlaygroundMode(app_mode); + View->SetPlaygroundMode(app_mode); + timer = lv_timer_create(onTimerUpdate, 10, this); +} + +void SurfaceDial::onTimerUpdate(lv_timer_t* timer) +{ + SurfaceDial* instance = (SurfaceDial*)timer->user_data; + instance->Update(); +} + +void SurfaceDial::Update() +{ + SurfaceDialInfo info; + Model->GetKnobStatus(&info); + HAL::surface_dial_update(info.konb_direction); + View->UpdateView(&info); +} \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.h b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.h new file mode 100644 index 0000000..bb6d4e9 --- /dev/null +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDial.h @@ -0,0 +1,35 @@ +#ifndef SURFACEDIAL_H_ +#define SURFACEDIAL_H_ +#include "SurfaceDialView.h" +#include "SurfaceDialModel.h" +namespace Page +{ + class SurfaceDial : public PageBase + { + public: + SurfaceDial(); + virtual ~SurfaceDial(); + + virtual void onCustomAttrConfig(); + virtual void onViewLoad(); + virtual void onViewDidLoad(); + virtual void onViewWillAppear(); + virtual void onViewDidAppear(); + virtual void onViewWillDisappear(); + virtual void onViewDidDisappear(); + virtual void onViewDidUnload(); + void SurfaceDialEventHandler(lv_event_t* event, lv_event_code_t code); + + private: + void AttachEvent(lv_obj_t* obj); + static void onEvent(lv_event_t* event); + static void onTimerUpdate(lv_timer_t* timer); + void Update(); + + private: + SurfaceDialView* View; + SurfaceDialModel* Model; + lv_timer_t* timer; + }; +} +#endif //SURFACEDIAL_H_ diff --git a/1.Firmware/src/app/Pages/Playground/SurfaceDialMode.cpp b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.cpp similarity index 68% rename from 1.Firmware/src/app/Pages/Playground/SurfaceDialMode.cpp rename to 1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.cpp index 30c6634..4ae1d60 100644 --- a/1.Firmware/src/app/Pages/Playground/SurfaceDialMode.cpp +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.cpp @@ -11,7 +11,7 @@ SurfaceDialModel::SurfaceDialModel() app = APP_MODE_SUPER_DIAL; } -void SurfaceDialModel::GetKnobStatus(PlaygroundInfo *info) +void SurfaceDialModel::GetKnobStatus(SurfaceDialInfo *info) { PlaygroundModel::GetKnobStatus(info); info->is_ble_connected = HAL::surface_dial_is_connected(); @@ -19,7 +19,7 @@ void SurfaceDialModel::GetKnobStatus(PlaygroundInfo *info) void SurfaceDialModel::SetPlaygroundMode(int16_t mode) { - + PlaygroundModel::SetPlaygroundMode(mode); } @@ -30,5 +30,9 @@ void SurfaceDialModel::Init() void SurfaceDialModel::Deinit() { - -} \ No newline at end of file + PlaygroundModel::Deinit(); +} +void SurfaceDialModel::ChangeMotorMode(int mode) +{ + PlaygroundModel::ChangeMotorMode(mode); +} diff --git a/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.h b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.h new file mode 100644 index 0000000..f0bf5e7 --- /dev/null +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialModel.h @@ -0,0 +1,34 @@ +#ifndef __SURFACE_DIAL_MODEL_H +#define __SURFACE_DIAL_MODEL_H +#include "app/Utils/AccountSystem/Account.h" +#include "lvgl.h" +#include "../Playground/PlaygroundView.h" +#include "../Playground/PlaygroundModel.h" + +typedef struct SurfaceDialInfo : PlaygroundInfo +{ + bool is_ble_connected; +} SurfaceDialInfo; + +namespace Page +{ + + class SurfaceDialModel : public PlaygroundModel + { + public: + SurfaceDialModel(); + void Init(); + void Deinit(); + void Update(void* pg_ui); + void GetKnobStatus(SurfaceDialInfo* info); + void ChangeMotorMode(int mode); + void SetPlaygroundMode(int16_t mode); + + void onEvent(Account* account, Account::EventParam_t* param); + private: + + }; + +} + +#endif diff --git a/1.Firmware/src/app/Pages/Playground/SurfaceDialView.cpp b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.cpp similarity index 81% rename from 1.Firmware/src/app/Pages/Playground/SurfaceDialView.cpp rename to 1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.cpp index 718bb75..cc9d28d 100644 --- a/1.Firmware/src/app/Pages/Playground/SurfaceDialView.cpp +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.cpp @@ -6,15 +6,15 @@ using namespace Page; * 默认视图显示: 圆点,原点所在位置 label_value * 此函数根据需要增加或 hidden 对象 */ -void Page::SurfaceDialView::SetPlaygroundMode(int16_t mode) +void SurfaceDialView::SetPlaygroundMode(int16_t mode) { lv_obj_add_flag(ui.lable_value, LV_OBJ_FLAG_HIDDEN); - lv_meter_set_scale_ticks(ui.meter, ui.scale_pot, 73, 2, 0, lv_color_make(0xff, 0x00, 0x00)); + lv_meter_set_scale_ticks(ui.meter, ui.scale_pot, 73, 2, 0, lv_color_black()); lv_meter_set_scale_range(ui.meter, ui.scale_pot, 0, 72, 360, 270); } -void Page::SurfaceDialView::UpdateView(PlaygroundInfo *info) +void SurfaceDialView::UpdateView(SurfaceDialInfo *info) { static bool is_connected = false; @@ -44,7 +44,9 @@ void SurfaceDialView::Create(lv_obj_t* root) void SurfaceDialView::Delete() { - - PlaygroundView:Delete(); - + printf("Deleting SurfaceDialView\n"); + lv_group_del(ui.group); + lv_style_reset(&style.meter); + lv_style_reset(&style.ticks); + printf("Delete done SurfaceDialView\n"); } \ No newline at end of file diff --git a/1.Firmware/src/app/Pages/Playground/SurfaceDialView.h b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.h similarity index 69% rename from 1.Firmware/src/app/Pages/Playground/SurfaceDialView.h rename to 1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.h index 70d5680..12190fd 100644 --- a/1.Firmware/src/app/Pages/Playground/SurfaceDialView.h +++ b/1.Firmware/src/app/Pages/SurfaceDial/SurfaceDialView.h @@ -1,10 +1,10 @@ #ifndef __SUPER_DIAL_VIEW_H #define __SUPER_DIAL_VIEW_H -#include "Arduino.h" +#include #include "app/app.h" -#include "../Page.h" -#include "PlaygroundView.h" - +#include "app/Pages/Page.h" +#include "../Playground/PlaygroundView.h" +#include "SurfaceDialModel.h" namespace Page { @@ -15,7 +15,7 @@ class SurfaceDialView: public PlaygroundView SurfaceDialView(){} void Create(lv_obj_t* root); void Delete(); - void UpdateView(PlaygroundInfo *info); + void UpdateView(SurfaceDialInfo *info); void SetPlaygroundMode(int16_t mode); diff --git a/1.Firmware/src/app/app.cpp b/1.Firmware/src/app/app.cpp index da0a2e8..3e22b96 100644 --- a/1.Firmware/src/app/app.cpp +++ b/1.Firmware/src/app/app.cpp @@ -41,7 +41,9 @@ void App_Init() manager.Install("Template", "Pages/Template"); manager.Install("Menu", "Pages/Menu"); manager.Install("Startup", "Pages/Startup"); - manager.Install("Playground", "Pages/Playground"); + manager.Install("Playground", "Pages/Playground"); + manager.Install("SurfaceDial", "Pages/SurfaceDial"); + manager.Install("Hass","Pages/Hass"); // manager.Install("Scene3D", "Pages/Scene3D"); manager.SetGlobalLoadAnimType(PageManager::LOAD_ANIM_OVER_TOP, 500);