diff --git a/udfps/UdfpsHandler.cpp b/udfps/UdfpsHandler.cpp index eabbc31..dcb9702 100644 --- a/udfps/UdfpsHandler.cpp +++ b/udfps/UdfpsHandler.cpp @@ -20,8 +20,11 @@ #include "xiaomi_touch.h" #define COMMAND_NIT 10 -#define PARAM_NIT_FOD 1 -#define PARAM_NIT_NONE 0 +#define TARGET_BRIGHTNESS_OFF 0 +#define TARGET_BRIGHTNESS_1000NIT 1 +#define TARGET_BRIGHTNESS_110NIT 6 + +#define LOW_BRIGHTNESS_THRESHHOLD 100 #define COMMAND_FOD_PRESS_STATUS 1 #define PARAM_FOD_PRESSED 1 @@ -115,12 +118,28 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { mDevice->extCmd(mDevice, COMMAND_FOD_PRESS_STATUS, pressed ? PARAM_FOD_PRESSED : PARAM_FOD_RELEASED); + // Get brightness + struct disp_brightness_req brightness_req; + int brightness = LOW_BRIGHTNESS_THRESHHOLD; + brightness_req.base.flag = 0; + brightness_req.base.disp_id = MI_DISP_PRIMARY; + rc = ioctl(disp_fd_.get(), MI_DISP_IOCTL_GET_BRIGHTNESS, &brightness_req); + if (rc) { + LOG(ERROR) << "failed to get brightness, err: " << rc; + } else if (brightness_req.brightness > 0) { + brightness = brightness_req.brightness; + } + LOG(DEBUG) << "brightness is: " << (int)brightness_req.brightness; + bool requestLowBrightness = brightness < LOW_BRIGHTNESS_THRESHHOLD; + // Request HBM disp_local_hbm_req req; req.base.flag = 0; req.base.disp_id = MI_DISP_PRIMARY; - req.local_hbm_value = pressed ? LHBM_TARGET_BRIGHTNESS_WHITE_1000NIT - : LHBM_TARGET_BRIGHTNESS_OFF_FINGER_UP; + req.local_hbm_value = + pressed ? (requestLowBrightness ? LHBM_TARGET_BRIGHTNESS_WHITE_110NIT + : LHBM_TARGET_BRIGHTNESS_WHITE_1000NIT) + : LHBM_TARGET_BRIGHTNESS_OFF_FINGER_UP; ioctl(disp_fd_.get(), MI_DISP_IOCTL_SET_LOCAL_HBM, &req); } }).detach(); @@ -167,9 +186,13 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { LOG(DEBUG) << "received data: " << std::bitset<8>(value); bool localHbmUiReady = value & LOCAL_HBM_UI_READY; + bool requestLowBrightnessCapture = value & FOD_LOW_BRIGHTNESS_CAPTURE; mDevice->extCmd(mDevice, COMMAND_NIT, - localHbmUiReady ? PARAM_NIT_FOD : PARAM_NIT_NONE); + localHbmUiReady + ? (requestLowBrightnessCapture ? TARGET_BRIGHTNESS_110NIT + : TARGET_BRIGHTNESS_1000NIT) + : TARGET_BRIGHTNESS_OFF); } }).detach(); }