PageSourceSearch

https://rmk.rs/static/js/async/3372.f54fe590e6.js

js rmk.rs collected 2026-10-05 03:12:01 UTC 50,126 bytes, 1 lines download raw bytes

1"use strict";(self.rspackChunkrmk_rspress=self.rspackChunkrmk_rspress||[]).push([[3372],{1783(s,e,n){n.r(e);var r=n(1684),i=n(506),o=n(6306);function l(s){let e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...s.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(e.h1,{id:"input-device",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#input-device",children:"#"}),"Input Device"]}),"\n",(0,r.jsx)(e.p,{children:"RMK's input device system provides a unified interface for hardware components that generate input events."}),"\n",(0,r.jsx)(o.Pq,{type:"info",title:"What are input devices?",children:(0,r.jsx)(e.p,{children:"\nInput devices are hardware components that provide input to the keyboard firmware, such as key matrix, rotary encoders, joysticks, pointing devices, ADC sensors, and more."})}),"\n",(0,r.jsxs)(e.h2,{id:"overview",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#overview",children:"#"}),"Overview"]}),"\n",(0,r.jsxs)(e.p,{children:["Input devices read from hardware peripherals and publish events. These events are then consumed by ",(0,r.jsx)(e.a,{href:"/main/docs/features/processor.html",children:"Processors"})," or the keyboard core. For details about events, see the ",(0,r.jsx)(e.a,{href:"/main/docs/features/event.html",children:"Event"})," documentation."]}),"\n",(0,r.jsxs)(e.h2,{id:"inputdevice-trait",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#inputdevice-trait",children:"#"}),"InputDevice Trait"]}),"\n",(0,r.jsxs)(e.p,{children:["The ",(0,r.jsx)(e.code,{children:"InputDevice"})," trait defines the interface for input devices:"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" trait"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" InputDevice"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Runnable"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    type"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    async"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" read_event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"&mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self) "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"->"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" Self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(e.p,{children:["You don't need to implement this trait manually. Use the ",(0,r.jsx)(e.code,{children:"#[input_device]"})," macro to generate the implementation automatically."]}),"\n",(0,r.jsxs)(e.h2,{id:"defining-input-devices",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#defining-input-devices",children:"#"}),"Defining Input Devices"]}),"\n",(0,r.jsxs)(e.p,{children:["Use the ",(0,r.jsx)(e.code,{children:"#[input_device]"})," macro on a struct to define an input device:"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"BatteryAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"macros"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"input_device;"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[input_device(publish "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" BatteryAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" struct"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" MyBatteryReader"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    pin"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" u8"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"publish = EventType"})," (required): The event type this device publishes."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"How it works:"})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"#[input_device]"})," implements both ",(0,r.jsx)(e.code,{children:"InputDevice"})," and ",(0,r.jsx)(e.code,{children:"Runnable"})," traits automatically."]}),"\n",(0,r.jsxs)(e.li,{children:["You only need to implement a ",(0,r.jsx)(e.code,{children:"read_<event_name>_event()"})," method that ",(0,r.jsx)(e.strong,{children:"returns"})," the event. The macro will automatically publish the returned event to the corresponding event channel."]}
1),"\n",(0,r.jsxs)(e.li,{children:["The method name is derived from the event type name by converting it to snake_case and stripping the ",(0,r.jsx)(e.code,{children:"Event"})," suffix:\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"publish = BatteryAdcEvent"})," → ",(0,r.jsx)(e.code,{children:"async fn read_battery_adc_event(&mut self) -> BatteryAdcEvent"})]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.code,{children:"publish = KeyboardEvent"})," → ",(0,r.jsx)(e.code,{children:"async fn read_keyboard_event(&mut self) -> KeyboardEvent"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.h3,{id:"single-event-device-example",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#single-event-device-example",children:"#"}),"Single-event Device Example"]}),"\n",(0,r.jsx)(e.p,{children:"A device that reads charging state from a GPIO pin:"}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"ChargingStateEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"macros"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"input_device;"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[input_device(publish "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ChargingStateEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" struct"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ChargingStateReader"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"I"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" InputPin"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    state_input"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" I"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    low_active"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" bool"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    current_charging_state"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" bool"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"impl"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"I"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" InputPin"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"ChargingStateReader"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"I"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" new"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(state_input"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" I"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", low_active"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" bool"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"->"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" Self {"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"        Self {"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            state_input,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            low_active,"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            current_charging_state"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"        }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    }"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"    // This method is required by #[input_device(publish = ChargingStateEvent)]"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    async"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" read_charging_state_event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"&mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self) "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"->"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ChargingStateEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"        loop"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            embassy_time"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Timer"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"after_secs"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:".await"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"            let"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" charging "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"low_active {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"                self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"state_input"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"is_low"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"}
1,children:"()"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"unwrap_or"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"false"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            } "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"else"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"                self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"state_input"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"is_high"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"unwrap_or"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"false"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            };"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"            if"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" charging "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"!="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"current_charging_state {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"                self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"current_charging_state "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" charging;"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"                return"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ChargingStateEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" { charging };"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"            }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"        }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(e.h3,{id:"multi-event-device-example",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#multi-event-device-example",children:"#"}),"Multi-event Device Example"]}),"\n",(0,r.jsxs)(e.p,{children:["A device that produces multiple event types using a wrapper enum (see ",(0,r.jsx)(e.a,{href:"/main/docs/features/event.html#multi-event-enums",children:"Multi-event Enums"}),"):"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"{"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"BatteryAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"PointingEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"macros"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"{"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", input_device};"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// Define a wrapper enum for multiple event types"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[derive("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Clone"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Debug"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" enum"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" NrfAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"    Pointing"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"PointingEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"),"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"    Battery"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"BatteryAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"),"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[input_device(publish "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" NrfAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" struct"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" NrfAdc"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<'"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"a"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" PIN_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" usize"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" EVENT_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" usize"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    saadc"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Saadc"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<'"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"a"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"PIN_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">,"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"    // ... other fields"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"impl"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<'"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"a"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" PIN_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" usize"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" EVENT_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" usize"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"NrfAdc"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<'"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"a"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"PIN_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"EVENT_NUM"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> {"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"    // Returns the wrapper enum"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    async"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" read_nrf_adc_event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"&mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self) "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"->"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" NrfAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"        // Read ADC and return the appropriate variant"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"        NrfAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Battery"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"BatteryAdcEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(adc_value))"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(e.h2,{id:"running-input-devices",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#running-input-devices",children:"#"}),"Running Input Devices"]}),"\n",(0,r.jsxs)(e.p,{children:["All input devices implement the ",(0,r.jsx)(e.code,{children:"Runnable"})," trait. Use the ",(0,r.jsx)(e.code,{children:"run_all!"})," macro to run all runnables — input devices, processors, and the rest of the firmware (keyboard, storage, transports) — 
1concurrently:"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"run_all;"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create your devices and processors"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" matrix "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Matrix"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<_, _, _, ROW, COL, "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(row_pins, col_pins, debouncer);"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" encoder "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RotaryEncoder"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(pin_a, pin_b, "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" adc_device "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" NrfAdc"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(saadc, [AnalogEventType"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"Battery"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"], ["}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"], interval, "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"None"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" batt_proc "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" BatteryProcessor"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"2000"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"2806"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// Run everything concurrently"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"run_all!"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    matrix,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    encoder,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    adc_device,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    batt_proc,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    storage,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    usb_transport,"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    keyboard"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:".await"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),"\n",(0,r.jsxs)(e.p,{children:["See ",(0,r.jsx)(e.a,{href:"https://github.com/rmk-rs/rmk/blob/main/examples/use_rust/nrf52840_ble/src/main.rs",rel:"noopener noreferrer",target:"_blank",children:(0,r.jsx)(e.code,{children:"examples/use_rust/nrf52840_ble"})})," for a complete ",(0,r.jsx)(e.code,{children:"main.rs"})," using these devices."]}),"\n",(0,r.jsxs)(e.h2,{id:"configuration",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#configuration",children:"#"}),"Configuration"]}),"\n",(0,r.jsxs)(e.p,{children:["RMK provides ",(0,r.jsx)(e.code,{children:"keyboard.toml"})," configuration support for some built-in input devices (such as rotary encoders, joysticks, PMW3610 and PMW3360/PMW3389 sensors, and IQS5xx trackpads), so you can use them without writing any Rust code. See the ",(0,r.jsx)(e.a,{href:"/main/docs/configuration/input_device.html",children:"Input Device Configuration"})," documentation for details."]}),"\n",(0,r.jsxs)(e.h2,{id:"combining-with-processor",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#combining-with-processor",children:"#"}),"Combining with Processor"]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"#[input_device]"})," can be combined with ",(0,r.jsx)(e.code,{children:"#[processor]"}
1)," on the same struct. This allows a single struct to both produce events and subscribe to other events:"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(e.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"rust",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"use"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rmk"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"macros"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"::"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"{input_device, processor};"})]}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[input_device(publish "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" SensorEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:")]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"#[processor(subscribe "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"ConfigEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"])]"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" struct"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" InputSensor"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    pub"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" threshold"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" u16"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"impl"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" InputSensor"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"    // Required by #[input_device]: return the event, it will be published automatically"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    async"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" read_sensor_event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"&mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self) "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"->"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" SensorEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"        // Read sensor data"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    }"})}),"\n",(0,r.jsx)(e.span,{className:"line"}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"    // Required by #[processor]: handle subscribed events"})}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"    async"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" fn"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" on_config_event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"&mut"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" self, event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ConfigEvent"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,r.jsxs)(e.span,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"        self"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"threshold "}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" event"}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"."}),(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"threshold;"})]}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"    }"})}),"\n",(0,r.jsx)(e.span,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(o.Pq,{type:"warning",title:"Beware of infinite event loops",children:[(0,r.jsx)(e.p,{children:"\nWhen combining input device and processor, be careful not to create event loops:"}),(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Direct loop"}),": Subscribing to an event you publish yourself (RMK rejects this case at compile time)"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Indirect loop"}),": Device A subscribes to X and publishes Y, Device B subscribes to Y and publishes X — this forms a cycle"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Longer chains"}),": A→B→C→A loops are also possible (A publishes B, B publishes C, C publishes A)"]}),"\n"]}),(0,r.jsx)(e.p,{children:"Event loops cause infinite cycles and hang your firmware."})]}),"\n",(0,r.jsxs)(e.h2,{id:"related-documentation",children:[(0,r.jsx)(e.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#related-documentation",children:"#"}),"Related Documentation"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"/main/docs/features/event.html",children:"Event"})," - Event concepts, built-in events, and custom event definition"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"/main/docs/features/processor.html",children:"Processor"})," - How to create processors that subscribe to events"]}),"\n"]})]})}function a(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:e}={...(0,i.R)(),...s.components};return e?(0,r.jsx)(e,{...s,children:(0,r.jsx)(l,{...s})}):l(s)}a.__RSPRESS_PAGE_META={},a.__RSPRESS_PAGE_META["main%2Fdocs%2Ffeatures%2Finput_device.md"]={toc:[{id:"overview",text:"Overview",depth:2},{id:"inputdevice-trait",text:"InputDevice Trait",depth:2},{id:"defining-input-devices",text:"Defining Input Devices",depth:2},{id:"single-event-device-example",text:"Single-event Device Example",depth:3},{id:"multi-event-device-example",text:"Multi-event Device Example",depth:3},{id:"running-input-devices",text:"Running Input Devices",depth:2},{id:"configuration",text:"Configuration",depth:2},{id:"combining-with-processor",text:"Combining with Processor",depth:2},{id:"related-documentation",text:"Related Documentation",depth:2}],title:"Input Device",headingTitle:"Input Device",frontmatter:{}},n.d(e,{default:()=>a})}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.