From 419acc8b9339668b1634f2a46937586ddf74f309 Mon Sep 17 00:00:00 2001 From: Youngjae Cho Date: Thu, 17 Aug 2023 21:14:46 +0900 Subject: [PATCH] display: Add display attribute for controlling DPMS New attribute: - id: DEVICED_DISPLAY_ATTR_INT_DPMS_STATE - type: SYSCOMMON_RESMAN_DATA_TYPE_INT - setter: O - getter: O It sets/gets DPMS value type of enum deviced_dpms_state. New attribute: - id: DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT - type: SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64 - setter: O - getter: X It bypasses display state transition routine. Instead it sets DPMS directly. It requires two parameter, enum deviced_dpms_state and enum deviced_event. Change-Id: If8ab662ccf011458607acfa24aca97298eddcfc6 Signed-off-by: Youngjae Cho --- plugins/iot-headed/display/core.c | 19 +++++--- plugins/iot-headed/display/key-filter.c | 43 ++++++++++++++---- src/display/display-dpms.h | 3 ++ src/display/resource-display.c | 80 +++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 14 deletions(-) diff --git a/plugins/iot-headed/display/core.c b/plugins/iot-headed/display/core.c index fd5058a..5403fe6 100644 --- a/plugins/iot-headed/display/core.c +++ b/plugins/iot-headed/display/core.c @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include #include #include @@ -49,7 +52,6 @@ #include "lock-detector.h" #include "display-ops.h" #include "device-interface.h" -#include "display-panel.h" #include "display-config.h" #include "display-state-transition.h" @@ -170,10 +172,12 @@ static int display_start(enum device_flags flags) if (flags & NORMAL_MODE) { if (flags & LCD_PANEL_OFF_MODE) /* standby on */ - display_panel_set_panel_state_by_standby_state(true); + syscommon_resman_set_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, DEVICED_DPMS_STANDBY); else /* normal lcd on */ - display_panel_set_panel_state_by_on_state(flags); + syscommon_resman_set_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, DEVICED_DPMS_ON); return 0; } @@ -197,8 +201,13 @@ static int display_start(enum device_flags flags) static int display_stop(enum device_flags flags) { /* NORMAL MODE */ - if (flags & NORMAL_MODE || flags & FORCE_OFF_MODE) { - display_panel_set_panel_state_by_off_state(flags); + if (flags & NORMAL_MODE) { + syscommon_resman_set_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, DEVICED_DPMS_OFF); + return 0; + } else if (flags & FORCE_OFF_MODE) { + syscommon_resman_set_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, DEVICED_DPMS_FORCE_OFF); return 0; } diff --git a/plugins/iot-headed/display/key-filter.c b/plugins/iot-headed/display/key-filter.c index b03cb49..ea1ed4e 100644 --- a/plugins/iot-headed/display/key-filter.c +++ b/plugins/iot-headed/display/key-filter.c @@ -35,7 +35,6 @@ #include "poll.h" #include "device-interface.h" #include "display-actor.h" -#include "display-panel.h" #include "display-backlight.h" #include "display-ops.h" #include "display-config.h" @@ -211,33 +210,51 @@ static inline void broadcast_lcdoff_by_powerkey(void) static inline bool switch_on_lcd(enum device_flags flags) { + int dpms_state; + int ret; + enum deviced_event reason; + if (current_state_in_on()) return false; - if (display_panel_get_dpms_cached_state() == DPMS_ON) + ret = syscommon_resman_get_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, &dpms_state); + if (ret == 0 && dpms_state == DEVICED_DPMS_ON) return false; - if (flags & LCD_ON_BY_POWER_KEY) + if (flags & LCD_ON_BY_POWER_KEY) { broadcast_lcdon_by_powerkey(); - else if (flags & LCD_ON_BY_TOUCH) + reason = DEVICED_EVENT_INPUT_POWERKEY; + } else if (flags & LCD_ON_BY_TOUCH) { _I("Display on by Touch_wakeup event"); + reason = DEVICED_EVENT_TOUCHSCREEN; + } else { + reason = DEVICED_EVENT_UNKNOWN; + } - display_panel_lcd_on_direct(flags); + syscommon_resman_set_resource_attr_uint64_2(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT, DEVICED_DPMS_ON, reason); return true; } static inline void switch_off_lcd(void) { + int dpms_state; + int ret; + if (!current_state_in_on()) return; - if (display_panel_get_dpms_cached_state() == DPMS_OFF) + ret = syscommon_resman_get_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, &dpms_state); + if (ret == 0 && dpms_state == DEVICED_DPMS_OFF) return; broadcast_lcdoff_by_powerkey(); - display_panel_lcd_off_procedure(LCD_OFF_BY_POWER_KEY); + syscommon_resman_set_resource_attr_uint64_2(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT, DEVICED_DPMS_OFF, DEVICED_EVENT_INPUT_POWERKEY); } static void check_key_combination(struct input_event *pinput) @@ -357,9 +374,17 @@ static int process_menu_key(struct input_event *pinput) static int decide_lcdoff(void) { + int dpms_state; + int ret; + + ret = syscommon_resman_get_resource_attr_int(SYSCOMMON_RESOURCE_ID(DEVICED_RESOURCE_TYPE_DISPLAY), + DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, &dpms_state); + + if (ret < 0) + return false; + /* It's not needed if it's already LCD off state */ - if (!current_state_in_on() && - display_panel_get_dpms_cached_state() != DPMS_ON) + if (!current_state_in_on() && dpms_state != DPMS_ON) return false; /* diff --git a/src/display/display-dpms.h b/src/display/display-dpms.h index 2c8802b..8e1447f 100644 --- a/src/display/display-dpms.h +++ b/src/display/display-dpms.h @@ -19,6 +19,9 @@ #ifndef __DISPLAY_DPMS_H__ #define __DISPLAY_DPMS_H__ +/** + * FIXME: Need to replace it with libsyscommon one, enum deviced_dpms_state. + */ enum dpms_state { DPMS_ON, /* In use */ DPMS_STANDBY, /* Blanked, low power */ diff --git a/src/display/resource-display.c b/src/display/resource-display.c index 54d97c6..86feba5 100644 --- a/src/display/resource-display.c +++ b/src/display/resource-display.c @@ -39,6 +39,39 @@ typedef union { bool b; } resource_attr_data_t; +static int set_display_attr_data(int resource_id, + const struct syscommon_resman_resource_attribute *attr, + const void *data, int count) +{ + if (!data) + return -EINVAL; + + switch (attr->id) { + case DEVICED_DISPLAY_ATTR_INT_DPMS_STATE: + { + enum deviced_dpms_state state = *(enum deviced_dpms_state *) data; + + switch (state) { + case DEVICED_DPMS_ON: + return display_panel_set_panel_state_by_on_state(0); + case DEVICED_DPMS_STANDBY: + return display_panel_set_panel_state_by_standby_state(1); + case DEVICED_DPMS_OFF: + return display_panel_set_panel_state_by_off_state(0); + case DEVICED_DPMS_FORCE_OFF: + return display_panel_set_panel_state_by_off_state(FORCE_OFF_MODE); + default: + return 0; + } + } + break; + default: + return -EINVAL; + } + + return 0; +} + static int set_tuple2_display_attr_data(int resource_id, const struct syscommon_resman_resource_attribute *attr, const void *data1, const void *data2, int count1, int count2) @@ -60,6 +93,31 @@ static int set_tuple2_display_attr_data(int resource_id, else return display_state_transition_do_state_transition(state, EVENT_INPUT); } + case DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT: + { + enum deviced_dpms_state state = *(enum deviced_dpms_state *) data1; + enum deviced_event reason = *(enum deviced_event *) data2; + int flag; + + switch (reason) { + case DEVICED_EVENT_INPUT_POWERKEY: + flag = LCD_ON_BY_POWER_KEY; + break; + case DEVICED_EVENT_TOUCHSCREEN: + flag = LCD_ON_BY_TOUCH; + break; + default: + flag = 0; + break; + } + + if (state == DEVICED_DPMS_OFF) + display_panel_lcd_off_procedure(flag); + else if (state == DEVICED_DPMS_ON) + display_panel_lcd_on_direct(flag); + return 0; + } + break; default: return -EINVAL; } @@ -83,6 +141,9 @@ static int get_display_attr_data(int resource_id, case DEVICED_DISPLAY_ATTR_INT_GET_CURRENT_STATE: ret = display_state_get_current((enum deviced_display_state *) &attr_data.i32); break; + case DEVICED_DISPLAY_ATTR_INT_DPMS_STATE: + attr_data.i32 = display_panel_get_dpms_cached_state(); + break; default: ret = -EINVAL; break; @@ -148,6 +209,25 @@ static const struct syscommon_resman_resource_attribute display_attrs[] = { .set_2_tuple = set_tuple2_display_attr_data, .is_supported = syscommon_resman_resource_attr_supported_always, }, + }, { + .name = "DEVICED_DISPLAY_ATTR_INT_DPMS_STATE", + .id = DEVICED_DISPLAY_ATTR_INT_DPMS_STATE, + .type = SYSCOMMON_RESMAN_DATA_TYPE_INT, + .flag = SYSCOMMON_RESMAN_RESOURCE_FLAG_PUBLIC, + .ops = { + .set = set_display_attr_data, + .get = get_display_attr_data, + .is_supported = syscommon_resman_resource_attr_supported_always, + }, + }, { + .name = "DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT", + .id = DEVICED_DISPLAY_ATTR_TUPLE2_SET_DISPLAY_DIRECT, + .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64, + .flag = SYSCOMMON_RESMAN_RESOURCE_FLAG_PUBLIC, + .ops = { + .set_2_tuple = set_tuple2_display_attr_data, + .is_supported = syscommon_resman_resource_attr_supported_always, + }, } }; -- 2.7.4