add a function to initialize output LED buffer

This commit is contained in:
beerpsi 2023-12-28 20:19:59 +07:00
parent 98e6f5cf76
commit c6f3fb529b
5 changed files with 56 additions and 23 deletions

View File

@ -22,12 +22,14 @@ pub const OUTPUT_MEMORY_SIZE: usize = 1;
///
/// Both bit masks are active-high.
#[cfg(any(chuni, amdaemon))]
#[inline(always)]
pub fn jvs_poll(_input: &[u8]) -> (u8, u8) {
(0, 0)
}
/// Checks the current state of the coin button (if there is one).
#[cfg(any(chuni, amdaemon))]
#[inline(always)]
pub fn is_coin_button_pressed(_input: &[u8]) -> bool {
false
}
@ -51,13 +53,23 @@ pub fn is_coin_button_pressed(_input: &[u8]) -> bool {
/// ----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
/// ```
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn read_pressure_data(_input: &[u8]) -> [u8; 32] {
[0u8; 32]
}
/// Do some one-time initialization to the USB out buffer
/// (e.g. set magic bytes).
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn init_output_buffer(_output: &mut [u8]) {
}
/// Update the RGB lighting on the slider. A slice `rgb` is provided, alternating
/// between 16 touch pad pixels and 15 divider pixels, going from right to left.
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_slider_leds<T: UsbContext>(
_device: &DeviceHandle<T>,
_output: &mut [u8],
@ -77,6 +89,7 @@ pub fn set_slider_leds<T: UsbContext>(
/// Note that billboard strips have alternating direction (bottom to top, top
/// to bottom...)
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_led_colors<T: UsbContext>(
_device: &DeviceHandle<T>,
_output: &mut [u8],

View File

@ -32,7 +32,8 @@
//! - Content length: 240 bytes
//! - Bytes 0..3: magic bytes [0x42, 0x4C, 0x00]
//! - Bytes 3..96: Slider LED (GRB order, right -> left)
//! - Bytes 96..240: Nothing.
//! - Bytes 96..168: Left tower LED (GRB)
//! - Bytes 168..240: Right tower LED (GRB)
#[cfg(any(chuni, chusanapp))]
use anyhow::Result;
@ -100,6 +101,14 @@ pub fn read_pressure_data(input: &[u8]) -> [u8; 32] {
pressure
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn init_output_buffer(output: &mut [u8]) {
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_slider_leds<T: UsbContext>(
@ -107,10 +116,6 @@ pub fn set_slider_leds<T: UsbContext>(
output: &mut [u8],
rgb: &[u8],
) -> Result<()> {
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
for (buf_chunk, state_chunk) in output[3..96].chunks_mut(3).take(31).zip(rgb.chunks(3)) {
buf_chunk[0] = state_chunk[1];
buf_chunk[1] = state_chunk[0];
@ -134,10 +139,6 @@ pub fn set_led_colors<T: UsbContext>(
return Ok(());
}
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
let air_rgb = if board == 0 { 0x96 } else { 0xB4 };
let output_start = if board == 0 { 96 } else { 168 };

View File

@ -19,7 +19,8 @@
//! - Content length: 240 bytes
//! - Bytes 0..3: magic bytes [0x42, 0x4C, 0x00]
//! - Bytes 3..96: Slider LED (GRB order, right -> left)
//! - Bytes 96..240: Nothing.
//! - Bytes 96..168: Left tower LED (GRB)
//! - Bytes 168..240: Right tower LED (GRB)
#[cfg(any(chuni, chusanapp))]
use anyhow::Result;
@ -65,6 +66,14 @@ pub fn read_pressure_data(input: &[u8]) -> [u8; 32] {
pressure
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn init_output_buffer(output: &mut [u8]) {
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_slider_leds<T: UsbContext>(
@ -72,10 +81,6 @@ pub fn set_slider_leds<T: UsbContext>(
output: &mut [u8],
rgb: &[u8],
) -> Result<()> {
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
for (buf_chunk, state_chunk) in output[3..96].chunks_mut(3).take(31).zip(rgb.chunks(3)) {
buf_chunk[0] = state_chunk[1];
buf_chunk[1] = state_chunk[0];
@ -99,10 +104,6 @@ pub fn set_led_colors<T: UsbContext>(
return Ok(());
}
output[0] = 0x42;
output[1] = 0x4C;
output[2] = 0;
let air_rgb = if board == 0 { 0x96 } else { 0xB4 };
let output_start = if board == 0 { 96 } else { 168 };

View File

@ -46,16 +46,19 @@ pub const INPUT_MEMORY_SIZE: usize = 45;
pub const OUTPUT_MEMORY_SIZE: usize = 122;
#[cfg(any(chuni, amdaemon))]
#[inline(always)]
pub fn jvs_poll(input: &[u8]) -> (u8, u8) {
(input[1] & 3, input[0])
}
#[cfg(any(chuni, amdaemon))]
#[inline(always)]
pub fn is_coin_button_pressed(input: &[u8]) -> bool {
(input[1] & 4) != 0
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn read_pressure_data(input: &[u8]) -> [u8; 32] {
let mut pressure = [0u8; 32];
@ -67,14 +70,19 @@ pub fn read_pressure_data(input: &[u8]) -> [u8; 32] {
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn init_output_buffer(output: &mut [u8]) {
output[0] = 0;
output[61] = 1;
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_slider_leds<T: UsbContext>(
device: &DeviceHandle<T>,
output: &mut [u8],
rgb: &[u8],
) -> Result<()> {
output[0] = 0;
output[61] = 1;
for (buf_chunk, state_chunk) in output[1..61].chunks_mut(3).zip(rgb.chunks(3).take(20)) {
buf_chunk[0] = state_chunk[0];
buf_chunk[1] = state_chunk[1];
@ -97,6 +105,7 @@ pub fn set_slider_leds<T: UsbContext>(
}
#[cfg(any(chuni, chusanapp))]
#[inline(always)]
pub fn set_led_colors<T: UsbContext>(
device: &DeviceHandle<T>,
output: &mut [u8],
@ -107,8 +116,6 @@ pub fn set_led_colors<T: UsbContext>(
return Ok(());
}
output[61] = 1;
match board {
0 => {
output[95] = rgb[150];

View File

@ -296,6 +296,17 @@ pub unsafe extern "C" fn chuni_io_slider_set_leds(rgb: *const u8) {
pub extern "C" fn chuni_io_slider_set_leds(_rgb: *const u8) {}
#[no_mangle]
#[cfg(any(chuni, chusanapp))]
pub extern "C" fn chuni_io_led_init() -> HRESULT {
let mut output = SLIDER_OUTPUT.write();
con_impl::init_output_buffer(output.as_mut_slice());
S_OK
}
#[no_mangle]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_led_init() -> HRESULT {
S_OK
}