1 /*
2 * Copyright (c) 2021-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 #include "vibrator_hdi_connection.h"
16
17 #ifdef HIVIEWDFX_HITRACE_ENABLE
18 #include "hitrace_meter.h"
19 #endif // HIVIEWDFX_HITRACE_ENABLE
20
21 #ifdef BUILD_VARIANT_ENG
22 #include "compatible_connection.h"
23 #endif // BUILD_VARIANT_ENG
24 #include "hdi_connection.h"
25 #include "sensors_errors.h"
26
27 #undef LOG_TAG
28 #define LOG_TAG "VibratorHdiConnection"
29
30 namespace OHOS {
31 namespace Sensors {
32
ConnectHdi()33 int32_t VibratorHdiConnection::ConnectHdi()
34 {
35 #ifdef HDF_DRIVERS_INTERFACE_VIBRATOR
36 iVibratorHdiConnection_ = std::make_unique<HdiConnection>();
37 #endif // HDF_DRIVERS_INTERFACE_VIBRATOR
38 int32_t ret = iVibratorHdiConnection_->ConnectHdi();
39 #ifdef BUILD_VARIANT_ENG
40 if (ret != ERR_OK) {
41 MISC_HILOGE("Hdi direct failed");
42 iVibratorHdiConnection_ = std::make_unique<CompatibleConnection>();
43 ret = iVibratorHdiConnection_->ConnectHdi();
44 }
45 if (ret != ERR_OK) {
46 MISC_HILOGE("Hdi connection failed");
47 return VIBRATOR_HDF_CONNECT_ERR;
48 }
49 #endif // BUILD_VARIANT_ENG
50 return ret;
51 }
52
StartOnce(const VibratorIdentifierIPC & identifier,uint32_t duration)53 int32_t VibratorHdiConnection::StartOnce(const VibratorIdentifierIPC &identifier, uint32_t duration)
54 {
55 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
56 #ifdef HIVIEWDFX_HITRACE_ENABLE
57 StartTrace(HITRACE_TAG_SENSORS, "StartOnce");
58 #endif // HIVIEWDFX_HITRACE_ENABLE
59 int32_t ret = iVibratorHdiConnection_->StartOnce(identifier, duration);
60 #ifdef HIVIEWDFX_HITRACE_ENABLE
61 FinishTrace(HITRACE_TAG_SENSORS);
62 #endif // HIVIEWDFX_HITRACE_ENABLE
63 if (ret != 0) {
64 MISC_HILOGE("StartOnce failed");
65 return VIBRATOR_ON_ERR;
66 }
67 return ERR_OK;
68 }
69
Start(const VibratorIdentifierIPC & identifier,const std::string & effectType)70 int32_t VibratorHdiConnection::Start(const VibratorIdentifierIPC &identifier, const std::string &effectType)
71 {
72 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
73 #ifdef HIVIEWDFX_HITRACE_ENABLE
74 StartTrace(HITRACE_TAG_SENSORS, "Start");
75 #endif // HIVIEWDFX_HITRACE_ENABLE
76 int32_t ret = iVibratorHdiConnection_->Start(identifier, effectType);
77 #ifdef HIVIEWDFX_HITRACE_ENABLE
78 FinishTrace(HITRACE_TAG_SENSORS);
79 #endif // HIVIEWDFX_HITRACE_ENABLE
80 if (ret != 0) {
81 MISC_HILOGE("Start failed");
82 return VIBRATOR_ON_ERR;
83 }
84 return ERR_OK;
85 }
86
87 #ifdef HDF_DRIVERS_INTERFACE_VIBRATOR
88 #ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
EnableCompositeEffect(const VibratorIdentifierIPC & identifier,const HdfCompositeEffect & hdfCompositeEffect)89 int32_t VibratorHdiConnection::EnableCompositeEffect(const VibratorIdentifierIPC &identifier,
90 const HdfCompositeEffect &hdfCompositeEffect)
91 {
92 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
93 #ifdef HIVIEWDFX_HITRACE_ENABLE
94 StartTrace(HITRACE_TAG_SENSORS, "EnableCompositeEffect");
95 #endif // HIVIEWDFX_HITRACE_ENABLE
96 int32_t ret = iVibratorHdiConnection_->EnableCompositeEffect(identifier, hdfCompositeEffect);
97 #ifdef HIVIEWDFX_HITRACE_ENABLE
98 FinishTrace(HITRACE_TAG_SENSORS);
99 #endif // HIVIEWDFX_HITRACE_ENABLE
100 if (ret != 0) {
101 MISC_HILOGE("EnableCompositeEffect failed");
102 return VIBRATOR_ON_ERR;
103 }
104 return ERR_OK;
105 }
106
IsVibratorRunning(const VibratorIdentifierIPC & identifier)107 bool VibratorHdiConnection::IsVibratorRunning(const VibratorIdentifierIPC &identifier)
108 {
109 CHKPR(iVibratorHdiConnection_, false);
110 return iVibratorHdiConnection_->IsVibratorRunning(identifier);
111 }
112 #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
113
GetEffectInfo(const VibratorIdentifierIPC & identifier,const std::string & effect)114 std::optional<HdfEffectInfo> VibratorHdiConnection::GetEffectInfo(const VibratorIdentifierIPC &identifier,
115 const std::string &effect)
116 {
117 if (iVibratorHdiConnection_ == nullptr) {
118 MISC_HILOGE("Connect hdi failed");
119 return std::nullopt;
120 }
121 #ifdef HIVIEWDFX_HITRACE_ENABLE
122 StartTrace(HITRACE_TAG_SENSORS, "GetEffectInfo");
123 #endif // HIVIEWDFX_HITRACE_ENABLE
124 std::optional<HdfEffectInfo> ret = iVibratorHdiConnection_->GetEffectInfo(identifier, effect);
125 #ifdef HIVIEWDFX_HITRACE_ENABLE
126 FinishTrace(HITRACE_TAG_SENSORS);
127 #endif // HIVIEWDFX_HITRACE_ENABLE
128 return ret;
129 }
130
Stop(const VibratorIdentifierIPC & identifier,HdfVibratorMode mode)131 int32_t VibratorHdiConnection::Stop(const VibratorIdentifierIPC &identifier, HdfVibratorMode mode)
132 {
133 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
134 #ifdef HIVIEWDFX_HITRACE_ENABLE
135 StartTrace(HITRACE_TAG_SENSORS, "Stop");
136 #endif // HIVIEWDFX_HITRACE_ENABLE
137 int32_t ret = iVibratorHdiConnection_->Stop(identifier, mode);
138 #ifdef HIVIEWDFX_HITRACE_ENABLE
139 FinishTrace(HITRACE_TAG_SENSORS);
140 #endif // HIVIEWDFX_HITRACE_ENABLE
141 if (ret != 0) {
142 MISC_HILOGE("Stop failed");
143 return VIBRATOR_OFF_ERR;
144 }
145 return ERR_OK;
146 }
147 #endif // HDF_DRIVERS_INTERFACE_VIBRATOR
148
GetDelayTime(const VibratorIdentifierIPC & identifier,int32_t mode,int32_t & delayTime)149 int32_t VibratorHdiConnection::GetDelayTime(const VibratorIdentifierIPC &identifier, int32_t mode, int32_t &delayTime)
150 {
151 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
152 return iVibratorHdiConnection_->GetDelayTime(identifier, mode, delayTime);
153 }
154
GetVibratorCapacity(const VibratorIdentifierIPC & identifier,VibratorCapacity & capacity)155 int32_t VibratorHdiConnection::GetVibratorCapacity(const VibratorIdentifierIPC &identifier, VibratorCapacity &capacity)
156 {
157 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
158 return iVibratorHdiConnection_->GetVibratorCapacity(identifier, capacity);
159 }
160
PlayPattern(const VibratorIdentifierIPC & identifier,const VibratePattern & pattern)161 int32_t VibratorHdiConnection::PlayPattern(const VibratorIdentifierIPC &identifier, const VibratePattern &pattern)
162 {
163 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
164 return iVibratorHdiConnection_->PlayPattern(identifier, pattern);
165 }
166
PlayPatternBySessionId(const VibratorIdentifierIPC & identifier,uint32_t sessionId,const VibratePattern & pattern)167 int32_t VibratorHdiConnection::PlayPatternBySessionId(const VibratorIdentifierIPC &identifier, uint32_t sessionId,
168 const VibratePattern &pattern)
169 {
170 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
171 return iVibratorHdiConnection_->PlayPatternBySessionId(identifier, sessionId, pattern);
172 }
173
PlayPackageBySessionId(const VibratorIdentifierIPC & identifier,uint32_t sessionId,const VibratePackageIPC & package)174 int32_t VibratorHdiConnection::PlayPackageBySessionId(const VibratorIdentifierIPC &identifier, uint32_t sessionId,
175 const VibratePackageIPC &package)
176 {
177 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
178 return iVibratorHdiConnection_->PlayPackageBySessionId(identifier, sessionId, package);
179 }
180
StopVibrateBySessionId(const VibratorIdentifierIPC & identifier,uint32_t sessionId)181 int32_t VibratorHdiConnection::StopVibrateBySessionId(const VibratorIdentifierIPC &identifier, uint32_t sessionId)
182 {
183 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
184 return iVibratorHdiConnection_->StopVibrateBySessionId(identifier, sessionId);
185 }
186
DestroyHdiConnection()187 int32_t VibratorHdiConnection::DestroyHdiConnection()
188 {
189 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
190 int32_t ret = iVibratorHdiConnection_->DestroyHdiConnection();
191 if (ret != 0) {
192 MISC_HILOGE("DestroyHdiConnection failed");
193 return VIBRATOR_HDF_CONNECT_ERR;
194 }
195 return ERR_OK;
196 }
197
StartByIntensity(const VibratorIdentifierIPC & identifier,const std::string & effect,int32_t intensity)198 int32_t VibratorHdiConnection::StartByIntensity(const VibratorIdentifierIPC &identifier, const std::string &effect,
199 int32_t intensity)
200 {
201 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
202 #ifdef HIVIEWDFX_HITRACE_ENABLE
203 StartTrace(HITRACE_TAG_SENSORS, "StartByIntensity");
204 #endif // HIVIEWDFX_HITRACE_ENABLE
205 int32_t ret = iVibratorHdiConnection_->StartByIntensity(identifier, effect, intensity);
206 #ifdef HIVIEWDFX_HITRACE_ENABLE
207 FinishTrace(HITRACE_TAG_SENSORS);
208 #endif // HIVIEWDFX_HITRACE_ENABLE
209 if (ret != 0) {
210 MISC_HILOGE("StartByIntensity failed");
211 return VIBRATOR_ON_ERR;
212 }
213 return ERR_OK;
214 }
215
216 #ifdef HDF_DRIVERS_INTERFACE_VIBRATOR
GetVibratorInfo(std::vector<HdfVibratorInfo> & hdfVibratorInfo)217 int32_t VibratorHdiConnection::GetVibratorInfo(std::vector<HdfVibratorInfo> &hdfVibratorInfo)
218 {
219 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
220 return iVibratorHdiConnection_->GetVibratorInfo(hdfVibratorInfo);
221 }
222
GetAllWaveInfo(const VibratorIdentifierIPC & identifier,std::vector<HdfWaveInformation> & waveInfos)223 int32_t VibratorHdiConnection::GetAllWaveInfo(const VibratorIdentifierIPC &identifier,
224 std::vector<HdfWaveInformation> &waveInfos)
225 {
226 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
227 return iVibratorHdiConnection_->GetAllWaveInfo(identifier, waveInfos);
228 }
229
GetVibratorList(const VibratorIdentifierIPC & identifier,std::vector<HdfVibratorInfo> & vibratorInfo)230 int32_t VibratorHdiConnection::GetVibratorList(const VibratorIdentifierIPC &identifier,
231 std::vector<HdfVibratorInfo> &vibratorInfo)
232 {
233 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
234 return iVibratorHdiConnection_->GetVibratorList(identifier, vibratorInfo);
235 }
236
GetEffectInfo(const VibratorIdentifierIPC & identifier,const std::string & effectType,HdfEffectInfo & effectInfo)237 int32_t VibratorHdiConnection::GetEffectInfo(const VibratorIdentifierIPC &identifier, const std::string &effectType,
238 HdfEffectInfo &effectInfo)
239 {
240 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
241 return iVibratorHdiConnection_->GetEffectInfo(identifier, effectType, effectInfo);
242 }
243 #endif // HDF_DRIVERS_INTERFACE_VIBRATOR
244
RegisterVibratorPlugCallback(DevicePlugCallback cb)245 int32_t VibratorHdiConnection::RegisterVibratorPlugCallback(DevicePlugCallback cb)
246 {
247 CHKPR(iVibratorHdiConnection_, VIBRATOR_HDF_CONNECT_ERR);
248 #ifdef HIVIEWDFX_HITRACE_ENABLE
249 StartTrace(HITRACE_TAG_SENSORS, "RegisterVibratorPlugCallback");
250 #endif // HIVIEWDFX_HITRACE_ENABLE
251 int32_t ret = iVibratorHdiConnection_->RegisterVibratorPlugCallback(cb);
252 #ifdef HIVIEWDFX_HITRACE_ENABLE
253 FinishTrace(HITRACE_TAG_SENSORS);
254 #endif // HIVIEWDFX_HITRACE_ENABLE
255 if (ret != 0) {
256 MISC_HILOGE("RegisterVibratorPlugCallback failed");
257 return VIBRATOR_ON_ERR;
258 }
259 return ERR_OK;
260 }
261
GetVibratorPlugCb()262 DevicePlugCallback VibratorHdiConnection::GetVibratorPlugCb()
263 {
264 CHKPP(iVibratorHdiConnection_);
265 return NULL;
266 }
267 } // namespace Sensors
268 } // namespace OHOS
269