turns out, vscode does properly dim inactive code

This commit is contained in:
beerpsi 2023-12-26 11:57:51 +07:00
parent 9f552e30a3
commit 4c06e76982
5 changed files with 266 additions and 64 deletions

1
.gitignore vendored
View File

@ -1,5 +1,4 @@
/target
/Cargo.lock
# Created by https://www.toptal.com/developers/gitignore/api/jetbrains
# Edit at https://www.toptal.com/developers/gitignore?templates=jetbrains

223
Cargo.lock generated Normal file
View File

@ -0,0 +1,223 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "anyhow"
version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355"
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cc"
version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
dependencies = [
"libc",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f"
[[package]]
name = "chuniio-yubideck"
version = "0.1.0"
dependencies = [
"anyhow",
"cfg_aliases",
"env_logger",
"lazy_static",
"log",
"rusb",
"shared_memory",
"winapi",
]
[[package]]
name = "env_logger"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece"
dependencies = [
"log",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
[[package]]
name = "libusb1-sys"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d0e2afce4245f2c9a418511e5af8718bcaf2fa408aefb259504d1a9cb25f27"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "log"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
[[package]]
name = "memoffset"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
dependencies = [
"autocfg",
]
[[package]]
name = "nix"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"memoffset",
]
[[package]]
name = "pkg-config"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
[[package]]
name = "rusb"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45fff149b6033f25e825cbb7b2c625a11ee8e6dac09264d49beb125e39aa97bf"
dependencies = [
"libc",
"libusb1-sys",
]
[[package]]
name = "shared_memory"
version = "0.12.4-chuniio"
dependencies = [
"cfg-if",
"libc",
"nix",
"win-sys",
]
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "win-sys"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5"
dependencies = [
"windows",
]
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f"
dependencies = [
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d"
[[package]]
name = "windows_i686_gnu"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed"
[[package]]
name = "windows_i686_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956"
[[package]]
name = "windows_x86_64_gnu"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4"
[[package]]
name = "windows_x86_64_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9"

View File

@ -25,3 +25,6 @@ log = "0.4.20"
rusb = "0.9.3"
shared_memory = { path = "vendor/shared_memory" }
winapi = { version = "0.3.9", features = ["minwindef", "winnt", "winerror", "debugapi", "winbase", "winuser"] }
[build-dependencies]
cfg_aliases = "0.2.0"

9
build.rs Normal file
View File

@ -0,0 +1,9 @@
use cfg_aliases::cfg_aliases;
fn main() {
cfg_aliases! {
chuni: { not(feature = "chusan") },
amdaemon: { all(feature = "chusan", target_pointer_width = "64") },
chusanapp: { all(feature = "chusan", target_pointer_width = "32") },
}
}

View File

@ -1,23 +1,7 @@
// I swear the code down below looks way better in a proper editor
// that greys out disabled code.
//
// While I'd love to make use of something like cfg_aliases, IDEs
// are not intelligent enough yet.
//
// To aid reading this code, I have also adapted a convention of
// having the original function first, then the stub function after.
//
// Legend of common cfg flags:
// - any(all(feature = "chusan", target_arch = "x86_64"), not(feature = "chusan")): For amdaemon usage
// - any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")): For chusanapp usage
mod configuration;
mod log;
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
use std::{ffi::c_int, sync::atomic::AtomicU16};
use std::{
ffi::{c_void, CString},
@ -27,7 +11,7 @@ use std::{
Arc,
},
};
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
use std::{
sync::{Mutex, OnceLock},
thread::{self, JoinHandle},
@ -38,10 +22,7 @@ use ::log::error;
use anyhow::{anyhow, Result};
use lazy_static::lazy_static;
use shared_memory::{Shmem, ShmemConf, ShmemError};
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
use winapi::um::winuser::GetAsyncKeyState;
use winapi::{
shared::{
@ -53,7 +34,7 @@ use winapi::{
winnt::{DLL_PROCESS_ATTACH, HRESULT},
},
};
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
use {
::log::info,
rusb::{DeviceHandle, GlobalContext},
@ -63,33 +44,28 @@ use crate::{configuration::Configuration, log::init_logger};
static mut INPUT_SHMEM: Option<Arc<Shmem>> = None;
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
type SliderCallbackFn = unsafe extern "C" fn(data: *const u8);
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
static DEVICE: OnceLock<DeviceHandle<GlobalContext>> = OnceLock::new();
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
static mut SLIDER_THREAD: OnceLock<JoinHandle<()>> = OnceLock::new();
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
static SLIDER_ACTIVE: AtomicBool = AtomicBool::new(false);
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
static COIN_COUNT: AtomicU16 = AtomicU16::new(0);
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
static COIN_PRESSED: AtomicBool = AtomicBool::new(false);
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
static mut OUTPUT_SHMEM: Option<Arc<Mutex<Shmem>>> = None;
#[cfg(any(chuni, amdaemon))]
lazy_static! {
static ref CONFIGURATION: Configuration = {
let io3 = CString::new("io3").unwrap();
@ -139,10 +115,7 @@ pub extern "C" fn chuni_io_get_api_version() -> u16 {
}
#[no_mangle]
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
pub extern "C" fn chuni_io_jvs_init() -> HRESULT {
#[cfg(not(feature = "chusan"))]
{
@ -156,16 +129,13 @@ pub extern "C" fn chuni_io_jvs_init() -> HRESULT {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86"))]
#[cfg(chusanapp)]
pub extern "C" fn chuni_io_jvs_init() -> HRESULT {
S_OK
}
#[no_mangle]
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
pub extern "C" fn chuni_io_jvs_poll(opbtn: *mut u8, beams: *mut u8) {
if opbtn.is_null() || beams.is_null() {
return;
@ -193,14 +163,11 @@ pub extern "C" fn chuni_io_jvs_poll(opbtn: *mut u8, beams: *mut u8) {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86"))]
#[cfg(chusanapp)]
pub extern "C" fn chuni_io_jvs_poll(_opbtn: *mut u8, _beams: *mut u8) {}
#[no_mangle]
#[cfg(any(
all(feature = "chusan", target_arch = "x86_64"),
not(feature = "chusan")
))]
#[cfg(any(chuni, amdaemon))]
pub extern "C" fn chuni_io_jvs_read_coin_counter(total: *mut u16) {
if total.is_null() {
return;
@ -227,11 +194,12 @@ pub extern "C" fn chuni_io_jvs_read_coin_counter(total: *mut u16) {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86"))]
#[cfg(chusanapp)]
pub extern "C" fn chuni_io_jvs_read_coin_counter(_total: *mut u16) {}
#[no_mangle]
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[allow(unreachable_code)]
#[cfg(any(chuni, chusanapp))]
pub unsafe extern "C" fn chuni_io_slider_init() -> HRESULT {
match create_shared_memory("Local\\YubideckOutput", 122, true) {
Ok(s) => OUTPUT_SHMEM = Some(Arc::new(Mutex::new(s))),
@ -256,13 +224,13 @@ pub unsafe extern "C" fn chuni_io_slider_init() -> HRESULT {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86_64"))]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_slider_init(_callback: *const c_void) -> HRESULT {
S_OK
}
#[no_mangle]
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
pub unsafe extern "C" fn chuni_io_slider_start(callback: *const c_void) {
if callback.is_null() {
return;
@ -298,11 +266,11 @@ pub unsafe extern "C" fn chuni_io_slider_start(callback: *const c_void) {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86_64"))]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_slider_start(_callback: *const c_void) {}
#[no_mangle]
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
pub extern "C" fn chuni_io_slider_stop() {
let Some(thread) = (unsafe { SLIDER_THREAD.take() }) else {
return;
@ -314,11 +282,11 @@ pub extern "C" fn chuni_io_slider_stop() {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86_64"))]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_slider_stop() {}
#[no_mangle]
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
pub unsafe extern "C" fn chuni_io_slider_set_leds(rgb: *const u8) {
if rgb.is_null() {
return;
@ -367,7 +335,7 @@ pub unsafe extern "C" fn chuni_io_slider_set_leds(rgb: *const u8) {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86_64"))]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_slider_set_leds(_rgb: *const u8) {}
#[no_mangle]
@ -376,7 +344,7 @@ pub extern "C" fn chuni_io_led_init() -> HRESULT {
}
#[no_mangle]
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
pub unsafe extern "C" fn chuni_io_led_set_colors(board: u8, rgb: *const u8) {
let Some(device) = DEVICE.get() else { return };
let Some(out_shmem) = &OUTPUT_SHMEM else {
@ -414,7 +382,7 @@ pub unsafe extern "C" fn chuni_io_led_set_colors(board: u8, rgb: *const u8) {
}
#[no_mangle]
#[cfg(all(feature = "chusan", target_arch = "x86_64"))]
#[cfg(amdaemon)]
pub extern "C" fn chuni_io_led_set_colors(_rgb: *const u8) {}
fn create_input_shared_memory() -> HRESULT {
@ -453,7 +421,7 @@ where
.map_err(|e| anyhow!("Failed to create/open shared memory {os_id}: {e:#}"))
}
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
fn yubideck_init() -> Result<()> {
let Some(mut device) = rusb::open_device_with_vid_pid(0x1973, 0x2001) else {
return Err(anyhow!("YubiDeck not found."));
@ -470,7 +438,7 @@ fn yubideck_init() -> Result<()> {
Ok(())
}
#[cfg(any(all(feature = "chusan", target_arch = "x86"), not(feature = "chusan")))]
#[cfg(any(chuni, chusanapp))]
fn input_thread_proc() {
info!("Input thread started");