1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#ifndef DEVICE_H
17c29fa5a6Sopenharmony_ci#define DEVICE_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include <bitset>
20c29fa5a6Sopenharmony_ci#include <string>
21c29fa5a6Sopenharmony_ci#include <vector>
22c29fa5a6Sopenharmony_ci
23c29fa5a6Sopenharmony_ci#include <linux/input.h>
24c29fa5a6Sopenharmony_ci
25c29fa5a6Sopenharmony_ci#include "nocopyable.h"
26c29fa5a6Sopenharmony_ci
27c29fa5a6Sopenharmony_ci#include "i_device.h"
28c29fa5a6Sopenharmony_ci#include "i_epoll_event_source.h"
29c29fa5a6Sopenharmony_ci
30c29fa5a6Sopenharmony_cinamespace OHOS {
31c29fa5a6Sopenharmony_cinamespace Msdp {
32c29fa5a6Sopenharmony_cinamespace DeviceStatus {
33c29fa5a6Sopenharmony_ciinline constexpr size_t BIT_PER_UINT8 { 8 };
34c29fa5a6Sopenharmony_ci
35c29fa5a6Sopenharmony_ciinline constexpr size_t NBYTES(size_t nbits)
36c29fa5a6Sopenharmony_ci{
37c29fa5a6Sopenharmony_ci    return (nbits + BIT_PER_UINT8 - 1) / BIT_PER_UINT8;
38c29fa5a6Sopenharmony_ci}
39c29fa5a6Sopenharmony_ci
40c29fa5a6Sopenharmony_ciinline constexpr size_t BYTE(size_t bit)
41c29fa5a6Sopenharmony_ci{
42c29fa5a6Sopenharmony_ci    return (bit / BIT_PER_UINT8);
43c29fa5a6Sopenharmony_ci}
44c29fa5a6Sopenharmony_ci
45c29fa5a6Sopenharmony_ciinline constexpr size_t OFFSET(size_t bit)
46c29fa5a6Sopenharmony_ci{
47c29fa5a6Sopenharmony_ci    return (bit % BIT_PER_UINT8);
48c29fa5a6Sopenharmony_ci}
49c29fa5a6Sopenharmony_ci
50c29fa5a6Sopenharmony_ciinline bool TestBit(size_t bit, const uint8_t *array)
51c29fa5a6Sopenharmony_ci{
52c29fa5a6Sopenharmony_ci    return ((array)[BYTE(bit)] & (1 << OFFSET(bit)));
53c29fa5a6Sopenharmony_ci}
54c29fa5a6Sopenharmony_ci
55c29fa5a6Sopenharmony_ciclass Device final : public IDevice,
56c29fa5a6Sopenharmony_ci                     public IEpollEventSource {
57c29fa5a6Sopenharmony_cipublic:
58c29fa5a6Sopenharmony_ci
59c29fa5a6Sopenharmony_ci    explicit Device(int32_t deviceId);
60c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(Device);
61c29fa5a6Sopenharmony_ci    ~Device();
62c29fa5a6Sopenharmony_ci
63c29fa5a6Sopenharmony_ci    int32_t Open() override;
64c29fa5a6Sopenharmony_ci    void Close() override;
65c29fa5a6Sopenharmony_ci    int32_t GetFd() const override;
66c29fa5a6Sopenharmony_ci    void Dispatch(const struct epoll_event &ev) override;
67c29fa5a6Sopenharmony_ci
68c29fa5a6Sopenharmony_ci    void SetId(int32_t id) override;
69c29fa5a6Sopenharmony_ci    void SetDevPath(const std::string &devPath) override;
70c29fa5a6Sopenharmony_ci    void SetSysPath(const std::string &sysPath) override;
71c29fa5a6Sopenharmony_ci    void SetName(const std::string &name) override;
72c29fa5a6Sopenharmony_ci    void SetBus(int32_t bus) override;
73c29fa5a6Sopenharmony_ci    void SetVersion(int32_t version) override;
74c29fa5a6Sopenharmony_ci    void SetProduct(int32_t product) override;
75c29fa5a6Sopenharmony_ci    void SetVendor(int32_t vendor) override;
76c29fa5a6Sopenharmony_ci    void SetPhys(const std::string &phys) override;
77c29fa5a6Sopenharmony_ci    void SetUniq(const std::string &uniq) override;
78c29fa5a6Sopenharmony_ci    void SetKeyboardType(KeyboardType keyboardType) override;
79c29fa5a6Sopenharmony_ci    void AddCapability(Capability capability) override;
80c29fa5a6Sopenharmony_ci
81c29fa5a6Sopenharmony_ci    int32_t GetId() const override;
82c29fa5a6Sopenharmony_ci    std::string GetDevPath() const override;
83c29fa5a6Sopenharmony_ci    std::string GetSysPath() const override;
84c29fa5a6Sopenharmony_ci    std::string GetName() const override;
85c29fa5a6Sopenharmony_ci    int32_t GetBus() const override;
86c29fa5a6Sopenharmony_ci    int32_t GetVersion() const override;
87c29fa5a6Sopenharmony_ci    int32_t GetProduct() const override;
88c29fa5a6Sopenharmony_ci    int32_t GetVendor() const override;
89c29fa5a6Sopenharmony_ci    std::string GetPhys() const override;
90c29fa5a6Sopenharmony_ci    std::string GetUniq() const override;
91c29fa5a6Sopenharmony_ci    IDevice::KeyboardType GetKeyboardType() const override;
92c29fa5a6Sopenharmony_ci    bool IsPointerDevice() const override;
93c29fa5a6Sopenharmony_ci    bool IsKeyboard() const override;
94c29fa5a6Sopenharmony_ci    bool IsRemote() const override;
95c29fa5a6Sopenharmony_ci
96c29fa5a6Sopenharmony_ci    bool HasAbs(size_t abs) const;
97c29fa5a6Sopenharmony_ci    bool HasKey(size_t key) const;
98c29fa5a6Sopenharmony_ci    bool HasRel(size_t rel) const;
99c29fa5a6Sopenharmony_ci    bool HasProperty(size_t property) const;
100c29fa5a6Sopenharmony_ci    bool HasCapability(Capability capability) const;
101c29fa5a6Sopenharmony_ci
102c29fa5a6Sopenharmony_ciprivate:
103c29fa5a6Sopenharmony_ci    void QueryDeviceInfo();
104c29fa5a6Sopenharmony_ci    void QuerySupportedEvents();
105c29fa5a6Sopenharmony_ci    void UpdateCapability();
106c29fa5a6Sopenharmony_ci    bool HasAbsCoord() const;
107c29fa5a6Sopenharmony_ci    bool HasMtCoord() const;
108c29fa5a6Sopenharmony_ci    bool HasRelCoord() const;
109c29fa5a6Sopenharmony_ci    bool HasAxesOrButton(size_t start, size_t end, const uint8_t* whichBitMask) const;
110c29fa5a6Sopenharmony_ci    bool HasJoystickAxesOrButtons() const;
111c29fa5a6Sopenharmony_ci    void CheckPointers();
112c29fa5a6Sopenharmony_ci    void CheckAbs();
113c29fa5a6Sopenharmony_ci    void CheckJoystick();
114c29fa5a6Sopenharmony_ci    void CheckMt();
115c29fa5a6Sopenharmony_ci    void CheckAdditional();
116c29fa5a6Sopenharmony_ci    void CheckPencilMouse();
117c29fa5a6Sopenharmony_ci    void CheckKeys();
118c29fa5a6Sopenharmony_ci    std::string MakeConfigFileName() const;
119c29fa5a6Sopenharmony_ci    int32_t ReadConfigFile(const std::string &filePath);
120c29fa5a6Sopenharmony_ci    int32_t ConfigItemSwitch(const std::string &configItem, const std::string &value);
121c29fa5a6Sopenharmony_ci    int32_t ReadTomlFile(const std::string &filePath);
122c29fa5a6Sopenharmony_ci    void JudgeKeyboardType();
123c29fa5a6Sopenharmony_ci    void LoadDeviceConfig();
124c29fa5a6Sopenharmony_ci    void PrintCapsDevice() const;
125c29fa5a6Sopenharmony_ci    void GetEventMask(const std::string &eventName, uint32_t type, std::size_t arrayLength,
126c29fa5a6Sopenharmony_ci        uint8_t *whichBitMask) const;
127c29fa5a6Sopenharmony_ci    void GetPropMask(const std::string &eventName, std::size_t arrayLength, uint8_t *whichBitMask) const;
128c29fa5a6Sopenharmony_ci
129c29fa5a6Sopenharmony_ci    int32_t fd_ { -1 };
130c29fa5a6Sopenharmony_ci    int32_t deviceId_ { -1 };
131c29fa5a6Sopenharmony_ci    int32_t bus_ { 0 };
132c29fa5a6Sopenharmony_ci    int32_t version_ { 0 };
133c29fa5a6Sopenharmony_ci    int32_t product_ { 0 };
134c29fa5a6Sopenharmony_ci    int32_t vendor_ { 0 };
135c29fa5a6Sopenharmony_ci    std::string devPath_;
136c29fa5a6Sopenharmony_ci    std::string sysPath_;
137c29fa5a6Sopenharmony_ci    std::string dhid_;
138c29fa5a6Sopenharmony_ci    std::string name_;
139c29fa5a6Sopenharmony_ci    std::string phys_;
140c29fa5a6Sopenharmony_ci    std::string uniq_;
141c29fa5a6Sopenharmony_ci    std::string networkId_;
142c29fa5a6Sopenharmony_ci    std::bitset<DEVICE_CAP_MAX> caps_;
143c29fa5a6Sopenharmony_ci    uint8_t evBitmask_[NBYTES(EV_MAX)] {};
144c29fa5a6Sopenharmony_ci    uint8_t keyBitmask_[NBYTES(KEY_MAX)] {};
145c29fa5a6Sopenharmony_ci    uint8_t absBitmask_[NBYTES(ABS_MAX)] {};
146c29fa5a6Sopenharmony_ci    uint8_t relBitmask_[NBYTES(REL_MAX)] {};
147c29fa5a6Sopenharmony_ci    uint8_t propBitmask_[NBYTES(INPUT_PROP_MAX)] {};
148c29fa5a6Sopenharmony_ci    IDevice::KeyboardType keyboardType_ { IDevice::KEYBOARD_TYPE_NONE };
149c29fa5a6Sopenharmony_ci};
150c29fa5a6Sopenharmony_ci
151c29fa5a6Sopenharmony_ciinline int32_t Device::GetFd() const
152c29fa5a6Sopenharmony_ci{
153c29fa5a6Sopenharmony_ci    return fd_;
154c29fa5a6Sopenharmony_ci}
155c29fa5a6Sopenharmony_ci
156c29fa5a6Sopenharmony_ciinline void Device::SetId(int32_t id)
157c29fa5a6Sopenharmony_ci{
158c29fa5a6Sopenharmony_ci    deviceId_ = id;
159c29fa5a6Sopenharmony_ci}
160c29fa5a6Sopenharmony_ci
161c29fa5a6Sopenharmony_ciinline void Device::SetDevPath(const std::string &devPath)
162c29fa5a6Sopenharmony_ci{
163c29fa5a6Sopenharmony_ci    devPath_ = devPath;
164c29fa5a6Sopenharmony_ci}
165c29fa5a6Sopenharmony_ci
166c29fa5a6Sopenharmony_ciinline void Device::SetSysPath(const std::string &sysPath)
167c29fa5a6Sopenharmony_ci{
168c29fa5a6Sopenharmony_ci    sysPath_ = sysPath;
169c29fa5a6Sopenharmony_ci}
170c29fa5a6Sopenharmony_ci
171c29fa5a6Sopenharmony_ciinline void Device::SetName(const std::string &name)
172c29fa5a6Sopenharmony_ci{
173c29fa5a6Sopenharmony_ci    name_ = name;
174c29fa5a6Sopenharmony_ci}
175c29fa5a6Sopenharmony_ci
176c29fa5a6Sopenharmony_ciinline void Device::SetBus(int32_t bus)
177c29fa5a6Sopenharmony_ci{
178c29fa5a6Sopenharmony_ci    bus_ = bus;
179c29fa5a6Sopenharmony_ci}
180c29fa5a6Sopenharmony_ci
181c29fa5a6Sopenharmony_ciinline void Device::SetVersion(int32_t version)
182c29fa5a6Sopenharmony_ci{
183c29fa5a6Sopenharmony_ci    version_ = version;
184c29fa5a6Sopenharmony_ci}
185c29fa5a6Sopenharmony_ci
186c29fa5a6Sopenharmony_ciinline void Device::SetProduct(int32_t product)
187c29fa5a6Sopenharmony_ci{
188c29fa5a6Sopenharmony_ci    product_ = product;
189c29fa5a6Sopenharmony_ci}
190c29fa5a6Sopenharmony_ci
191c29fa5a6Sopenharmony_ciinline void Device::SetVendor(int32_t vendor)
192c29fa5a6Sopenharmony_ci{
193c29fa5a6Sopenharmony_ci    vendor_ = vendor;
194c29fa5a6Sopenharmony_ci}
195c29fa5a6Sopenharmony_ci
196c29fa5a6Sopenharmony_ciinline void Device::SetPhys(const std::string &phys)
197c29fa5a6Sopenharmony_ci{
198c29fa5a6Sopenharmony_ci    phys_ = phys;
199c29fa5a6Sopenharmony_ci}
200c29fa5a6Sopenharmony_ci
201c29fa5a6Sopenharmony_ciinline void Device::SetUniq(const std::string &uniq)
202c29fa5a6Sopenharmony_ci{
203c29fa5a6Sopenharmony_ci    uniq_ = uniq;
204c29fa5a6Sopenharmony_ci}
205c29fa5a6Sopenharmony_ci
206c29fa5a6Sopenharmony_ciinline void Device::SetKeyboardType(KeyboardType type)
207c29fa5a6Sopenharmony_ci{
208c29fa5a6Sopenharmony_ci    if (type >= KEYBOARD_TYPE_NONE && type < KEYBOARD_TYPE_MAX) {
209c29fa5a6Sopenharmony_ci        keyboardType_ = type;
210c29fa5a6Sopenharmony_ci    }
211c29fa5a6Sopenharmony_ci}
212c29fa5a6Sopenharmony_ci
213c29fa5a6Sopenharmony_ciinline void Device::AddCapability(Capability capability)
214c29fa5a6Sopenharmony_ci{
215c29fa5a6Sopenharmony_ci    if (capability >= DEVICE_CAP_KEYBOARD && capability < DEVICE_CAP_MAX) {
216c29fa5a6Sopenharmony_ci        caps_.set(capability);
217c29fa5a6Sopenharmony_ci    }
218c29fa5a6Sopenharmony_ci}
219c29fa5a6Sopenharmony_ci
220c29fa5a6Sopenharmony_ciinline int32_t Device::GetId() const
221c29fa5a6Sopenharmony_ci{
222c29fa5a6Sopenharmony_ci    return deviceId_;
223c29fa5a6Sopenharmony_ci}
224c29fa5a6Sopenharmony_ci
225c29fa5a6Sopenharmony_ciinline std::string Device::GetDevPath() const
226c29fa5a6Sopenharmony_ci{
227c29fa5a6Sopenharmony_ci    return devPath_;
228c29fa5a6Sopenharmony_ci}
229c29fa5a6Sopenharmony_ci
230c29fa5a6Sopenharmony_ciinline std::string Device::GetSysPath() const
231c29fa5a6Sopenharmony_ci{
232c29fa5a6Sopenharmony_ci    return sysPath_;
233c29fa5a6Sopenharmony_ci}
234c29fa5a6Sopenharmony_ci
235c29fa5a6Sopenharmony_ciinline std::string Device::GetName() const
236c29fa5a6Sopenharmony_ci{
237c29fa5a6Sopenharmony_ci    return name_;
238c29fa5a6Sopenharmony_ci}
239c29fa5a6Sopenharmony_ci
240c29fa5a6Sopenharmony_ciinline int32_t Device::GetBus() const
241c29fa5a6Sopenharmony_ci{
242c29fa5a6Sopenharmony_ci    return bus_;
243c29fa5a6Sopenharmony_ci}
244c29fa5a6Sopenharmony_ci
245c29fa5a6Sopenharmony_ciinline int32_t Device::GetVersion() const
246c29fa5a6Sopenharmony_ci{
247c29fa5a6Sopenharmony_ci    return version_;
248c29fa5a6Sopenharmony_ci}
249c29fa5a6Sopenharmony_ci
250c29fa5a6Sopenharmony_ciinline int32_t Device::GetProduct() const
251c29fa5a6Sopenharmony_ci{
252c29fa5a6Sopenharmony_ci    return product_;
253c29fa5a6Sopenharmony_ci}
254c29fa5a6Sopenharmony_ci
255c29fa5a6Sopenharmony_ciinline int32_t Device::GetVendor() const
256c29fa5a6Sopenharmony_ci{
257c29fa5a6Sopenharmony_ci    return vendor_;
258c29fa5a6Sopenharmony_ci}
259c29fa5a6Sopenharmony_ci
260c29fa5a6Sopenharmony_ciinline std::string Device::GetPhys() const
261c29fa5a6Sopenharmony_ci{
262c29fa5a6Sopenharmony_ci    return phys_;
263c29fa5a6Sopenharmony_ci}
264c29fa5a6Sopenharmony_ci
265c29fa5a6Sopenharmony_ciinline std::string Device::GetUniq() const
266c29fa5a6Sopenharmony_ci{
267c29fa5a6Sopenharmony_ci    return uniq_;
268c29fa5a6Sopenharmony_ci}
269c29fa5a6Sopenharmony_ci
270c29fa5a6Sopenharmony_ciinline IDevice::KeyboardType Device::GetKeyboardType() const
271c29fa5a6Sopenharmony_ci{
272c29fa5a6Sopenharmony_ci    return keyboardType_;
273c29fa5a6Sopenharmony_ci}
274c29fa5a6Sopenharmony_ci
275c29fa5a6Sopenharmony_ciinline bool Device::IsPointerDevice() const
276c29fa5a6Sopenharmony_ci{
277c29fa5a6Sopenharmony_ci    return caps_.test(DEVICE_CAP_POINTER);
278c29fa5a6Sopenharmony_ci}
279c29fa5a6Sopenharmony_ci
280c29fa5a6Sopenharmony_ciinline bool Device::IsKeyboard() const
281c29fa5a6Sopenharmony_ci{
282c29fa5a6Sopenharmony_ci    return caps_.test(DEVICE_CAP_KEYBOARD);
283c29fa5a6Sopenharmony_ci}
284c29fa5a6Sopenharmony_ci
285c29fa5a6Sopenharmony_ciinline bool Device::IsRemote() const
286c29fa5a6Sopenharmony_ci{
287c29fa5a6Sopenharmony_ci    return GetName().find("DistributedInput ") != std::string::npos;
288c29fa5a6Sopenharmony_ci}
289c29fa5a6Sopenharmony_ci
290c29fa5a6Sopenharmony_ciinline bool Device::HasAbs(size_t abs) const
291c29fa5a6Sopenharmony_ci{
292c29fa5a6Sopenharmony_ci    return TestBit(abs, absBitmask_);
293c29fa5a6Sopenharmony_ci}
294c29fa5a6Sopenharmony_ci
295c29fa5a6Sopenharmony_ciinline bool Device::HasRel(size_t rel) const
296c29fa5a6Sopenharmony_ci{
297c29fa5a6Sopenharmony_ci    return TestBit(rel, relBitmask_);
298c29fa5a6Sopenharmony_ci}
299c29fa5a6Sopenharmony_ci
300c29fa5a6Sopenharmony_ciinline bool Device::HasKey(size_t key) const
301c29fa5a6Sopenharmony_ci{
302c29fa5a6Sopenharmony_ci    return TestBit(key, keyBitmask_);
303c29fa5a6Sopenharmony_ci}
304c29fa5a6Sopenharmony_ci
305c29fa5a6Sopenharmony_ciinline bool Device::HasProperty(size_t property) const
306c29fa5a6Sopenharmony_ci{
307c29fa5a6Sopenharmony_ci    return TestBit(property, propBitmask_);
308c29fa5a6Sopenharmony_ci}
309c29fa5a6Sopenharmony_ci
310c29fa5a6Sopenharmony_ciinline bool Device::HasCapability(Capability capability) const
311c29fa5a6Sopenharmony_ci{
312c29fa5a6Sopenharmony_ci    return caps_.test(capability);
313c29fa5a6Sopenharmony_ci}
314c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
315c29fa5a6Sopenharmony_ci} // namespace Msdp
316c29fa5a6Sopenharmony_ci} // namespace OHOS
317c29fa5a6Sopenharmony_ci#endif // DEVICE_H