• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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