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 16 #ifndef VIBRATOR_SERVICE_CLIENT_H 17 #define VIBRATOR_SERVICE_CLIENT_H 18 19 #include <dlfcn.h> 20 #include <time.h> 21 #include <mutex> 22 #include <map> 23 #include <set> 24 #include <vector> 25 26 #include "iremote_object.h" 27 #include "singleton.h" 28 29 #include "i_vibrator_decoder.h" 30 #include "miscdevice_service_proxy.h" 31 #include "vibrator_agent_type.h" 32 #include "vibrator_client_stub.h" 33 #include "miscdevice_common.h" 34 35 namespace OHOS { 36 namespace Sensors { 37 38 struct VibratorDecodeHandle { 39 void *handle; 40 IVibratorDecoder *decoder; 41 IVibratorDecoder *(*create)(const JsonParser &); 42 void (*destroy)(IVibratorDecoder *); 43 VibratorDecodeHandleVibratorDecodeHandle44 VibratorDecodeHandle(): handle(nullptr), decoder(nullptr), 45 create(nullptr), destroy(nullptr) {} 46 FreeVibratorDecodeHandle47 void Free() 48 { 49 if (handle != nullptr) { 50 dlclose(handle); 51 handle = nullptr; 52 } 53 decoder = nullptr; 54 create = nullptr; 55 destroy = nullptr; 56 } 57 }; 58 59 struct VibratorCurveInterval { 60 int32_t beginTime; 61 int32_t endTime; 62 int32_t intensity; 63 int32_t frequency; 64 }; 65 66 class VibratorServiceClient : public Singleton<VibratorServiceClient> { 67 public: 68 ~VibratorServiceClient() override; 69 int32_t Vibrate(const VibratorIdentifier &identifier, int32_t timeOut, int32_t usage, bool systemUsage); 70 int32_t Vibrate(const VibratorIdentifier &identifier, const std::string &effect, 71 int32_t loopCount, int32_t usage, bool systemUsage); 72 #ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM 73 int32_t PlayVibratorCustom(const VibratorIdentifier &identifier, const RawFileDescriptor &rawFd, 74 int32_t usage, bool systemUsage, const VibratorParameter ¶meter); 75 #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM 76 int32_t StopVibrator(const VibratorIdentifier &identifier, const std::string &mode); 77 int32_t StopVibrator(const VibratorIdentifier &identifier); 78 bool IsHdHapticSupported(const VibratorIdentifier &identifier); 79 int32_t IsSupportEffect(const VibratorIdentifier &identifier, const std::string &effect, bool &state); 80 void ProcessDeathObserver(const wptr<IRemoteObject> &object); 81 int32_t PreProcess(const VibratorFileDescription &fd, VibratorPackage &package); 82 int32_t GetDelayTime(const VibratorIdentifier &identifier, int32_t &delayTime); 83 int32_t InitPlayPattern(const VibratorIdentifier &identifier, const VibratorPattern &pattern, int32_t usage, 84 bool systemUsage, const VibratorParameter ¶meter); 85 int32_t PlayPattern(const VibratorIdentifier &identifier, const VibratorPattern &pattern, int32_t usage, 86 bool systemUsage, const VibratorParameter ¶meter); 87 int32_t ConvertVibratorPackage(const VibratorPackage& inPkg, VibratePackageIPC &outPkg); 88 int32_t PlayPackageBySessionId(const VibratorIdentifier &identifier, 89 const VibratorEffectParameter &vibratorEffectParameter, const VibratorPackage &package); 90 int32_t StopVibrateBySessionId(const VibratorIdentifier &identifier, uint32_t sessionId); 91 static int32_t FreeVibratorPackage(VibratorPackage &package); 92 int32_t PlayPrimitiveEffect(const VibratorIdentifier &identifier, const std::string &effect, 93 const PrimitiveEffect &primitiveEffect); 94 bool IsSupportVibratorCustom(const VibratorIdentifier &identifier); 95 int32_t SeekTimeOnPackage(int32_t seekTime, const VibratorPackage &completePackage, VibratorPackage &seekPackage); 96 int32_t SubscribeVibratorPlugInfo(const VibratorUser *user); 97 int32_t UnsubscribeVibratorPlugInfo(const VibratorUser *user); 98 std::set<RecordVibratorPlugCallback> GetSubscribeUserCallback(int32_t deviceId); 99 bool HandleVibratorData(VibratorStatusEvent statusEvent); 100 void SetUsage(const VibratorIdentifier &identifier, int32_t usage, bool systemUsage); 101 void SetLoopCount(const VibratorIdentifier &identifier, int32_t count); 102 void SetParameters(const VibratorIdentifier &identifier, const VibratorParameter ¶meter); 103 VibratorEffectParameter GetVibratorEffectParameter(const VibratorIdentifier &identifier); 104 int32_t GetVibratorList(const VibratorIdentifier& identifier, std::vector<VibratorInfos>& vibratorInfo); 105 int32_t GetEffectInfo(const VibratorIdentifier& identifier, const std::string& effectType, EffectInfo& effectInfo); 106 static int32_t ModulatePackage(const VibratorEvent &modulationCurve, 107 const VibratorPackage &beforeModulationPackage, VibratorPackage &afterModulationPackage); 108 109 private: 110 int32_t InitServiceClient(); 111 int32_t LoadDecoderLibrary(const std::string& path); 112 int32_t ConvertVibratorPackage(const VibratePackage& inPkg, VibratorPackage &outPkg); 113 int32_t TransferClientRemoteObject(); 114 int32_t GetVibratorCapacity(const VibratorIdentifier &identifier, VibratorCapacity &capacity); 115 void ConvertSeekVibratorPackage(const VibratorPackage &completePackage, VibratePackage &convertPackage, 116 int32_t seekTime); 117 void ConvertVibratorPattern(const VibratorPattern &vibratorPattern, VibratePattern &vibratePattern); 118 bool SkipEventAndConvertVibratorEvent(const VibratorEvent &vibratorEvent, VibratePattern &vibratePattern, 119 int32_t patternStartTime, VibrateEvent &vibrateEvent); 120 static VibratorCurvePoint* GetCurveListAfterModulation(const std::vector<VibratorCurveInterval>& modInterval, 121 const VibratorEvent &beforeModEvent, int32_t patternOffset); 122 static int32_t ModulateEventWithoutCurvePoints(const std::vector<VibratorCurveInterval>& modInterval, 123 int32_t patternStartTime, const VibratorEvent &beforeModEvent, VibratorEvent &afterModEvent); 124 static void FreePartiallyAllocatedVibratorPatterns(VibratorPattern** patterns, int32_t partialIdx); 125 static int32_t ModulateVibratorPattern(const VibratorEvent &modulationCurve, 126 const VibratorPattern &beforeModulationPattern, VibratorPattern &afterModulationPattern); 127 static void FreePartiallyAllocatedVibratorEvents(VibratorEvent** events, int32_t partialIdx); 128 static int32_t ModulateVibratorEvent(const VibratorEvent &modulationCurve, int32_t patternStartTime, 129 const VibratorEvent &beforeModulationEvent, VibratorEvent &afterModulationEvent); 130 static int32_t ModulateEventWithCurvePoints(std::vector<VibratorCurveInterval>& modInterval, 131 int32_t patternStartTime, const VibratorEvent &beforeModulationEvent, VibratorEvent &afterModulationEvent); 132 static void BinarySearchInterval(const std::vector<VibratorCurveInterval>& interval, 133 int32_t val, int32_t& idx); 134 static void ConvertVibratorEventsToCurveIntervals(const VibratorEvent &vibratorEvent, int32_t patternTimeOffset, 135 std::vector<VibratorCurveInterval>& curveInterval); 136 static int32_t RestrictIntensityRange(int32_t intensity); 137 static int32_t RestrictFrequencyRange(int32_t frequency); 138 void WriteVibratorHiSysIPCEvent(IMiscdeviceServiceIpcCode code, int32_t ret); 139 void WriteOtherHiSysIPCEvent(IMiscdeviceServiceIpcCode code, int32_t ret); 140 sptr<IRemoteObject::DeathRecipient> serviceDeathObserver_ = nullptr; 141 sptr<IMiscdeviceService> miscdeviceProxy_ = nullptr; 142 sptr<VibratorClientStub> vibratorClient_ = nullptr; 143 VibratorDecodeHandle decodeHandle_; 144 std::mutex clientMutex_; 145 std::mutex decodeMutex_; 146 147 std::recursive_mutex subscribeMutex_; 148 std::set<const VibratorUser *> subscribeSet_; 149 150 std::mutex vibratorEffectMutex_; 151 std::map<VibratorIdentifier, VibratorEffectParameter> vibratorEffectMap_; 152 }; 153 } // namespace Sensors 154 } // namespace OHOS 155 #endif // VIBRATOR_SERVICE_CLIENT_H 156