partial work

This commit is contained in:
pszsh 2026-03-09 09:58:56 -07:00
parent 03d6312e22
commit 61287e5b8e
7 changed files with 148 additions and 377 deletions

378
cue/Cargo.lock generated
View File

@ -54,6 +54,28 @@ version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "alsa"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43"
dependencies = [
"alsa-sys",
"bitflags 2.11.0",
"cfg-if",
"libc",
]
[[package]]
name = "alsa-sys"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527"
dependencies = [
"libc",
"pkg-config",
]
[[package]] [[package]]
name = "android-activity" name = "android-activity"
version = "0.6.0" version = "0.6.0"
@ -64,7 +86,7 @@ dependencies = [
"bitflags 2.11.0", "bitflags 2.11.0",
"cc", "cc",
"cesu8", "cesu8",
"jni 0.21.1", "jni",
"jni-sys", "jni-sys",
"libc", "libc",
"log", "log",
@ -350,63 +372,6 @@ dependencies = [
"piper", "piper",
] ]
[[package]]
name = "bluez-async"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84ae4213cc2a8dc663acecac67bbdad05142be4d8ef372b6903abf878b0c690a"
dependencies = [
"bitflags 2.11.0",
"bluez-generated",
"dbus",
"dbus-tokio",
"futures",
"itertools",
"log",
"serde",
"serde-xml-rs",
"thiserror 2.0.18",
"tokio",
"uuid",
]
[[package]]
name = "bluez-generated"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9676783265eadd6f11829982792c6f303f3854d014edfba384685dcf237dd062"
dependencies = [
"dbus",
]
[[package]]
name = "btleplug"
version = "0.11.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9a11621cb2c8c024e444734292482b1ad86fb50ded066cf46252e46643c8748"
dependencies = [
"async-trait",
"bitflags 2.11.0",
"bluez-async",
"dashmap 6.1.0",
"dbus",
"futures",
"jni 0.19.0",
"jni-utils",
"log",
"objc2 0.5.2",
"objc2-core-bluetooth",
"objc2-foundation 0.2.2",
"once_cell",
"static_assertions",
"thiserror 2.0.18",
"tokio",
"tokio-stream",
"uuid",
"windows 0.61.3",
"windows-future",
]
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.20.2" version = "3.20.2"
@ -671,6 +636,27 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "coremidi"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "964eb3e10ea8b0d29c797086aab3ca730f75e06dced0cb980642fd274a5cca30"
dependencies = [
"block",
"core-foundation",
"core-foundation-sys",
"coremidi-sys",
]
[[package]]
name = "coremidi-sys"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc9504310988d938e49fff1b5f1e56e3dafe39bb1bae580c19660b58b83a191e"
dependencies = [
"core-foundation-sys",
]
[[package]] [[package]]
name = "cosmic-text" name = "cosmic-text"
version = "0.12.1" version = "0.12.1"
@ -763,11 +749,10 @@ checksum = "e162d0c2e2068eb736b71e5597eff0b9944e6b973cd9f37b6a288ab9bf20e300"
name = "cue" name = "cue"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"btleplug",
"futures", "futures",
"iced", "iced",
"midir",
"tokio", "tokio",
"uuid",
] ]
[[package]] [[package]]
@ -803,57 +788,6 @@ dependencies = [
"zbus", "zbus",
] ]
[[package]]
name = "dashmap"
version = "5.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
dependencies = [
"cfg-if",
"hashbrown 0.14.5",
"lock_api",
"once_cell",
"parking_lot_core 0.9.12",
]
[[package]]
name = "dashmap"
version = "6.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
dependencies = [
"cfg-if",
"crossbeam-utils",
"hashbrown 0.14.5",
"lock_api",
"once_cell",
"parking_lot_core 0.9.12",
]
[[package]]
name = "dbus"
version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b3aa68d7e7abee336255bd7248ea965cc393f3e70411135a6f6a4b651345d4"
dependencies = [
"futures-channel",
"futures-util",
"libc",
"libdbus-sys",
"windows-sys 0.59.0",
]
[[package]]
name = "dbus-tokio"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "007688d459bc677131c063a3a77fb899526e17b7980f390b69644bdbc41fad13"
dependencies = [
"dbus",
"libc",
"tokio",
]
[[package]] [[package]]
name = "dconf_rs" name = "dconf_rs"
version = "0.3.0" version = "0.3.0"
@ -1301,7 +1235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
dependencies = [ dependencies = [
"rustix 1.1.4", "rustix 1.1.4",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@ -1732,35 +1666,12 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "itertools"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.17" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]]
name = "jni"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
dependencies = [
"cesu8",
"combine",
"jni-sys",
"log",
"thiserror 1.0.69",
"walkdir",
]
[[package]] [[package]]
name = "jni" name = "jni"
version = "0.21.1" version = "0.21.1"
@ -1783,21 +1694,6 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jni-utils"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "259e9f2c3ead61de911f147000660511f07ab00adeed1d84f5ac4d0386e7a6c4"
dependencies = [
"dashmap 5.5.3",
"futures",
"jni 0.19.0",
"log",
"once_cell",
"static_assertions",
"uuid",
]
[[package]] [[package]]
name = "jobserver" name = "jobserver"
version = "0.1.34" version = "0.1.34"
@ -1857,15 +1753,6 @@ version = "0.2.183"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
[[package]]
name = "libdbus-sys"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043"
dependencies = [
"pkg-config",
]
[[package]] [[package]]
name = "libloading" name = "libloading"
version = "0.7.4" version = "0.7.4"
@ -1883,7 +1770,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@ -2043,6 +1930,23 @@ dependencies = [
"paste", "paste",
] ]
[[package]]
name = "midir"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b73f8737248ad37b88291a2108d9df5f991dc8555103597d586b5a29d4d703c0"
dependencies = [
"alsa",
"bitflags 1.3.2",
"coremidi",
"js-sys",
"libc",
"parking_lot 0.12.5",
"wasm-bindgen",
"web-sys",
"windows 0.56.0",
]
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.9" version = "0.8.9"
@ -2243,17 +2147,6 @@ dependencies = [
"objc2-foundation 0.2.2", "objc2-foundation 0.2.2",
] ]
[[package]]
name = "objc2-core-bluetooth"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a644b62ffb826a5277f536cf0f701493de420b13d40e700c452c36567771111"
dependencies = [
"bitflags 2.11.0",
"objc2 0.5.2",
"objc2-foundation 0.2.2",
]
[[package]] [[package]]
name = "objc2-core-data" name = "objc2-core-data"
version = "0.2.2" version = "0.2.2"
@ -2588,7 +2481,7 @@ dependencies = [
"libc", "libc",
"redox_syscall 0.5.18", "redox_syscall 0.5.18",
"smallvec", "smallvec",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@ -3070,18 +2963,6 @@ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]]
name = "serde-xml-rs"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc2215ce3e6a77550b80a1c37251b7d294febaf42e36e21b7b411e0bf54d540d"
dependencies = [
"log",
"serde",
"thiserror 2.0.18",
"xml",
]
[[package]] [[package]]
name = "serde_core" name = "serde_core"
version = "1.0.228" version = "1.0.228"
@ -3523,31 +3404,6 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "tokio-stream"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
dependencies = [
"futures-core",
"pin-project-lite",
"tokio",
"tokio-util",
]
[[package]]
name = "tokio-util"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
dependencies = [
"bytes",
"futures-core",
"futures-sink",
"pin-project-lite",
"tokio",
]
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "1.0.0+spec-1.1.0" version = "1.0.0+spec-1.1.0"
@ -3705,16 +3561,6 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "uuid"
version = "1.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.5" version = "0.9.5"
@ -4188,24 +4034,12 @@ dependencies = [
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.61.3" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132"
dependencies = [ dependencies = [
"windows-collections", "windows-core 0.56.0",
"windows-core 0.61.2", "windows-targets 0.52.6",
"windows-future",
"windows-link 0.1.3",
"windows-numerics",
]
[[package]]
name = "windows-collections"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
dependencies = [
"windows-core 0.61.2",
] ]
[[package]] [[package]]
@ -4219,33 +4053,21 @@ dependencies = [
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.61.2" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6"
dependencies = [ dependencies = [
"windows-implement", "windows-implement",
"windows-interface", "windows-interface",
"windows-link 0.1.3",
"windows-result", "windows-result",
"windows-strings", "windows-targets 0.52.6",
]
[[package]]
name = "windows-future"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
dependencies = [
"windows-core 0.61.2",
"windows-link 0.1.3",
"windows-threading",
] ]
[[package]] [[package]]
name = "windows-implement" name = "windows-implement"
version = "0.60.2" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4254,53 +4076,28 @@ dependencies = [
[[package]] [[package]]
name = "windows-interface" name = "windows-interface"
version = "0.59.3" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "windows-link"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]] [[package]]
name = "windows-link" name = "windows-link"
version = "0.2.1" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-numerics"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
dependencies = [
"windows-core 0.61.2",
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows-result" name = "windows-result"
version = "0.3.4" version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
dependencies = [ dependencies = [
"windows-link 0.1.3", "windows-targets 0.52.6",
]
[[package]]
name = "windows-strings"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
"windows-link 0.1.3",
] ]
[[package]] [[package]]
@ -4336,7 +4133,7 @@ version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@ -4370,15 +4167,6 @@ dependencies = [
"windows_x86_64_msvc 0.52.6", "windows_x86_64_msvc 0.52.6",
] ]
[[package]]
name = "windows-threading"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
dependencies = [
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.42.2" version = "0.42.2"
@ -4694,12 +4482,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
[[package]]
name = "xml"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a"
[[package]] [[package]]
name = "xml-rs" name = "xml-rs"
version = "0.8.28" version = "0.8.28"

View File

@ -5,7 +5,6 @@ edition = "2024"
[dependencies] [dependencies]
iced = { version = "0.13", features = ["canvas", "tokio"] } iced = { version = "0.13", features = ["canvas", "tokio"] }
btleplug = "0.11" midir = "0.10"
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
futures = "0.3" futures = "0.3"
uuid = "1"

View File

@ -60,7 +60,7 @@ impl App {
fn send_cmd(&self, sysex: &[u8]) { fn send_cmd(&self, sysex: &[u8]) {
if let Some(tx) = &self.cmd_tx { if let Some(tx) = &self.cmd_tx {
let _ = tx.send(protocol::wrap_ble_midi(sysex)); let _ = tx.send(sysex.to_vec());
} }
} }

View File

@ -1,13 +1,9 @@
use btleplug::api::{Central, Manager as _, Peripheral as _, ScanFilter, WriteType}; use midir::{MidiInput, MidiOutput, MidiInputConnection, MidiOutputConnection};
use btleplug::platform::{Adapter, Manager, Peripheral}; use std::sync::mpsc as std_mpsc;
use futures::StreamExt;
use std::time::Duration;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use uuid::Uuid;
use crate::protocol::{self, EisMessage}; use crate::protocol::{self, EisMessage};
const MIDI_CHR_UUID: Uuid = Uuid::from_u128(0x7772E5DB_3868_4112_A1A9_F2669D106BF3);
const DEVICE_NAME: &str = "EIS4"; const DEVICE_NAME: &str = "EIS4";
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -20,62 +16,77 @@ pub async fn connect_and_run(
tx: mpsc::UnboundedSender<BleEvent>, tx: mpsc::UnboundedSender<BleEvent>,
mut cmd_rx: mpsc::UnboundedReceiver<Vec<u8>>, mut cmd_rx: mpsc::UnboundedReceiver<Vec<u8>>,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> { ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let _ = tx.send(BleEvent::Status("Scanning...".into())); let _ = tx.send(BleEvent::Status("Looking for MIDI device...".into()));
let manager = Manager::new().await?; let (midi_in, in_port, midi_out, out_port) = loop {
let adapter = manager.adapters().await?.into_iter().next() if let Some(found) = find_midi_ports() {
.ok_or("no BLE adapter")?; break found;
}
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
};
adapter.start_scan(ScanFilter::default()).await?; let _ = tx.send(BleEvent::Status("Connecting MIDI...".into()));
tokio::time::sleep(Duration::from_secs(3)).await;
let device = find_device(&adapter).await?; let (sysex_tx, sysex_rx) = std_mpsc::channel::<Vec<u8>>();
let _ = tx.send(BleEvent::Status("Connecting...".into()));
device.connect().await?; let _in_conn: MidiInputConnection<()> = midi_in.connect(
device.discover_services().await?; &in_port, "cue-in",
move |_ts, data, _| {
if let Some(sysex) = extract_sysex(data) {
let _ = sysex_tx.send(sysex);
}
},
(),
).map_err(|e| format!("MIDI input connect: {e}"))?;
let chars = device.characteristics(); let mut out_conn: MidiOutputConnection = midi_out.connect(
let midi_chr = chars.iter() &out_port, "cue-out",
.find(|c| c.uuid == MIDI_CHR_UUID) ).map_err(|e| format!("MIDI output connect: {e}"))?;
.ok_or("MIDI characteristic not found")?
.clone();
device.subscribe(&midi_chr).await?;
let _ = tx.send(BleEvent::Status("Connected".into())); let _ = tx.send(BleEvent::Status("Connected".into()));
let mut notifs = device.notifications().await?;
loop { loop {
tokio::select! { while let Ok(sysex) = sysex_rx.try_recv() {
Some(notif) = notifs.next() => { if let Some(msg) = protocol::parse_sysex(&sysex) {
if notif.uuid == MIDI_CHR_UUID { let _ = tx.send(BleEvent::Data(msg));
if let Some(sysex) = protocol::extract_sysex_from_ble_midi(&notif.value) {
if let Some(msg) = protocol::parse_sysex(&sysex) {
let _ = tx.send(BleEvent::Data(msg));
}
}
}
} }
Some(pkt) = cmd_rx.recv() => {
device.write(&midi_chr, &pkt, WriteType::WithoutResponse).await.ok();
}
else => break,
} }
match cmd_rx.try_recv() {
Ok(pkt) => {
out_conn.send(&pkt).ok();
}
Err(mpsc::error::TryRecvError::Disconnected) => break,
Err(mpsc::error::TryRecvError::Empty) => {}
}
tokio::time::sleep(std::time::Duration::from_millis(5)).await;
} }
let _ = tx.send(BleEvent::Status("Disconnected".into())); let _ = tx.send(BleEvent::Status("Disconnected".into()));
Ok(()) Ok(())
} }
async fn find_device(adapter: &Adapter) -> Result<Peripheral, Box<dyn std::error::Error + Send + Sync>> { fn find_midi_ports() -> Option<(
let peripherals = adapter.peripherals().await?; MidiInput, midir::MidiInputPort,
for p in peripherals { MidiOutput, midir::MidiOutputPort,
if let Some(props) = p.properties().await? { )> {
if props.local_name.as_deref() == Some(DEVICE_NAME) { let midi_in = MidiInput::new("cue-in").ok()?;
return Ok(p); let midi_out = MidiOutput::new("cue-out").ok()?;
}
} let in_port = midi_in.ports().into_iter().find(|p| {
} midi_in.port_name(p).map_or(false, |n| n.contains(DEVICE_NAME))
Err(format!("{} not found", DEVICE_NAME).into()) })?;
let out_port = midi_out.ports().into_iter().find(|p| {
midi_out.port_name(p).map_or(false, |n| n.contains(DEVICE_NAME))
})?;
Some((midi_in, in_port, midi_out, out_port))
}
fn extract_sysex(data: &[u8]) -> Option<Vec<u8>> {
if data.first() != Some(&0xF0) { return None; }
let end = data.iter().position(|&b| b == 0xF7)?;
Some(data[1..end].to_vec())
} }

View File

@ -188,17 +188,3 @@ pub fn build_sysex_start_sweep() -> Vec<u8> {
pub fn build_sysex_get_config() -> Vec<u8> { pub fn build_sysex_get_config() -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_GET_CONFIG, 0xF7] vec![0xF0, SYSEX_MFR, CMD_GET_CONFIG, 0xF7]
} }
pub fn wrap_ble_midi(sysex: &[u8]) -> Vec<u8> {
let mut pkt = vec![0x80, 0x80];
pkt.extend_from_slice(sysex);
pkt
}
pub fn extract_sysex_from_ble_midi(packet: &[u8]) -> Option<Vec<u8>> {
if packet.len() < 4 { return None; }
let midi = &packet[2..];
if midi.first() != Some(&0xF0) { return None; }
let end = midi.iter().position(|&b| b == 0xF7)?;
Some(midi[1..end].to_vec())
}

View File

@ -151,14 +151,7 @@ void eis_init(const EISConfig *cfg)
gpio.OutputEnSet = AGPIO_Pin0; gpio.OutputEnSet = AGPIO_Pin0;
AD5940_AGPIOCfg(&gpio); AD5940_AGPIOCfg(&gpio);
FIFOCfg_Type fifo; AD5940_WriteReg(REG_AFE_FIFOCON, 0);
AD5940_StructInit(&fifo, sizeof(fifo));
fifo.FIFOEn = bFALSE;
fifo.FIFOMode = FIFOMODE_FIFO;
fifo.FIFOSize = FIFOSIZE_2KB;
fifo.FIFOSrc = FIFOSRC_DFT;
fifo.FIFOThresh = 4;
AD5940_FIFOCfg(&fifo);
SEQCfg_Type seq; SEQCfg_Type seq;
seq.SeqMemSize = SEQMEMSIZE_4KB; seq.SeqMemSize = SEQMEMSIZE_4KB;
@ -184,7 +177,6 @@ void eis_reconfigure(const EISConfig *cfg)
{ {
memcpy(&ctx.cfg, cfg, sizeof(EISConfig)); memcpy(&ctx.cfg, cfg, sizeof(EISConfig));
resolve_config(); resolve_config();
apply_hsloop();
} }
/* ---------- internal helpers ---------- */ /* ---------- internal helpers ---------- */
@ -232,12 +224,17 @@ static int32_t sign_extend_18(uint32_t v)
static void dft_measure(uint32_t mux_p, uint32_t mux_n, iImpCar_Type *out) static void dft_measure(uint32_t mux_p, uint32_t mux_n, iImpCar_Type *out)
{ {
AD5940_AFECtrlS(AFECTRL_ADCCNV | AFECTRL_DFT, bFALSE);
AD5940_WriteReg(REG_AFE_FIFOCON, 0);
AD5940_ReadAfeResult(AFERESULT_DFTREAL);
AD5940_ReadAfeResult(AFERESULT_DFTIMAGE);
AD5940_INTCClrFlag(AFEINTSRC_DFTRDY);
AD5940_ADCMuxCfgS(mux_p, mux_n); AD5940_ADCMuxCfgS(mux_p, mux_n);
AD5940_AFECtrlS(AFECTRL_WG | AFECTRL_ADCPWR, bTRUE); AD5940_AFECtrlS(AFECTRL_WG | AFECTRL_ADCPWR, bTRUE);
AD5940_Delay10us(25); AD5940_Delay10us(25);
AD5940_INTCClrFlag(AFEINTSRC_DFTRDY);
AD5940_AFECtrlS(AFECTRL_ADCCNV | AFECTRL_DFT, bTRUE); AD5940_AFECtrlS(AFECTRL_ADCCNV | AFECTRL_DFT, bTRUE);
uint32_t timeout = 10000000; uint32_t timeout = 10000000;

View File

@ -11,14 +11,10 @@
static EISConfig cfg; static EISConfig cfg;
static EISPoint results[EIS_MAX_POINTS]; static EISPoint results[EIS_MAX_POINTS];
static bool afe_inited;
static void do_sweep(void) static void do_sweep(void)
{ {
if (!afe_inited) { eis_init(&cfg);
eis_init(&cfg);
afe_inited = true;
}
uint32_t n = eis_calc_num_points(&cfg); uint32_t n = eis_calc_num_points(&cfg);
int got = eis_sweep(results, n); int got = eis_sweep(results, n);