15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2008 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef _LIBINPUT_KEY_LAYOUT_MAP_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_KEY_LAYOUT_MAP_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <stdint.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/KeyedVector.h>
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Tokenizer.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/RefBase.h>
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct AxisInfo {
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    enum Mode {
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Axis value is reported directly.
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MODE_NORMAL = 0,
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Axis value should be inverted before reporting.
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MODE_INVERT = 1,
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Axis value should be split into two axes
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MODE_SPLIT = 2,
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Axis mode.
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Mode mode;
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Axis id.
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // When split, this is the axis used for values smaller than the split position.
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t axis;
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // When split, this is the axis used for values after higher than the split position.
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t highAxis;
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The split value, or 0 if not split.
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t splitValue;
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The flat value, or -1 if none.
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t flatOverride;
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AxisInfo() : mode(MODE_NORMAL), axis(-1), highAxis(-1), splitValue(0), flatOverride(-1) {
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Describes a mapping from keyboard scan codes and joystick axes to Android key codes and axes.
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * This object is immutable after it has been loaded.
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyLayoutMap : public RefBase {
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static status_t load(const String8& filename, sp<KeyLayoutMap>* outMap);
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t mapKey(int32_t scanCode, int32_t usageCode,
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t* outKeyCode, uint32_t* outFlags) const;
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t findScanCodesForKey(int32_t keyCode, Vector<int32_t>* outScanCodes) const;
7074bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    status_t findScanCodeForLed(int32_t ledCode, int32_t* outScanCode) const;
7174bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    status_t findUsageCodeForLed(int32_t ledCode, int32_t* outUsageCode) const;
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t mapAxis(int32_t scanCode, AxisInfo* outAxisInfo) const;
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~KeyLayoutMap();
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    struct Key {
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t keyCode;
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        uint32_t flags;
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
8474bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    struct Led {
8574bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright        int32_t ledCode;
8674bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    };
8774bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright
8874bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, Key> mKeysByScanCode;
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, Key> mKeysByUsageCode;
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, AxisInfo> mAxes;
9274bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    KeyedVector<int32_t, Led> mLedsByScanCode;
9374bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright    KeyedVector<int32_t, Led> mLedsByUsageCode;
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyLayoutMap();
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const Key* getKey(int32_t scanCode, int32_t usageCode) const;
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    class Parser {
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KeyLayoutMap* mMap;
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Tokenizer* mTokenizer;
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    public:
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Parser(KeyLayoutMap* map, Tokenizer* tokenizer);
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ~Parser();
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parse();
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    private:
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseKey();
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseAxis();
11174bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright        status_t parseLed();
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_KEY_LAYOUT_MAP_H
118