display: Add display attribute for controlling DPMS 81/297381/4
authorYoungjae Cho <y0.cho@samsung.com>
Thu, 17 Aug 2023 12:14:46 +0000 (21:14 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Fri, 18 Aug 2023 01:23:05 +0000 (01:23 +0000)
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 <y0.cho@samsung.com>
plugins/iot-headed/display/core.c
plugins/iot-headed/display/key-filter.c
src/display/display-dpms.h
src/display/resource-display.c

index fd5058a..5403fe6 100644 (file)
@@ -40,6 +40,9 @@
 #include <vconf-keys.h>
 #include <sys/time.h>
 #include <libsyscommon/list.h>
+#include <libsyscommon/resource-manager.h>
+#include <system/syscommon-plugin-deviced-common-interface.h>
+#include <system/syscommon-plugin-deviced-display-interface.h>
 #include <device/display-internal.h>
 #include <hal/device/hal-device-power.h>
 
@@ -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;
        }
 
index b03cb49..ea1ed4e 100644 (file)
@@ -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;
 
        /*
index 2c8802b..8e1447f 100644 (file)
@@ -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 */
index 54d97c6..86feba5 100644 (file)
@@ -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,
+               },
        }
 };