From 925096a69825779768dbbbea5f194e3054e59d4a Mon Sep 17 00:00:00 2001 From: lurenaud Date: Mon, 25 May 2026 17:59:30 +0200 Subject: [PATCH] Add KeyMapper database generation script and sqlite database, and update .gitignore --- .gitignore | 5 ++ key_map_database | Bin 0 -> 94208 bytes populate_db.py | 133 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 key_map_database create mode 100644 populate_db.py diff --git a/.gitignore b/.gitignore index b988b88..1701d31 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,8 @@ compile_commands.json Kicad/PCB_AndroidAuto-backups/ *.lck +# Local tooling & screen captures +platform-tools/ +screen.png + + diff --git a/key_map_database b/key_map_database new file mode 100644 index 0000000000000000000000000000000000000000..374c9adcbad692626d720ba9bf87a5b410e3af83 GIT binary patch literal 94208 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 ZYQCRNitf>(q?R1ddn&dy>p0$!{|~AkE|CBL literal 0 HcmV?d00001 diff --git a/populate_db.py b/populate_db.py new file mode 100644 index 0000000..0e68dcd --- /dev/null +++ b/populate_db.py @@ -0,0 +1,133 @@ +import sqlite3 +import json +import uuid + +def generate_uuid(): + return str(uuid.uuid4()) + +# Configuration for the mappings +device_id = "75bae499fc7060c40ae424563b660e5122e33c7b" +device_name = "2.4G Mouse " + +mappings = [ + # 1. UP + { + "trigger_keyCode": 19, + "trigger_scanCode": 103, + "action_type": "KEY_EVENT", + "action_data": "19", # KEYCODE_DPAD_UP + "action_flags": 4 # Repeat until released + }, + # 2. DOWN + { + "trigger_keyCode": 20, + "trigger_scanCode": 108, + "action_type": "KEY_EVENT", + "action_data": "20", # KEYCODE_DPAD_DOWN + "action_flags": 4 + }, + # 3. LEFT + { + "trigger_keyCode": 21, + "trigger_scanCode": 105, + "action_type": "KEY_EVENT", + "action_data": "21", # KEYCODE_DPAD_LEFT + "action_flags": 4 + }, + # 4. RIGHT + { + "trigger_keyCode": 22, + "trigger_scanCode": 106, + "action_type": "KEY_EVENT", + "action_data": "22", # KEYCODE_DPAD_RIGHT + "action_flags": 4 + }, + # 5. ENTER (Select) + { + "trigger_keyCode": 66, + "trigger_scanCode": 352, + "action_type": "KEY_EVENT", + "action_data": "23", # KEYCODE_DPAD_CENTER + "action_flags": 0 + }, + # 6. BACK + { + "trigger_keyCode": 4, + "trigger_scanCode": 174, + "action_type": "KEY_EVENT", + "action_data": "4", # KEYCODE_BACK + "action_flags": 0 + }, + # 7. Volume Up (Shutdown) + { + "trigger_keyCode": 24, + "trigger_scanCode": 115, + "action_type": "SHELL_COMMAND", + "action_data": "cmVib290IC1w", # base64 for 'reboot -p' + "action_flags": 0, + "shell_description": "Shutdown", + "shell_timeout": "10000" + } +] + +conn = sqlite3.connect('key_map_database') +cursor = conn.cursor() + +# Clear existing keymaps +cursor.execute("DELETE FROM keymaps;") + +for m in mappings: + key_uid = generate_uuid() + trigger_json = { + "extras": [], + "flags": 0, + "keys": [ + { + "clickType": 0, + "deviceId": device_id, + "deviceName": device_name, + "flags": 0, + "keyCode": m["trigger_keyCode"], + "scanCode": m["trigger_scanCode"], + "uid": key_uid + } + ], + "mode": 2 + } + + action_uid = generate_uuid() + action_item = { + "data": m["action_data"], + "extras": [], + "flags": m["action_flags"], + "type": m["action_type"], + "uid": action_uid + } + + if m["action_type"] == "SHELL_COMMAND": + action_item["extras"] = [ + {"data": m["shell_description"], "id": "extra_shell_command_description"}, + {"data": m["shell_timeout"], "id": "extra_shell_command_timeout"} + ] + + action_list_json = [action_item] + + row_uid = generate_uuid() + + cursor.execute(""" + INSERT INTO keymaps (trigger, action_list, constraint_list, constraint_mode, flags, is_enabled, uid, group_uid) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, ( + json.dumps(trigger_json), + json.dumps(action_list_json), + "[]", + 1, + 0, + 1, + row_uid, + None + )) + +conn.commit() +conn.close() +print("Successfully populated key_map_database!")