1 /*
2 * Copyright (c) 2024-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <securec.h>
17 #include "proximity_controller_base.h"
18 #include "ffrt_utils.h"
19 #include "power_log.h"
20 #include "errors.h"
21 #include "setting_helper.h"
22
23 namespace OHOS {
24 namespace PowerMgr {
25 std::mutex ProximityNormalController::userMutex_;
26 bool ProximityNormalController::isInactiveClose_ = false;
27
ProximityControllerBase(const std::string & name,SensorCallbackFunc callback)28 ProximityControllerBase::ProximityControllerBase(const std::string& name, SensorCallbackFunc callback)
29 {
30 #ifdef HAS_SENSORS_SENSOR_PART
31 POWER_HILOGD(FEATURE_INPUT, "Instance enter");
32 SensorInfo* sensorInfo = nullptr;
33 int32_t count = 0;
34 int ret = GetAllSensors(&sensorInfo, &count);
35 if (ret != 0 || sensorInfo == nullptr) {
36 POWER_HILOGE(FEATURE_INPUT, "Get sensors fail, ret=%{public}d", ret);
37 return;
38 }
39 for (int32_t i = 0; i < count; i++) {
40 if (sensorInfo[i].sensorTypeId == SENSOR_TYPE_ID_PROXIMITY) {
41 POWER_HILOGI(FEATURE_INPUT, "Support PROXIMITY sensor");
42 support_ = true;
43 break;
44 }
45 }
46 if (!support_) {
47 POWER_HILOGE(FEATURE_INPUT, "PROXIMITY sensor not support");
48 return;
49 }
50 if (strcpy_s(user_.name, sizeof(user_.name), name.c_str()) != EOK) {
51 POWER_HILOGE(FEATURE_INPUT, "strcpy_s user_.name=%{public}s error", name.c_str());
52 return;
53 }
54 user_.userData = nullptr;
55 user_.callback = callback;
56 #endif
57 }
58
~ProximityControllerBase()59 ProximityControllerBase::~ProximityControllerBase()
60 {
61 #ifdef HAS_SENSORS_SENSOR_PART
62 if (support_) {
63 UnsubscribeSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
64 }
65 #endif
66 }
67
68 #ifdef HAS_SENSORS_SENSOR_PART
Enable()69 void ProximityControllerBase::Enable()
70 {
71 POWER_HILOGD(FEATURE_INPUT, "Enter");
72 enabled_ = true;
73 if (!support_) {
74 POWER_HILOGE(FEATURE_INPUT, "PROXIMITY sensor not support");
75 return;
76 }
77
78 int32_t errorCode = SubscribeSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
79 if (errorCode != ERR_OK) {
80 POWER_HILOGW(FEATURE_INPUT, "SubscribeSensor PROXIMITY failed, errorCode=%{public}d", errorCode);
81 return;
82 }
83 SetBatch(SENSOR_TYPE_ID_PROXIMITY, &user_, SAMPLING_RATE, SAMPLING_RATE);
84 errorCode = ActivateSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
85 if (errorCode != ERR_OK) {
86 POWER_HILOGW(FEATURE_INPUT, "ActivateSensor PROXIMITY failed, errorCode=%{public}d", errorCode);
87 return;
88 }
89 SetMode(SENSOR_TYPE_ID_PROXIMITY, &user_, SENSOR_ON_CHANGE);
90 POWER_HILOGI(FEATURE_INPUT, "ActivateSensor PROXIMITY success");
91 }
92
Disable()93 void ProximityControllerBase::Disable()
94 {
95 POWER_HILOGD(FEATURE_INPUT, "Enter");
96 enabled_ = false;
97 if (!support_) {
98 POWER_HILOGE(FEATURE_INPUT, "PROXIMITY sensor not support");
99 return;
100 }
101
102 DeactivateSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
103 int32_t errorCode = UnsubscribeSensor(SENSOR_TYPE_ID_PROXIMITY, &user_);
104 if (errorCode != ERR_OK) {
105 POWER_HILOGW(FEATURE_INPUT, "UnsubscribeSensor PROXIMITY failed, errorCode=%{public}d", errorCode);
106 return;
107 }
108 POWER_HILOGI(FEATURE_INPUT, "UnsubscribeSensor PROXIMITY success");
109 }
110
IsClose()111 bool ProximityControllerBase::IsClose()
112 {
113 POWER_HILOGD(FEATURE_INPUT, "PROXIMITY IsClose: %{public}d", isClose_);
114 return isClose_;
115 }
116
Clear()117 void ProximityControllerBase::Clear()
118 {
119 isClose_ = false;
120 }
121 #endif
122
RecordSensorCallback(SensorEvent * event)123 void ProximityNormalController::RecordSensorCallback(SensorEvent *event)
124 {
125 #ifdef POWER_PROXIMITY_PICKUP_ENABLE
126 POWER_HILOGD(FEATURE_POWER_STATE, "Sensor Callback come in");
127 if (event == nullptr) {
128 POWER_HILOGW(FEATURE_POWER_STATE, "Sensor event is nullptr");
129 return;
130 }
131 if (event->sensorTypeId != SENSOR_TYPE_ID_PROXIMITY) {
132 POWER_HILOGW(FEATURE_POWER_STATE, "SensorTypeId=%{public}d, sensor type is not PROXIMITY", event->sensorTypeId);
133 return;
134 }
135 ProximityData* data = reinterpret_cast<ProximityData*>(event->data);
136 if (data == nullptr) {
137 POWER_HILOGE(FEATURE_POWER_STATE, "ProximityData is null");
138 return;
139 }
140 int32_t distance = static_cast<int32_t>(data->distance);
141 POWER_HILOGI(FEATURE_POWER_STATE, "SensorD=%{public}d", distance);
142 if (distance == PROXIMITY_CLOSE_SCALAR) {
143 isInactiveClose_ = true;
144 } else if (distance == PROXIMITY_AWAY_SCALAR) {
145 isInactiveClose_ = false;
146 }
147 #endif
148 }
149
ActivateValidProximitySensor(PowerState state)150 void ProximityNormalController::ActivateValidProximitySensor(PowerState state)
151 {
152 #ifdef POWER_PROXIMITY_PICKUP_ENABLE
153 if (support_ == false) {
154 POWER_HILOGE(FEATURE_POWER_STATE, "PROXIMITY sensor not support, ActivateValidProximitySensor failed");
155 return;
156 }
157 if (state == PowerState::INACTIVE) {
158 if (proximitySensorEnabled_) {
159 POWER_HILOGI(FEATURE_POWER_STATE, "PROXIMITY sensor is already on");
160 } else if (SettingHelper::GetSettingWakeupPickup()) {
161 FFRTTask task = [this] {
162 std::lock_guard lock(userMutex_);
163 Enable();
164 };
165 FFRTUtils::SubmitTask(task);
166 proximitySensorEnabled_ = true;
167 } else {
168 POWER_HILOGI(FEATURE_POWER_STATE, "Piukup Wakeup device is disable, skip PROXIMITY sensor Enable");
169 }
170 } else if (state == PowerState::AWAKE) {
171 if (!proximitySensorEnabled_) {
172 POWER_HILOGI(FEATURE_POWER_STATE, "PROXIMITY sensor is already off");
173 } else {
174 FFRTTask task = [this] {
175 std::lock_guard lock(userMutex_);
176 Disable();
177 isInactiveClose_ = false;
178 };
179 FFRTUtils::SubmitTask(task);
180 proximitySensorEnabled_ = false;
181 }
182 }
183 #endif
184 }
185 } // namespace PowerMgr
186 } // namespace OHOS