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