From 81157eeaaa621e641524e2950b87e0a969c41405 Mon Sep 17 00:00:00 2001 From: Danila Gamkov Date: Fri, 28 Feb 2025 19:59:35 +0300 Subject: [PATCH] first release done: main commands for communictation works --- .gitignore | 6 + Cargo.lock | 814 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 11 + src/.vimrc | 132 +++++++++ src/main.rs | 379 ++++++++++++++++++++++++ 5 files changed, 1342 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/.vimrc create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eba55f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/target +*.csv +*.png +*.swp +*.zip +*.log diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..9cfc4c3 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,814 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "cc" +version = "1.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + +[[package]] +name = "fd-lock" +version = "3.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.170" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.8.0", + "libc", +] + +[[package]] +name = "libudev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" +dependencies = [ + "libc", + "libudev-sys", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "rustyline" +version = "9.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "clipboard-win", + "dirs-next", + "fd-lock", + "libc", + "log", + "memchr", + "nix 0.23.2", + "radix_trie", + "scopeguard", + "smallvec", + "unicode-segmentation", + "unicode-width", + "utf8parse", + "winapi", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serialport" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecfc4858c2266c7695d8b8460bbd612fa81bd2e250f5f0dd16195e4b4f8b3d8" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "libudev", + "mach2", + "nix 0.26.4", + "scopeguard", + "unescaper", + "winapi", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + +[[package]] +name = "syn" +version = "2.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "uart_server" +version = "0.1.0" +dependencies = [ + "chrono", + "log", + "regex", + "rustyline", + "serialport", +] + +[[package]] +name = "unescaper" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +dependencies = [ + "thiserror", +] + +[[package]] +name = "unicode-ident" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4cdf5ec --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "uart_server" +version = "0.1.0" +edition = "2021" + +[dependencies] +serialport = "4.7.0" +rustyline = "9.*" +regex = "1.7.0" +chrono = "0.4.40" +log = "0.4.26" diff --git a/src/.vimrc b/src/.vimrc new file mode 100644 index 0000000..adf6810 --- /dev/null +++ b/src/.vimrc @@ -0,0 +1,132 @@ +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 +set noexpandtab +set colorcolumn=90 +highlight ColorColumnt ctermbg=darkgray +augroup project + autocmd! + autocmd BufRead,BufNewFile *.h,*.c set filetype=c.doxygen +augroup END +let &path.="src/include, src/source," + +" Включаем использование системного буфера +set clipboard=unnamedplus + +" Работа с текстом + +" Python использует 4 пробела для отступов +autocmd FileType python setlocal tabstop=4 shiftwidth=4 + +" Кодировка текста +set encoding=utf-8 +set fileencoding=utf-8 +set fileencodings=utf-8,cp1251,koi8-r,cp866 + +" Поиск по тексту +set hlsearch " подсвечивать результаты поиска + +" Перемещение по тексту +" Когда достигаем границ строки, то перемещаемся на предыдующую/следующую +set whichwrap+=h,l,<,>,[,] + +set number + +" Настройки автодополнения +set completeopt=menu,menuone,noselect + +" Разделение экрана +set splitbelow " разбивать вниз +set splitright " разбивать вправо + + + +" сочетание клавиш + +" Использование h, j, k, l для перемещения с зажатым Ctrl в режиме +" редактирования +inoremap +inoremap +inoremap +inoremap + +let g:mapleader = "\" + +" Переключение между вкладками +nnoremap t :tabnext +nnoremap T :tabprevious + +" Список вкладок +nnoremap tl :tabs + +" nnoremap tn :tabnew +nnoremap tc :tabclose +nnoremap to :tabonly +nnoremap tm :tabmove + +" Редактировать файл в новой вкладке +nnoremap te :tabedit | + +" Выбор вкладки +nnoremap 1 1gt +nnoremap 2 2gt +nnoremap 3 3gt +nnoremap 4 4gt +nnoremap 5 5gt +nnoremap 6 6gt +nnoremap 7 7gt +nnoremap 8 8gt +nnoremap 9 9gt +nnoremap 0 :tablast + +" Разбиение окон +nnoremap s :split +nnoremap v :vsplit + +" Выбор окна +nnoremap h +nnoremap j +nnoremap k +nnoremap l + +" Размер окна +nnoremap + +nnoremap - +nnoremap < +nnoremap > + +" Vimspector +" nnoremap +" nnoremap q +nmap VimspectorStepOver +nmap VimspectorStepInto +nmap VimspectorStepOut +nmap VimspectorDisassemble + +" Сделать окна одного размера +nnoremap = = + +" Переключения между буферами +" nnoremap b :bnext +" nnoremap B :bprevious +" nnoremap l :ls +" nnoremap d :bd + +" " Скрыть/раскрыть блок кода +" nnoremap z za + + +" настройка плагинов + +" настройки для отступов +" let g:indent_guides_enable_on_vim_startup = 1 +" Настройки для разноцветной подсветки скобок +let g:rainbow_active = 1 +" Настройки для vim-airline +let g:airline#extensions#tabline#enabled = 1 +let g:airline#extensions#tabline#buffer_nr_show = 1 +let g:airline#extensions#tabline#formatter = 'unique_tail' +let g:airline_powerline_fonts = 1 +let g:airline_solarized_bg = 'luna' + +let g:vimspector_enable_mappings = 'HUMAN' diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8a627ae --- /dev/null +++ b/src/main.rs @@ -0,0 +1,379 @@ +use std::time::Duration; +use std::{thread, time}; +use serialport::{SerialPort, StopBits, Parity, FlowControl, DataBits}; +use std::io::{self, Read, Write, BufWriter}; +use regex::Regex; +use rustyline::Editor; +use rustyline::error::ReadlineError; +use std::fs::OpenOptions; +use std::io::{BufReader, BufRead}; + +pub mod perf { + use chrono::{DateTime, Duration, Utc, Local}; + + pub struct Perf { + start: DateTime, + end: DateTime, + delta_ms: i64, + delta_mks: i64, + } + + impl Perf { + pub fn new() -> Perf { + Perf { + start: Utc::now(), + end: Utc::now(), + delta_ms: 0, + delta_mks: 0, + } + } + + pub fn start(&mut self) { + self.start = Utc::now(); + } + + // measure: "ms" or "mks" + pub fn stop(&mut self, out_msg: &str, measure: &str) { + self.end = Utc::now(); + self.delta_ms = (self.end - self.start).num_microseconds().unwrap()/1000; + self.delta_mks = (self.end - self.start).num_microseconds().unwrap(); + + if (measure == "ms") { println!("{} (ms): {:?}", out_msg, self.delta_ms); } + else { println!("{} (mks): {:?}", out_msg, self.delta_mks); } + } + + pub fn stop_restart(&mut self, out_msg: &str, measure: &str) { + self.stop(out_msg, measure); + self.start = Utc::now(); + } + + pub fn cur_time(format: &str) -> String { + let now = Local::now(); + let fmt = now.format(format).to_string(); + return fmt; + } + + } +} + +fn read_str(s: &str) -> Result, String> { + let re = match Regex::new(r#""([^"]+)"|(\S+)"#) { + Ok(val) => val, + Err(_) => { return Err(format!("Error in regex!")); } + }; + + let res: Vec = re.find_iter(&s) + .map(|match_| match_.as_str().to_owned().replace("\"", "")) + .collect(); + + Ok(res) +} + +fn set_port_settings(port_name: &str, baud_rate: u32, data_bits: DataBits, parity: Parity, + stop_bits: StopBits, flow_ctrl: FlowControl, timeout_msec: u64) -> Result, String> { + + let mut port = match serialport::new(port_name, baud_rate) + .timeout(Duration::from_millis(timeout_msec)).open() { + Ok(p) => p, + Err(msg) => return Err(format!("{}", msg)), + }; + + port.set_baud_rate(baud_rate).unwrap(); + port.set_data_bits(data_bits).unwrap(); + port.set_parity(parity).unwrap(); + port.set_stop_bits(stop_bits).unwrap(); + port.set_flow_control(flow_ctrl).unwrap(); + return Ok(port); +} + + +fn tx_rx_data(port_name: &str, + mut data_out: String, + cmd_writer: &mut BufWriter, + data_writer: &mut BufWriter, + save_data_flag: bool, + save_cmd_flag: bool) { + use crate::perf::Perf; + let mut perf = Perf::new(); + perf.start(); + // let port_name = &args[1]; + let mut port = match set_port_settings(port_name, 19200, + DataBits::Eight, + Parity::Even, + StopBits::One, + FlowControl::None, 100) { + Ok(set) => {set}, + Err(msg) => { println!("error while opening com-port ({}): {}", port_name, msg); return } + }; + + perf.stop_restart("time open port", "ms"); + + if save_cmd_flag == true { + writeln!(cmd_writer, "{};{};{}", Perf::cur_time("%Y.%m.%d"), + Perf::cur_time("%H:%M:%S.%f"), data_out.trim()).expect("err"); + } + + data_out.push_str(std::str::from_utf8(b"\x0D\x0A").unwrap()); // CR + LF + match port.write(data_out.as_bytes()) { + Ok(_) => {}, + Err(e) => eprintln!("Error sending data: {}", e), + } + + port.flush().unwrap(); + + perf.stop_restart("time write to port", "ms"); + + let mut reader = BufReader::new(port); + let mut s = String::new(); + reader.read_line(&mut s).unwrap(); + if s.len() > 0 { + let data = format!("{}: {}", Perf::cur_time("%H:%M:%S.%f"), s.trim()); + println!("{}", data); + if save_data_flag == true { + writeln!(data_writer, "{}", + format!("{};{};{}", + Perf::cur_time("%Y.%m.%d"), + Perf::cur_time("%H:%M:%S.%f"), + s.trim())) + .expect("err"); + } + } + + perf.stop("time for receive data", "ms"); + + // let mut buffer = Vec::new(); + // match port.read_to_end(&mut buffer) { + // Ok(_) => { + // if buffer.len() > 0 { + // let data = format!("{}: {:?}", cur_time("%H:%M:%S"), buffer); + // println!("{}", data); + // if save_data_flag == true { + // writeln!(data_writer, "{}", + // format!("{};{};{}", + // cur_time("%Y.%m.%d"), + // cur_time("%H:%M:%S"), + // String::from_utf8(buffer).expect("msg"))) + // .expect("err"); + // } + // } + // }, + // Err(msg) => eprintln!("{}", msg), + // } + + // let mut cnt: u32 = 0; + // let mut i = 0; + // let mut buf: String = String::new(); + + // let start = Utc::now(); + // let mut timeout_flag = false; + + // let mut delta1 = 0; + // while cnt == 0 { + // cnt = match port.bytes_to_read() { + // Ok(c) => c, + // Err(msg) => { println!("{}", msg); return; } + // }; + // let delta = Utc::now() - start; + // delta1 = delta.num_microseconds().unwrap()/1000; + // if delta1 > timeout_ms { + // println!("timeout: {}", delta1); + // timeout_flag = true; + // break; + // }; + // } + + // println!("time (ms): {}", delta1); + + // // println!("time (ms): {:?}", delta.num_microseconds().unwrap()/1000); + + // if timeout_flag == false { + // while i < 500000 { + // // thread::sleep(time::Duration::from_millis(10)); + // i += 1; + // let mut buffer = [0u8; 4096]; + + // cnt = match port.bytes_to_read() { + // Ok(c) => c, + // Err(msg) => { println!("{}", msg); return; } + // }; + + // if cnt > 0 { + // match port.read(&mut buffer) { + // Ok(count) => { + // let s = std::str::from_utf8(&buffer[..count]).unwrap(); + // buf.push_str(s); + // println!("{}", s); + // }, + + // Err(ref e) if e.kind() == io::ErrorKind::TimedOut => { println!("timeout!"); }, + // Err(e) => eprintln!("error reading from port ({}): {}", port_name, e), + // } + // } + // else {} + // } + + // } + + + // if buf.len() > 0 { + // let data = format!("{}: {:?}", cur_time("%H:%M:%S"), buf); + // println!("{}", data); + // if save_data_flag == true { + // writeln!(data_writer, "{};{};{}", cur_time("%Y.%m.%d"), cur_time("%H:%M:%S"), buf.trim()).expect("err"); + // } + // } + +} + +fn main() { + use crate::perf::Perf; + let mut perf = Perf::new(); + + let data_log_path = "../log/data.log"; + let file = OpenOptions::new() + .write(true) + .append(true) + .open(data_log_path) + .expect("error opening file "); + + let mut data_writer = BufWriter::new(file); + + let data_log_path = "../log/cmd.log"; + let file = OpenOptions::new() + .write(true) + .append(true) + .open(data_log_path) + .expect("error opening file "); + + let mut cmd_writer = BufWriter::new(file); + + let mut save_data_flag = false; + let mut save_cmd_flag = false; + + let timeout_ms = 1000; + let fname_hist = "../settings/cmd_history.log".to_string(); + let mut editor = Editor::<()>::new(); + if editor.load_history(&fname_hist).is_err() { + println!("error while reading cmd_history.log file!", ); + return; + } + + loop { + let s: String = match editor.readline(">> ") { + Ok(s_) => s_.to_string(), + Err(ReadlineError::Interrupted) => { + editor.save_history(&fname_hist) + .expect("error while save the command to the history file (cmd_history.log)"); + return; + }, + Err(ReadlineError::Eof) => { + editor.save_history(&fname_hist) + .expect("error while save the command to the history file (cmd_history.log)"); + return; + }, + Err(msg) => { + println!("{}{:?}", + "unknown command", + msg); + return; + } + }; + + editor.add_history_entry(&s); + + let args = match read_str(&s) { + Ok(arg) => arg, + Err(msg) => { + println!("{}", msg); + continue; + } + }; + + let args_cnt = args.len(); + + let cmd_head = &args[0].clone(); + + if cmd_head.contains("exit") { break; } + else if cmd_head.contains("help") { + println!("Serial port terminal supports the following commands:"); + println!("exit - excecute quit from this program"); + println!("help - explain how to use this program"); + println!("show_ports - shows all available serial ports"); + println!("send - sends specified to "); + println!("send_loop - sends specified to in loop mode: times with period specified in "); + println!("open_port - opens specified with specified settings"); + println!("save_data_log "); + println!("save_cmd_log "); + } + else if cmd_head.contains("save_data_log") { + if args_cnt != 2 { eprintln!("Error while parse command! {}", "arguments count must be 1"); } + + if args[1].contains("enable") { save_data_flag = true; } + else { save_data_flag = false; } + } + else if cmd_head.contains("save_cmd_log") { + if args_cnt != 2 { eprintln!("Error while parse command! {}", "arguments count must be 1"); } + + if args[1].contains("enable") { save_cmd_flag = true; } + else { save_cmd_flag = false; } + } + else if cmd_head.contains("show_ports") { + match serialport::available_ports() { + Ok(ports) => { + for port in ports { + println!("{}: {:?}", port.port_name, port.port_type); + } + } + Err(msg) => { eprintln!("error while get all available serial port list: {}", msg); return; } + } + } + else if cmd_head == "send" { + if args_cnt != 3 { eprintln!("Error while parse command! {}", "arguments count must be 2"); } + else { + tx_rx_data(&args[1], + args[2].clone(), + &mut cmd_writer, + &mut data_writer, + save_data_flag, + save_cmd_flag); + } + } + else if cmd_head == "send_loop" { + if args_cnt != 5 { eprintln!("Error while parse command! {}", "arguments count must be 4"); } + else { + let cnt = args[3].parse::().unwrap(); + let period = args[4].parse::().unwrap(); + let mut i = 0; + while (i < cnt) { + i += 1; + tx_rx_data(&args[1], + args[2].clone(), + &mut cmd_writer, + &mut data_writer, + save_data_flag, + save_cmd_flag); + + thread::sleep(time::Duration::from_millis(period)); + } + } + } + else if cmd_head.contains("open port") { + + if args_cnt != 8 { eprintln!("Error while parse command! {}", "arguments count must be 8"); } + else { + // println!("open port - opens specified with specified settings"); + // let port_name = args[2].clone(); + // let speed = args[3].clone(); + // let data_bits = args[4].clone(); + // let parity = args[5].clone(); + // let stop_bits = args[6].clone(); + // let flow_ctrl = args[7].clone(); + } + } + } + + // close ports + editor.save_history(&fname_hist).unwrap(); + // drop(port1); + +}