1864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn/* 2864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * Copyright (C) 2015 The Android Open Source Project 3864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * 4864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); 5864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * you may not use this file except in compliance with the License. 6864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * You may obtain a copy of the License at 7864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * 8864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0 9864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * 10864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * Unless required by applicable law or agreed to in writing, software 11864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * distributed under the License is distributed on an "AS IS" BASIS, 12864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * See the License for the specific language governing permissions and 14864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn * limitations under the License. 15864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn */ 16864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 17864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#define LOG_TAG "MouseInputMapper" 18864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn//#define LOG_NDEBUG 0 19864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 20864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include "MouseInputMapper.h" 21864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 22864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include <linux/input.h> 23864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include <hardware/input.h> 24864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include <utils/Log.h> 25864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include <utils/misc.h> 26864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 27864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include "InputHost.h" 28864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn#include "InputHub.h" 29864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 30864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 31864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournnamespace android { 32864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 33864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn// Map scancodes to input HAL usages. 34864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn// The order of these definitions MUST remain in sync with the order they are 35864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn// defined in linux/input.h. 36864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournstatic struct { 37864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn int32_t scancode; 38864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn InputUsage usage; 39864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} codeMap[] = { 40864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_LEFT, INPUT_USAGE_BUTTON_PRIMARY}, 41864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_RIGHT, INPUT_USAGE_BUTTON_SECONDARY}, 42864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_MIDDLE, INPUT_USAGE_BUTTON_TERTIARY}, 43864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_SIDE, INPUT_USAGE_BUTTON_UNKNOWN}, 44864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_EXTRA, INPUT_USAGE_BUTTON_UNKNOWN}, 45864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_FORWARD, INPUT_USAGE_BUTTON_FORWARD}, 46864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_BACK, INPUT_USAGE_BUTTON_BACK}, 47864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn {BTN_TASK, INPUT_USAGE_BUTTON_UNKNOWN}, 48864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn}; 49864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 50864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 51864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournbool MouseInputMapper::configureInputReport(InputDeviceNode* devNode, 52864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn InputReportDefinition* report) { 53864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn setInputReportDefinition(report); 54864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->addCollection(INPUT_COLLECTION_ID_MOUSE, 1); 55864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 56864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Configure mouse axes 57864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (!devNode->hasRelativeAxis(REL_X) || !devNode->hasRelativeAxis(REL_Y)) { 58864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn ALOGE("Device %s is missing a relative x or y axis. Device cannot be configured.", 59864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn devNode->getPath().c_str()); 60864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn return false; 61864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 62864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->declareUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_X, 63864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn INT32_MIN, INT32_MAX, 1.0f); 64864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->declareUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_Y, 65864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn INT32_MIN, INT32_MAX, 1.0f); 66864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (devNode->hasRelativeAxis(REL_WHEEL)) { 67864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->declareUsage(INPUT_COLLECTION_ID_MOUSE, 68864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn INPUT_USAGE_AXIS_VSCROLL, -1, 1, 0.0f); 69864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 70864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (devNode->hasRelativeAxis(REL_HWHEEL)) { 71864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->declareUsage(INPUT_COLLECTION_ID_MOUSE, 72864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn INPUT_USAGE_AXIS_HSCROLL, -1, 1, 0.0f); 73864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 74864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 75864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Configure mouse buttons 76864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn InputUsage usages[NELEM(codeMap)]; 77864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn int numUsages = 0; 78864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn for (int32_t i = 0; i < NELEM(codeMap); ++i) { 79864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (devNode->hasKey(codeMap[i].scancode)) { 80864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn usages[numUsages++] = codeMap[i].usage; 81864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 82864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 83864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (numUsages == 0) { 84864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn ALOGW("MouseInputMapper found no buttons for %s", devNode->getPath().c_str()); 85864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 86864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReportDefinition()->declareUsages(INPUT_COLLECTION_ID_MOUSE, usages, numUsages); 87864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn return true; 88864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 89864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 90864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournvoid MouseInputMapper::process(const InputEvent& event) { 91fdd4d81ca191ae6096e94be1bf98975d17766b1aMichael Wright ALOGV("processing mouse event. type=%d code=%d value=%d", 92864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn event.type, event.code, event.value); 93864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn switch (event.type) { 94864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case EV_KEY: 95864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn processButton(event.code, event.value); 96864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 97864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case EV_REL: 98864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn processMotion(event.code, event.value); 99864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 100864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case EV_SYN: 101864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (event.code == SYN_REPORT) { 102864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn sync(event.when); 103864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 104864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 105864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn default: 106fdd4d81ca191ae6096e94be1bf98975d17766b1aMichael Wright ALOGV("unknown mouse event type: %d", event.type); 107864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 108864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 109864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 110864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournvoid MouseInputMapper::processMotion(int32_t code, int32_t value) { 111864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn switch (code) { 112864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case REL_X: 113864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelX = value; 114864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 115864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case REL_Y: 116864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelY = value; 117864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 118864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case REL_WHEEL: 119864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelWheel = value; 120864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 121864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn case REL_HWHEEL: 122864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelHWheel = value; 123864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 124864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn default: 125864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Unknown code. Ignore. 126864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn break; 127864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 128864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 129864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 130864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn// Map evdev button codes to bit indices. This function assumes code >= 131864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn// BTN_MOUSE. 132864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournuint32_t buttonToBit(int32_t code) { 133864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn return static_cast<uint32_t>(code - BTN_MOUSE); 134864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 135864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 136864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournvoid MouseInputMapper::processButton(int32_t code, int32_t value) { 137864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Mouse buttons start at BTN_MOUSE and end before BTN_JOYSTICK. There isn't 138864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // really enough room after the mouse buttons for another button class, so 139864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // the risk of a button type being inserted after mouse is low. 140864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (code >= BTN_MOUSE && code < BTN_JOYSTICK) { 141864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (value) { 142864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mButtonValues.markBit(buttonToBit(code)); 143864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } else { 144864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mButtonValues.clearBit(buttonToBit(code)); 145864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 146864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mUpdatedButtonMask.markBit(buttonToBit(code)); 147864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 148864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 149864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 150864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbournvoid MouseInputMapper::sync(nsecs_t when) { 151864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Process updated button states. 152864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn while (!mUpdatedButtonMask.isEmpty()) { 153864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn auto bit = mUpdatedButtonMask.clearFirstMarkedBit(); 154864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->setBoolUsage(INPUT_COLLECTION_ID_MOUSE, codeMap[bit].usage, 155864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mButtonValues.hasBit(bit), 0); 156864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 157864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 158864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Process motion and scroll changes. 159864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (mRelX != 0) { 160864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->setIntUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_X, mRelX, 0); 161864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 162864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (mRelY != 0) { 163864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->setIntUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_Y, mRelY, 0); 164864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 165864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (mRelWheel != 0) { 166864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->setIntUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_VSCROLL, 167864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelWheel, 0); 168864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 169864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn if (mRelHWheel != 0) { 170864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->setIntUsage(INPUT_COLLECTION_ID_MOUSE, INPUT_USAGE_AXIS_HSCROLL, 171864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelHWheel, 0); 172864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn } 173864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 174864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn // Report and reset. 175864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn getInputReport()->reportEvent(getDeviceHandle()); 176864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mUpdatedButtonMask.clear(); 177864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mButtonValues.clear(); 178864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelX = 0; 179864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelY = 0; 180864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelWheel = 0; 181864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn mRelHWheel = 0; 182864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} 183864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn 184864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn} // namespace android 185