diff --git a/src-slider_io/src/device/config.rs b/src-slider_io/src/device/config.rs index 03de3f3..060fd6e 100644 --- a/src-slider_io/src/device/config.rs +++ b/src-slider_io/src/device/config.rs @@ -5,6 +5,7 @@ pub enum HardwareSpec { TasollerOne, TasollerTwo, Yuancon, + Yubideck, } #[derive(Debug, Clone)] @@ -47,6 +48,10 @@ impl DeviceMode { spec: HardwareSpec::Yuancon, disable_air: v["disableAirStrings"].as_bool()?, }, + "yubideck" => DeviceMode::Hardware { + spec: HardwareSpec::Yubideck, + disable_air: v["disableAirStrings"].as_bool()?, + }, "diva" => DeviceMode::DivaSlider { port: v["divaSerialPort"].as_str()?.to_string(), brightness: u8::try_from(v["divaBrightness"].as_i64()?).ok()?, diff --git a/src-slider_io/src/device/hid.rs b/src-slider_io/src/device/hid.rs index 40bdfbd..4b4a62a 100644 --- a/src-slider_io/src/device/hid.rs +++ b/src-slider_io/src/device/hid.rs @@ -190,6 +190,49 @@ impl HidJob { } }, ), + HardwareSpec::Yubideck => Self::new( + state.clone(), + 0x1973, + 0x2001, + 0x81, // Need to confirm + 0x02, // Need to confirm + *disable_air, + |buf, input| { + if buf.len != 45 { + return; + } + + input.ground.copy_from_slice(&buf.data[2..34]); + for i in 0..6 { + input.air[i ^ 1] = (buf.data[0] >> i) & 1; + } + for i in 0..3 { + input.extra[2 - i] = (buf.data[1] >> i) & 1; + } + }, + WriteType::Interrupt, + |buf, lights| { + buf.len = 62; + let lights_nibbles: Vec = lights + .ground + .chunks(3) + .rev() + .flat_map(|x| x.iter().map(|y| *y >> 4)) + .chain([0, 0, 0]) + .collect(); + + for (buf_chunk, state_chunk) in buf + .data + .chunks_mut(3) + .take(16) + .zip(lights_nibbles.chunks(6)) + { + buf_chunk[0] = (state_chunk[0]) | (state_chunk[1] << 4); + buf_chunk[1] = (state_chunk[2]) | (state_chunk[3] << 4); + buf_chunk[2] = (state_chunk[4]) | (state_chunk[5] << 4); + } + }, + ), } } diff --git a/src/App.svelte b/src/App.svelte index 736025f..bd19af1 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -181,6 +181,7 @@ + @@ -188,7 +189,7 @@ - {#if deviceMode.slice(0, 8) === "tasoller" || deviceMode.slice(0, 7) === "yuancon" || (deviceMode.slice(0, 10) === "brokenithm" && deviceMode !== "brokenithm-nostalgia")} + {#if deviceMode.slice(0, 8) === "tasoller" || deviceMode.slice(0, 7) === "yuancon" || deviceMode.slice(0, 8) === "yubideck" || (deviceMode.slice(0, 10) === "brokenithm" && deviceMode !== "brokenithm-nostalgia")}