mirror of https://github.com/4yn/slidershim
split chupico and redboard specs. leds wip
parent
adea9e3a45
commit
cfa786ce2b
|
@ -7,7 +7,8 @@ pub enum HardwareSpec {
|
||||||
Yuancon,
|
Yuancon,
|
||||||
Yubideck,
|
Yubideck,
|
||||||
YubideckThree,
|
YubideckThree,
|
||||||
HoriPad,
|
HoriPico,
|
||||||
|
HoriRed,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -59,8 +60,12 @@ impl DeviceMode {
|
||||||
spec: HardwareSpec::YubideckThree,
|
spec: HardwareSpec::YubideckThree,
|
||||||
disable_air: v["disableAirStrings"].as_bool()?,
|
disable_air: v["disableAirStrings"].as_bool()?,
|
||||||
},
|
},
|
||||||
"hori" => DeviceMode::Hardware {
|
"hori-pico" => DeviceMode::Hardware {
|
||||||
spec: HardwareSpec::HoriPad,
|
spec: HardwareSpec::HoriPico,
|
||||||
|
disable_air: v["disableAirStrings"].as_bool()?,
|
||||||
|
},
|
||||||
|
"hori-red" => DeviceMode::Hardware {
|
||||||
|
spec: HardwareSpec::HoriRed,
|
||||||
disable_air: v["disableAirStrings"].as_bool()?,
|
disable_air: v["disableAirStrings"].as_bool()?,
|
||||||
},
|
},
|
||||||
"diva" => DeviceMode::DivaSlider {
|
"diva" => DeviceMode::DivaSlider {
|
||||||
|
|
|
@ -331,13 +331,14 @@ impl HidJob {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
HardwareSpec::HoriPad => Self::new(
|
HardwareSpec::HoriPico => Self::new(
|
||||||
state.clone(),
|
state.clone(),
|
||||||
0x0f0d,
|
0x0f0d,
|
||||||
0x0092,
|
0x0092,
|
||||||
*disable_air,
|
*disable_air,
|
||||||
0x84,
|
0x84,
|
||||||
|buf, input| {
|
|buf, input| {
|
||||||
|
// info!("log hid {:?} {:?}", buf.len, buf.data);
|
||||||
if buf.len != 9 {
|
if buf.len != 9 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -356,10 +357,10 @@ impl HidJob {
|
||||||
input.extra[2] = 0;
|
input.extra[2] = 0;
|
||||||
},
|
},
|
||||||
vec![
|
vec![
|
||||||
LedSpec::new(WriteType::Interrupt, 0x04),
|
LedSpec::new(WriteType::Interrupt, 0x01),
|
||||||
LedSpec::new(WriteType::Interrupt, 0x05),
|
LedSpec::new(WriteType::Interrupt, 0x01),
|
||||||
LedSpec::new(WriteType::Interrupt, 0x06),
|
LedSpec::new(WriteType::Interrupt, 0x01),
|
||||||
LedSpec::new(WriteType::Interrupt, 0x0b),
|
LedSpec::new(WriteType::Interrupt, 0x01),
|
||||||
],
|
],
|
||||||
|led_specs, lights| {
|
|led_specs, lights| {
|
||||||
if let [led_spec_ga, led_spec_gb, led_spec_air, led_spec_comp] = led_specs.as_mut_slice()
|
if let [led_spec_ga, led_spec_gb, led_spec_air, led_spec_comp] = led_specs.as_mut_slice()
|
||||||
|
@ -389,12 +390,121 @@ impl HidJob {
|
||||||
// info!("compress {:?}", light_brg_buf_compress);
|
// info!("compress {:?}", light_brg_buf_compress);
|
||||||
|
|
||||||
if light_brg_buf_compress.len() < 63 {
|
if light_brg_buf_compress.len() < 63 {
|
||||||
buf_comp.data[0..light_brg_buf_compress.len()]
|
buf_comp.data[0] = 0x0b;
|
||||||
|
buf_comp.data[1..(light_brg_buf_compress.len() + 1)]
|
||||||
.copy_from_slice(light_brg_buf_compress.as_slice());
|
.copy_from_slice(light_brg_buf_compress.as_slice());
|
||||||
|
buf_comp.len = light_brg_buf_compress.len() + 1;
|
||||||
|
info!(
|
||||||
|
"Sending compressed led data {:?} {:?}",
|
||||||
|
buf_comp.len, buf_comp.data
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
buf_ga.data[0..48].copy_from_slice(&light_brg_buf[0..48]);
|
buf_ga.data[0] = 0x04;
|
||||||
buf_gb.data[0..45].copy_from_slice(&light_brg_buf[48..(48 + 45)]);
|
buf_ga.data[1..(48 + 1)].copy_from_slice(&light_brg_buf[0..48]);
|
||||||
buf_air.data[0..18].copy_from_slice(&light_brg_buf[(48 + 45)..(48 + 45 + 18)]);
|
buf_ga.len = 48 + 1;
|
||||||
|
buf_gb.data[0] = 0x05;
|
||||||
|
buf_gb.data[1..(45 + 1)].copy_from_slice(&light_brg_buf[48..(48 + 45)]);
|
||||||
|
buf_gb.len = 45 + 1;
|
||||||
|
buf_air.data[0] = 0x06;
|
||||||
|
buf_air.data[1..(18 + 1)].copy_from_slice(&light_brg_buf[(48 + 45)..(48 + 45 + 18)]);
|
||||||
|
buf_air.len = 18 + 1;
|
||||||
|
|
||||||
|
info!("Sending uncompressed led data");
|
||||||
|
info!("{:?} {:?}", buf_ga.len, buf_ga.data);
|
||||||
|
info!("{:?} {:?}", buf_gb.len, buf_gb.data);
|
||||||
|
info!("{:?} {:?}", buf_air.len, buf_air.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
HardwareSpec::HoriRed => Self::new(
|
||||||
|
state.clone(),
|
||||||
|
0x0f0d,
|
||||||
|
0x0092,
|
||||||
|
*disable_air,
|
||||||
|
0x81,
|
||||||
|
|buf, input| {
|
||||||
|
// info!("log hid {:?} {:?}", buf.len, buf.data);
|
||||||
|
if buf.len != 9 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let bits: Vec<u8> = buf.data[0..7]
|
||||||
|
.iter()
|
||||||
|
.flat_map(|x| (0..8).map(move |i| ((x ^ 128) >> i) & 1))
|
||||||
|
.collect();
|
||||||
|
for i in 0..32 {
|
||||||
|
input.ground[i] = bits[7 * 8 - 1 - i] * 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.air[0] = bits[3];
|
||||||
|
input.air[1] = bits[0];
|
||||||
|
input.air[2] = bits[1];
|
||||||
|
input.air[3] = bits[2];
|
||||||
|
input.air[4] = bits[4];
|
||||||
|
input.air[5] = bits[5];
|
||||||
|
|
||||||
|
input.extra[0] = 0;
|
||||||
|
input.extra[1] = 0;
|
||||||
|
input.extra[2] = 0;
|
||||||
|
},
|
||||||
|
vec![
|
||||||
|
LedSpec::new(WriteType::Interrupt, 0x02),
|
||||||
|
LedSpec::new(WriteType::Interrupt, 0x02),
|
||||||
|
LedSpec::new(WriteType::Interrupt, 0x02),
|
||||||
|
LedSpec::new(WriteType::Interrupt, 0x02),
|
||||||
|
],
|
||||||
|
|led_specs, lights| {
|
||||||
|
if let [led_spec_ga, led_spec_gb, led_spec_air, led_spec_comp] = led_specs.as_mut_slice()
|
||||||
|
{
|
||||||
|
let buf_ga = &mut led_spec_ga.led_buf;
|
||||||
|
let buf_gb = &mut led_spec_gb.led_buf;
|
||||||
|
let buf_air = &mut led_spec_air.led_buf;
|
||||||
|
let buf_comp = &mut led_spec_comp.led_buf;
|
||||||
|
|
||||||
|
let light_rgb_buf: Vec<u8> = lights
|
||||||
|
.ground
|
||||||
|
.iter()
|
||||||
|
.chain(lights.air_left.iter())
|
||||||
|
.chain(lights.air_right.iter())
|
||||||
|
.map(|x| *x)
|
||||||
|
.collect();
|
||||||
|
let light_brg_buf: Vec<u8> = light_rgb_buf
|
||||||
|
.chunks(3)
|
||||||
|
.map(|x| [x[2], x[0], x[1]])
|
||||||
|
.flatten()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut light_brg_buf_compress: Vec<u8> = vec![];
|
||||||
|
light_brg_buf_compress.reserve(512);
|
||||||
|
compress(&light_brg_buf, &mut light_brg_buf_compress);
|
||||||
|
// info!("raw {:?}", light_brg_buf);
|
||||||
|
// info!("compress {:?}", light_brg_buf_compress);
|
||||||
|
|
||||||
|
if light_brg_buf_compress.len() < 63 {
|
||||||
|
buf_comp.data[0] = 0x0b;
|
||||||
|
buf_comp.data[1..(light_brg_buf_compress.len() + 1)]
|
||||||
|
.copy_from_slice(light_brg_buf_compress.as_slice());
|
||||||
|
buf_comp.len = light_brg_buf_compress.len() + 1;
|
||||||
|
info!(
|
||||||
|
"Sending compressed led data {:?} {:?}",
|
||||||
|
buf_comp.len, buf_comp.data
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
buf_ga.data[0] = 0x04;
|
||||||
|
buf_ga.data[1..(48 + 1)].copy_from_slice(&light_brg_buf[0..48]);
|
||||||
|
buf_ga.len = 48 + 1;
|
||||||
|
buf_gb.data[0] = 0x05;
|
||||||
|
buf_gb.data[1..(45 + 1)].copy_from_slice(&light_brg_buf[48..(48 + 45)]);
|
||||||
|
buf_gb.len = 45 + 1;
|
||||||
|
buf_air.data[0] = 0x06;
|
||||||
|
buf_air.data[1..(18 + 1)].copy_from_slice(&light_brg_buf[(48 + 45)..(48 + 45 + 18)]);
|
||||||
|
buf_air.len = 18 + 1;
|
||||||
|
|
||||||
|
info!("Sending uncompressed led data");
|
||||||
|
info!("{:?} {:?}", buf_ga.len, buf_ga.data);
|
||||||
|
info!("{:?} {:?}", buf_gb.len, buf_gb.data);
|
||||||
|
info!("{:?} {:?}", buf_air.len, buf_air.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -490,7 +600,7 @@ impl ThreadJob for HidJob {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
// debug!("Device write error {}", e);
|
error!("Device write error {}", e);
|
||||||
e
|
e
|
||||||
})
|
})
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
|
|
|
@ -198,7 +198,8 @@
|
||||||
<option value="yuancon">Yuancon Laverita, HID Firmware</option>
|
<option value="yuancon">Yuancon Laverita, HID Firmware</option>
|
||||||
<option value="yubideck">大四 / Yubideck, HID Firmware 1.0</option>
|
<option value="yubideck">大四 / Yubideck, HID Firmware 1.0</option>
|
||||||
<option value="yubideck-three">大四 / Yubideck, HID Firmware 3.0</option>
|
<option value="yubideck-three">大四 / Yubideck, HID Firmware 3.0</option>
|
||||||
<option value="hori">HORI Pad (Redboard / Chu Pico)</option>
|
<option value="hori-pico">HORI (Chu Pico)</option>
|
||||||
|
<option value="hori-red">HORI (Redboard)</option>
|
||||||
<option value="diva">Slider over Serial</option>
|
<option value="diva">Slider over Serial</option>
|
||||||
<option value="brokenithm">Brokenithm</option>
|
<option value="brokenithm">Brokenithm</option>
|
||||||
<option value="brokenithm-led">Brokenithm + Led</option>
|
<option value="brokenithm-led">Brokenithm + Led</option>
|
||||||
|
|
Loading…
Reference in New Issue