• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &parameter);
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 &parameter);
85     int32_t PlayPattern(const VibratorIdentifier &identifier, const VibratorPattern &pattern, int32_t usage,
86         bool systemUsage, const VibratorParameter &parameter);
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 &parameter);
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