use super::opcode::{
CLIP_PKT_TRIG_HDR, INJ_MOTION_CURSOR, INJ_MOTION_PAN, INJ_MOTION_WHEEL, OPT_BEARING, OPT_EMIT,
OPT_IMPERFECT, OPT_MOVE_RIDE, OPT_NAME, OPT_RENDER, OPT_SPREAD, PATCH_APPLY, PATCH_CLEAR,
};
use crate::types::{Direction, Setup};
pub fn move_cursor_payload(dx: i16, dy: i16, flags: u8) -> [u8; 6] {
let dx = dx.to_le_bytes();
let dy = dy.to_le_bytes();
[INJ_MOTION_CURSOR, dx[0], dx[1], dy[0], dy[1], flags]
}
pub fn move_wheel_payload(dz: i16, flags: u8) -> [u8; 4] {
let d = dz.to_le_bytes();
[INJ_MOTION_WHEEL, d[0], d[1], flags]
}
pub fn move_pan_payload(dpan: i16, flags: u8) -> [u8; 4] {
let d = dpan.to_le_bytes();
[INJ_MOTION_PAN, d[0], d[1], flags]
}
pub fn inject_payload(class: u8, id: u16, action: u8) -> [u8; 4] {
let u = id.to_le_bytes();
[class, u[0], u[1], action]
}
pub fn query_payload(what: u8) -> [u8; 1] {
[what]
}
pub fn led_payload(target: u8, mode: u8, level: u8) -> [u8; 3] {
[target, mode, level]
}
pub fn lock_payload(class: u8, usage: u16, direction: u8, scale: i16) -> [u8; 6] {
let u = usage.to_le_bytes();
let s = scale.to_le_bytes();
[class, u[0], u[1], direction, s[0], s[1]]
}
pub fn catch_payload(class: u8, id: u16, direction: u8, state: u8, snaplen: u8) -> [u8; 6] {
let i = id.to_le_bytes();
[class, i[0], i[1], direction, state, snaplen]
}
pub fn imperfect_payload(allow: bool) -> [u8; 2] {
[OPT_IMPERFECT, allow as u8]
}
pub fn bearing_payload(window_ms: u16, mode: u8) -> [u8; 4] {
let w = window_ms.to_le_bytes();
[OPT_BEARING, w[0], w[1], mode]
}
pub fn move_ride_payload(timeout_ms: u16) -> [u8; 3] {
let t = timeout_ms.to_le_bytes();
[OPT_MOVE_RIDE, t[0], t[1]]
}
pub fn emit_pace_payload(mode: u8, hz: u16, force_hz: u16) -> [u8; 6] {
let h = hz.to_le_bytes();
let f = force_hz.to_le_bytes();
[OPT_EMIT, mode, h[0], h[1], f[0], f[1]]
}
pub fn render_payload(mode: u8, full: bool) -> [u8; 3] {
[OPT_RENDER, mode, full as u8]
}
pub fn spread_payload(percent: u16) -> [u8; 3] {
let p = percent.to_le_bytes();
[OPT_SPREAD, p[0], p[1]]
}
pub fn clip_op_payload(op: u8) -> [u8; 1] {
[op]
}
pub fn clip_set_payload(id: u8, value: u8) -> [u8; 2] {
[id, value]
}
pub fn clip_trigger_payload(class: u8, id: u16, edge: u8, action: u8, flags: u8) -> [u8; 6] {
let u = id.to_le_bytes();
[class, u[0], u[1], edge, action, flags]
}
#[allow(clippy::too_many_arguments)]
pub fn clip_packet_trigger_payload(
class: u8,
id: u16,
dir: u8,
action: u8,
flags: u8,
slen: u8,
match_bytes: &[u8],
mask: &[u8],
) -> Vec<u8> {
let mut v = Vec::with_capacity(CLIP_PKT_TRIG_HDR + match_bytes.len() + mask.len());
v.extend_from_slice(&clip_trigger_payload(class, id, dir, action, flags));
v.push(slen);
v.push(match_bytes.len() as u8);
v.extend_from_slice(match_bytes);
v.extend_from_slice(mask);
v
}
pub fn name_payload(name: &str) -> Vec<u8> {
let mut v = Vec::with_capacity(1 + name.len());
v.push(OPT_NAME);
v.extend_from_slice(name.as_bytes());
v
}
pub fn raw_payload(ep: u8, direction: Direction, bytes: &[u8]) -> Vec<u8> {
let mut v = Vec::with_capacity(2 + bytes.len());
v.push(ep & 0x0f);
v.push(direction.as_u8());
v.extend_from_slice(bytes);
v
}
pub fn transfer_payload(ep: u8, setup: Setup, out: &[u8]) -> Vec<u8> {
let mut v = Vec::with_capacity(1 + 8 + out.len());
v.push(ep);
v.extend_from_slice(&setup.to_bytes());
v.extend_from_slice(out);
v
}
#[allow(clippy::too_many_arguments)]
pub fn rewrite_payload(
class: u8,
id: u16,
direction: u8,
state: u8,
action: u8,
offset: u16,
match_bytes: &[u8],
mask: &[u8],
payload: &[u8],
) -> Vec<u8> {
let mlen = match_bytes.len();
let mut v = Vec::with_capacity(9 + 2 * mlen + payload.len());
v.push(class);
v.extend_from_slice(&id.to_le_bytes());
v.push(direction);
v.push(state);
v.push(action);
v.extend_from_slice(&offset.to_le_bytes());
v.push(mlen as u8);
v.extend_from_slice(match_bytes);
v.extend_from_slice(mask);
v.extend_from_slice(payload);
v
}
pub fn patch_payload(section: u8, cfg: u8, index: u8, offset: u16, bytes: &[u8]) -> Vec<u8> {
let mut v = Vec::with_capacity(5 + bytes.len());
v.push(section);
v.push(cfg);
v.push(index);
v.extend_from_slice(&offset.to_le_bytes());
v.extend_from_slice(bytes);
v
}
pub fn transform_payload(op: u8, sclass: u8, sid: u16, dclass: u8, did: u16, state: u8) -> [u8; 8] {
let sid = sid.to_le_bytes();
let did = did.to_le_bytes();
[op, sclass, sid[0], sid[1], dclass, did[0], did[1], state]
}
pub fn patch_apply_payload() -> [u8; 1] {
[PATCH_APPLY]
}
pub fn patch_clear_payload() -> [u8; 1] {
[PATCH_CLEAR]
}