actions.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. /**
  2. * @Author: 李建
  3. * @Date: 2025/3/18 11:34
  4. * Description: 定义了UI 与 逻辑的交互
  5. * Copyright: Copyright (©) 2025 永续绿建. All rights reserved.
  6. */
  7. #include <esp_log.h>
  8. #include <string.h>
  9. #include <nvs_flash.h>
  10. #include <esp_app_desc.h>
  11. #include "misc/lv_types.h"
  12. #include "widgets/tabview/lv_tabview.h"
  13. #include "gui_guider.h"
  14. #include "main.h"
  15. #include "wifi.h"
  16. #include "actions.h"
  17. #include "xf_controller.h"
  18. #include "lvgl_port.h"
  19. #include "modbus_master.h"
  20. #include "system/miscellaneous_interface.h"
  21. LV_IMAGE_DECLARE(_orange_meter_RGB565A8_84x396);
  22. LV_IMAGE_DECLARE(_green_meter_RGB565A8_84x396);
  23. LV_IMAGE_DECLARE(_power_open_RGB565A8_36x36);
  24. LV_IMAGE_DECLARE(_nxh_off_RGB565A8_80x80);
  25. LV_IMAGE_DECLARE(_js_on_RGB565A8_80x80);
  26. LV_IMAGE_DECLARE(_auto_on_RGB565A8_80x80);
  27. LV_IMAGE_DECLARE(_xf_on_RGB565A8_80x80);
  28. const static char *TAG = "actions";
  29. extern void set_xf_mode(lv_ui *ui, uint16_t mode);
  30. //
  31. /**
  32. * 点击管理密码登录按钮事件
  33. * @param e
  34. */
  35. void on_btn_check_manager_password(lv_event_t *e) {
  36. const char *password = lv_textarea_get_text(guider_ui.SettingPage_ta_1);
  37. if (strcmp(password, "0803") != 0) {
  38. // 显示密码错误标签
  39. lv_obj_remove_flag(guider_ui.SettingPage_lab_password_incorrect, LV_OBJ_FLAG_HIDDEN);
  40. } else {
  41. // 验证通过
  42. lv_obj_add_flag(guider_ui.SettingPage_lab_password_incorrect, LV_OBJ_FLAG_HIDDEN);
  43. // 隐藏密码输入 panel
  44. lv_obj_add_flag(guider_ui.SettingPage_cont_1, LV_OBJ_FLAG_HIDDEN);
  45. // 显示高级设置界面
  46. guider_ui.SettingPage_del = true;
  47. ui_load_scr_animation(&guider_ui, &guider_ui.FactorySettingPage, true,
  48. &guider_ui.SettingPage_del, setup_scr_FactorySettingPage,
  49. LV_SCR_LOAD_ANIM_MOVE_RIGHT, 200, 200, true, true);
  50. }
  51. }
  52. //void on_ac_page_set_power(lv_event_t *e) {
  53. // lv_obj_t *obj = lv_event_get_current_target(e);
  54. // if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
  55. // ac_status.power = 1;
  56. // } else {
  57. // ac_status.power = 0;
  58. // }
  59. // ac_set_power(false);
  60. //}
  61. /**
  62. * 点击设置-开关机按钮事件
  63. * @param e
  64. */
  65. void on_btn_power_click(lv_event_t *e) {
  66. lv_obj_t *obj = lv_event_get_current_target(e);
  67. if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
  68. xf_status.power = 1;
  69. } else {
  70. xf_status.power = 0;
  71. }
  72. xf_set_power(true);
  73. }
  74. /**
  75. * 滑块风挡值变化
  76. * @param e
  77. */
  78. void on_slider_speed_value_changed(lv_event_t *e) {
  79. int32_t value=lv_slider_get_value(guider_ui.screen_main_slider_speedSet_sign);
  80. if(value<=20)
  81. {
  82. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "1档");
  83. }else if(value<=40)
  84. {
  85. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "2档");
  86. }else if(value<=60)
  87. {
  88. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "3档");
  89. }else if(value<=80)
  90. {
  91. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "4档");
  92. }else if(value<=100)
  93. {
  94. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "5档");
  95. }else{
  96. }
  97. }
  98. /**
  99. * 滑块风挡释放
  100. * @param e
  101. */
  102. void on_slider_speed_released(lv_event_t *e) {
  103. int32_t value=lv_slider_get_value(guider_ui.screen_main_slider_speedSet_sign);
  104. lvgl_port_lock(-1);
  105. if(value<=30)
  106. {
  107. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "1档");
  108. lv_slider_set_value(guider_ui.screen_main_slider_speedSet_sign,30,LV_ANIM_OFF);
  109. xf_status.fan_speed=1;
  110. }else if(value<=60)
  111. {
  112. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "2档");
  113. lv_slider_set_value(guider_ui.screen_main_slider_speedSet_sign,60,LV_ANIM_OFF);
  114. xf_status.fan_speed=2;
  115. }else if(value<=90)
  116. {
  117. lv_label_set_text_static(guider_ui.screen_main_label_spedSet_vul, "3档");
  118. lv_slider_set_value(guider_ui.screen_main_slider_speedSet_sign,90,LV_ANIM_OFF);
  119. xf_status.fan_speed=3;
  120. }else{
  121. }
  122. xf_set_fan_speed(true);
  123. lvgl_port_unlock();
  124. }
  125. /**
  126. * 滑块最大湿度值变化
  127. * @param e
  128. */
  129. void on_slider_hum_value_changed(lv_event_t *e) {
  130. int32_t value=lv_slider_get_value(guider_ui.screen_main_slider_humSet_sign);
  131. if(value>100)
  132. {
  133. value=100;
  134. }else if(value<=system_setting.set_min_hum)
  135. {
  136. value=system_setting.set_min_hum;
  137. }
  138. lvgl_port_lock(-1);
  139. lv_label_set_text_fmt(guider_ui.screen_main_label_humSet_vul, "%ld%%",value);
  140. lvgl_port_unlock();
  141. }
  142. /**
  143. * 滑块最大湿度值释放
  144. * @param e
  145. */
  146. void on_slider_hum_released(lv_event_t *e) {
  147. int32_t value=lv_slider_get_value(guider_ui.screen_main_slider_humSet_sign);
  148. if(value>100)
  149. {
  150. value=100;
  151. }else if(value<=system_setting.set_min_hum)
  152. {
  153. value=system_setting.set_min_hum;
  154. }
  155. lvgl_port_lock(-1);
  156. lv_slider_set_value(guider_ui.screen_main_slider_humSet_sign,value,LV_ANIM_OFF);
  157. lv_label_set_text_fmt(guider_ui.screen_main_label_humSet_vul, "%ld%%",value);
  158. lvgl_port_unlock();
  159. xf_status.set_max_hum=value;
  160. xf_set_max_hum(true);
  161. }
  162. /**
  163. * 点击设置-网络-查找网络按钮事件
  164. * @param e
  165. */
  166. void on_btn_scan_wifi_click(lv_event_t *e) {
  167. lv_obj_clean(guider_ui.SettingPage_list_wifi);
  168. app_wifi_scan();
  169. }
  170. /**
  171. * 点击连接 wifi 按钮
  172. * @param e
  173. */
  174. void on_btn_connect_wifi(lv_event_t *e) {
  175. app_connect_wifi();
  176. }
  177. /**
  178. * 切换至主页面
  179. * @param e
  180. */
  181. void switch_screen_main_set(lv_event_t *e) {
  182. lv_ui * ui = lv_event_get_user_data(e);
  183. // 设置温度及滑动和风速状态
  184. lvgl_port_lock(-1);
  185. if(xf_status.new_fan==2)
  186. {
  187. lv_obj_add_state(ui->screen_main_imgbtn_new_fan,LV_STATE_CHECKED);
  188. }else{
  189. lv_obj_remove_state(ui->screen_main_imgbtn_new_fan,LV_STATE_CHECKED);
  190. }
  191. lv_label_set_text_fmt(ui->screen_main_label_humSet_vul, "%d%%", xf_status.set_max_hum);
  192. lv_slider_set_value(ui->screen_main_slider_speedSet_sign, xf_status.fan_speed*30, LV_ANIM_ON);
  193. lv_label_set_text_fmt(ui->screen_main_label_spedSet_vul, "%d档",xf_status.fan_speed);
  194. lv_slider_set_value(ui->screen_main_slider_humSet_sign, xf_status.set_max_hum, LV_ANIM_ON);
  195. set_xf_mode(ui, xf_status.mode);
  196. xf_set_power(true);
  197. // 设置电源状态
  198. lv_obj_add_state(ui->screen_main_imgbtn_power, xf_status.power == 1 ? LV_STATE_CHECKED : LV_STATE_DEFAULT);
  199. lvgl_port_unlock();
  200. }
  201. /**
  202. * 切换至设置页面
  203. * @param e
  204. */
  205. void switch_setting_page_set(lv_event_t *e) {
  206. lv_ui * ui = lv_event_get_user_data(e);
  207. lvgl_port_lock(-1);
  208. if(system_setting.sound_on_off)
  209. lv_obj_add_state(ui->SettingPage_sw_sound, LV_STATE_CHECKED);
  210. else
  211. lv_obj_remove_state(ui->SettingPage_sw_sound, LV_STATE_CHECKED);
  212. if(system_setting.screen_auto_off)
  213. lv_obj_add_state(ui->SettingPage_sw_1, LV_STATE_CHECKED);
  214. else
  215. lv_obj_remove_state(ui->SettingPage_sw_1, LV_STATE_CHECKED);
  216. lv_slider_set_value(ui->SettingPage_slider_sound_level, system_setting.sound_volume, false);
  217. lv_spinbox_set_value(ui->SettingPage_spinbox_2,system_setting.screen_off_minute);
  218. lvgl_port_unlock();
  219. }
  220. //刷新ui
  221. void refresh_ui_error(lv_event_t *e)
  222. {
  223. lv_ui * ui = lv_event_get_user_data(e);
  224. char str[320]={0};
  225. int index=0;
  226. lvgl_port_lock(-1);
  227. if ((xf_status.js_error_code==0)&&(xf_status.cs_error_code==0))
  228. {
  229. lv_label_set_text_static(ui->FactorySettingPage_label_detail_error, "NONE");
  230. } else{
  231. index=0;
  232. for(int i=0;i<8;i++)
  233. {
  234. if(xf_status.js_error_code&(1<<i))
  235. {
  236. //sprintf(str,"%s:%s\n",xf_fault[i].code,xf_fault[i].description);
  237. str[index++]='E';
  238. str[index++]='0'+i+1;
  239. str[index++]=':';
  240. for(int j=0;j<strlen((const char*)xf_fault[i].description);j++)
  241. {
  242. str[index++]=xf_fault[i].description[j];
  243. }
  244. str[index++]='\n';
  245. }
  246. }
  247. for(int i=0;i<11;i++)
  248. {
  249. if(xf_status.cs_error_code&(1<<i))
  250. {
  251. //sprintf(str,"%s:%s\n",xf_fault[i].code,xf_fault[i].description);
  252. str[index++]='E';
  253. str[index++]='0'+i+1;
  254. str[index++]=':';
  255. for(int j=0;j<strlen((const char*)xf_CSFault[i].description);j++)
  256. {
  257. str[index++]=xf_CSFault[i].description[j];
  258. }
  259. str[index++]='\n';
  260. }
  261. }
  262. str[index++]=0;
  263. lv_label_set_text(ui->FactorySettingPage_label_detail_error, str);
  264. }
  265. lvgl_port_unlock();
  266. }
  267. /**
  268. * 切换至高级设置页面
  269. * @param e
  270. */
  271. void switch_factory_setting_page_set(lv_event_t *e) {
  272. refresh_ui_error(e);
  273. }
  274. /**
  275. * 重置滤网剩余寿命
  276. * @param e
  277. */
  278. void on_btn_filter_life_remain_clear(lv_event_t *e) {
  279. xf_set_filter_life_remain(true);
  280. }
  281. // 设置界面切换顶部tab按钮时的事件
  282. void on_setting_tabview_changed(lv_event_t *e) {
  283. // uint32_t index = lv_tabview_get_tab_active(guider_ui.SettingPage_tabview_1);
  284. // switch (index) {
  285. // case 0: // 参数设置
  286. // break;
  287. // case 1: // 网络设置
  288. // //app_wifi_scan();
  289. // break;
  290. // case 2:
  291. // default:
  292. // break;
  293. // }
  294. }
  295. //
  296. ///**
  297. // * 高级配置-五恒模块选中事件
  298. // * @param e
  299. // */
  300. //void on_set_five_const_module(lv_event_t *e) {
  301. // lv_obj_t *cont = (lv_obj_t *) lv_event_get_current_target(e);
  302. // lv_obj_t *act_cb = lv_event_get_target(e);
  303. // if (act_cb == cont) return;
  304. // lv_obj_add_state(act_cb, LV_STATE_CHECKED);
  305. // uint32_t count = lv_obj_get_child_count(cont);
  306. // // 遍历所有子控件
  307. // for (int i = 0; i < count; i++) {
  308. // lv_obj_t *child = lv_obj_get_child(cont, i);
  309. // if (child != act_cb) {
  310. // lv_obj_remove_state(child, LV_STATE_CHECKED);
  311. // }
  312. // }
  313. // // TODO:修改本地配置
  314. //}
  315. //
  316. ///**
  317. // * 高级配置-设备风阀与分控对应关系
  318. // * @param e
  319. // * @param valve_index
  320. // */
  321. //void on_set_fan_valve(lv_event_t *e, uint8_t valve_index) {
  322. // lv_obj_t *cont = (lv_obj_t *) lv_event_get_current_target(e);
  323. // lv_obj_t *act_cb = lv_event_get_target(e);
  324. // if (act_cb == cont) return;
  325. // lv_obj_add_state(act_cb, LV_STATE_CHECKED);
  326. // uint32_t count = lv_obj_get_child_count(cont);
  327. // // 遍历所有子控件
  328. // for (int i = 0; i < count; i++) {
  329. // lv_obj_t *child = lv_obj_get_child(cont, i);
  330. // if (child != act_cb) {
  331. // lv_obj_remove_state(child, LV_STATE_CHECKED);
  332. // }
  333. // }
  334. // // TODO: 修改风阀对应配置
  335. //}
  336. /**
  337. * 高级配置-恢复出厂设置按钮事件
  338. * @param e
  339. */
  340. void on_reset_factory_setting(lv_event_t *e) {
  341. // 清空nvs
  342. nvs_flash_erase();
  343. // 重启设备
  344. esp_restart();
  345. }
  346. /**
  347. * 手动新风开关
  348. * @param e
  349. */
  350. void on_new_fan_on_off(lv_event_t *e) {
  351. lv_obj_t *obj = lv_event_get_current_target(e);
  352. if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
  353. xf_status.new_fan = 2;
  354. } else {
  355. xf_status.new_fan = 1;
  356. }
  357. set_new_fan(true);
  358. }
  359. //
  360. //void on_ac_page_arc_value_changed(lv_event_t *e) {
  361. // lv_obj_t *arc = lv_event_get_current_target(e);
  362. // int32_t value = lv_arc_get_value(arc);
  363. // lvgl_port_lock(0);
  364. // lv_label_set_text_fmt(guider_ui.ACPage_lab_ac_temp, "%d", (uint16_t) value);
  365. // lvgl_port_unlock();
  366. //}
  367. //
  368. //void on_ac_page_arc_released(lv_event_t *e) {
  369. // lv_obj_t *arc = lv_event_get_current_target(e);
  370. // int32_t value = lv_arc_get_value(arc);
  371. // ac_status.set_temp = (uint16_t) value;
  372. // ac_set_temp(true);
  373. //}
  374. //
  375. //void on_set_inner_addr(uint8_t num) {
  376. // if (num)
  377. // addr += 1;
  378. // else
  379. // addr -= 1;
  380. // if (addr + num > 255)
  381. // addr = 254;
  382. // if (addr + num < 1)
  383. // addr = 1;
  384. // lvgl_port_lock(0);
  385. // lv_label_set_text_fmt(guider_ui.FactorySettingPage_lab_inner_addr, "%d", addr);
  386. // lvgl_port_unlock();
  387. // // 保存到 nvs
  388. // save_inner_addr(addr);
  389. //}
  390. //
  391. void on_set_xf_mode(lv_event_t *e) {
  392. lv_obj_t *cont = (lv_obj_t *) lv_event_get_current_target(e);
  393. lv_obj_t *act_cb = lv_event_get_target(e);
  394. if (act_cb == cont) return;
  395. lvgl_port_lock(-1);
  396. lv_obj_add_state(act_cb, LV_STATE_CHECKED);
  397. uint32_t count = lv_obj_get_child_count(cont);
  398. // 遍历所有子控件
  399. for (int i = 0; i < count; i++) {
  400. lv_obj_t *child = lv_obj_get_child(cont, i);
  401. if (child != act_cb) {
  402. lv_obj_remove_state(child, LV_STATE_CHECKED);
  403. }
  404. }
  405. lvgl_port_unlock();
  406. if (act_cb == guider_ui.screen_main_imgbtn_cs) {
  407. xf_status.mode = CS;
  408. } else if (act_cb == guider_ui.screen_main_imgbtn_js) {
  409. xf_status.mode = JS;
  410. } else if (act_cb == guider_ui.screen_main_imgbtn_sf) {
  411. xf_status.mode = SF;
  412. }
  413. // else if (act_cb == guider_ui.screen_main_imgbtn_auto)
  414. // xf_status.mode = AUTO;
  415. xf_set_mode(true);
  416. }
  417. void on_set_beep_on_off(lv_event_t * e) {
  418. lv_obj_t *obj = lv_event_get_current_target(e);
  419. if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
  420. system_setting.sound_on_off = 1;
  421. } else {
  422. system_setting.sound_on_off = 0;
  423. }
  424. save_system_setting(&system_setting);
  425. }
  426. void on_set_screen_auto_off(lv_event_t * e) {
  427. lv_obj_t *obj = lv_event_get_current_target(e);
  428. if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
  429. system_setting.screen_auto_off = 1;
  430. } else {
  431. system_setting.screen_auto_off = 0;
  432. }
  433. save_system_setting(&system_setting);
  434. }
  435. void on_set_beep_volume(lv_event_t* e) {
  436. const lv_obj_t *slider = lv_event_get_current_target(e);
  437. uint32_t value = lv_slider_get_value(slider);
  438. ESP_LOGD(TAG, "on_set_beep_volume;%d", (uint8_t) value);
  439. system_setting.sound_volume = (uint8_t) value;
  440. save_system_setting(&system_setting);
  441. }
  442. void on_set_xf_mode_volume(lv_ui *ui) {
  443. }
  444. void on_set_screen_off_minute(lv_event_t * e) {
  445. lv_obj_t *spbox = lv_event_get_current_target(e);
  446. int32_t value = lv_spinbox_get_value(spbox);
  447. ESP_LOGD(TAG, "on_set_screen_off_minute;%d", (uint8_t) value);
  448. system_setting.screen_off_minute = (uint8_t) value;
  449. save_system_setting(&system_setting);
  450. }
  451. void setting_page_init(lv_ui *ui) {
  452. static lv_style_t style_SettingPage_tabview_1_extra_btnm_items_default;
  453. ui_init_style(&style_SettingPage_tabview_1_extra_btnm_items_default);
  454. lv_style_set_text_color(&style_SettingPage_tabview_1_extra_btnm_items_default, lv_color_hex(0xffb204));
  455. lv_style_set_text_font(&style_SettingPage_tabview_1_extra_btnm_items_default, &lv_font_Alibaba_PuHuiTi_Medium_16);
  456. lv_style_set_text_opa(&style_SettingPage_tabview_1_extra_btnm_items_default, 255);
  457. lv_obj_add_style(lv_tabview_get_tab_bar(ui->SettingPage_tabview_1),
  458. &style_SettingPage_tabview_1_extra_btnm_items_default, LV_PART_MAIN | LV_STATE_DEFAULT);
  459. lv_label_set_text(ui->SettingPage_lab_wifi_status, get_wifi_status() == 1 ? "已连接" : "未连接");
  460. // 填充“关于”页面信息
  461. esp_app_desc_t * desc = esp_app_get_description();
  462. lv_label_set_text(ui->SettingPage_lab_version, desc->version);
  463. char device_serial[12];
  464. get_device_serial(device_serial);
  465. lv_qrcode_update(ui->SettingPage_qr_device_code, device_serial, 12);
  466. }
  467. void on_ota_failed_restart(lv_event_t *e) {
  468. esp_restart();
  469. }
  470. void on_reset_wifi(lv_event_t *e) {
  471. yx_data_clear(NVS_SSID_KEY);
  472. yx_data_clear(NVS_PASSWORD_KEY);
  473. esp_restart();
  474. }
  475. void on_restart_device(lv_event_t *e) {
  476. esp_restart();
  477. }
  478. /**
  479. *
  480. * @param e
  481. */
  482. void on_refresh_set_on_off(lv_event_t *e) {
  483. lv_obj_t *obj = lv_event_get_current_target(e);
  484. switch (system_setting.mould_proof_runtime) {
  485. case 10:
  486. lv_dropdown_set_selected(guider_ui.FactorySettingPage_ddlist_proof_set, 0);
  487. break;
  488. case 20:
  489. lv_dropdown_set_selected(guider_ui.FactorySettingPage_ddlist_proof_set, 1);
  490. break;
  491. case 30:
  492. lv_dropdown_set_selected(guider_ui.FactorySettingPage_ddlist_proof_set, 2);
  493. break;
  494. case 60:
  495. lv_dropdown_set_selected(guider_ui.FactorySettingPage_ddlist_proof_set, 3);
  496. break;
  497. default:
  498. lv_dropdown_set_selected(guider_ui.FactorySettingPage_ddlist_proof_set, 3);
  499. break;
  500. }
  501. }
  502. /**
  503. *
  504. * @param e
  505. */
  506. void on_asve_set_on_off(lv_event_t *e) {
  507. uint32_t select;
  508. lv_obj_t *obj = lv_event_get_current_target(e);
  509. select=lv_dropdown_get_selected(guider_ui.FactorySettingPage_ddlist_proof_set);
  510. switch (select) {
  511. case 0:
  512. system_setting.mould_proof_runtime = 10;
  513. break;
  514. case 1:
  515. system_setting.mould_proof_runtime = 20;
  516. break;
  517. case 2:
  518. system_setting.mould_proof_runtime = 30;
  519. break;
  520. case 3:
  521. system_setting.mould_proof_runtime = 60;
  522. break;
  523. default:
  524. system_setting.mould_proof_runtime = 60;
  525. break;
  526. }
  527. nvs_set_uint8(system_setting.mould_proof_runtime, NVS_MOULD_PROOF_RUNTIME);
  528. }