mirror of
https://github.com/cccb/servicepoint.git
synced 2025-01-18 10:00:14 +01:00
add c api
This commit is contained in:
parent
01d1f1dad0
commit
98e8a6d639
290
Cargo.lock
generated
290
Cargo.lock
generated
|
@ -21,7 +21,7 @@ dependencies = [
|
||||||
name = "announce"
|
name = "announce"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap 4.5.4",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"servicepoint2",
|
"servicepoint2",
|
||||||
]
|
]
|
||||||
|
@ -75,6 +75,35 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atty"
|
||||||
|
version = "0.2.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
|
||||||
|
dependencies = [
|
||||||
|
"hermit-abi",
|
||||||
|
"libc",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "1.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bzip2"
|
name = "bzip2"
|
||||||
version = "0.4.4"
|
version = "0.4.4"
|
||||||
|
@ -96,6 +125,25 @@ dependencies = [
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cbindgen"
|
||||||
|
version = "0.26.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "da6bc11b07529f16944307272d5bd9b22530bc7d05751717c9d416586cedab49"
|
||||||
|
dependencies = [
|
||||||
|
"clap 3.2.25",
|
||||||
|
"heck 0.4.1",
|
||||||
|
"indexmap",
|
||||||
|
"log",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"syn 1.0.109",
|
||||||
|
"tempfile",
|
||||||
|
"toml",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.97"
|
version = "1.0.97"
|
||||||
|
@ -113,6 +161,21 @@ version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "3.2.25"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
|
||||||
|
dependencies = [
|
||||||
|
"atty",
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"clap_lex 0.2.4",
|
||||||
|
"indexmap",
|
||||||
|
"strsim 0.10.0",
|
||||||
|
"termcolor",
|
||||||
|
"textwrap",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.4"
|
version = "4.5.4"
|
||||||
|
@ -131,8 +194,8 @@ checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstream",
|
"anstream",
|
||||||
"anstyle",
|
"anstyle",
|
||||||
"clap_lex",
|
"clap_lex 0.7.0",
|
||||||
"strsim",
|
"strsim 0.11.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -141,10 +204,19 @@ version = "4.5.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
|
checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck 0.5.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.63",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
|
||||||
|
dependencies = [
|
||||||
|
"os_str_bytes",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -191,6 +263,22 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fastrand"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.0.30"
|
version = "1.0.30"
|
||||||
|
@ -205,7 +293,7 @@ dependencies = [
|
||||||
name = "game_of_life"
|
name = "game_of_life"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap 4.5.4",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"rand",
|
"rand",
|
||||||
"servicepoint2",
|
"servicepoint2",
|
||||||
|
@ -222,24 +310,61 @@ dependencies = [
|
||||||
"wasi",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.12.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "heck"
|
name = "heck"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hermit-abi"
|
||||||
|
version = "0.1.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "humantime"
|
name = "humantime"
|
||||||
version = "2.1.0"
|
version = "2.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.9.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "is_terminal_polyfill"
|
name = "is_terminal_polyfill"
|
||||||
version = "1.70.0"
|
version = "1.70.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
|
checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jobserver"
|
name = "jobserver"
|
||||||
version = "0.1.31"
|
version = "0.1.31"
|
||||||
|
@ -255,6 +380,12 @@ version = "0.2.154"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
|
checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linux-raw-sys"
|
||||||
|
version = "0.4.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.21"
|
version = "0.4.21"
|
||||||
|
@ -300,7 +431,7 @@ dependencies = [
|
||||||
name = "moving_line"
|
name = "moving_line"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap 4.5.4",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"servicepoint2",
|
"servicepoint2",
|
||||||
]
|
]
|
||||||
|
@ -311,6 +442,12 @@ version = "1.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os_str_bytes"
|
||||||
|
version = "6.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pkg-config"
|
name = "pkg-config"
|
||||||
version = "0.3.30"
|
version = "0.3.30"
|
||||||
|
@ -375,7 +512,7 @@ dependencies = [
|
||||||
name = "random_brightness"
|
name = "random_brightness"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap 4.5.4",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"rand",
|
"rand",
|
||||||
"servicepoint2",
|
"servicepoint2",
|
||||||
|
@ -410,23 +547,91 @@ version = "0.8.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustix"
|
||||||
|
version = "0.38.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.5.0",
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.201"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.201"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.63",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.117"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "servicepoint2"
|
name = "servicepoint2"
|
||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bzip2",
|
"bzip2",
|
||||||
|
"cbindgen",
|
||||||
"flate2",
|
"flate2",
|
||||||
"log",
|
"log",
|
||||||
"lz4",
|
"lz4",
|
||||||
"zstd",
|
"zstd",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.11.1"
|
version = "0.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.109"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.63"
|
version = "2.0.63"
|
||||||
|
@ -438,6 +643,42 @@ dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tempfile"
|
||||||
|
version = "3.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"fastrand",
|
||||||
|
"rustix",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "termcolor"
|
||||||
|
version = "1.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "textwrap"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.5.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.12"
|
version = "1.0.12"
|
||||||
|
@ -456,6 +697,37 @@ version = "0.11.0+wasi-snapshot-preview1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
|
[[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-util"
|
||||||
|
version = "0.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[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]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.52.0"
|
version = "0.52.0"
|
||||||
|
@ -533,7 +805,7 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
|
||||||
name = "wiping_clear"
|
name = "wiping_clear"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap 4.5.4",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"servicepoint2",
|
"servicepoint2",
|
||||||
]
|
]
|
||||||
|
|
|
@ -4,8 +4,7 @@ use std::time::Duration;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use rand::{distributions, Rng};
|
use rand::{distributions, Rng};
|
||||||
|
|
||||||
use servicepoint2::{Connection, Origin, PixelGrid};
|
use servicepoint2::{Command, Connection, Origin, PixelGrid};
|
||||||
use servicepoint2::Command::BitmapLinearWin;
|
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -24,7 +23,7 @@ fn main() {
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
connection
|
connection
|
||||||
.send(BitmapLinearWin(Origin::top_left(), field.clone()))
|
.send(Command::BitmapLinearWin(Origin::top_left(), field.clone()))
|
||||||
.expect("could not send");
|
.expect("could not send");
|
||||||
thread::sleep(Duration::from_millis(14));
|
thread::sleep(Duration::from_millis(14));
|
||||||
field = iteration(field);
|
field = iteration(field);
|
||||||
|
|
|
@ -3,8 +3,7 @@ use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use servicepoint2::Command::BitmapLinearWin;
|
use servicepoint2::{Command, Connection, Origin, PIXEL_HEIGHT, PIXEL_WIDTH, PixelGrid};
|
||||||
use servicepoint2::{Connection, Origin, PixelGrid, PIXEL_HEIGHT, PIXEL_WIDTH};
|
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
|
@ -25,7 +24,7 @@ fn main() {
|
||||||
pixels.set((y + x_offset) % PIXEL_WIDTH as usize, y, true);
|
pixels.set((y + x_offset) % PIXEL_WIDTH as usize, y, true);
|
||||||
}
|
}
|
||||||
connection
|
connection
|
||||||
.send(BitmapLinearWin(Origin::top_left(), pixels.clone()))
|
.send(Command::BitmapLinearWin(Origin::top_left(), pixels.clone()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
thread::sleep(Duration::from_millis(14));
|
thread::sleep(Duration::from_millis(14));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,8 @@ use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use servicepoint2::Command::BitmapLinearAnd;
|
|
||||||
use servicepoint2::{
|
use servicepoint2::{
|
||||||
BitVec, CompressionCode, Connection, PixelGrid, PIXEL_HEIGHT, PIXEL_WIDTH,
|
BitVec, Command, CompressionCode, Connection, PIXEL_HEIGHT, PIXEL_WIDTH, PixelGrid
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
|
@ -37,7 +36,7 @@ fn main() {
|
||||||
let bit_vec = BitVec::from(&*pixel_data);
|
let bit_vec = BitVec::from(&*pixel_data);
|
||||||
|
|
||||||
connection
|
connection
|
||||||
.send(BitmapLinearAnd(0, bit_vec, CompressionCode::Gz))
|
.send(Command::BitmapLinearAnd(0, bit_vec, CompressionCode::Gz))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
thread::sleep(sleep_duration);
|
thread::sleep(sleep_duration);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,3 +23,6 @@ compression-bz = ["dep:bzip2", "compression"]
|
||||||
compression-lz = ["dep:lz4", "compression"]
|
compression-lz = ["dep:lz4", "compression"]
|
||||||
compression-zs = ["dep:zstd", "compression"]
|
compression-zs = ["dep:zstd", "compression"]
|
||||||
compression = []
|
compression = []
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cbindgen = "0.26.0"
|
||||||
|
|
186
servicepoint2/bindings.h
Normal file
186
servicepoint2/bindings.h
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* size of a single tile in one dimension
|
||||||
|
*/
|
||||||
|
#define sp2_TILE_SIZE 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tile count in the x-direction
|
||||||
|
*/
|
||||||
|
#define sp2_TILE_WIDTH 56
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tile count in the y-direction
|
||||||
|
*/
|
||||||
|
#define sp2_TILE_HEIGHT 20
|
||||||
|
|
||||||
|
/**
|
||||||
|
* screen width in pixels
|
||||||
|
*/
|
||||||
|
#define sp2_PIXEL_WIDTH (sp2_TILE_WIDTH * sp2_TILE_SIZE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* screen height in pixels
|
||||||
|
*/
|
||||||
|
#define sp2_PIXEL_HEIGHT (sp2_TILE_HEIGHT * sp2_TILE_SIZE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pixel count on whole screen
|
||||||
|
*/
|
||||||
|
#define sp2_PIXEL_COUNT ((uintptr_t)sp2_PIXEL_WIDTH * (uintptr_t)sp2_PIXEL_HEIGHT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the kind of compression to use. Availability depends on features.
|
||||||
|
*/
|
||||||
|
enum sp2_CompressionCode {
|
||||||
|
Uncompressed = 0,
|
||||||
|
Gz = 26490,
|
||||||
|
Bz = 25210,
|
||||||
|
Lz = 27770,
|
||||||
|
Zs = 31347,
|
||||||
|
};
|
||||||
|
typedef uint16_t sp2_CompressionCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A vector of bits
|
||||||
|
*/
|
||||||
|
typedef struct sp2_BitVec sp2_BitVec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A grid of bytes
|
||||||
|
*/
|
||||||
|
typedef struct sp2_ByteGrid sp2_ByteGrid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A command to send to the display.
|
||||||
|
*/
|
||||||
|
typedef struct sp2_Command sp2_Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A connection to the display.
|
||||||
|
*/
|
||||||
|
typedef struct sp2_Connection sp2_Connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A grid of pixels stored in packed bytes.
|
||||||
|
*/
|
||||||
|
typedef struct sp2_PixelGrid sp2_PixelGrid;
|
||||||
|
|
||||||
|
typedef uint8_t sp2_Brightness;
|
||||||
|
|
||||||
|
typedef uint16_t sp2_Offset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to load a command from the passed array with the specified length.
|
||||||
|
*
|
||||||
|
* returns: NULL in case of an error, pointer to the allocated command otherwise
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_try_load(const uint8_t *data, uintptr_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones a `Command` instance
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_clone(const struct sp2_Command *original);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::Clear` instance
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_clear(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::HardReset` instance
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_hard_reset(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::FadeOut` instance
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_fade_out(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::Brightness` instance
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_brightness(sp2_Brightness brightness);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::CharBrightness` instance.
|
||||||
|
* The passed `ByteGrid` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_char_brightness(uint16_t x, uint16_t y, struct sp2_ByteGrid *byte_grid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::BitmapLinear` instance.
|
||||||
|
* The passed `BitVec` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_bitmap_linear(sp2_Offset offset,
|
||||||
|
struct sp2_BitVec *bit_vec,
|
||||||
|
sp2_CompressionCode compression);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::BitmapLinearAnd` instance.
|
||||||
|
* The passed `BitVec` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_bitmap_linear_and(sp2_Offset offset,
|
||||||
|
struct sp2_BitVec *bit_vec,
|
||||||
|
sp2_CompressionCode compression);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::BitmapLinearOr` instance.
|
||||||
|
* The passed `BitVec` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_bitmap_linear_or(sp2_Offset offset,
|
||||||
|
struct sp2_BitVec *bit_vec,
|
||||||
|
sp2_CompressionCode compression);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::BitmapLinearXor` instance.
|
||||||
|
* The passed `BitVec` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_bitmap_linear_xor(sp2_Offset offset,
|
||||||
|
struct sp2_BitVec *bit_vec,
|
||||||
|
sp2_CompressionCode compression);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::Cp437Data` instance.
|
||||||
|
* The passed `ByteGrid` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_cp437_data(uint16_t x, uint16_t y, struct sp2_ByteGrid *byte_grid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new `Command::BitmapLinearWin` instance.
|
||||||
|
* The passed `PixelGrid` gets deallocated in the process.
|
||||||
|
*/
|
||||||
|
struct sp2_Command *command_bitmap_linear_win(uint16_t x,
|
||||||
|
uint16_t y,
|
||||||
|
struct sp2_PixelGrid *byte_grid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocates a command. Note that connection_send does this implicitly, so you only need
|
||||||
|
* to do this if you use the library for parsing commands.
|
||||||
|
*/
|
||||||
|
void command_dealloc(struct sp2_Command *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of Connection.
|
||||||
|
* The returned instance has to be deallocated with `connection_dealloc`.
|
||||||
|
*
|
||||||
|
* returns: NULL if connection fails or connected instance
|
||||||
|
*
|
||||||
|
* Panics: bad string encoding
|
||||||
|
*/
|
||||||
|
struct sp2_Connection *connection_open(const char *host);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends the command instance. The instance is consumed / destroyed and cannot be used after this call.
|
||||||
|
*/
|
||||||
|
bool connection_send(const struct sp2_Connection *connection,
|
||||||
|
struct sp2_Command *command_ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes and deallocates a connection instance
|
||||||
|
*/
|
||||||
|
void connection_dealloc(struct sp2_Connection *ptr);
|
16
servicepoint2/build.rs
Normal file
16
servicepoint2/build.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
extern crate cbindgen;
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use cbindgen::Language;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||||
|
|
||||||
|
cbindgen::Builder::new()
|
||||||
|
.with_crate(crate_dir)
|
||||||
|
.with_item_prefix("sp2_")
|
||||||
|
.with_language(Language::C)
|
||||||
|
.generate()
|
||||||
|
.expect("Unable to generate bindings")
|
||||||
|
.write_to_file("bindings.h");
|
||||||
|
}
|
|
@ -105,3 +105,54 @@ impl std::fmt::Debug for BitVec {
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
pub mod c_api {
|
||||||
|
use crate::BitVec;
|
||||||
|
|
||||||
|
/// Creates a new `BitVec` instance.
|
||||||
|
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
||||||
|
pub unsafe extern "C" fn bit_vec_new(size: usize) -> *mut BitVec {
|
||||||
|
Box::into_raw(Box::new(BitVec::new(size)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Loads a `BitVec` from the provided data.
|
||||||
|
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_load(data: *const u8, data_length: usize) -> *mut BitVec {
|
||||||
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
|
Box::into_raw(Box::new(BitVec::from(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clones a `BitVec`.
|
||||||
|
/// The returned instance has to be freed with `bit_vec_dealloc`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_clone(this: *const BitVec) -> *mut BitVec {
|
||||||
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deallocates a `BitVec`.
|
||||||
|
///
|
||||||
|
/// Note: do not call this if the grid has been consumed in another way, e.g. to create a command.
|
||||||
|
pub unsafe extern "C" fn byte_grid_dealloc(this: *mut BitVec) {
|
||||||
|
_ = Box::from_raw(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the value of a bit from the `BitVec`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_get(this: *const BitVec, index: usize) -> bool {
|
||||||
|
(*this).get(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the value of a bit in the `BitVec`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_set(this: *mut BitVec, index: usize, value: bool) -> bool {
|
||||||
|
(*this).set(index, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the value of all bits in the `BitVec`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_fill(this: *mut BitVec, value: bool) {
|
||||||
|
(*this).fill(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the length of the `BitVec` in bits.
|
||||||
|
pub unsafe extern "C" fn byte_grid_len(this: *const BitVec) -> usize{
|
||||||
|
(*this).len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -57,3 +57,60 @@ impl Into<Vec<u8>> for ByteGrid {
|
||||||
self.data
|
self.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
pub mod c_api
|
||||||
|
{
|
||||||
|
use crate::{ByteGrid, PixelGrid};
|
||||||
|
|
||||||
|
/// Creates a new `ByteGrid` instance.
|
||||||
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_new(width: usize, height: usize) -> *mut ByteGrid {
|
||||||
|
Box::into_raw(Box::new(ByteGrid::new(width, height)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Loads a `ByteGrid` with the specified dimensions from the provided data.
|
||||||
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_load(width: usize, height: usize, data: *const u8, data_length: usize) -> *mut ByteGrid {
|
||||||
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
|
Box::into_raw(Box::new(ByteGrid::load(width, height, data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clones a `ByteGrid`.
|
||||||
|
/// The returned instance has to be freed with `byte_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn byte_grid_clone(this: *const ByteGrid) -> *mut ByteGrid {
|
||||||
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deallocates a `ByteGrid`.
|
||||||
|
///
|
||||||
|
/// Note: do not call this if the grid has been consumed in another way, e.g. to create a command.
|
||||||
|
pub unsafe extern "C" fn byte_grid_dealloc(this: *mut ByteGrid) {
|
||||||
|
_ = Box::from_raw(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the current value at the specified position
|
||||||
|
pub unsafe extern "C" fn byte_grid_get(this: *const ByteGrid, x: usize, y: usize) -> u8 {
|
||||||
|
(*this).get(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the current value at the specified position
|
||||||
|
pub unsafe extern "C" fn byte_grid_set(this: *mut ByteGrid, x: usize, y: usize, value: u8) {
|
||||||
|
(*this).set(x, y, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fills the whole `ByteGrid` with the specified value
|
||||||
|
pub unsafe extern "C" fn byte_grid_fill(this: *mut ByteGrid, value: u8) {
|
||||||
|
(*this).fill(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the width in pixels of the `ByteGrid` instance.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_width(this: *const PixelGrid) -> usize {
|
||||||
|
(*this).width
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the height in pixels of the `ByteGrid` instance.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_height(this: *const PixelGrid) -> usize {
|
||||||
|
(*this).height
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::compression::{into_compressed, into_decompressed};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
BitVec, ByteGrid, CommandCode, CompressionCode, Header, Packet, PixelGrid,
|
BitVec, ByteGrid, CommandCode, CompressionCode, Header, Packet, PixelGrid,
|
||||||
TILE_SIZE,
|
TILE_SIZE,
|
||||||
};
|
};
|
||||||
|
use crate::compression::{into_compressed, into_decompressed};
|
||||||
|
|
||||||
/// An origin marks the top left position of a window sent to the display.
|
/// An origin marks the top left position of a window sent to the display.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -18,12 +18,12 @@ impl Origin {
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct Size(pub u16, pub u16);
|
pub struct Size(pub u16, pub u16);
|
||||||
|
|
||||||
type Offset = u16;
|
pub type Offset = u16;
|
||||||
|
|
||||||
type Brightness = u8;
|
pub type Brightness = u8;
|
||||||
|
|
||||||
/// A command to send to the display.
|
/// A command to send to the display.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
/// Set all pixels to the off state
|
/// Set all pixels to the off state
|
||||||
Clear,
|
Clear,
|
||||||
|
@ -315,3 +315,121 @@ fn packet_into_linear_bitmap(
|
||||||
};
|
};
|
||||||
Ok((BitVec::from(&*payload), sub))
|
Ok((BitVec::from(&*payload), sub))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
pub mod c_api
|
||||||
|
{
|
||||||
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
|
use crate::{BitVec, Brightness, ByteGrid, Command, CompressionCode, Offset, Origin, Packet, PixelGrid};
|
||||||
|
|
||||||
|
/// Tries to load a command from the passed array with the specified length.
|
||||||
|
///
|
||||||
|
/// returns: NULL in case of an error, pointer to the allocated command otherwise
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_try_load(data: *const u8, length: usize) -> *mut Command {
|
||||||
|
let data = std::slice::from_raw_parts(data, length);
|
||||||
|
let packet = match Packet::try_from(data) {
|
||||||
|
Err(_) => return null_mut(),
|
||||||
|
Ok(packet) => packet
|
||||||
|
};
|
||||||
|
let command = match Command::try_from(packet) {
|
||||||
|
Err(_) => return null_mut(),
|
||||||
|
Ok(command) => command,
|
||||||
|
};
|
||||||
|
Box::into_raw(Box::new(command))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clones a `Command` instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_clone(original: *const Command) -> *mut Command {
|
||||||
|
Box::into_raw(Box::new((*original).clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::Clear` instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_clear() -> *mut Command {
|
||||||
|
Box::into_raw(Box::new(Command::Clear))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::HardReset` instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_hard_reset() -> *mut Command {
|
||||||
|
Box::into_raw(Box::new(Command::HardReset))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::FadeOut` instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_fade_out() -> *mut Command {
|
||||||
|
Box::into_raw(Box::new(Command::FadeOut))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::Brightness` instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_brightness(brightness: Brightness) -> *mut Command {
|
||||||
|
Box::into_raw(Box::new(Command::Brightness(brightness)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::CharBrightness` instance.
|
||||||
|
/// The passed `ByteGrid` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_char_brightness(x: u16, y: u16, byte_grid: *mut ByteGrid) -> *mut Command {
|
||||||
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
|
Box::into_raw(Box::new(Command::CharBrightness(Origin(x, y), byte_grid)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::BitmapLinear` instance.
|
||||||
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_bitmap_linear(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
||||||
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
|
Box::into_raw(Box::new(Command::BitmapLinear(offset, bit_vec, compression)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::BitmapLinearAnd` instance.
|
||||||
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_bitmap_linear_and(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
||||||
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
|
Box::into_raw(Box::new(Command::BitmapLinearAnd(offset, bit_vec, compression)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::BitmapLinearOr` instance.
|
||||||
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_bitmap_linear_or(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
||||||
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
|
Box::into_raw(Box::new(Command::BitmapLinearOr(offset, bit_vec, compression)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::BitmapLinearXor` instance.
|
||||||
|
/// The passed `BitVec` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_bitmap_linear_xor(offset: Offset, bit_vec: *mut BitVec, compression: CompressionCode) -> *mut Command {
|
||||||
|
let bit_vec = *Box::from_raw(bit_vec);
|
||||||
|
Box::into_raw(Box::new(Command::BitmapLinearXor(offset, bit_vec, compression)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::Cp437Data` instance.
|
||||||
|
/// The passed `ByteGrid` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_cp437_data(x: u16, y: u16, byte_grid: *mut ByteGrid) -> *mut Command {
|
||||||
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
|
Box::into_raw(Box::new(Command::Cp437Data(Origin(x, y), byte_grid)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocates a new `Command::BitmapLinearWin` instance.
|
||||||
|
/// The passed `PixelGrid` gets deallocated in the process.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_bitmap_linear_win(x: u16, y: u16, byte_grid: *mut PixelGrid) -> *mut Command {
|
||||||
|
let byte_grid = *Box::from_raw(byte_grid);
|
||||||
|
Box::into_raw(Box::new(Command::BitmapLinearWin(Origin(x, y), byte_grid)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deallocates a command. Note that connection_send does this implicitly, so you only need
|
||||||
|
/// to do this if you use the library for parsing commands.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn command_dealloc(ptr: *mut Command) {
|
||||||
|
_ = Box::from_raw(ptr);
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,3 +64,42 @@ impl Connection {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod c_api
|
||||||
|
{
|
||||||
|
use std::ffi::{c_char, CStr};
|
||||||
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
|
use crate::{Command, Connection};
|
||||||
|
|
||||||
|
/// Creates a new instance of Connection.
|
||||||
|
/// The returned instance has to be deallocated with `connection_dealloc`.
|
||||||
|
///
|
||||||
|
/// returns: NULL if connection fails or connected instance
|
||||||
|
///
|
||||||
|
/// Panics: bad string encoding
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn connection_open(host: *const c_char) -> *mut Connection {
|
||||||
|
let host = CStr::from_ptr(host).to_str().expect("Bad encoding");
|
||||||
|
let connection = match Connection::open(host) {
|
||||||
|
Err(_) => return null_mut(),
|
||||||
|
Ok(value) => value
|
||||||
|
};
|
||||||
|
|
||||||
|
let boxed = Box::new(connection);
|
||||||
|
Box::into_raw(boxed)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sends the command instance. The instance is consumed / destroyed and cannot be used after this call.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn connection_send(connection: *const Connection, command_ptr: *mut Command) -> bool{
|
||||||
|
let command = Box::from_raw(command_ptr);
|
||||||
|
(*connection).send(*command).is_ok()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Closes and deallocates a connection instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn connection_dealloc(ptr: *mut Connection) {
|
||||||
|
_ = Box::from_raw(ptr);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
pub use crate::bit_vec::BitVec;
|
pub use crate::bit_vec::BitVec;
|
||||||
pub use crate::byte_grid::ByteGrid;
|
pub use crate::byte_grid::ByteGrid;
|
||||||
pub use crate::command::{Command, Origin, Size};
|
pub use crate::command::{Brightness, Command, Offset, Origin, Size};
|
||||||
pub use crate::command_code::CommandCode;
|
pub use crate::command_code::CommandCode;
|
||||||
pub use crate::compression_code::CompressionCode;
|
pub use crate::compression_code::CompressionCode;
|
||||||
pub use crate::connection::Connection;
|
pub use crate::connection::Connection;
|
||||||
|
|
|
@ -45,3 +45,16 @@ impl From<Payload> for Packet {
|
||||||
Packet(Header(mode, a, b, c, d), payload)
|
Packet(Header(mode, a, b, c, d), payload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&[u8]> for Packet {
|
||||||
|
fn from(value: &[u8]) -> Self {
|
||||||
|
let mode = u16_from_be_slice(&value[0..=1]);
|
||||||
|
let a = u16_from_be_slice(&value[2..=3]);
|
||||||
|
let b = u16_from_be_slice(&value[4..=5]);
|
||||||
|
let c = u16_from_be_slice(&value[6..=7]);
|
||||||
|
let d = u16_from_be_slice(&value[8..=9]);
|
||||||
|
let payload = value[10..].to_vec();
|
||||||
|
|
||||||
|
Packet(Header(mode, a, b, c, d), payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -83,3 +83,60 @@ impl Into<Vec<u8>> for PixelGrid {
|
||||||
self.bit_vec.into()
|
self.bit_vec.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
pub mod c_api
|
||||||
|
{
|
||||||
|
use crate::PixelGrid;
|
||||||
|
|
||||||
|
/// Creates a new `PixelGrid` instance.
|
||||||
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_new(width: usize, height: usize) -> *mut PixelGrid {
|
||||||
|
Box::into_raw(Box::new(PixelGrid::new(width, height)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Loads a `PixelGrid` with the specified dimensions from the provided data.
|
||||||
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_load(width: usize, height: usize, data: *const u8, data_length: usize) -> *mut PixelGrid {
|
||||||
|
let data = std::slice::from_raw_parts(data, data_length);
|
||||||
|
Box::into_raw(Box::new(PixelGrid::load(width, height, data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clones a `PixelGrid`.
|
||||||
|
/// The returned instance has to be freed with `pixel_grid_dealloc`.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_clone(this: *const PixelGrid) -> *mut PixelGrid {
|
||||||
|
Box::into_raw(Box::new((*this).clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deallocates a `PixelGrid`.
|
||||||
|
///
|
||||||
|
/// Note: do not call this if the grid has been consumed in another way, e.g. to create a command.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_dealloc(this: *mut PixelGrid) {
|
||||||
|
_ = Box::from_raw(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the current value at the specified position
|
||||||
|
pub unsafe extern "C" fn pixel_grid_get(this: *const PixelGrid, x: usize, y: usize) -> bool {
|
||||||
|
(*this).get(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the current value at the specified position
|
||||||
|
pub unsafe extern "C" fn pixel_grid_set(this: *mut PixelGrid, x: usize, y: usize, value: bool) {
|
||||||
|
(*this).set(x, y, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fills the whole `PixelGrid` with the specified value
|
||||||
|
pub unsafe extern "C" fn pixel_grid_fill(this: *mut PixelGrid, value: bool) {
|
||||||
|
(*this).fill(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the width in pixels of the `PixelGrid` instance.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_width(this: *const PixelGrid) -> usize {
|
||||||
|
(*this).width
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the height in pixels of the `PixelGrid` instance.
|
||||||
|
pub unsafe extern "C" fn pixel_grid_height(this: *const PixelGrid) -> usize {
|
||||||
|
(*this).height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue