換)
固件嵌入式智能硬件藍(lán)牙【免費(fèi)下載鏈接】zmkZMK Firmware Repository項(xiàng)目地址https://gitcode.com/gh_mirrors/zm/zmk點(diǎn)擊查看免費(fèi)下載導(dǎo)讀Code Mapper代碼映射是 ZMK 固件中一類輸入處理器input processor它能把輸入事件的事件碼code改寫成另一個(gè)事件碼例如把垂直方向的 Y 移動(dòng)事件改寫成滾輪滾動(dòng)事件或把 X/Y 移動(dòng)方向互換。本文基于官方文檔 code-mapper.md 展開并結(jié)合 ZMK 倉(cāng)庫中的驅(qū)動(dòng)實(shí)現(xiàn)input_processor_code_mapper.c、設(shè)備樹綁定zmk,input-processor-code-mapper.yaml與測(cè)試用例完整講解其用法、兩個(gè)預(yù)定義實(shí)例、用戶自定義實(shí)例的配置方法以及底層工作原理。讀完本文你將掌握如何把指針設(shè)備的移動(dòng)事件映射為滾輪事件、交換 X/Y 軸以及為任意事件碼編寫自定義映射。背景什么是輸入處理器在 ZMK 中輸入處理器是一類負(fù)責(zé)處理并可選修改指針事件的小功能單元事件既可以來自物理指針設(shè)備如軌跡球、觸控板也可以來自軟件模擬的指針設(shè)備。處理器可以完成諸如縮放移動(dòng)量、把移動(dòng)事件改寫成滾動(dòng)事件、在指針使用時(shí)臨時(shí)啟用某一層等功能詳見 輸入處理器概覽。輸入處理器通過輸入監(jiān)聽器input listener掛載到指定指針設(shè)備上處理器按input-processors屬性中聲明的順序依次處理事件還可以通過子節(jié)點(diǎn)為特定層配置覆蓋規(guī)則詳見 輸入處理器使用說明。Code Mapper 是什么Code Mapper 輸入處理器的作用是把事件的**事件碼code**映射為一個(gè)新的事件碼。典型場(chǎng)景如把垂直的 Y 移動(dòng)事件INPUT_REL_Y改寫成滾輪事件INPUT_REL_WHEEL從而讓軌跡板或軌跡球在某個(gè)層上變成一個(gè)滾動(dòng)設(shè)備。需要注意它與 Transformer 的區(qū)別Code Mapper 只做事件碼的一對(duì)一改寫不改動(dòng)事件的值value。Transformer 則對(duì)匹配類型的事件值做變換如取反、交換 X/Y 軸不改寫事件碼。二者都可以實(shí)現(xiàn) X/Y 互換但方式不同Code Mapper 把 X 碼映射成 Y 碼、Y 碼映射成 X 碼Transformer 則交換事件值的含義。官方文檔明確提示交換 X 和 Y 移動(dòng)也可以使用 transformer 處理器完成你可以根據(jù)實(shí)際需求選擇。用法零參數(shù)處理器Code Mapper 在使用時(shí)不接收任何參數(shù)因?yàn)榫唧w的代碼映射關(guān)系已經(jīng)固化在處理器實(shí)例的定義中。在input-processors屬性中直接引用實(shí)例即可zip_xy_to_scroll_mapper配合輸入監(jiān)聽器使用時(shí)例如為trackpad設(shè)備的監(jiān)聽器掛載#include input/processors.dtsi trackpad_listener { input-processors zip_xy_to_scroll_mapper; }處理器鏈?zhǔn)教幚頃r(shí)#input-processor-cells必須為0因此在引用處不能再附加param1、param2之類的參數(shù)。從驅(qū)動(dòng) APIinput_processor.h看handle_event回調(diào)接收的param1、param2會(huì)從設(shè)備樹input-processors引用處解析零參數(shù)實(shí)例的這兩個(gè)值恒為 0。預(yù)定義實(shí)例倉(cāng)庫在 code_mapper.dtsi 中提供了兩個(gè)預(yù)定義實(shí)例只需在 keymap/overlay 頂部#include input/processors.dtsi即可引用該頭文件內(nèi)部會(huì)包含input/processors/code_mapper.dtsi見 processors.dtsi。引用說明zip_xy_to_scroll_mapper把 X/Y 移動(dòng)事件分別映射為水平滾輪/滾輪事件zip_xy_swap_mapper把 X 映射為 Y、Y 映射為 X實(shí)現(xiàn)移動(dòng)軸互換zip_xy_to_scroll_mapper的實(shí)際定義源碼 code_mapper.dtsi/omit-if-no-ref/ zip_xy_to_scroll_mapper: zip_xy_to_scroll_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_REL; map INPUT_REL_Y INPUT_REL_WHEEL , INPUT_REL_X INPUT_REL_HWHEEL ; };zip_xy_swap_mapper的實(shí)際定義源碼 code_mapper.dtsi/omit-if-no-ref/ zip_xy_swap_mapper: zip_xy_swap_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_REL; map INPUT_REL_Y INPUT_REL_X , INPUT_REL_X INPUT_REL_Y ; };/omit-if-no-ref/標(biāo)記保證只有當(dāng)你的 keymap 真正引用了這些節(jié)點(diǎn)時(shí)它們才會(huì)被編入固件從而避免無謂的固件體積增加。用戶自定義實(shí)例官方文檔允許用戶針對(duì)不同的事件碼定義新的 Code Mapper 實(shí)例。下面這個(gè)示例把鼠標(biāo)左鍵映射為鼠標(biāo)中鍵#include zephyr/dt-bindings/input/input-event-codes.h / { input_processors { zip_click_to_middle_click_mapper: zip_click_to_middle_click_mapper { compatible zmk,input-processor-code-mapper; #input-processor-cells 0; type INPUT_EV_KEY; map INPUT_BTN_0 INPUT_BTN_2; }; }; }CompatibleCode Mapper 輸入處理器使用compatible屬性值z(mì)mk,input-processor-code-mapper這一點(diǎn)與綁定文件 zmk,input-processor-code-mapper.yaml 中的聲明一致。標(biāo)準(zhǔn)屬性#input-processor-cells— 必須為常量值0表示該處理器在引用處不攜帶任何附加參數(shù)見 ip_zero_param.yaml。用戶屬性type— 要處理的事件類型。通常相對(duì)移動(dòng)事件用INPUT_EV_REL按鍵/按鈕事件用INPUT_EV_KEY。事件類型與事件碼的完整取值可參考 Zephyr 的input-event-codes.hINPUT_EV_REL與INPUT_EV_KEY等類型定義在 input-event-codes.h 所依賴的 Zephyr 頭文件include/zephyr/dt-bindings/input/input-event-codes.h中。map— 給定類型下的具體事件碼映射對(duì)列表例如相對(duì)事件碼INPUT_REL_X、INPUT_REL_Y、INPUT_REL_WHEEL、INPUT_REL_HWHEEL等或按鍵事件碼INPUT_BTN_0、INPUT_BTN_2等。該列表?xiàng)l目數(shù)必須是偶數(shù)按每?jī)蓚€(gè)一組解析為映射對(duì)每對(duì)的第一個(gè)碼是源事件碼source code第二個(gè)碼是映射目標(biāo)事件碼。type與map在綁定文件中均標(biāo)記為required: true即自定義實(shí)例必須同時(shí)提供這兩個(gè)屬性缺一不可。底層實(shí)現(xiàn)原理驅(qū)動(dòng)入口與事件處理Code Mapper 驅(qū)動(dòng)位于 input_processor_code_mapper.c通過DT_DRV_COMPAT zmk_input_processor_code_mapper綁定到設(shè)備樹節(jié)點(diǎn)。其核心處理邏輯cm_handle_event大致如下類型過濾若事件類型不等于配置的type直接返回ZMK_INPUT_PROC_CONTINUE將事件原樣交給鏈中下一個(gè)處理器。碼查找與改寫在mapping數(shù)組中按步長(zhǎng) 2 遍歷當(dāng)某個(gè)偶數(shù)下標(biāo)元素等于事件碼時(shí)將event-code改寫為緊隨其后的映射目標(biāo)碼并記錄調(diào)試日志Remapped %d to %d。繼續(xù)傳遞無論是否發(fā)生映射均返回ZMK_INPUT_PROC_CONTINUE保證后續(xù)處理器如縮放、行為觸發(fā)仍能正常處理該事件。值得注意的實(shí)現(xiàn)細(xì)節(jié)源碼用DT_INST_PROP_OR(n, type, INPUT_EV_REL)讀取type未指定時(shí)默認(rèn)INPUT_EV_REL用DT_INST_PROP_LEN(n, map)讀取映射條目總數(shù)并通過BUILD_ASSERT(DT_INST_PROP_LEN(n, map) % 2 0, ...)在編譯期強(qiáng)制校驗(yàn)map必須為偶數(shù)條目——這正是文檔中該列表?xiàng)l目數(shù)必須是偶數(shù)的底層保障。事件在處理器鏈中的流轉(zhuǎn)輸入監(jiān)聽器input_listener.c在收到事件后會(huì)調(diào)用zmk_input_processor_handle_event()把事件按input-processors屬性聲明的順序依次交給每個(gè)處理器見apply_config中的循環(huán)與 input_processor.h 中的驅(qū)動(dòng) API 定義。處理器返回ZMK_INPUT_PROC_CONTINUE時(shí)繼續(xù)鏈?zhǔn)絺鬟f返回ZMK_INPUT_PROC_STOP時(shí)終止處理并丟棄該事件。Code Mapper 屬于只改寫、不攔截型處理器因此非常適合與縮放、變換等其他處理器自由組合。Kconfig 開關(guān)Code Mapper 由 Kconfig 選項(xiàng)ZMK_INPUT_PROCESSOR_CODE_MAPPER控制默認(rèn)開啟且僅當(dāng)設(shè)備樹中存在啟用的zmk,input-processor-code-mapper節(jié)點(diǎn)時(shí)才會(huì)生效見 pointing/Kconfig源碼文件也僅在開啟該選項(xiàng)時(shí)才參與編譯見 pointing/CMakeLists.txt。測(cè)試用例驗(yàn)證倉(cāng)庫的自動(dòng)化測(cè)試直接驗(yàn)證了zip_xy_swap_mapper的行為。move_diagonal_xy_swap 測(cè)試在mmv_input_listener上掛載了input-processors zip_xy_swap_mapper隨后通過 mock 鍵盤掃描注入左上方向的對(duì)角移動(dòng)事件并與預(yù)期的快照結(jié)果比對(duì)。該測(cè)試與move_diagonal、move_diagonal_xy_invert等用例共同構(gòu)成對(duì)移動(dòng)事件處理含映射/變換的回歸保障可作為你驗(yàn)證自定義映射配置的參考模板。實(shí)戰(zhàn)建議讓軌跡設(shè)備變滾輪把zip_xy_to_scroll_mapper掛到監(jiān)聽器上或僅在某層啟用即可把 X/Y 移動(dòng)映射為水平/垂直滾輪滾動(dòng)。豎握/橫握軌跡球適配當(dāng)物理設(shè)備的安裝方向與邏輯坐標(biāo)不一致時(shí)使用zip_xy_swap_mapper交換 X/Y 軸若還需要鏡像方向可再疊加 Transformer 的取反變換。自定義按鈕映射按上文示例用type INPUT_EV_KEYmap 源碼 目標(biāo)碼實(shí)現(xiàn)按鍵重映射例如把INPUT_BTN_0左鍵映射為INPUT_BTN_2中鍵。組合使用Code Mapper 不攔截事件可放心與 Scaler、Transformer 等處理器串聯(lián)實(shí)現(xiàn)先映射、再縮放/變換的完整處理鏈。記住零參數(shù)在input-processors中引用 Code Mapper 實(shí)例時(shí)不要附加任何參數(shù)#input-processor-cells 0否則設(shè)備樹解析會(huì)出錯(cuò)。關(guān)于輸入處理器與監(jiān)聽器的完整掛載方式、層覆蓋layer override與process-next行為請(qǐng)繼續(xù)閱讀 輸入處理器使用說明 與 指向功能配置。贊分享固件嵌入式智能硬件藍(lán)牙【免費(fèi)下載鏈接】zmkZMK Firmware Repository項(xiàng)目地址https://gitcode.com/gh_mirrors/zm/zmk點(diǎn)擊查看免費(fèi)下載相關(guān)推薦RedwoodJS映射器對(duì)象映射與轉(zhuǎn)換的完整指南RedwoodJS映射器對(duì)象映射與轉(zhuǎn)換的完整指南 RedwoodJS是一個(gè)專為初創(chuàng)公司設(shè)計(jì)的全棧應(yīng)用框架而RedwoodRecord是其核心的 對(duì)象關(guān)系映射后端前端Web框架開發(fā)工具SkillsGate與skills.sh深度集成探索91,000公共AI技能庫SkillsGate與skills.sh深度集成探索91,000公共AI技能庫 SkillsGate是一款功能強(qiáng)大的AI技能管理工具通過與skills.s如何使用Frappe映射器數(shù)據(jù)轉(zhuǎn)換處理的終極指南如何使用Frappe映射器數(shù)據(jù)轉(zhuǎn)換處理的終極指南 Frappe映射器是Frappe框架中一個(gè)強(qiáng)大的數(shù)據(jù)轉(zhuǎn)換工具它允許開發(fā)者輕松地將數(shù)據(jù)從一個(gè)文檔類型映射到另后端Web框架低代碼前端認(rèn)證鑒權(quán)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考