#include "typedef.h" #include "asm/pwm_led.h" #include "system/includes.h" #include "chgbox_ctrl.h" #include "chargeIc_manage.h" #include "chgbox_ui.h" #include "app_config.h" #if (TCFG_CHARGE_BOX_ENABLE) #define LOG_TAG_CONST APP_CHGBOX #define LOG_TAG "[CHGBOXUI]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE #define LOG_DUMP_ENABLE #define LOG_CLI_ENABLE #include "debug.h" #if (TCFG_CHARGE_BOX_UI_ENABLE) //关于仓ui的说明,分为三个部分 //1.ui状态层 //2.ui中间层 //3.ui驱动层 //状态层主要就是外部把仓的状态传进来,中间层是一个过渡,如不想用本驱动,可以自己更换中间层 //或者只使用本驱动层作其他使用 ///////////////////////////////////////////////////////////////////////////////////////////// //ui状态层 typedef struct _chgbox_ui_var_ { int ui_timer; u8 ui_power_on; //上电标志 } _chgbox_ui_var; static _chgbox_ui_var chgbox_ui_var; #define __this (&chgbox_ui_var) /*------------------------------------------------------------------------------------*/ /**@brief UI超时函数 @param priv:ui状态 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_update_timeout(void *priv) { u8 ledmode = (u8)priv; __this->ui_timer = 0; chgbox_led_set_mode(ledmode); } /*------------------------------------------------------------------------------------*/ /**@brief UI超时设置 @param priv:传到func的参数 func:超时后的回调函数 msec:N毫秒后调用func @return 无 @note */ /*------------------------------------------------------------------------------------*/ u16 chgbox_ui_timeout_add(int priv, void (*func)(void *priv), u32 msec) { if (__this->ui_timer) { sys_timer_del(__this->ui_timer); __this->ui_timer = 0; } if (func != NULL) { __this->ui_timer = sys_timeout_add((void *)priv, func, msec); } return __this->ui_timer; } /*------------------------------------------------------------------------------------*/ /**@brief 设置ui上电标志位 @param 无 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_set_power_on(u8 flag) { __this->ui_power_on = flag; } /*------------------------------------------------------------------------------------*/ /**@brief 获取ui上电标志位 @param 无 @return 无 @note */ /*------------------------------------------------------------------------------------*/ u8 chgbox_get_ui_power_on(void) { return __this->ui_power_on; } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓电量态ui更新 @param 无 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_update_local_power(void) { //配对状态,不显示舱电量UI if (sys_info.pair_status) { return; } if (sys_info.status[USB_DET] == STATUS_ONLINE) { chgbox_ui_timeout_add(0, NULL, 0); if (sys_info.localfull) { chgbox_led_set_mode(CHGBOX_LED_GREEN_ON);//充满后绿灯常亮 } else { chgbox_led_set_mode(CHGBOX_LED_RED_SLOW_BRE);//充电中灯慢闪 } } else { if (sys_info.lowpower_flag) { chgbox_led_set_mode(CHGBOX_LED_RED_FAST_BRE); //快闪4秒 chgbox_ui_timeout_add(CHGBOX_LED_RED_OFF, chgbox_ui_update_timeout, 4000); } else { chgbox_led_set_mode(CHGBOX_LED_GREEN_ON); chgbox_ui_timeout_add(CHGBOX_LED_GREEN_OFF, chgbox_ui_update_timeout, 8000); } } } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓公共态ui更新 @param status:UI状态 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_updata_default_status(u8 status) { switch (status) { case CHGBOX_UI_ALL_OFF: chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_ALL_OFF); break; case CHGBOX_UI_ALL_ON: chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_ALL_ON); break; case CHGBOX_UI_POWER: chgbox_ui_update_local_power(); break; } } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓合盖充电ui更新 @param status:UI状态 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_updata_charge_status(u8 status) { switch (status) { case CHGBOX_UI_USB_IN: case CHGBOX_UI_KEY_CLICK: case CHGBOX_UI_LOCAL_FULL: chgbox_ui_update_local_power(); break; case CHGBOX_UI_USB_OUT: chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_ALL_OFF); break; case CHGBOX_UI_CLOSE_LID: if (sys_info.status[USB_DET] == STATUS_ONLINE) { chgbox_ui_update_local_power(); } else { chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_GREEN_OFF); } break; case CHGBOX_UI_EAR_FULL: break; case CHGBOX_UI_OVER_CURRENT: if (sys_info.status[USB_DET] == STATUS_ONLINE) { chgbox_ui_update_local_power(); } else { chgbox_led_set_mode(CHGBOX_LED_RED_FAST_BRE); //快闪4秒 chgbox_ui_timeout_add(CHGBOX_LED_RED_OFF, chgbox_ui_update_timeout, 4000); } break; default: chgbox_ui_updata_default_status(status); break; } } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓开盖通信ui更新 @param status:UI状态 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_updata_comm_status(u8 status) { switch (status) { case CHGBOX_UI_USB_IN: case CHGBOX_UI_LOCAL_FULL: case CHGBOX_UI_KEY_CLICK: case CHGBOX_UI_OPEN_LID: chgbox_ui_update_local_power(); break; case CHGBOX_UI_USB_OUT: if (!sys_info.pair_status) { chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_RED_OFF); } break; case CHGBOX_UI_EAR_L_IN: case CHGBOX_UI_EAR_R_IN: case CHGBOX_UI_EAR_L_OUT: case CHGBOX_UI_EAR_R_OUT: if (!sys_info.pair_status) { if (sys_info.status[USB_DET] == STATUS_ONLINE) { if (sys_info.localfull) { chgbox_led_set_mode(CHGBOX_LED_RED_OFF); chgbox_ui_timeout_add(CHGBOX_LED_RED_ON, chgbox_ui_update_timeout, 500); } } else { chgbox_led_set_mode(CHGBOX_LED_GREEN_ON); chgbox_ui_timeout_add(CHGBOX_LED_GREEN_OFF, chgbox_ui_update_timeout, 500); } } break; case CHGBOX_UI_KEY_LONG: chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_BLUE_ON); break; case CHGBOX_UI_PAIR_START: chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_BLUE_FAST_FLASH); break; case CHGBOX_UI_PAIR_SUCC: if (sys_info.status[USB_DET] == STATUS_OFFLINE) { chgbox_ui_timeout_add(CHGBOX_LED_BLUE_OFF, chgbox_ui_update_timeout, 500); } else { if (!sys_info.localfull) { chgbox_ui_timeout_add(CHGBOX_LED_RED_SLOW_FLASH, chgbox_ui_update_timeout, 500); } else { chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_BLUE_ON); } } break; case CHGBOX_UI_PAIR_STOP: if (sys_info.status[USB_DET] == STATUS_ONLINE) { chgbox_ui_update_local_power(); } else { chgbox_ui_timeout_add(0, NULL, 0); chgbox_led_set_mode(CHGBOX_LED_BLUE_OFF); } break; default: chgbox_ui_updata_default_status(status); break; } } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓低电量ui更新 @param status:UI状态 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_updata_lowpower_status(u8 status) { switch (status) { case CHGBOX_UI_LOCAL_FULL: case CHGBOX_UI_LOWPOWER: case CHGBOX_UI_KEY_CLICK: case CHGBOX_UI_OPEN_LID: case CHGBOX_UI_CLOSE_LID: case CHGBOX_UI_USB_OUT: case CHGBOX_UI_USB_IN: chgbox_ui_update_local_power(); break; default: chgbox_ui_updata_default_status(status); break; } } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓UI更新仓状态 @param mode: 充电仓当前的UI模式(与充电仓的三个模式对应) status:充电仓当前状态 @return @note 各个模式根据状态控制ui变化 */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_update_status(u8 mode, u8 status) { switch (mode) { case UI_MODE_CHARGE: chgbox_ui_updata_charge_status(status); break; case UI_MODE_COMM: chgbox_ui_updata_comm_status(status); break; case UI_MODE_LOWPOWER: chgbox_ui_updata_lowpower_status(status); break; } chgbox_ui_set_power_on(0); } /*------------------------------------------------------------------------------------*/ /**@brief 充电仓UI初始化 @param 无 @return 无 @note */ /*------------------------------------------------------------------------------------*/ void chgbox_ui_manage_init(void) { chgbox_led_init(); } ///////////////////////////////////////////////////////////////////////////////////////////// //ui中间层 /*------------------------------------------------------------------------------------*/ /**@brief 充电仓设置呼吸灯模式 @param mode: 灯模式 @return 无 @note 设置充电仓灯的状态,不同的亮暗或闪烁可以调配 */ /*------------------------------------------------------------------------------------*/ void chgbox_led_set_mode(u8 mode) { u8 i; log_info("CHG_LED_mode:%d\n", mode); switch (mode) { case CHGBOX_LED_RED_OFF://红灯 chgbox_set_led_stu(CHG_LED_RED, 0, 0, 1); break; case CHGBOX_LED_RED_FAST_OFF: chgbox_set_led_stu(CHG_LED_RED, 0, 0, 0); break; case CHGBOX_LED_RED_ON://红灯 chgbox_set_led_stu(CHG_LED_RED, 1, 0, 1); break; case CHGBOX_LED_RED_FAST_ON: chgbox_set_led_stu(CHG_LED_RED, 1, 0, 0); break; case CHGBOX_LED_RED_SLOW_FLASH: chgbox_set_led_bre(CHG_LED_RED, LED_FLASH_SLOW, 0, 0xffff); break; case CHGBOX_LED_RED_FLAST_FLASH: chgbox_set_led_bre(CHG_LED_RED, LED_FLASH_FAST, 0, 0xffff); break; case CHGBOX_LED_RED_SLOW_BRE: chgbox_set_led_bre(CHG_LED_RED, LED_FLASH_SLOW, 1, 0xffff); break; case CHGBOX_LED_RED_FAST_BRE: chgbox_set_led_bre(CHG_LED_RED, LED_FLASH_FAST, 1, 0xffff); break; case CHGBOX_LED_GREEN_OFF: chgbox_set_led_stu(CHG_LED_GREEN, 0, 1, 1); break; case CHGBOX_LED_GREEN_FAST_OFF: chgbox_set_led_stu(CHG_LED_GREEN, 0, 0, 0); break; case CHGBOX_LED_GREEN_ON: chgbox_set_led_stu(CHG_LED_GREEN, 1, 1, 1); break; case CHGBOX_LED_GREEN_FAST_ON: chgbox_set_led_stu(CHG_LED_GREEN, 1, 0, 0); break; case CHGBOX_LED_GREEN_SLOW_FLASH: chgbox_set_led_bre(CHG_LED_GREEN, LED_FLASH_SLOW, 0, 0xffff); break; case CHGBOX_LED_GREEN_FAST_FLASH: chgbox_set_led_bre(CHG_LED_GREEN, LED_FLASH_FAST, 0, 0xffff); break; case CHGBOX_LED_GREEN_SLOW_BRE: chgbox_set_led_bre(CHG_LED_GREEN, LED_FLASH_SLOW, 1, 0xffff); break; case CHGBOX_LED_GREEN_FAST_BRE: chgbox_set_led_bre(CHG_LED_GREEN, LED_FLASH_FAST, 1, 0xffff); break; case CHGBOX_LED_BLUE_OFF: chgbox_set_led_stu(CHG_LED_BLUE, 0, 0, 1); break; case CHGBOX_LED_BLUE_FAST_OFF: chgbox_set_led_stu(CHG_LED_BLUE, 0, 0, 0); break; case CHGBOX_LED_BLUE_ON: chgbox_set_led_stu(CHG_LED_BLUE, 1, 0, 1); break; case CHGBOX_LED_BLUE_FAST_ON: chgbox_set_led_stu(CHG_LED_BLUE, 1, 0, 0); break; case CHGBOX_LED_BLUE_SLOW_FLASH: chgbox_set_led_bre(CHG_LED_BLUE, LED_FLASH_SLOW, 0, 0xffff); break; case CHGBOX_LED_BLUE_FAST_FLASH: chgbox_set_led_bre(CHG_LED_BLUE, LED_FLASH_FAST, 0, 0xffff); break; case CHGBOX_LED_BLUE_SLOW_BRE: chgbox_set_led_bre(CHG_LED_BLUE, LED_FLASH_SLOW, 1, 0xffff); break; case CHGBOX_LED_BLUE_FAST_BRE: chgbox_set_led_bre(CHG_LED_BLUE, LED_FLASH_FAST, 1, 0xffff); break; case CHGBOX_LED_ALL_OFF: chgbox_set_led_all_off(1); break; case CHGBOX_LED_ALL_FAST_OFF: chgbox_set_led_all_off(0); break; case CHGBOX_LED_ALL_ON: chgbox_set_led_all_on(1); break; case CHGBOX_LED_ALL_FAST_ON: chgbox_set_led_all_on(0); break; } } #else void chgbox_ui_set_power_on(u8 flag) { } u8 chgbox_get_ui_power_on(void) { return 0; } void chgbox_ui_update_status(u8 mode, u8 status) { } void chgbox_ui_manage_init(void) { } #endif #endif