Clean up rust implementation, add lidar implementation in rust
This commit is contained in:
360
car-rs/Cargo.lock
generated
360
car-rs/Cargo.lock
generated
@@ -2,27 +2,6 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "CoreFoundation-sys"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d0e9889e6db118d49d88d84728d0e964d973a5680befb5f85f55141beea5c20b"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"mach 0.1.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "IOKit-sys"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "99696c398cbaf669d2368076bdb3d627fb0ce51a26899d7c61228c5c0af3bf4a"
|
|
||||||
dependencies = [
|
|
||||||
"CoreFoundation-sys",
|
|
||||||
"libc",
|
|
||||||
"mach 0.1.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
version = "0.7.18"
|
version = "0.7.18"
|
||||||
@@ -78,13 +57,13 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "axum"
|
name = "axum"
|
||||||
version = "0.5.13"
|
version = "0.6.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6b9496f0c1d1afb7a2af4338bbe1d969cddfead41d87a9fb3aaa6d0bbc7af648"
|
checksum = "678c5130a507ae3a7c797f9a17393c14849300b8440eac47cdb90a5bdcb3a543"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum-core",
|
"axum-core",
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http",
|
"http",
|
||||||
@@ -96,9 +75,9 @@ dependencies = [
|
|||||||
"mime",
|
"mime",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"rustversion",
|
||||||
"serde",
|
"serde",
|
||||||
"sync_wrapper",
|
"sync_wrapper",
|
||||||
"tokio",
|
|
||||||
"tower",
|
"tower",
|
||||||
"tower-http",
|
"tower-http",
|
||||||
"tower-layer",
|
"tower-layer",
|
||||||
@@ -107,9 +86,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "axum-core"
|
name = "axum-core"
|
||||||
version = "0.2.7"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635"
|
checksum = "1cae3e661676ffbacb30f1a824089a8c9150e71017f7e1e38f2aa32009188d34"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -117,6 +96,9 @@ dependencies = [
|
|||||||
"http",
|
"http",
|
||||||
"http-body",
|
"http-body",
|
||||||
"mime",
|
"mime",
|
||||||
|
"rustversion",
|
||||||
|
"tower-layer",
|
||||||
|
"tower-service",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -131,6 +113,12 @@ version = "1.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytes"
|
name = "bytes"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
@@ -141,12 +129,14 @@ checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db"
|
|||||||
name = "car-rs"
|
name = "car-rs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"clap",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"prost",
|
"prost",
|
||||||
"rppal",
|
"rppal",
|
||||||
"serialport",
|
"serialport",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tokio-stream",
|
||||||
"tonic",
|
"tonic",
|
||||||
"tonic-build",
|
"tonic-build",
|
||||||
]
|
]
|
||||||
@@ -157,6 +147,49 @@ 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 = "4.1.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.4.2",
|
||||||
|
"clap_derive",
|
||||||
|
"clap_lex",
|
||||||
|
"is-terminal",
|
||||||
|
"once_cell",
|
||||||
|
"strsim",
|
||||||
|
"termcolor",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_derive"
|
||||||
|
version = "4.1.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fddf67631444a3a3e3e5ac51c36a5e01335302de677bd78759eaa90ab1f46644"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro-error",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
|
||||||
|
dependencies = [
|
||||||
|
"os_str_bytes",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "core-foundation-sys"
|
||||||
|
version = "0.8.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.7.0"
|
version = "1.7.0"
|
||||||
@@ -287,6 +320,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hermit-abi"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "http"
|
name = "http"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
@@ -382,6 +421,27 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "io-kit-sys"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4769cb30e5dcf1710fc6730d3e94f78c47723a014a567de385e113c737394640"
|
||||||
|
dependencies = [
|
||||||
|
"core-foundation-sys",
|
||||||
|
"mach2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "is-terminal"
|
||||||
|
version = "0.4.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
|
||||||
|
dependencies = [
|
||||||
|
"hermit-abi 0.3.9",
|
||||||
|
"libc",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.3"
|
version = "0.10.3"
|
||||||
@@ -405,9 +465,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.127"
|
version = "0.2.153"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "505e71a4706fa491e9b1b55f51b95d4037d0821ee40131190475f692b35b009b"
|
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libudev"
|
name = "libudev"
|
||||||
@@ -449,28 +509,19 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mach"
|
name = "mach2"
|
||||||
version = "0.1.2"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2fd13ee2dd61cc82833ba05ade5a30bb3d63f7ced605ef827063c63078302de9"
|
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "mach"
|
|
||||||
version = "0.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matchit"
|
name = "matchit"
|
||||||
version = "0.5.0"
|
version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
|
checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
@@ -493,7 +544,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"wasi",
|
"wasi",
|
||||||
"windows-sys",
|
"windows-sys 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -504,11 +555,11 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
version = "0.24.2"
|
version = "0.26.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc"
|
checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
@@ -519,7 +570,7 @@ version = "1.13.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
|
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hermit-abi",
|
"hermit-abi 0.1.19",
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -529,6 +580,12 @@ version = "1.13.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
|
checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os_str_bytes"
|
||||||
|
version = "6.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking_lot"
|
name = "parking_lot"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
@@ -549,7 +606,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"redox_syscall",
|
"redox_syscall",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"windows-sys",
|
"windows-sys 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -622,6 +679,30 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-error"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-error-attr",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-error-attr"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.43"
|
version = "1.0.43"
|
||||||
@@ -643,9 +724,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "prost-build"
|
name = "prost-build"
|
||||||
version = "0.11.1"
|
version = "0.11.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb"
|
checksum = "276470f7f281b0ed53d2ae42dd52b4a8d08853a3c70e7fe95882acbb98a6ae94"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"heck",
|
"heck",
|
||||||
@@ -654,9 +735,11 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"multimap",
|
"multimap",
|
||||||
"petgraph",
|
"petgraph",
|
||||||
|
"prettyplease",
|
||||||
"prost",
|
"prost",
|
||||||
"prost-types",
|
"prost-types",
|
||||||
"regex",
|
"regex",
|
||||||
|
"syn",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"which",
|
"which",
|
||||||
]
|
]
|
||||||
@@ -729,7 +812,7 @@ version = "0.2.16"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -768,6 +851,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustversion"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@@ -782,18 +871,20 @@ checksum = "e590c437916fb6b221e1d00df6e3294f3fccd70ca7e92541c475d6ed6ef5fee2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serialport"
|
name = "serialport"
|
||||||
version = "4.2.0"
|
version = "4.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aab92efb5cf60ad310548bc3f16fa6b0d950019cb7ed8ff41968c3d03721cf12"
|
checksum = "8f5a15d0be940df84846264b09b51b10b931fb2f275becb80934e3568a016828"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"CoreFoundation-sys",
|
"bitflags 2.4.2",
|
||||||
"IOKit-sys",
|
|
||||||
"bitflags",
|
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
"core-foundation-sys",
|
||||||
|
"io-kit-sys",
|
||||||
"libudev",
|
"libudev",
|
||||||
"mach 0.3.2",
|
"mach2",
|
||||||
"nix",
|
"nix",
|
||||||
"regex",
|
"regex",
|
||||||
|
"scopeguard",
|
||||||
|
"unescaper",
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -831,6 +922,12 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.99"
|
version = "1.0.99"
|
||||||
@@ -862,6 +959,35 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "termcolor"
|
||||||
|
version = "1.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.39"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.39"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.20.1"
|
version = "1.20.1"
|
||||||
@@ -906,9 +1032,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-stream"
|
name = "tokio-stream"
|
||||||
version = "0.1.9"
|
version = "0.1.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9"
|
checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
@@ -931,9 +1057,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tonic"
|
name = "tonic"
|
||||||
version = "0.8.0"
|
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 = "498f271adc46acce75d66f639e4d35b31b2394c295c82496727dafa16d465dd2"
|
checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-stream",
|
"async-stream",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -963,9 +1089,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tonic-build"
|
name = "tonic-build"
|
||||||
version = "0.8.0"
|
version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2fbcd2800e34e743b9ae795867d5f77b535d3a3be69fd731e39145719752df8c"
|
checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"prettyplease",
|
"prettyplease",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1000,7 +1126,7 @@ version = "0.3.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
|
checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
@@ -1015,9 +1141,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
|
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-service"
|
name = "tower-service"
|
||||||
@@ -1074,12 +1200,27 @@ version = "0.2.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
|
checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unescaper"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0adf6ad32eb5b3cadff915f7b770faaac8f7ff0476633aa29eb0d9584d889d34"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.3"
|
version = "1.0.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
|
checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "version_check"
|
||||||
|
version = "0.9.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "want"
|
name = "want"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
@@ -1123,6 +1264,15 @@ version = "0.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-util"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
@@ -1135,39 +1285,105 @@ version = "0.36.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
|
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows_aarch64_msvc",
|
"windows_aarch64_msvc 0.36.1",
|
||||||
"windows_i686_gnu",
|
"windows_i686_gnu 0.36.1",
|
||||||
"windows_i686_msvc",
|
"windows_i686_msvc 0.36.1",
|
||||||
"windows_x86_64_gnu",
|
"windows_x86_64_gnu 0.36.1",
|
||||||
"windows_x86_64_msvc",
|
"windows_x86_64_msvc 0.36.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.52.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm",
|
||||||
|
"windows_aarch64_msvc 0.52.4",
|
||||||
|
"windows_i686_gnu 0.52.4",
|
||||||
|
"windows_i686_msvc 0.52.4",
|
||||||
|
"windows_x86_64_gnu 0.52.4",
|
||||||
|
"windows_x86_64_gnullvm",
|
||||||
|
"windows_x86_64_msvc 0.52.4",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_msvc"
|
name = "windows_aarch64_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
|
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnu"
|
name = "windows_i686_gnu"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
|
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_msvc"
|
name = "windows_i686_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
|
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnu"
|
name = "windows_x86_64_gnu"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
|
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_msvc"
|
name = "windows_x86_64_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
|
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.52.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
|
||||||
|
|||||||
@@ -11,16 +11,23 @@ rppal = { version = "0.13.1", optional = true }
|
|||||||
futures-core = "0.3"
|
futures-core = "0.3"
|
||||||
futures-util = "0.3"
|
futures-util = "0.3"
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
tokio-stream = "0.1.11"
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
|
|
||||||
# https://github.com/hyperium/tonic
|
# https://github.com/hyperium/tonic
|
||||||
tonic = "0.8.0"
|
tonic = "0.8.3"
|
||||||
|
|
||||||
# https://docs.rs/serialport/4.0.1/serialport/index.html
|
# https://docs.rs/serialport/4.0.1/serialport/index.html
|
||||||
serialport = "4.0.1"
|
serialport = "4.3.0"
|
||||||
|
|
||||||
|
clap = { version = "4.1.8", features = ["derive"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tonic-build = "0.8.0"
|
tonic-build = "0.8.3"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
rppal = ["dep:rppal"]
|
rppal = ["dep:rppal"]
|
||||||
|
|
||||||
|
# How to get dependencies for my own projects, so I don't need to upload to crates.io
|
||||||
|
# or create my own rust package repo.
|
||||||
|
# https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let protos = ["slam/SlamController.proto", "control/motorService.proto"];
|
||||||
tonic_build::configure().compile(
|
tonic_build::configure().compile(
|
||||||
&["../protobuf/src/main/proto/car/control/motorService.proto"],
|
&protos.map(|proto| "../protobuf/src/main/proto/car/".to_owned() + proto),
|
||||||
&["../protobuf/src/main/proto"],
|
&["../protobuf/src/main/proto"],
|
||||||
)?;
|
)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -2,17 +2,28 @@ pub mod motor_control_service {
|
|||||||
tonic::include_proto!("motor_control");
|
tonic::include_proto!("motor_control");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod slam_controller_service {
|
||||||
|
tonic::include_proto!("slam_control");
|
||||||
|
}
|
||||||
|
|
||||||
use std::{sync::Mutex, time::Duration};
|
use std::{sync::Mutex, time::Duration};
|
||||||
|
|
||||||
use car_rs::{Servo, Vehicle};
|
use car_rs::{Servo, Vehicle};
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use motor_control_service::car_control_server::CarControl;
|
use motor_control_service::car_control_server::CarControl;
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
|
use tokio_stream::wrappers::ReceiverStream;
|
||||||
use tonic::{Request, Response, Status, Streaming};
|
use tonic::{Request, Response, Status, Streaming};
|
||||||
|
|
||||||
use self::motor_control_service::{
|
use self::{
|
||||||
|
motor_control_service::{
|
||||||
RecordingReqeust, RecordingResponse, SaveRequest, SaveResponse, SteeringRequest,
|
RecordingReqeust, RecordingResponse, SaveRequest, SaveResponse, SteeringRequest,
|
||||||
SteeringResponse, ThrottleRequest, ThrottleResponse, Vehicle2DRequest, Vehicle2DResponse,
|
SteeringResponse, ThrottleRequest, ThrottleResponse, Vehicle2DRequest, Vehicle2DResponse,
|
||||||
|
},
|
||||||
|
slam_controller_service::{
|
||||||
|
slam_control_server::SlamControl, SlamDetails, SlamLocation, SlamScan,
|
||||||
|
StartMapStreamingResponse, StopStreamingRequest, StopStreamingResponse,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -20,8 +31,6 @@ pub struct MotorControlService<T>
|
|||||||
where
|
where
|
||||||
T: Vehicle,
|
T: Vehicle,
|
||||||
{
|
{
|
||||||
// TODO: Any better way than mutex? need it over refcell to implement send, and need a smart pointer
|
|
||||||
// for interior mutability (since the generated protobuf functions aren't mut)
|
|
||||||
vehicle: Mutex<T>,
|
vehicle: Mutex<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,10 +71,16 @@ impl<T: Vehicle + Send + Sync + 'static> CarControl for MotorControlService<T> {
|
|||||||
request: Request<Streaming<Vehicle2DRequest>>,
|
request: Request<Streaming<Vehicle2DRequest>>,
|
||||||
) -> Result<Response<Vehicle2DResponse>, Status> {
|
) -> Result<Response<Vehicle2DResponse>, Status> {
|
||||||
let mut stream = request.into_inner();
|
let mut stream = request.into_inner();
|
||||||
|
|
||||||
|
// If we don't a request for 3 seconds, timeout and stop the vehicle
|
||||||
while let Ok(Some(Ok(req))) = time::timeout(Duration::from_secs(3), stream.next()).await {
|
while let Ok(Some(Ok(req))) = time::timeout(Duration::from_secs(3), stream.next()).await {
|
||||||
let mut vehicle = self.vehicle.lock().unwrap();
|
let mut vehicle = self.vehicle.lock().unwrap();
|
||||||
vehicle.set_throttle(req.throttle.unwrap().throttle as f64);
|
if let Some(throttle) = req.throttle {
|
||||||
vehicle.set_steering(req.steering.unwrap().steering as f64);
|
vehicle.set_throttle(throttle.throttle as f64);
|
||||||
|
}
|
||||||
|
if let Some(steering) = req.steering {
|
||||||
|
vehicle.set_steering(steering.steering as f64);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.vehicle.lock().unwrap().set_throttle(0.);
|
self.vehicle.lock().unwrap().set_throttle(0.);
|
||||||
@@ -87,3 +102,40 @@ impl<T: Vehicle + Send + Sync + 'static> CarControl for MotorControlService<T> {
|
|||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct SlamControlService {}
|
||||||
|
|
||||||
|
#[tonic::async_trait]
|
||||||
|
impl SlamControl for SlamControlService {
|
||||||
|
async fn start_map_streaming(
|
||||||
|
&self,
|
||||||
|
request: Request<SlamDetails>,
|
||||||
|
) -> Result<Response<StartMapStreamingResponse>, Status> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
type map_streamStream = ReceiverStream<Result<SlamScan, Status>>;
|
||||||
|
|
||||||
|
async fn map_stream(
|
||||||
|
&self,
|
||||||
|
request: Request<SlamDetails>,
|
||||||
|
) -> Result<Response<Self::map_streamStream>, Status> {
|
||||||
|
let scan = SlamScan {
|
||||||
|
map: vec![],
|
||||||
|
location: Some(SlamLocation {
|
||||||
|
theta: 1.,
|
||||||
|
x: 1.,
|
||||||
|
y: 1.,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn stop_streaming(
|
||||||
|
&self,
|
||||||
|
request: Request<StopStreamingRequest>,
|
||||||
|
) -> Result<Response<StopStreamingResponse>, Status> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ use std::sync::{Arc, Mutex};
|
|||||||
|
|
||||||
use serialport::SerialPort;
|
use serialport::SerialPort;
|
||||||
|
|
||||||
|
mod lidar;
|
||||||
|
|
||||||
// TODO: Should be returning results in these traits
|
// TODO: Should be returning results in these traits
|
||||||
pub trait Servo {
|
pub trait Servo {
|
||||||
fn get_value(&self) -> f64;
|
fn get_value(&self) -> f64;
|
||||||
@@ -91,14 +93,14 @@ pub mod rppal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Esp32SerialPwmServo<T: SerialPort> {
|
pub struct Esp32SerialPwmServo<T: SerialPort> {
|
||||||
serial_port: Arc<Mutex<T>>,
|
serial_port: T,
|
||||||
value: f64,
|
value: f64,
|
||||||
channel: u8,
|
channel: u8,
|
||||||
pin: u8,
|
pin: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: SerialPort> Esp32SerialPwmServo<T> {
|
impl<T: SerialPort> Esp32SerialPwmServo<T> {
|
||||||
pub fn new(serial_port: Arc<Mutex<T>>, channel: u8, pin: u8) -> Esp32SerialPwmServo<T> {
|
pub fn new(serial_port: T, channel: u8, pin: u8) -> Esp32SerialPwmServo<T> {
|
||||||
let mut servo = Esp32SerialPwmServo {
|
let mut servo = Esp32SerialPwmServo {
|
||||||
serial_port,
|
serial_port,
|
||||||
value: 0.,
|
value: 0.,
|
||||||
@@ -112,11 +114,7 @@ impl<T: SerialPort> Esp32SerialPwmServo<T> {
|
|||||||
|
|
||||||
impl<T: SerialPort> Esp32SerialPwmServo<T> {
|
impl<T: SerialPort> Esp32SerialPwmServo<T> {
|
||||||
fn init_pwm(&mut self) {
|
fn init_pwm(&mut self) {
|
||||||
let bytes_written = self
|
let bytes_written = self.serial_port.write(&[0, 1, self.channel, self.pin]);
|
||||||
.serial_port
|
|
||||||
.lock()
|
|
||||||
.unwrap()
|
|
||||||
.write(&[0, 1, self.channel, self.pin]);
|
|
||||||
// TODO: Better error handling (even anyhow would be better)
|
// TODO: Better error handling (even anyhow would be better)
|
||||||
match bytes_written {
|
match bytes_written {
|
||||||
Ok(size) => println!("{}", size),
|
Ok(size) => println!("{}", size),
|
||||||
@@ -132,7 +130,6 @@ impl<T: SerialPort> Servo for Esp32SerialPwmServo<T> {
|
|||||||
|
|
||||||
fn set_value(&mut self, value: f64) {
|
fn set_value(&mut self, value: f64) {
|
||||||
let mut temp_value = value;
|
let mut temp_value = value;
|
||||||
// TODO: Panic when out of bounds?
|
|
||||||
if temp_value < -1. {
|
if temp_value < -1. {
|
||||||
temp_value = -1.;
|
temp_value = -1.;
|
||||||
} else if temp_value > 1. {
|
} else if temp_value > 1. {
|
||||||
@@ -141,8 +138,6 @@ impl<T: SerialPort> Servo for Esp32SerialPwmServo<T> {
|
|||||||
self.value = temp_value;
|
self.value = temp_value;
|
||||||
let bytes_written = self
|
let bytes_written = self
|
||||||
.serial_port
|
.serial_port
|
||||||
.lock()
|
|
||||||
.unwrap()
|
|
||||||
.write(&[self.channel, ((value + 1.) / 2. * 255.) as u8]);
|
.write(&[self.channel, ((value + 1.) / 2. * 255.) as u8]);
|
||||||
// TODO: Better error handling
|
// TODO: Better error handling
|
||||||
match bytes_written {
|
match bytes_written {
|
||||||
|
|||||||
324
car-rs/src/lidar.rs
Normal file
324
car-rs/src/lidar.rs
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
use core::fmt;
|
||||||
|
use serialport::ClearBuffer;
|
||||||
|
use serialport::SerialPort;
|
||||||
|
use std::io;
|
||||||
|
use std::io::Error;
|
||||||
|
use std::string::FromUtf8Error;
|
||||||
|
|
||||||
|
const SYNC: u8 = 0xA5;
|
||||||
|
const SYNC2: u8 = 0x5A;
|
||||||
|
|
||||||
|
const GET_INFO: u8 = 0x50;
|
||||||
|
const GET_HEALTH: u8 = 0x52;
|
||||||
|
|
||||||
|
const STOP: u8 = 0x25;
|
||||||
|
const RESET: u8 = 0x40;
|
||||||
|
|
||||||
|
const SCAN: u8 = 0x20;
|
||||||
|
#[allow(dead_code)]
|
||||||
|
const FORCE_SCAN: u8 = 0x21;
|
||||||
|
|
||||||
|
const DESCRIPTOR_LEN: usize = 7;
|
||||||
|
const INFO_LEN: u8 = 20;
|
||||||
|
const HEALTH_LEN: u8 = 3;
|
||||||
|
|
||||||
|
const INFO_TYPE: u8 = 4;
|
||||||
|
const HEALTH_TYPE: u8 = 6;
|
||||||
|
const SCAN_TYPE: u8 = 129;
|
||||||
|
|
||||||
|
const SET_PWM: u8 = 0xF0;
|
||||||
|
const MAX_MOTOR_PWM: usize = 1023;
|
||||||
|
#[allow(dead_code)]
|
||||||
|
const DEFAULT_MOTOR_PWM: usize = 660;
|
||||||
|
|
||||||
|
const SCAN_SIZE: u8 = 5;
|
||||||
|
|
||||||
|
pub enum HealthStatus {
|
||||||
|
Good,
|
||||||
|
Warning,
|
||||||
|
Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HealthStatus {
|
||||||
|
pub fn from_raw(raw: u8) -> HealthStatus {
|
||||||
|
match raw {
|
||||||
|
0 => HealthStatus::Good,
|
||||||
|
1 => HealthStatus::Warning,
|
||||||
|
_ => HealthStatus::Error,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum RPLidarError {
|
||||||
|
FailedToStart,
|
||||||
|
IncorrectInfoFormat,
|
||||||
|
IncorrectHealthFormat,
|
||||||
|
ScanError(String),
|
||||||
|
IncorrectDescriptorFormat,
|
||||||
|
IOError(Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Error> for RPLidarError {
|
||||||
|
fn from(err: Error) -> Self {
|
||||||
|
RPLidarError::IOError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<FromUtf8Error> for RPLidarError {
|
||||||
|
fn from(_: FromUtf8Error) -> Self {
|
||||||
|
RPLidarError::IncorrectDescriptorFormat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for RPLidarError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
Self::FailedToStart => write!(f, "FailedToStart"),
|
||||||
|
Self::IncorrectInfoFormat => write!(f, "IncorrectInfoFormat"),
|
||||||
|
Self::IncorrectHealthFormat => write!(f, "IncorrectHealthFormat"),
|
||||||
|
Self::ScanError(arg0) => f.debug_tuple("ScanError").field(arg0).finish(),
|
||||||
|
Self::IncorrectDescriptorFormat => write!(f, "IncorrectDescriptorFormat"),
|
||||||
|
Self::IOError(arg0) => f.debug_tuple("IOError").field(arg0).finish(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct LidarScan {
|
||||||
|
pub new_scan: bool,
|
||||||
|
pub quality: u8,
|
||||||
|
pub angle: f64,
|
||||||
|
pub distance: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_scan(raw: [u8; SCAN_SIZE as usize]) -> Result<LidarScan, RPLidarError> {
|
||||||
|
let new_scan = raw[0] & 0b1;
|
||||||
|
let inversed_new_scan = (raw[0] >> 1) & 0b1;
|
||||||
|
let quality = raw[0] >> 2;
|
||||||
|
if new_scan == inversed_new_scan {
|
||||||
|
return Err(RPLidarError::ScanError(String::from(
|
||||||
|
"New scan flags mismatch",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (raw[1] & 0b1) != 1 {
|
||||||
|
return Err(RPLidarError::ScanError(String::from(
|
||||||
|
"Check bit not equal to 1",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
let angle = ((((raw[1] as isize) >> 1) + (raw[2] as isize) << 7) as f64) / 64.;
|
||||||
|
let distance = (((raw[3] as isize) + ((raw[4] as isize) << 8)) as f64) / 4.;
|
||||||
|
|
||||||
|
Ok(LidarScan {
|
||||||
|
new_scan: new_scan == 1,
|
||||||
|
quality,
|
||||||
|
angle,
|
||||||
|
distance,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Lidar<T: io::Read + io::Write> {
|
||||||
|
motor_running: bool,
|
||||||
|
serial_port: T,
|
||||||
|
is_scanning: bool,
|
||||||
|
measurements_per_batch: usize,
|
||||||
|
max_buffer_measurements: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: SerialPort> Lidar<T> {
|
||||||
|
pub fn new(serial_port: T) -> Lidar<T> {
|
||||||
|
Lidar {
|
||||||
|
motor_running: false,
|
||||||
|
serial_port,
|
||||||
|
is_scanning: false,
|
||||||
|
measurements_per_batch: 200,
|
||||||
|
max_buffer_measurements: 500,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn connect(&mut self) {
|
||||||
|
self.serial_port
|
||||||
|
.set_baud_rate(115200)
|
||||||
|
.expect("Failed to set baudrate");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn start_motor(&mut self) {
|
||||||
|
self.serial_port
|
||||||
|
.write_data_terminal_ready(true)
|
||||||
|
.expect("Failed to write dtr");
|
||||||
|
// self.set_pwm(DEFAULT_MOTOR_PWM);
|
||||||
|
self.motor_running = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn start_scanning(&mut self) -> Result<u8, RPLidarError> {
|
||||||
|
self.start_motor();
|
||||||
|
let (status, _) = self.get_health()?;
|
||||||
|
|
||||||
|
match status {
|
||||||
|
HealthStatus::Error => Err(RPLidarError::IncorrectHealthFormat),
|
||||||
|
_ => {
|
||||||
|
self.send_command(vec![SCAN]);
|
||||||
|
let (data_size, is_single, data_type) = self.read_descriptor()?;
|
||||||
|
if data_size != SCAN_SIZE || is_single || data_type != SCAN_TYPE {
|
||||||
|
return Err(RPLidarError::IncorrectDescriptorFormat);
|
||||||
|
}
|
||||||
|
self.is_scanning = true;
|
||||||
|
Ok(data_size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stop_motor(&mut self) {
|
||||||
|
self.set_pwm(0);
|
||||||
|
self.serial_port
|
||||||
|
.write_data_terminal_ready(false)
|
||||||
|
.expect("Failed to write dtr");
|
||||||
|
self.motor_running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_info(&mut self) -> Result<(u8, (u8, u8), u8, String), RPLidarError> {
|
||||||
|
self.send_command(vec![GET_INFO]);
|
||||||
|
|
||||||
|
let (data_size, is_single, data_type) = self.read_descriptor()?;
|
||||||
|
|
||||||
|
if data_size != INFO_LEN || !is_single || data_type != INFO_TYPE {
|
||||||
|
return Err(RPLidarError::IncorrectInfoFormat);
|
||||||
|
}
|
||||||
|
let mut buf = [0; INFO_LEN as usize];
|
||||||
|
self.serial_port.read(&mut buf)?;
|
||||||
|
let raw = buf;
|
||||||
|
let serial_number = String::from_utf8(Vec::from(&raw[4..]))?;
|
||||||
|
return Ok((raw[0], (raw[2], raw[1]), raw[3], serial_number));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_health(&mut self) -> Result<(HealthStatus, usize), RPLidarError> {
|
||||||
|
self.send_command(vec![GET_HEALTH]);
|
||||||
|
|
||||||
|
let (data_size, is_single, data_type) = self.read_descriptor()?;
|
||||||
|
|
||||||
|
if data_size != HEALTH_LEN || !is_single || data_type != HEALTH_TYPE {
|
||||||
|
return Err(RPLidarError::IncorrectHealthFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut buf = [0; HEALTH_LEN as usize];
|
||||||
|
self.serial_port.read(&mut buf)?;
|
||||||
|
let raw = buf;
|
||||||
|
let status = HealthStatus::from_raw(raw[0]);
|
||||||
|
let error_code = (raw[1] as usize) << 8 + raw[2];
|
||||||
|
return Ok((status, error_code));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_input(&mut self) {
|
||||||
|
self.serial_port
|
||||||
|
.clear(ClearBuffer::Input)
|
||||||
|
.expect("Failed to clear input buffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stop(&mut self) {
|
||||||
|
self.send_command(vec![STOP]);
|
||||||
|
self.is_scanning = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) {
|
||||||
|
self.send_command(vec![RESET]);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn receive_measurement_and_clear_buffer(
|
||||||
|
&mut self,
|
||||||
|
max_buffer_measurements: u32,
|
||||||
|
) -> Result<[u8; SCAN_SIZE as usize], RPLidarError> {
|
||||||
|
if !self.is_scanning {
|
||||||
|
return Err(RPLidarError::ScanError(String::from(
|
||||||
|
"Haven't started scanning",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
let mut buf = [0; SCAN_SIZE as usize];
|
||||||
|
self.serial_port.read(&mut buf)?;
|
||||||
|
let raw = buf;
|
||||||
|
if max_buffer_measurements > 0 {
|
||||||
|
if self
|
||||||
|
.serial_port
|
||||||
|
.bytes_to_read()
|
||||||
|
.expect("Failed to get bytes to read")
|
||||||
|
> max_buffer_measurements * SCAN_SIZE as u32
|
||||||
|
{
|
||||||
|
println!("Too many measurements in the input buffer. Clearing Buffer");
|
||||||
|
self.serial_port
|
||||||
|
.clear(ClearBuffer::Input)
|
||||||
|
.expect("Failed to clear input buffer.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(raw)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_command(&mut self, command: Vec<u8>) {
|
||||||
|
let mut vec = vec![SYNC];
|
||||||
|
vec.extend(command);
|
||||||
|
self.serial_port
|
||||||
|
.write(&vec)
|
||||||
|
.expect("Failed to send command");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_payload_command(&mut self, cmd: u8, payload: Vec<u8>) {
|
||||||
|
let size: u8 = payload
|
||||||
|
.len()
|
||||||
|
.try_into()
|
||||||
|
.expect("Failed to convert payload length");
|
||||||
|
let mut req = vec![SYNC];
|
||||||
|
req.push(cmd);
|
||||||
|
req.push(size);
|
||||||
|
req.extend(payload);
|
||||||
|
let checksum = self.calc_checksum(&req);
|
||||||
|
req.push(checksum);
|
||||||
|
self.serial_port
|
||||||
|
.write(&req)
|
||||||
|
.expect("Failed to send payload");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calc_checksum(&self, data: &Vec<u8>) -> u8 {
|
||||||
|
data.iter()
|
||||||
|
.copied()
|
||||||
|
.reduce(|accum, next| accum ^ next)
|
||||||
|
.expect("Failed to calculate checksum")
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_descriptor(&mut self) -> Result<(u8, bool, u8), RPLidarError> {
|
||||||
|
let mut descriptor: [u8; DESCRIPTOR_LEN] = [0; DESCRIPTOR_LEN];
|
||||||
|
let ret = self.serial_port.read(&mut descriptor)?;
|
||||||
|
if ret != DESCRIPTOR_LEN || (descriptor[0] != SYNC && descriptor[1] != SYNC2) {
|
||||||
|
eprintln!("Failed to read enough or something");
|
||||||
|
Err(RPLidarError::IncorrectDescriptorFormat)
|
||||||
|
} else {
|
||||||
|
let is_single = descriptor[DESCRIPTOR_LEN - 2] == 0;
|
||||||
|
Ok((descriptor[2], is_single, descriptor[DESCRIPTOR_LEN - 1]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_pwm(&mut self, pwm: usize) {
|
||||||
|
assert!(pwm <= MAX_MOTOR_PWM);
|
||||||
|
self.send_payload_command(SET_PWM, Vec::from(pwm.to_ne_bytes()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Probably want to have separate iterator types like we do in swift for measurements vs scans
|
||||||
|
impl<T: SerialPort> Iterator for Lidar<T> {
|
||||||
|
type Item = Vec<LidarScan>;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.is_scanning {
|
||||||
|
let mut all_scans: Vec<LidarScan> = Vec::new();
|
||||||
|
while all_scans.len() < self.measurements_per_batch {
|
||||||
|
if let Ok(raw) =
|
||||||
|
self.receive_measurement_and_clear_buffer(self.max_buffer_measurements)
|
||||||
|
{
|
||||||
|
if let Ok(scan) = process_scan(raw) {
|
||||||
|
all_scans.push(scan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Some(all_scans);
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
use std::sync::{Arc, Mutex};
|
|
||||||
|
|
||||||
use car_rs::{Esp32SerialPwmServo, ServoVehicle};
|
use car_rs::{Esp32SerialPwmServo, ServoVehicle};
|
||||||
|
use clap::Parser;
|
||||||
use grpcserver::{
|
use grpcserver::{
|
||||||
motor_control_service::car_control_server::CarControlServer, MotorControlService,
|
motor_control_service::car_control_server::CarControlServer, MotorControlService,
|
||||||
};
|
};
|
||||||
@@ -9,16 +8,34 @@ use tonic::transport::Server;
|
|||||||
|
|
||||||
mod grpcserver;
|
mod grpcserver;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(version, about, long_about = None)]
|
||||||
|
struct Args {
|
||||||
|
#[arg(short, long)]
|
||||||
|
serial_port: String,
|
||||||
|
|
||||||
|
#[arg(short, long, default_value_t = 10000)]
|
||||||
|
web_port: u32,
|
||||||
|
|
||||||
|
#[arg(short, long, default_value_t = 32400)]
|
||||||
|
baud_rate: u32,
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let addr = "[::1]:10000".parse().unwrap();
|
let args = Args::parse();
|
||||||
|
let addr = format!("[::1]:{}", &args.web_port).parse().unwrap();
|
||||||
|
|
||||||
let serial_port = serialport::new("", 32400)
|
let mut steering_port = serialport::new(&args.serial_port, args.baud_rate)
|
||||||
.open_native()
|
.open_native()
|
||||||
.expect("Could not open serial port");
|
.expect("Could not open serial port");
|
||||||
let serial_servo = Arc::new(Mutex::new(serial_port));
|
steering_port.set_exclusive(false)?;
|
||||||
let steering_servo = Esp32SerialPwmServo::new(serial_servo.clone(), 1, 12);
|
let mut throttle_port = serialport::new(&args.serial_port, args.baud_rate)
|
||||||
let throttle_servo = Esp32SerialPwmServo::new(serial_servo.clone(), 2, 18);
|
.open_native()
|
||||||
|
.expect("Could not open serial port");
|
||||||
|
throttle_port.set_exclusive(false)?;
|
||||||
|
let steering_servo = Esp32SerialPwmServo::new(steering_port, 1, 12);
|
||||||
|
let throttle_servo = Esp32SerialPwmServo::new(throttle_port, 2, 18);
|
||||||
|
|
||||||
let motor_control = MotorControlService::new(ServoVehicle::new(steering_servo, throttle_servo));
|
let motor_control = MotorControlService::new(ServoVehicle::new(steering_servo, throttle_servo));
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package SlamControl;
|
||||||
|
|
||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_package = "org.vato.carcontroller";
|
option java_package = "org.vato.carcontroller";
|
||||||
option java_outer_classname = "SlamControllerProto";
|
option java_outer_classname = "SlamControllerProto";
|
||||||
|
|
||||||
import "google/protobuf/empty.proto";
|
|
||||||
|
|
||||||
message SlamDetails {
|
message SlamDetails {
|
||||||
int32 map_size_pixels = 1;
|
int32 map_size_pixels = 1;
|
||||||
int32 map_size_meters = 2;
|
int32 map_size_meters = 2;
|
||||||
@@ -26,10 +26,22 @@ message SlamScan{
|
|||||||
SlamLocation location = 2;
|
SlamLocation location = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message StartMapStreamingResponse {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
message StopStreamingRequest {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
message StopStreamingResponse {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
service SlamControl {
|
service SlamControl {
|
||||||
rpc start_map_streaming(SlamDetails) returns (google.protobuf.Empty) {}
|
rpc start_map_streaming(SlamDetails) returns (StartMapStreamingResponse) {}
|
||||||
|
|
||||||
rpc map_stream(SlamDetails) returns (stream SlamScan) {}
|
rpc map_stream(SlamDetails) returns (stream SlamScan) {}
|
||||||
|
|
||||||
rpc stop_streaming(google.protobuf.Empty) returns (google.protobuf.Empty) {}
|
rpc stop_streaming(StopStreamingRequest) returns (StopStreamingResponse) {}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user