From fa60f228221b2757ac3d94b24526154a8e41b8dc Mon Sep 17 00:00:00 2001 From: aOK Date: Mon, 22 Jul 2024 17:16:42 +0300 Subject: [PATCH] first commit --- .cargo/config.toml | 14 + .gitignore | 12 + .vscode/settings.json | 3 + A9G GPRS Operation.png | Bin 0 -> 244164 bytes Cargo.toml | 108 ++++ LICENSE-APACHE | 201 +++++++ LICENSE-MIT | 25 + README.md | 0 build.rs | 3 + partitions.csv | 6 + rust-toolchain.toml | 2 + src/gps.rs | 122 ++++ src/lib.rs | 85 +++ src/main.rs | 317 ++++++++++ src/run/mod.rs | 1 + src/run/modem/apn.rs | 82 +++ src/run/modem/coms/gprs/mod.rs | 435 ++++++++++++++ src/run/modem/coms/mod.rs | 1 + src/run/modem/errors.rs | 14 + src/run/modem/impls.rs | 44 ++ src/run/modem/mod.rs | 6 + src/run/modem/module.rs | 300 ++++++++++ src/run/modem/parse/mod.rs | 1 + src/run/modem/parse/parse.rs | 1012 ++++++++++++++++++++++++++++++++ src/utils.rs | 41 ++ 25 files changed, 2835 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 A9G GPRS Operation.png create mode 100644 Cargo.toml create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT create mode 100644 README.md create mode 100644 build.rs create mode 100644 partitions.csv create mode 100644 rust-toolchain.toml create mode 100644 src/gps.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/run/mod.rs create mode 100644 src/run/modem/apn.rs create mode 100644 src/run/modem/coms/gprs/mod.rs create mode 100644 src/run/modem/coms/mod.rs create mode 100644 src/run/modem/errors.rs create mode 100644 src/run/modem/impls.rs create mode 100644 src/run/modem/mod.rs create mode 100644 src/run/modem/module.rs create mode 100644 src/run/modem/parse/mod.rs create mode 100644 src/run/modem/parse/parse.rs create mode 100644 src/utils.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..3fcc369 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,14 @@ +[target.xtensa-esp32-none-elf] +runner = "espflash flash -M -b 2000000 --partition-table partitions.csv -p /dev/cu.usbserial-1420" + + +[env] +ESP_LOGLEVEL = "INFO" + +[build] +rustflags = ["-C", "link-arg=-nostartfiles", "-Dclippy::clone_on_ref_ptr"] + +target = "xtensa-esp32-none-elf" + +[unstable] +build-std = ["alloc", "core"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e166f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb +*.lock +src/main.rs.txt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..979d509 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.check.allTargets": false, +} diff --git a/A9G GPRS Operation.png b/A9G GPRS Operation.png new file mode 100644 index 0000000000000000000000000000000000000000..119e2b6b8179bc0a2a56b46a849aea1f06565dd7 GIT binary patch literal 244164 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 z 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�y0%DD87Y>X!D+`9$%+B!NX^!V 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%0DkD~ifGLdciqDdhrs~r{ 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 IwH(9$1Gum*bN~PV literal 0 HcmV?d00001 diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f15c728 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,108 @@ +[package] +name = "ppp-gsm" +version = "0.1.0" +authors = ["aok"] +edition = "2021" +license = "MIT OR Apache-2.0" + +[lib] +name = "ppp_gsm" + +[dependencies] +esp-backtrace = { version = "0.12.0", features = [ + "esp32", + "exception-handler", + "panic-handler", + "println", +] } +hal = { package = "esp-hal", version = "0.19.0", features = [ + # "embassy", + "async", + "esp32", + # "embassy-time-timg0", + # "embassy-executor-thread", +] } +esp-hal-embassy = { version = "0.2.0", features = ["esp32", "executors"] } +embassy-time = "0.3.1" +embassy-sync = "0.6.0" +embedded-io = { version = "0.6.1" } +embedded-io-async = "0.6.1" +# embedded-io = "0.6.1" +esp-println = { version = "0.9.1", features = ["esp32", "log"] } +log = { version = "0.4.21" } +heapless = "0.8.0" +esp-alloc = { version = "0.4.0" } +static_cell = { version = "2.1.0", features = ["nightly"] } +embassy-executor = { version = "0.5.0", features = [ + "nightly", + "integrated-timers", +] } +bytemuck = { version = "1.16.1", features = ["derive"] } + +embedded-storage = "0.3.1" +esp-storage = { version = "0.3.0", features = ["esp32"] } +# embassy-net = { version = "0.4.0", features=[ "std", "log", "medium-ethernet", "medium-ip", "tcp", "udp", "dns", "dhcpv4", "proto-ipv6"] } +rand_core = { version = "0.6.3", default-features = false } +# rand_chacha = { version = "0.3.1", default-features = false } +rand = { version = "0.8.5", default-features = false, features = ["small_rng"] } + +embassy-net = { version = "0.4.0", features = [ + "log", + "medium-ethernet", + "medium-ip", + "tcp", + "udp", + "dns", + "dhcpv4", + "proto-ipv6", +] } +embassy-net-ppp = { version = "0.1.0", features = ["log"] } +# ppproto = "0.1.2" +# smoltcp = { version = "0.11.0", default-features = false, features = [ +# "proto-igmp", +# "proto-ipv4", +# "socket-tcp", +# "socket-icmp", +# "socket-udp", +# "medium-ethernet", +# "proto-dhcpv4", +# "socket-raw", +# "socket-dhcpv4", +# ] } +picoserve = "0.11.1" +embedded-tls = { version = "0.17.0", default-features = false } +rust-mqtt = { version = "0.3.0", default-features = false } +# futures = { version = "0.3.30", default-features = false, features = ["alloc"] } +reqwless = { version = "0.12.1", features = ["alloc", "log"] } +embassy-futures = "0.1.1" +# embedded-tls = "0.17.0" + +# rust-mqtt = "0.3.0" +# rust-mqtt = { git = "https://github.com/obabec/rust-mqtt", rev = "483138c", default-features = false } + +# defmt-or-log = "0.2.1" + +# defmt-or-log = { version = "0.2.1", features = ["defmt"] } +# defmt = "0.3.8" +# defmt-rtt = "0.4.1" + +[dev-dependencies] +embassy-time = { version = "0.3.1", features = ["std", "generic-queue"] } +critical-section = { version = "1.1", features = ["std"] } +tokio = { version = "1", features = ["macros", "rt"] } +static_cell = { version = "2.0.0" } + + +[profile.dev] +# Rust debug is too slow. +# For debug builds always builds with some optimization +opt-level = "s" + +[profile.release] +codegen-units = 1 # LLVM can perform better optimizations using a single thread +debug = 2 +debug-assertions = false +incremental = false +lto = 'fat' +opt-level = 2 +overflow-checks = false diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..d2c040e --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..3d3dcba --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright [year] [fullname] + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..5efe9c9 --- /dev/null +++ b/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rustc-link-arg-bins=-Tlinkall.x"); +} diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..426219e --- /dev/null +++ b/partitions.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x4000, +otadata, data, ota, 0xd000, 0x2000, +phy_init, data, phy, 0xf000, 0x1000, +ota_0, app, ota_0, 0x10000, 0x180000, +ota_1, app, ota_1, 0x190000, 0x180000, diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..a2f5ab5 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "esp" diff --git a/src/gps.rs b/src/gps.rs new file mode 100644 index 0000000..5fa5902 --- /dev/null +++ b/src/gps.rs @@ -0,0 +1,122 @@ +#![no_std] + +use core::str; + +fn get_gps_location(serial: &mut impl Serial) -> Result<(&[u8], &[u8]), ()> { + // Request GPS information + serial.write(b"AT+GPSRD=1\r\n").map_err(|_| ())?; + + // Wait for GPS information to be available + delay(2000); // You'll need to implement a suitable delay for your platform + + let mut response = [0u8; 128]; // Adjust buffer size as needed + let mut bytes_read = 0; + + while let Some(byte) = serial.read().map_err(|_| ())? { + if bytes_read < response.len() { + response[bytes_read] = byte; + bytes_read += 1; + } else { + // Handle buffer overflow if necessary + break; + } + } + + // Extract latitude and longitude from the response + let response_slice = &response[..bytes_read]; + if let Some(index) = find_subsequence(response_slice, b"GPSRD: ") { + let data = &response_slice[index + 7..]; + if let Some(comma_index) = data.iter().position(|&b| b == b',') { + let latitude = &data[..comma_index]; + let longitude = &data[comma_index + 1..]; + if let Some(end_index) = longitude.iter().position(|&b| b == b',') { + let longitude = &longitude[..end_index]; + Ok((latitude, longitude)) + } else { + Err(()) + } + } else { + Err(()) + } + } else { + Err(()) + } +} + +// Placeholder trait for serial communication +trait Serial { + fn write(&mut self, data: &[u8]) -> Result<(), ()>; + fn read(&mut self) -> Result, ()>; +} + +// Placeholder for delay function +fn delay(_ms: u32) { + // Implement a suitable delay for your platform +} + +// Helper function to find a subsequence in a byte slice +fn find_subsequence(haystack: &[u8], needle: &[u8]) -> Option { + haystack + .windows(needle.len()) + .position(|window| window == needle) +} + +use bytes::{BufMut, BytesMut}; +use core::fmt::Write; // For writing to strings // For byte buffer handling + +// Mock implementation of serial communication and delay +struct MySerial; + +impl MySerial { + fn available(&self) -> usize { + // Implementation to get number of bytes available in the serial buffer + unimplemented!() + } + + fn read(&self) -> u8 { + // Implementation to read a byte from the serial buffer + unimplemented!() + } +} + +fn delay(_ms: u32) { + // Implementation of delay + unimplemented!() +} + +fn send_at_command(command: &[u8]) { + // Implementation to send command to the GPS module + unimplemented!() +} + +fn get_gps_location(my_serial: &MySerial) -> Option<(BytesMut, BytesMut)> { + // Request GPS information + send_at_command(b"AT+GPSRD=1\r\n"); + // Wait for GPS information to be available + delay(2000); + + let mut response = BytesMut::with_capacity(128); // Pre-allocate buffer + + // Read available bytes from the serial + while my_serial.available() > 0 { + let byte = my_serial.read(); + response.put_u8(byte); // Store the byte in the buffer + } + + // Parse the response for latitude and longitude + if let Some(index) = response.windows(7).position(|w| w == b"GPSRD: ") { + let trimmed_response = &response[index + 8..]; // Skip "GPSRD: " + + if let Some(comma_index) = trimmed_response.iter().position(|&b| b == b',') { + let latitude = trimmed_response[..comma_index].to_vec().into(); + let remaining = &trimmed_response[comma_index + 1..]; + + if let Some(next_comma_index) = remaining.iter().position(|&b| b == b',') { + let longitude = remaining[..next_comma_index].to_vec().into(); + return Some((latitude, longitude)); + } + } + } + + None // Return None if parsing fails +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..623c71a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,85 @@ +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] +#![deny(clippy::clone_on_ref_ptr)] + +// #[macro_use] +extern crate alloc; +pub mod run; +pub mod utils; + +// use embassy_executor::Spawner; +// use embassy_net::tcp::TcpSocket; +// use embassy_net::{Stack, StackResources}; +// use embassy_serial::{AsyncDevice, Config}; +// use embassy_time::{Duration, Timer}; +// use embedded_hal::digital::v2::OutputPin; +// use std::net::Ipv4Addr; + +// #[embassy_executor::main] +// async fn main(_spawner: Spawner) { +// // Configure the serial port connected to the ESP32 +// let config = Config::default(); +// let mut serial = AsyncDevice::new(peripherals.UART0, config).unwrap(); + +// // Configure the network stack +// static mut RX_BUFFER: [u8; 1024] = [0; 1024]; +// static mut TX_BUFFER: [u8; 1024] = [0; 1024]; +// let stack = &mut Stack::new( +// StackResources::new() +// .tx_buffer(TX_BUFFER) +// .rx_buffer(RX_BUFFER), +// ); + +// // Power on the modem (if necessary) +// // ... + +// // Initialize the PPP connection +// let mut ppp = embassy_net_ppp::Ppp::new(&mut serial, stack); + +// // Attach to the GPRS network +// ppp.write_at("AT+CGATT=1\r").await.unwrap(); +// ppp.wait_for_ok().await.unwrap(); + +// // Set the PDP context +// ppp.write_at("AT+CGDCONT=1,\"IP\",\"cmnet\"\r") +// .await +// .unwrap(); +// ppp.wait_for_ok().await.unwrap(); +// // AT+CGDCONT=1,"IP","internet" +// // Activate the PDP context +// ppp.write_at("AT+CGACT=1,1\r").await.unwrap(); +// ppp.wait_for_ok().await.unwrap(); + +// // Start PPP translation +// ppp.write_at("ATD*99***1#\r").await.unwrap(); +// ppp.wait_for("CONNECT").await.unwrap(); + +// // Wait for the connection to be established +// ppp.wait_for("+++").await.unwrap(); +// Timer::after(Duration::from_secs(3)).await; + +// // Configure the network interface +// let config = embassy_net::Config::dhcpv4(Default::default()); +// stack.configure(config).unwrap(); + +// // Wait for the network to be configured +// stack.wait_for_link().await; + +// // Get the assigned IP address +// let ip = stack.get_ip_address().unwrap(); +// println!("IP address: {}", ip); + +// // Create a TCP socket +// let mut socket = TcpSocket::new(stack, &mut [0; 1024]); +// socket.bind(Ipv4Addr::UNSPECIFIED, 8080).unwrap(); +// socket.listen(1).unwrap(); + +// loop { +// // Accept a connection +// let (_remote_addr, mut connection) = socket.accept().await.unwrap(); + +// // Handle the connection +// // ... +// } +// } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7a46c44 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,317 @@ +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] +#![deny(clippy::clone_on_ref_ptr)] + +use alloc::vec::Vec; +use embassy_executor::Spawner; +use embassy_net::{Config, ConfigV4, Ipv4Address, Ipv4Cidr, Stack, StackResources}; +use embassy_net_ppp::Runner; +use embassy_sync::{blocking_mutex::raw::NoopRawMutex, mutex::Mutex, signal::Signal}; +use embassy_time::{with_timeout, Duration, Timer}; +use esp_backtrace as _; +// use hal::uart::ClockSource; +use hal::{ + clock::{ClockControl, Clocks}, + delay::Delay, + gpio::{GpioPin, Io}, + peripherals::{Peripherals, UART0, UART1}, + prelude::*, + system::SystemControl, + timer::{timg::TimerGroup, ErasedTimer, OneShotTimer}, + uart::{ + config::{Config as UartConfig, DataBits, Parity, StopBits}, + ClockSource, Uart, + }, +}; +use log::{error, info, warn}; +use ppp_gsm::{ + run::modem::{ + module::{SharedUart1, UartWrapper}, + parse::parse::{ModemResponse, ToSend}, + }, + singleton, + utils::generate_random_seed, +}; +use static_cell::StaticCell; +extern crate alloc; +use core::mem::MaybeUninit; + +#[global_allocator] +static ALLOCATOR: esp_alloc::EspHeap = esp_alloc::EspHeap::empty(); + +fn init_heap() { + const HEAP_SIZE: usize = 32 * 1024; + static mut HEAP: MaybeUninit<[u8; HEAP_SIZE]> = MaybeUninit::uninit(); + + unsafe { + ALLOCATOR.init(HEAP.as_mut_ptr() as *mut u8, HEAP_SIZE); + } +} + +pub const READ_BUF_SIZE: usize = 64; +// When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html +macro_rules! mk_static { + ($t:ty,$val:expr) => {{ + static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); + #[deny(unused_attributes)] + let x = STATIC_CELL.uninit().write(($val)); + x + }}; +} + +#[main] +async fn main(spawner: Spawner) { + let peripherals = Peripherals::take(); + let system = SystemControl::new(peripherals.SYSTEM); + + // let clocks = ClockControl::max(system.clock_control).freeze(); + let clocks = singleton!(ClockControl::max(system.clock_control).freeze(), Clocks<'_>); + + let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks, None); + let timer0 = OneShotTimer::new(timg0.timer0.into()); + let timers = [timer0]; + let timers = mk_static!([OneShotTimer; 1], timers); + esp_hal_embassy::init(&clocks, timers); + + let delay = Delay::new(&clocks); + init_heap(); + + esp_println::logger::init_logger_from_env(); + + // Init network device + static STATE: StaticCell> = StaticCell::new(); + let state = STATE.init(embassy_net_ppp::State::<4, 4>::new()); + let (device, runner) = embassy_net_ppp::new(state); + + // Generate random seed + let seed = generate_random_seed(); + + // Init network stack + static STACK: StaticCell>> = StaticCell::new(); + static RESOURCES: StaticCell> = StaticCell::new(); + let stack = &*STACK.init(Stack::new( + device, + Config::default(), // don't configure IP yet + RESOURCES.init(StackResources::<3>::new()), + seed, + )); + let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); + + static SIGNAL: StaticCell)>> = StaticCell::new(); + let signal = &*SIGNAL.init(Signal::new()); + + static MODEM_MUTEX: StaticCell>> = StaticCell::new(); + let mut modem = UartWrapper::new( + peripherals.UART0, + peripherals.UART1, + io.pins.gpio14, + io.pins.gpio15, + signal, + &clocks, + ); + let modem = &*MODEM_MUTEX.init(Mutex::new(modem)); + + // spawner.spawn(uart_reader(modem)).unwrap(); + match spawner.spawn(uart_reader(modem)) { + Ok(_) => info!("uart_reader task spawned successfully"), + Err(e) => error!("Failed to spawn uart_reader task: {:?}", e), + } + // spawner.spawn(ppp_task(stack, runner, modem)).unwrap(); + match spawner.spawn(ppp_task(stack, runner, modem)) { + Ok(_) => info!("ppp_task task spawned successfully"), + Err(e) => error!("Failed to spawn ppp_task task: {:?}", e), + } + { + let mut modem_guard = modem.lock().await; + match modem_guard.init_with_retry().await { + Ok(_) => info!("init completed successfully"), + Err(e) => { + error!("init failure: {:?}", e); + } + }; + } + loop { + log::info!("Hello world!"); + delay.delay(500.millis()); + } +} +use embedded_io_async::Read; + +#[embassy_executor::task] +async fn ppp_task( + stack: &'static Stack>, + mut runner: Runner<'static>, + // mut modem: UartWrapper<'static>, + modem: &'static Mutex>, +) -> ! { + let config = embassy_net_ppp::Config { + username: b"myuser", + password: b"mypass", + }; + Timer::after(Duration::from_millis(10)).await; // Adjust delay if needed + + let mut modem_guard = modem.lock().await; + + runner + .run(&mut *modem_guard, config, |ipv4| { + let Some(addr) = ipv4.address else { + warn!("PPP did not provide an IP address."); + return; + }; + // let mut dns_servers = Vec::new(); + let mut dns_servers: heapless::Vec = heapless::Vec::new(); + + for s in ipv4.dns_servers.iter().flatten() { + let _ = dns_servers.push(Ipv4Address::from_bytes(&s.0)); + } + let config = ConfigV4::Static(embassy_net::StaticConfigV4 { + address: Ipv4Cidr::new(Ipv4Address::from_bytes(&addr.0), 0), + gateway: None, + dns_servers, + }); + stack.set_config_v4(config); + }) + .await + .unwrap(); + unreachable!() +} +#[embassy_executor::task] +// async fn uart_reader(reader: &'static Mutex>) -> ! { +async fn uart_reader(modem: &'static Mutex>) -> ! { + const MAX_BUFFER_SIZE: usize = 10 * READ_BUF_SIZE + 16; + let mut rbuf: [u8; MAX_BUFFER_SIZE] = [0u8; MAX_BUFFER_SIZE]; + let mut offset = 0; + + info!("uart_reader task started"); + + loop { + info!("reader after loop"); + { + let mut modem_guard = modem.lock().await; + + info!("rdr after loop"); + // Log UART configuration + // info!("UART1 configuration: {:?}", modem_guard.uart1.get_config()); + // Perform a direct write-read test to ensure UART is working + use embedded_io_async::Write; + let test_data = b"AT\r\n"; + modem_guard.write(test_data).await.unwrap(); + info!("Sent test data: {:?}", test_data); + + info!("rdr before read()"); + match modem_guard.read(&mut rbuf[offset..]).await { + Ok(len) => { + info!("rdr_guard after read()"); + if len > 0 { + offset += len; + info!("Received {} bytes: {:?}", len, &rbuf[..offset]); + + modem_guard.signal.signal((offset, rbuf[..offset].to_vec())); + offset = 0; // Reset the offset after signaling + } else { + info!("Received empty data (len = 0)"); + } + } + Err(e) => { + error!("[uart_reader] RX Error: {:?}", e); + } + } + } + + // Add a small delay to avoid busy looping too fast + Timer::after(Duration::from_millis(1)).await; // Adjust delay if needed + } +} + +trait NewTrait<'a> { + pub async fn send_at( + &mut self, + tosend: Option<&[u8]>, + msg: Option<&str>, + _timeout_ms: Option, + ); + fn new( + // uart: &'a mut Uart<'static, UART1, Async> + _uart0_per: UART0, + uart1_per: UART1, + tx_pin: GpioPin<14>, + rx_pin: GpioPin<15>, + signal: &'static Signal)>, + clocks: &Clocks<'static>, + ) -> Self; +} + +impl<'a> NewTrait<'a> for UartWrapper<'a> { + fn new( + // uart: &'a mut Uart<'static, UART1, Async> + _uart0_per: UART0, + uart1_per: UART1, + tx_pin: GpioPin<14>, + rx_pin: GpioPin<15>, + signal: &'static Signal)>, + clocks: &Clocks<'static>, + ) -> Self { + // let uart1 = { + let (tx, rx) = { + let config = UartConfig { + baudrate: 115200, + data_bits: DataBits::DataBits8, + parity: Parity::ParityNone, + stop_bits: StopBits::STOP1, + clock_source: ClockSource::Apb, + rx_fifo_full_threshold: 1, + rx_timeout: Some(3), + }; + + config.rx_fifo_full_threshold(1); + let uart = + Uart::new_async_with_config(uart1_per, config, &clocks, tx_pin, rx_pin).unwrap(); + uart.split() + }; + + let modem_res = ModemResponse::new(); + let tosend = ToSend::new(); + + Self { + uart1: SharedUart1 { tx, rx }, + signal, + buffer: [0; 256], + read_pos: 0, + write_pos: 0, + modem_res, + tosend, + } + } + async fn send_at( + &mut self, + tosend: Option<&[u8]>, + msg: Option<&str>, + _timeout_ms: Option, + ) { + let msg_str = msg.unwrap_or("default"); + let tosend_f = tosend.unwrap_or(AT_CMD); + + info!( + "\n\x1b[32m[{msg_str}]\x1b[0m writing command: {:?}", + tosend_f + ); + + // Set the command to be sent + self.tosend.set_to_sent(tosend_f); + // Get the command after setting it + let cmd = self.tosend.get_to_sent().to_vec(); // Clone the command to a local variable + + if cmd.is_empty() { + info!("EMPTY: Command to send to modem is empty"); + return; + } + use embedded_io::Write; + // Now we can safely call self.write without borrowing self.tosend + if let Err(e) = self.write(&cmd).await { + error!("UART1 write failure: {:?}", e); + } else { + info!("UART1 wrote [{:?}] successfully", cmd); + } + } +} diff --git a/src/run/mod.rs b/src/run/mod.rs new file mode 100644 index 0000000..d6f851f --- /dev/null +++ b/src/run/mod.rs @@ -0,0 +1 @@ +pub mod modem; diff --git a/src/run/modem/apn.rs b/src/run/modem/apn.rs new file mode 100644 index 0000000..0a63b2f --- /dev/null +++ b/src/run/modem/apn.rs @@ -0,0 +1,82 @@ +// use super::{ +// errors::{Error, Result}, +// module::{FoundResponse, Modem}, +// parse::parse::{ModemResponse, Status}, +// }; + +use super::{ + error::{Error, Result}, + module::FoundResponse, +}; + +#[derive(Clone)] +pub struct Apn<'a> { + pub apn: &'a str, + pub username: &'a str, + pub password: &'a str, +} + +impl<'a> Apn<'a> { + pub const fn new(apn: &'a str) -> Self { + Self { + apn, + username: "", + password: "", + } + } + + pub fn get_apn_field(&self) -> &'a str { + self.apn + } +} + +impl<'a> From<&'a str> for Apn<'a> { + fn from(value: &'a str) -> Self { + Apn::new(value) + } +} + +impl UartWrapper { + pub async fn get_apn(&mut self) -> Result { + self.tosend.set_to_sent(b"AT+CSTT?\r\n"); + self.send_at(None, Some("get_apn"), None).await; + + let response = self.wait_response(None, None, None).await?; + match response.1 { + FoundResponse::M1 => Ok(self.modem_res.parse_apn(&response.0.response.data[..])?), + _ => Err(Error::Custom("error getting apn")), + } + } + pub async fn set_apn( + &mut self, + provider_name: &str, + userid: &str, + password: &str, + ) -> Result { + self.tosend.set_to_sent( + alloc::format!( + "AT+CSTT=\"{}\",\"{}\",\"{}\"\r\n", + provider_name, + userid, + password + ) + .as_bytes(), + ); + + self.send_at(None, Some("set_apn"), None).await; + + let response = self.wait_response(None, None, None).await?; + match response.1 { + FoundResponse::M1 => Ok(response.0.response.status), + _ => Err(Error::Custom("error setting apn")), + } + } +} + +impl ModemResponse { + pub(crate) fn parse_apn(&self, apn_response: &[u8]) -> Result { + // +CSTT: \"CMNET\", \"\", \"\"" + let apn = Apn::new("internet"); + Ok(apn) + } +} diff --git a/src/run/modem/coms/gprs/mod.rs b/src/run/modem/coms/gprs/mod.rs new file mode 100644 index 0000000..9565735 --- /dev/null +++ b/src/run/modem/coms/gprs/mod.rs @@ -0,0 +1,435 @@ +use log::{error, info}; + +use crate::run::modem::{ + errors::{Error, Result}, + module::{FoundResponse, RegistrationStatus, UartWrapper}, + parse::parse::{ModemResponse, PdpState, Status}, +}; + +#[derive(Debug, PartialEq)] +#[repr(u8)] +pub enum CIPSTATUS { + IPINITIAL, + IPSTART, + IPCONFIG, + IPIND, + IPGPRSACT, + IPSTATUS, + TCPCONNECTING, + IPCLOSE, + CONNECTOK, +} +impl<'a> UartWrapper<'a> { + /* + AT+CGATT=1 ;Attach to the GPRS network, can also use parameter 0 to detach. + OK ;Response, attach successful + + AT+CGDCONT=? ;Input test command for help information. + +CGDCONT: (1..7), (IP,IPV6,PPP),(0..3),(0..4) OK ;Response, show the helpful information. + + // AT+CGDCONT=1,"IP","internet" + AT+CGDCONT=1, "IP", "cmnet" ;Before active, use this command to set PDP context. + OK ;Response. Set context OK. + + AT+CGACT=1,1 ;Active command is used to active the specified PDP context. + OK ;Response, active successful. + + ATD*99***1# ;This command is to start PPP translation. + CONNECT ;Response, when get this, the module has been set to data state. + PPP data should be transferred after this response and anything input is treated as data. + + +++ ;This command is to change the status to online data state. + Notice that before input this command, you need to wait for a + three seconds’ break, and it should also be followed by 3 seconds’ + break, otherwise “+++” will be treated as data. + + ATH ;Use this command to return COMMAND state + ok Response + */ + + pub async fn set_modem_gprs(&mut self) -> Result<(CIPSTATUS, Status)> { + // Attempt to check network registration, handle potential errors + self.check_network_registration().await.map_err(|e| { + info!("Failed to check network registration: {:?}", e); + Error::Custom("Network registration failed") + })?; + + // Check attached network status + match self.check_attached_network().await { + Ok(s) => match s { + PdpState::Activated => { + info!("Already attached to the network"); + let pdpstatus = self.set_pdp_parameter().await.map_err(|e| { + error!("Failed to set PDP parameter: {:?}", e); + Error::Custom("Setting PDP parameter failed") + })?; + match pdpstatus { + Status::OK => { + info!("PDP set"); + let pdpactivationstatus = + self.activating_pdp_context().await.map_err(|e| { + error!("Failed to activate PDP context: {:?}", e); + Error::Custom("Activating PDP context failed") + })?; + match pdpactivationstatus { + Status::OK => { + info!("PDP context activated"); + let cipstatus = self.check_ip_status().await.map_err(|e| { + error!("Failed to check IP status: {:?}", e); + Error::Custom("Checking IP status failed") + })?; + Ok((cipstatus, pdpactivationstatus)) + } + Status::ModemError(e) => { + error!("Modem responded with an error: {:?}", e); + Err(Error::Custom("Modem error during PDP context activation")) + } + _ => Err(Error::Custom("Unexpected status")), + } + } + Status::ModemError(e) => { + error!("Modem responded with an error: {:?}", e); + Err(Error::Custom("Modem error during PDP parameter setting")) + } + _ => Err(Error::Custom("Unexpected status")), + } + } + PdpState::Deactivated => { + let status = self.attach_network().await.map_err(|e| { + error!("Failed to attach network: {:?}", e); + Error::Custom("Attaching to network failed") + })?; + match status { + Status::OK => { + info!("Attached to the network"); + let pdpstatus = self.set_pdp_parameter().await.map_err(|e| { + error!("Failed to set PDP parameter: {:?}", e); + Error::Custom("Setting PDP parameter failed") + })?; + match pdpstatus { + Status::OK => { + info!("PDP set"); + let pdpactivationstatus = + self.activating_pdp_context().await.map_err(|e| { + error!("Failed to activate PDP context: {:?}", e); + Error::Custom("Activating PDP context failed") + })?; + match pdpactivationstatus { + Status::OK => { + info!("PDP context activated"); + let cipstatus = + self.check_ip_status().await.map_err(|e| { + error!("Failed to check IP status: {:?}", e); + Error::Custom("Checking IP status failed") + })?; + Ok((cipstatus, pdpactivationstatus)) + } + Status::ModemError(e) => { + error!("Modem responded with an error: {:?}", e); + Err(Error::Custom( + "Modem error during PDP context activation", + )) + } + // Status::CONNECT => {} // + _ => Err(Error::Custom("Unexpected status")), + } + } + Status::ModemError(e) => { + info!("Modem responded with an error: {:?}", e); + Err(Error::Custom("Modem error during PDP parameter setting")) + } + _ => Err(Error::Custom("Unexpected status")), + } + } + Status::ModemError(e) => { + error!("Modem responded with an error: {:?}", e); + Err(Error::Custom("Modem error during network attachment")) + } + _ => Err(Error::Custom("Unexpected status")), + } + } + }, + Err(e) => { + error!("Failed to check attached network: {:?}", e); + Err(Error::Custom("Checking attached network failed")) + } + } + } + + pub async fn check_ip_status(&mut self) -> Result { + // AT+CIPSTATUS + // self.tosend.set_to_sent(b"AT+CIPSTATUS\r\n"); + // self.send_at(None, Some("check_ip_status"), None).await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CIPSTATUS\r\n"; + self.send_at(Some(cmd), Some("check_ip_status"), None).await; + let res_prefix = b"AT+CIPSTATUS\r\n+CIPSTATUS:\r\nSTATE:"; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + + match response.1 { + FoundResponse::M1 => Ok(self + .modem_res + .parse_ip_status(&response.0.response.data[..])?), + _ => Err(Error::Custom("Failed to check IP status")), + } + } + /// Returns the attach network of this [`Modem`]. + /// Attach to the GPRS network, can also use parameter 0 to detach. + /// Activate GPRS - "AT+CGATT=1" + pub async fn attach_network(&mut self) -> Result { + // self.tosend.set_to_sent(b"AT+CGATT=1\r\n"); + // self.send_at(None, Some("attach_network"), None).await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CGATT=1\r\n"; + self.send_at(Some(cmd), Some("attach_network"), None).await; + let res_prefix = b"AT+CGATT=1\r\n"; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => { + let status = response.0.response.status; + Ok(status) + } + _ => Err(Error::Custom("failed to attach to network")), + } + } + pub async fn start_ppp(&mut self) -> Result { + // self.tosend.set_to_sent(b"AT+CGATT=1\r\n"); + // self.send_at(None, Some("attach_network"), None).await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"ATD*99***1#\r\n"; + self.send_at(Some(cmd), Some("start_ppp"), None).await; + let res_prefix = b"ATD*99***1#\r\n"; + let res_suffix = b"\r\n\r\nCONNECT\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => { + let status = response.0.response.status; + Ok(status) + } + _ => Err(Error::Custom("failed to attach to network")), + } + } + /// Command: AT+CGDCONT=? + /// Response: +CGDCONT: (1..7), (IP,IPV6,PPP),(0..3),(0..4) + /// Returns the read pdp context of this [`Modem`]. + /// Input test command for help information. + pub async fn read_pdp_context(&mut self) -> Result { + // self.tosend.set_to_sent(b"AT+CGDCONT=?\r\n"); + // self.send_at(None, Some("read_pdp_context"), None).await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CGDCONT=?\r\n"; + self.send_at(Some(cmd), Some("read_pdp_context"), None) + .await; + let res_prefix = b"AT+CGDCONT=?\r\n\r\n+CGDCONT: "; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => { + let status = response.0.response.status; + Ok(status) + } + _ => Err(Error::Custom("failed to read pdp context")), + } + } + pub async fn set_pdp_parameter(&mut self) -> Result { + // "AT+CGDCONT=1,\"IP\",\"CMNET\"" + // "AT+CGDCONT=1,\"IP\",\"internet\"" + // AT+CGDCONT=? + // self.tosend + // .set_to_sent(b"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"); + // self.send_at(None, Some("set_pdp_parameter"), None).await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"; + self.send_at(Some(cmd), Some("set_pdp_parameter"), None) + .await; + let res_prefix = b"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => { + let status = response.0.response.status; + Ok(status) + } + _ => Err(Error::Custom("failed to set pdp parameter")), + } + } + pub async fn activating_pdp_context(&mut self) -> Result { + // Activate PDP context - "AT+CGACT=1,1" + // self.tosend.set_to_sent(b"AT+CGACT=1,1\r\n"); + // self.send_at(None, Some("activating_pdp_context"), None) + // .await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CGACT=1,1\r\n"; + self.send_at(Some(cmd), Some("activating_pdp_context"), None) + .await; + let res_prefix = b"AT+CGACT=1,1\r\n"; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => { + let status = response.0.response.status; + Ok(status) + } + _ => Err(Error::Custom("Failed to activate PDP context")), + } + } + pub async fn check_attached_network(&mut self) -> Result { + // get_pdp_context_states + // Activate GPRS - "AT+CGACT=?" + // self.tosend.set_to_sent(b"AT+CGACT=?\r\n"); + // self.send_at(None, Some("check_attached_network"), None) + // .await; + // let response = self.wait_response(None, None, None).await?; + + let response = { + let cmd = b"AT+CGACT=?\r\n"; + self.send_at(Some(cmd), Some("check_attached_network"), None) + .await; + let res_prefix = b"AT+CGACT=?\r\n\r\n+CGACT: "; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + + match response.1 { + FoundResponse::M1 => Ok(self + .modem_res + .get_pdp_context_states(&response.0.response.data[..])?), + _ => Err(Error::Custom("Failed to activate GPRS")), + } + } + /// Returns the get gprs network registration status of this [`Modem`]. + /// GPRS network registration status + pub async fn get_gprs_network_registration_status( + &mut self, + ) -> Result<(RegistrationStatus, Status)> { + // let response = { + // // self.send_at("+CGREG?", None).await?; + // self.tosend.set_to_sent(b"AT+CGREG?\r\n"); + // self.send_at(None, Some("get_gprs_network_registration_status"), None) + // .await; + // let response = self.wait_response(None, None, None).await?; + // }; + let response = { + let cmd = b"AT+CGREG?"; + self.send_at(Some(cmd), Some("gprs_network"), None).await; + let res_prefix = b"AT+CGREG?\r\n\r\n+CGREG: "; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => Ok(self + .modem_res + .parse_registration_status(&response.0.response.data[..])?), + // FoundResponse::M1 => Ok(&response.0), + _ => Err(Error::Custom("error getting registration status")), + } + } +} + +impl ModemResponse { + const fn cipstatus_from_repr(d: &[u8]) -> Option { + match d { + b"IP INITIAL" => Some(CIPSTATUS::IPINITIAL), + b"CONNECT OK" => Some(CIPSTATUS::CONNECTOK), + b"IP START" => Some(CIPSTATUS::IPSTART), + b"IP CONFIG" => Some(CIPSTATUS::IPCONFIG), + b"IP IND" => Some(CIPSTATUS::IPIND), + b"IP GPRSACT" => Some(CIPSTATUS::IPGPRSACT), + b"TCP CONNECTING" => Some(CIPSTATUS::TCPCONNECTING), + b"IP CLOSE" => Some(CIPSTATUS::IPCLOSE), + _ => None, + } + } + pub(crate) fn parse_ip_status(&self, cipstatus_response: &[u8]) -> Result { + // "AT+CIPSTATUS\r\n+CIPSTATUS:\r\nSTATE:IP INITIAL \r\n\r\nOK\r\n" + // "+CIPSTATUS:\r\nSTATE:IP INITIAL " + let prefix = b"+CIPSTATUS:\r\nSTATE:"; + + // Check if the response starts with the expected prefix + if !cipstatus_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse ip status")); + } + + // Remove the prefix by skipping its length + let status_content = &cipstatus_response[prefix.len()..]; + + // const IPINITIAL: &[u8] = b"IP INITIAL"; + // const CONNECTOK: &[u8] = b"CONNECT OK"; + // const CONNECTOK: &[u8] = b"IP CLOSE"; + + match Self::cipstatus_from_repr(status_content) { + Some(cip) => Ok(cip), + None => Err(Error::Custom("unknown cipstatus")), + } + } + + pub(crate) fn parse_ip_status_old(&self, cipstatus_response: &[u8]) -> Result { + // "AT+CIPSTATUS\r\n+CIPSTATUS:\r\nSTATE:IP INITIAL \r\n\r\nOK\r\n" + // "+CIPSTATUS:\r\nSTATE:IP INITIAL " + let prefix = b"+CIPSTATUS:\r\nSTATE:"; + + // Check if the response starts with the expected prefix + if !cipstatus_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse ip status")); + } + + // Remove the prefix by skipping its length + let status_content = &cipstatus_response[prefix.len()..]; + + // Find the position of the `:IP` substring + match status_content + .windows(b":IP".len()) + .position(|window| window == b":IP") + { + Some(ip_start) => { + // Check if a number exists before the `:IP` substring + if status_content[..ip_start] + .iter() + .rposition(|&b| b.is_ascii_digit()) + .is_none() + { + return Err(Error::NoNumberExist); + } + // Extract the number before the `:IP` substring + match status_content[..ip_start] + .iter() + .rposition(|&b| b.is_ascii_digit()) + { + Some(number_start) => { + let num_str = + core::str::from_utf8(&status_content[number_start..number_start + 1]) + .map_err(|_| Error::ParseError)?; + let number: u8 = num_str.parse().map_err(|_| Error::InvalidNumber)?; + if number <= 7 { + return Ok(number); + } else { + return Err(Error::InvalidNumber); + } + } + None => return Err(Error::NoNumberExist), + } + } + None => return Err(Error::NoNumberExist), + } + } +} diff --git a/src/run/modem/coms/mod.rs b/src/run/modem/coms/mod.rs new file mode 100644 index 0000000..682908f --- /dev/null +++ b/src/run/modem/coms/mod.rs @@ -0,0 +1 @@ +pub mod gprs; diff --git a/src/run/modem/errors.rs b/src/run/modem/errors.rs new file mode 100644 index 0000000..9e61138 --- /dev/null +++ b/src/run/modem/errors.rs @@ -0,0 +1,14 @@ +#[derive(Debug)] +pub enum Error { + Custom(&'static str), + ParseError, + BorrowError, + InvalidState, + InvalidNumber, + NoNumberExist, + InitTimeout, + Timeout, + UartError(), +} + +pub type Result = core::result::Result; diff --git a/src/run/modem/impls.rs b/src/run/modem/impls.rs new file mode 100644 index 0000000..2c31810 --- /dev/null +++ b/src/run/modem/impls.rs @@ -0,0 +1,44 @@ +use embedded_io_async::{BufRead, ErrorType, Read, Write}; + +use super::module::UartWrapper; + +impl<'a> ErrorType for UartWrapper<'a> { + type Error = hal::uart::Error; +} + +impl<'a> Read for UartWrapper<'a> { + async fn read(&mut self, buf: &mut [u8]) -> Result { + let available = self.write_pos - self.read_pos; + let to_copy = available.min(buf.len()); + buf[..to_copy].copy_from_slice(&self.buffer[self.read_pos..self.read_pos + to_copy]); + self.read_pos += to_copy; + + if to_copy == 0 { + // Buffer is empty, read directly from UART + self.uart1.rx.read(buf).await + } else { + Ok(to_copy) + } + } +} + +impl<'a> Write for UartWrapper<'a> { + async fn write(&mut self, buf: &[u8]) -> Result { + self.uart1.tx.write(buf).await + } +} + +impl<'a> BufRead for UartWrapper<'a> { + async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> { + if self.read_pos == self.write_pos { + // Buffer is empty, fill it + self.read_pos = 0; + self.write_pos = self.uart1.rx.read(&mut self.buffer).await?; + } + Ok(&self.buffer[self.read_pos..self.write_pos]) + } + + fn consume(&mut self, amt: usize) { + self.read_pos = (self.read_pos + amt).min(self.write_pos); + } +} diff --git a/src/run/modem/mod.rs b/src/run/modem/mod.rs new file mode 100644 index 0000000..d42617f --- /dev/null +++ b/src/run/modem/mod.rs @@ -0,0 +1,6 @@ +// pub mod apn; +pub mod coms; +pub mod errors; +pub mod impls; +pub mod module; +pub mod parse; diff --git a/src/run/modem/module.rs b/src/run/modem/module.rs new file mode 100644 index 0000000..149fa3c --- /dev/null +++ b/src/run/modem/module.rs @@ -0,0 +1,300 @@ +use crate::singleton; + +use super::{ + errors::{Error, Result}, + parse::parse::{ModemResponse, Status, ToSend}, +}; +use alloc::{ + // rc::Rc, + string::ToString, + vec::Vec, +}; +use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal}; +use embassy_time::{with_timeout, Duration, Instant, Timer}; +use embedded_io_async::Write; +use hal::{ + clock::Clocks, + gpio::GpioPin, + peripherals::{UART0, UART1}, + uart::{ + config::{Config, DataBits, Parity, StopBits}, + ClockSource, Uart, UartRx, UartTx, + }, + Async, +}; +use log::{error, info, warn}; +// uart::{ +// config::{Config as UartConfig, DataBits, Parity, StopBits}, +// ClockSource, TxRxPins, Uart, UartTx, +// }, +// use static_cell::StaticCell; +pub struct SharedUart1<'a> { + pub tx: UartTx<'a, UART1, Async>, + pub rx: UartRx<'a, UART1, Async>, +} + +pub struct UartWrapper<'a> { + pub uart1: SharedUart1<'a>, + // pub uart1: Uart<'a, UART1, Async>, + pub signal: &'a Signal)>, + pub buffer: [u8; 256], // Adjust size as needed + pub read_pos: usize, + pub write_pos: usize, + pub modem_res: ModemResponse, + pub tosend: ToSend, +} +impl<'a> UartWrapper<'a> { + pub async fn init_with_retry(&mut self) -> Result<()> { + for attempt in 1..=3 { + info!("Init attempt {}", attempt); + match with_timeout(Duration::from_secs(10), self.init(None)).await { + Ok(result) => return result, + Err(_) => warn!("Init attempt {} timed out", attempt), + } + } + Err(Error::InitTimeout) + } + // async fn wait_for_response(&mut self, timeout: Duration) -> Result> { + // let mut buffer = Vec::new(); + // let deadline = Timer::after(timeout); + + // // let mut modem_guard = modem.lock().await; + + // loop { + // match embassy_futures::select::select(self.uart1.read(), deadline).await { + // embassy_futures::select::Either::First(Ok(byte)) => { + // buffer.push(byte); + // if buffer.ends_with(b"\r\nOK\r\n") { + // return Ok(buffer); + // } + // } + // embassy_futures::select::Either::First(Err(e)) => return Err(Error::UartError(e)), + // embassy_futures::select::Either::Second(_) => return Err(Error::Timeout), + // } + // } + // } + pub async fn init(&mut self, timeout_ms: Option) -> Result<()> { + let timeout = timeout_ms.unwrap_or(30000); + let start_time = Instant::now(); + loop { + info!("Modem: init function!"); + // Send a simple AT command + let (_, found_response) = { + let cmd = b"AT\r\n"; + self.send_at(Some(cmd), Some("init"), None).await; + let isok_res_prefix = b"AT\r\n\r\nOK\r\n"; + self.need(Some(isok_res_prefix), None).await + }; + if start_time.elapsed().as_millis() > timeout { + info!("timeout initializing modem"); + } + match found_response { + FoundResponse::M1 => break, + _ => Timer::after(Duration::from_millis(1000)).await, + }; + } + esp_println::println!("\nsuccessfully established communication with the modem"); + Ok(()) + } + /// Check that the cellular module is alive. + /// + /// See if the cellular module is responding at the AT interface by poking + /// it with "AT" up to `attempts` times, waiting 1 second for an "OK" + /// response each time + pub async fn is_alive(&mut self, attempts: u8) -> Result { + for i in 0..attempts { + let (res, found_response) = { + let cmd = b"AT\r\n"; + self.send_at( + Some(cmd), + Some(("is_alive: ".to_string() + &i.to_string()).as_str()), + None, + ) + .await; + let isok_res_prefix = b"AT\r\n\r\nOK\r\n"; + self.need(Some(isok_res_prefix), None).await + }; + match found_response { + FoundResponse::M1 => { + return Ok(res.response.status); + } + FoundResponse::M2 => { + return Ok(res.response.status); + } + _ => { + continue; + } + } + } + + Err(Error::Custom("Modem not responding in is_alive")) + } + pub async fn check_network_registration(&mut self) -> Result { + let response = { + let cmd = b"AT+CREG?\r\n"; + self.send_at(Some(cmd), Some("check_network_registration"), None) + .await; + let res_prefix = b"AT+CREG?\r\n\r\n+CREG: "; + let res_suffix = b"\r\n\r\nOK\r\n"; + self.need(Some(res_prefix), Some(res_suffix)).await + }; + match response.1 { + FoundResponse::M1 => Ok(self + .modem_res + .parse_network_registaration(&response.0.response.data[..])?), + _ => Err(Error::Custom("error getting subscriber number")), + } + } + + pub async fn need( + &mut self, + gps_prefixparam: Option<&[u8]>, + gps_suffixparam: Option<&[u8]>, + ) -> (ModemResponse, FoundResponse) { + let gps_prefix = gps_prefixparam.unwrap_or(AT_CMD); + let gps_suffix = gps_suffixparam.unwrap_or(AT_CMD); + let mut modem_response = ModemResponse::new(); + let mut found_response = FoundResponse::None; + let mut received_bytes: Vec = Vec::new(); + + loop { + let (_len, line_bytes) = self.signal.wait().await; + received_bytes.extend_from_slice(&line_bytes); + self.signal.reset(); + info!("looping……"); + + if gps_prefixparam.is_some() && gps_suffixparam.is_some() { + if let Some((prefix_pos, suffix_pos)) = + find_prefix_suffix(&received_bytes, gps_prefix, gps_suffix) + { + let extracted = &received_bytes[prefix_pos..suffix_pos + gps_suffix.len()]; + modem_response = self + .modem_res + .parse0(&extracted, Some(self.tosend.get_to_sent())); + found_response = FoundResponse::M1; + break; + } + } else if let Some(pos) = find_sequence(&received_bytes, gps_prefix) { + let extracted = &received_bytes[pos..pos + gps_prefix.len()]; + modem_response = self + .modem_res + .parse0(&extracted, Some(self.tosend.get_to_sent())); + found_response = FoundResponse::M1; + break; + } + + if find_sequence(&received_bytes, b"ERROR").is_some() { + modem_response = self + .modem_res + .parse0(&received_bytes, Some(self.tosend.get_to_sent())); + found_response = FoundResponse::M2; + break; + } + } + (modem_response, found_response) + } +} +const AT_CMD: &[u8] = b"AT\r\n"; +// const AT_OK_RESPONSE: &[u8] = b"AT\r\n\r\nOK\r\n"; +// const AT_CREG: &[u8] = b"AT+CREG?\r\n"; +// const CREG_RESPONSE_PREFIX: &[u8] = b"AT+CREG?\r\n\r\n+CREG: "; +// const RESPONSE_SUFFIX: &[u8] = b"\r\n\r\nOK\r\n"; + +fn find_prefix_suffix(buffer: &[u8], prefix: &[u8], suffix: &[u8]) -> Option<(usize, usize)> { + if let Some(prefix_pos) = buffer + .windows(prefix.len()) + .position(|window| window == prefix) + { + let after_prefix_pos = prefix_pos + prefix.len(); + if let Some(suffix_pos) = buffer[after_prefix_pos..] + .windows(suffix.len()) + .position(|window| window == suffix) + { + return Some((prefix_pos, after_prefix_pos + suffix_pos)); + } + } + None +} + +fn find_sequence(buffer: &[u8], sequence: &[u8]) -> Option { + buffer + .windows(sequence.len()) + .position(|window| window == sequence) +} +#[derive(Debug)] +pub enum FoundResponse { + None, + M1, + M2, +} +#[derive(Debug, PartialEq)] +#[repr(u8)] +pub enum RegistrationStatus { + NotRegistered = 0, + OkHome = 1, + Searching = 2, + Denied = 3, + Unknown = 4, + OkRoaming = 5, +} +#[derive(Debug, PartialEq)] +#[repr(u8)] +pub enum PreferredMode { + Automatic = 2, + CDMAOnly = 9, + EVDOOnly = 10, + GSMOnly = 13, + WCDMAOnly = 14, + GSMPlusWCDMAOnly = 19, + CDMAPlusEVDOOnly = 22, + LTEOnly = 37, + GSMPlusWCDMAPlusLTEOnly = 39, + AnyButLTE = 48, + GSMPlusLTEOnly = 51, + WCDMAPlusLTEOnly = 54, + TDCDMAOnly = 59, + GSMPlusTDSCDMAOnly = 60, + GSMPlusWCDMAPlusTDSCDMAOnly = 63, + CDMAPlusEVDOPlusGSMPlusWCDMAPlusTDSCDMAOnly = 67, +} +#[derive(Debug, PartialEq)] +#[repr(u16)] +pub enum ModemErrors { + OPERATIONNOTALLOWED = 3, + EXENOTSUPPORT = 49, + EXEFAIL = 50, + PARAMINVALID = 53, + INVALIDCOMMANDLINE = 58, + OPERNOTSUPP = 303, + INVALIDTXTPARAM = 305, + INVALIDMEMINDEX = 321, + UNKNOWNERROR = 500, +} + +#[derive(Debug, PartialEq)] +pub enum SIMStatus { + UNKNOWN, + READY, + SIMPIN, + SIMPUK, + PHSIMPIN, + SIMPIN2, + SIMPUK2, + PHNETPIN, +} + +pub struct SignalQuality { + pub rssi: u8, + pub ber: u8, +} + +impl SignalQuality { + pub fn rssi(&self) -> Option { + match self.rssi { + 0 => Some(-115), + 1 => Some(-111), + 2..=32 => Some(-110 + 2 * (self.rssi - 2) as i8), + _ => None, + } + } +} diff --git a/src/run/modem/parse/mod.rs b/src/run/modem/parse/mod.rs new file mode 100644 index 0000000..ea86848 --- /dev/null +++ b/src/run/modem/parse/mod.rs @@ -0,0 +1 @@ +pub mod parse; diff --git a/src/run/modem/parse/parse.rs b/src/run/modem/parse/parse.rs new file mode 100644 index 0000000..c0f20f7 --- /dev/null +++ b/src/run/modem/parse/parse.rs @@ -0,0 +1,1012 @@ +use core::fmt; + +use alloc::vec::Vec; +use log::info; + +use crate::run::modem::{ + // apn::Apn, + errors::{Error, Result}, + module::{ModemErrors, PreferredMode, RegistrationStatus, SIMStatus, SignalQuality}, +}; + +pub struct ToSend { + pub to_send: Vec, + pub len: usize, + pub timeout_ms: Option, +} + +impl ToSend { + pub fn new() -> Self { + Self { + to_send: Vec::new(), + len: 0, + timeout_ms: Some(0), + } + } + pub fn at_tosend(&mut self, _cmd: &[u8]) -> Self { + let cmd_to_send = self.get_to_sent(); + Self { + to_send: cmd_to_send.to_vec(), + len: cmd_to_send.len(), + timeout_ms: Some(10000), + } + } + pub fn empty_tosend(&mut self) -> Self { + Self { + to_send: Vec::new(), + len: 0, + timeout_ms: Some(0), + } + } + pub fn at_terminal_cmd(&mut self, cmd: &[u8]) -> Self { + // let mut extended_cmd = cmd.to_vec(); + // extended_cmd.push(10); + let cleaned_cmd = clean_array::remove_chars_and_add_newline(&cmd[..]); + + Self { + to_send: cleaned_cmd, + len: cmd.len() + 1, + timeout_ms: Some(10000), + } + } + + pub fn clear(&mut self) { + self.to_send = Vec::new(); + self.len = 0; + } + pub fn get_to_sent(&mut self) -> &[u8] { + let at = [65, 84]; + if self.to_send[..] + .windows(at.len()) + .any(|window| window == at) + { + &self.to_send[..] + // found_response = FoundResponse::M1; + } else if self.to_send[..] + .windows([26].len()) + .any(|window| window == [26]) + { + &self.to_send[..] + // found_response = FoundResponse::M1; + } else { + esp_println::println!("\nAT sent does not have the PREFIX [AT]"); + &self.to_send[..] + } + } + pub fn set_to_sent(&mut self, cmd: &[u8]) { + let cleaned_cmd = clean_array::remove_chars_and_add_newline(&cmd[..]); + self.to_send = cleaned_cmd; + } + pub fn cmd_t(&mut self, cmd: &[u8]) -> Vec { + let cleaned_cmd = clean_array::remove_chars_and_add_newline(&cmd[..]); + cleaned_cmd + } + pub fn get_timeout(&mut self) -> Option { + self.timeout_ms + } +} + +pub enum Status { + OK, + CONNECT, + ModemError(Option), +} + +pub enum PdpState { + Deactivated = 0, + Activated = 1, +} + +pub struct ResponseData { + pub data: Vec, + pub status: Status, + // error: Option<[u8; 8]>, +} + +impl ResponseData { + pub fn new() -> Self { + ResponseData { + data: Vec::new(), + status: Status::ModemError(None), + } + } + + pub fn set_data(&mut self, bytes: &[u8]) { + // let length = bytes.len(); + // self.data[..length].copy_from_slice(&bytes[..length]); + self.data.extend_from_slice(&bytes[..]); + } + + pub fn set_status(&mut self, bytes: &[u8]) { + if bytes.contains(&79) && bytes.contains(&75) { + self.status = Status::OK; + } else { + } + } + pub fn set_error_from_modem(&mut self, e: ModemErrors) { + self.status = Status::ModemError(Some(e)); + } +} + +impl core::fmt::Debug for ResponseData { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let cleaned = clean_array::remove_invalid_utf8(&self.data[..]); + let data_str = core::str::from_utf8(&cleaned).unwrap_or(""); + // let status_str = core::str::from_utf8(&self.status).unwrap_or(""); + + f.debug_struct("ResponseData") + .field("data", &data_str) + .field("status", &self.status) + .finish() + // f.debug_struct("ResponseData") + // .field("data", &self.data) + // .field("status", &self.status) + // .field("error", &error_str) + // .finish() + } +} + +pub struct ModemResponse { + pub bytesresponse: Vec, + pub command_sent: Vec, + pub response: ResponseData, +} + +pub struct DateTime { + pub datetime: Vec, + pub date: Vec, + pub time: Vec, +} +impl ModemResponse { + pub fn new() -> Self { + ModemResponse { + bytesresponse: Vec::new(), + command_sent: Vec::new(), + response: ResponseData::new(), + } + } + + pub fn set_command_sent(&mut self, command: &[u8]) { + // let length = command.len(); + // self.command_sent[..length].copy_from_slice(&command[..length]); + self.command_sent.extend_from_slice(&command[..]); + } + pub fn set_bytes_response(&mut self, command: &[u8]) { + self.bytesresponse.extend_from_slice(&command[..]); + } + pub fn clear(&mut self) { + self.command_sent = Vec::new(); + self.response = ResponseData { + data: Vec::new(), + status: Status::ModemError(None), + } + } + + pub fn parse0(&mut self, received_bytes: &[u8], separator: Option<&[u8]>) -> Self { + // if received_bytes + // .windows([26].len()) + // .any(|window| window == [26]) + // && self.bytesresponse.is_empty() + // { + // self.set_bytes_response(received_bytes); + // } + if self.bytesresponse.is_empty() { + if received_bytes + .windows([26].len()) + .any(|window| window == [26]) + && self.bytesresponse.is_empty() + { + self.set_bytes_response(received_bytes); + } + } else { + self.bytesresponse.clear() + } + let mut modem_response = ModemResponse::new(); + + let (nested_chunks, _final_chunk) = split_nested(&received_bytes, separator); + // if received_bytes + // .windows([26].len()) + // .any(|window| window == [26]) + // { + // esp_println::println!("\nHere, nested_chunks: {:?}", nested_chunks.len()); + // esp_println::println!("\nHere, nested_chunks: {:?}", nested_chunks); + // } + for (i, v) in nested_chunks.iter().enumerate() { + if nested_chunks.len() == 4 + && received_bytes + .windows([26].len()) + .any(|window| window == [26]) + { + match i { + 0 => modem_response.set_command_sent(v), + 1 => { + // debug_println!("Here: {:?}", v); + modem_response.set_command_sent(v); + modem_response.bytesresponse.clear(); + } + 2 => modem_response.response.set_data(v), + 3 => modem_response.response.set_status(v), + _ => { + esp_println::println!("\nOther element at index {}: {:?}", i, v); + // Perform some action for other elements + } + } + } else if nested_chunks.len() == 3 { + match i { + 0 => modem_response.set_command_sent(v), + 1 => { + // debug_println!("Here: {:?}", v); + modem_response.response.set_data(v) + } + 2 => modem_response.response.set_status(v), + _ => { + esp_println::println!("\nOther element at index {}: {:?}", i, v); + // Perform some action for other elements + } + } + } else if nested_chunks.len() == 2 { + //OK or CONNECT without data + match i { + 0 => modem_response.set_command_sent(v), + 1 => { + let okcrlf = [79, 75, 13, 10]; + let ee = [69, 82, 82, 79, 82]; + // let ctrlz = [26]; + if v.windows(okcrlf.len()).any(|window| window == okcrlf) { + // debug_println!("Here: {:?}", v); + modem_response.response.set_status(v) + } else if v.windows(ee.len()).any(|window| window == ee) { + // debug_println!("ModemError: {:?}", v); + match self.parse_error(v) { + Ok(e) => { + // Successfully parsed the error + // Use `e` as needed + esp_println::println!("\nParsed error: {:?}", e); + modem_response.response.set_error_from_modem(e) + } + Err(_) => { + // Handle the error case, possibly log it or take corrective action + esp_println::println!("\nFailed to parse error"); + } + } + } else if v.windows([26].len()).any(|window| window == [26]) { + // debug_println!("Here: {:?}", v); + modem_response.response.set_data(v) + } else { + info!("OK or Error not found{:?}", v); + } + } + _ => { + info!("Other element at index {}: {:?}", i, v); + } + } + } else if nested_chunks.len() == 1 { + match i { + 0 => { + let okcrlf = [79, 75, 13, 10]; + let ee = [69, 82, 82, 79, 82]; + // debug_println!("Here: {:?}", v); + if v.windows(ee.len()).any(|window| window == ee) { + match self.parse_error(v) { + Ok(e) => { + esp_println::println!("\nParsed error: {:?}", e); + modem_response.response.set_error_from_modem(e) + } + Err(_) => { + esp_println::println!("\nFailed to parse error"); + } + } + } else { + modem_response.response.set_data(v) + } + } + 1 => modem_response.response.set_status(v), + _ => { + info!("Other element at index {}: {:?}", i, v); + } + } + // debug_println!("NOT COVERED"); + } else { + info!("NOT COVERED"); + } + } + modem_response + } + + const fn modem_error_from_repr(d: u16) -> Option { + match d { + 3 => Some(ModemErrors::OPERATIONNOTALLOWED), + 49 => Some(ModemErrors::EXENOTSUPPORT), + 50 => Some(ModemErrors::EXEFAIL), + 53 => Some(ModemErrors::PARAMINVALID), + 58 => Some(ModemErrors::INVALIDCOMMANDLINE), + 303 => Some(ModemErrors::OPERNOTSUPP), + 305 => Some(ModemErrors::INVALIDTXTPARAM), + 321 => Some(ModemErrors::INVALIDMEMINDEX), + 500 => Some(ModemErrors::UNKNOWNERROR), + _ => None, + } + } + + pub fn parse_error(&mut self, error_response: &[u8]) -> Result { + // Convert the prefix into a byte array + // Define the possible prefixes + let cme_prefix = b"+CME ERROR: "; + let cms_prefix = b"+CMS ERROR: "; + + let data = if error_response.starts_with(cme_prefix) { + // If the response starts with the CME prefix, strip it + &error_response[cme_prefix.len()..] + } else if error_response.starts_with(cms_prefix) { + // If the response starts with the CMS prefix, strip it + &error_response[cms_prefix.len()..] + } else { + // If the response doesn't start with any known prefix, return an error + return Err(Error::Custom("no matches in parse error")); + }; + + // Parse the raw_rssi part as a u8 + let number = core::str::from_utf8(data) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + // Convert the modem_error_from_repr to a ModemErrors enum + match Self::modem_error_from_repr(number) { + Some(rs) => Ok(rs), + None => Err(Error::Custom("unknown code")), + } + } + const fn registration_status_from_repr(d: u8) -> Option { + match d { + 0 => Some(RegistrationStatus::NotRegistered), + 1 => Some(RegistrationStatus::OkHome), + 2 => Some(RegistrationStatus::Searching), + 3 => Some(RegistrationStatus::Denied), + 4 => Some(RegistrationStatus::Unknown), + 5 => Some(RegistrationStatus::OkRoaming), + _ => None, + } + } + const fn preferred_mode_from_repr(d: &[u8]) -> Option { + match d { + b"2" => Some(PreferredMode::Automatic), + b"9" => Some(PreferredMode::CDMAOnly), + b"10" => Some(PreferredMode::EVDOOnly), + b"13" => Some(PreferredMode::GSMOnly), + b"14" => Some(PreferredMode::WCDMAOnly), + b"19" => Some(PreferredMode::GSMPlusWCDMAOnly), + b"22" => Some(PreferredMode::CDMAPlusEVDOOnly), + b"37" => Some(PreferredMode::LTEOnly), + b"39" => Some(PreferredMode::GSMPlusWCDMAPlusLTEOnly), + b"48" => Some(PreferredMode::AnyButLTE), + b"51" => Some(PreferredMode::GSMPlusLTEOnly), + b"54" => Some(PreferredMode::WCDMAPlusLTEOnly), + b"59" => Some(PreferredMode::TDCDMAOnly), + b"60" => Some(PreferredMode::GSMPlusTDSCDMAOnly), + b"63" => Some(PreferredMode::GSMPlusWCDMAPlusTDSCDMAOnly), + b"67" => Some(PreferredMode::CDMAPlusEVDOPlusGSMPlusWCDMAPlusTDSCDMAOnly), + _ => None, + } + } + const fn sim_status_from_repr(d: &[u8]) -> Option { + match d { + b"UNKNOWN" => Some(SIMStatus::UNKNOWN), + b"READY" => Some(SIMStatus::READY), + b"SIMPIN" => Some(SIMStatus::SIMPIN), + b"SIMPUK" => Some(SIMStatus::SIMPUK), + b"PHSIMPIN" => Some(SIMStatus::PHSIMPIN), + b"SIMPIN2" => Some(SIMStatus::SIMPIN2), + b"SIMPUK2" => Some(SIMStatus::SIMPUK2), + b"PHNETPIN" => Some(SIMStatus::PHNETPIN), + _ => None, + } + } + + pub fn parse_realtime_clock(&self, cclk_response: &[u8]) -> Result { + // Modem Response String +CCLK: “24/07/01,19:29:31+03” + let prefix = b"+CCLK:"; + // Check if the response starts with the expected prefix + if !cclk_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse realtime clock")); + } + // Remove the prefix by skipping its length + let datetime = &cclk_response[prefix.len()..].to_vec(); + + // Find the first comma in the remaining data + let first_comma_idx = datetime + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (date, second_part) = datetime.split_at(first_comma_idx); + + // Remove the first comma from the second part + let time = &second_part[1..].to_vec(); + + Ok(DateTime { + datetime: datetime.to_vec(), + date: date.to_vec(), + time: time.to_vec(), + }) + } + + pub fn parse_operator_selection(&self, cops_response: &[u8]) -> Result> { + // Modem Response String +COPS: 0,2,”63902” + + let prefix = b"+COPS: "; + // Check if the response starts with the expected prefix + if !cops_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse operator selection")); + } + // Remove the prefix by skipping its length + let data = &cops_response[prefix.len()..]; + + // Find the second comma in the data + let second_comma_idx = data + .iter() + .enumerate() + .filter(|(_, &x)| x == b',') + .nth(1) + .map(|(idx, _)| idx) + .ok_or(Error::Custom("second comma not found"))?; + + // Split the remaining data at the first comma position + let (_mode_format, raw_operator) = data.split_at(second_comma_idx); + + // Remove the first comma from the second part + let operator = &raw_operator[1..]; + Ok(operator.to_vec()) + } + + pub fn parse_signal_quality(&self, csq_response: &[u8]) -> Result { + // Modem Response String +CSQ: 20,99 + // + let prefix = b"+CSQ: "; + // Check if the response starts with the expected prefix + if !csq_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse signal quality")); + } + // Remove the prefix by skipping its length + let data = &csq_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (raw_rssi, raw_ber) = data.split_at(first_comma_idx); + + // Remove the first comma from the second part + let flber = &raw_ber[1..]; + + // Parse the raw_rssi part as a u8 + let rssi = core::str::from_utf8(raw_rssi) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + // Parse the second part as a u8 + let ber = core::str::from_utf8(flber) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + + Ok(SignalQuality { rssi, ber }) + } + pub fn parse_sim_status(&self, cpin_response: &[u8]) -> Result { + // Modem Response String +CPIN:READY + let prefix = b"+CPIN:"; + // Check if the response starts with the expected prefix + if !cpin_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse sim status")); + } + // Remove the prefix by skipping its length + let data = &cpin_response[prefix.len()..]; + + // // Parse the first part as a u8 + // let sim_status = core::str::from_utf8(data) + // .map_err(|_| Error::ParseError)? + // .trim() + // .parse::<&str>() + // .map_err(|_| Error::ParseError)?; + // Convert the network_reg_status to a RegistrationStatus enum + match Self::sim_status_from_repr(data) { + Some(rs) => Ok(rs), + None => Err(Error::Custom("unknown code")), + } + } + pub fn parse_subscriber_number(&self, cnum_response: &[u8]) -> Result> { + // Modem Response String +CNUM: “11”,”+254114904097”,145 + let prefix = b"+CNUM: "; + // Check if the response starts with the expected prefix + if !cnum_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse subscriber number")); + } + // Remove the prefix by skipping its length + let data = &cnum_response[prefix.len()..]; + + // Find the second comma in the data + let second_comma_idx = data + .iter() + .enumerate() + .filter(|(_, &x)| x == b',') + .nth(1) + .map(|(idx, _)| idx) + .ok_or(Error::Custom("second comma not found"))?; + + // Split the remaining data at the first comma position + let (alpha_number, _ty_pe) = data.split_at(second_comma_idx); + + // Find the first comma in the alpha_number data + let first_comma_idx = alpha_number + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (_alpha, number) = data.split_at(first_comma_idx); + Ok(number.to_vec()) + } + + pub fn parse_preferred_mode(&self, cpol_response: &[u8]) -> Result { + // Modem Response String +CPOL: (1-99),2 + let prefix = b"+CPOL:"; + + // debug_println!("parse_registration_status: {:?}", cgreg_response); + + // Check if the response starts with the expected prefix + if !cpol_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse preferred mode")); + } + + // Remove the prefix by skipping its length + let data = &cpol_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (_first_part, second_part) = data.split_at(first_comma_idx); + + // Remove the first comma from the second part + let second_part = &second_part[1..]; + + match Self::preferred_mode_from_repr(second_part) { + Some(rs) => Ok(rs), + None => Err(Error::Custom("unknown code")), + } + } + + pub(crate) fn parse_activate_gprs_respose(&self, cgatt_response: &[u8]) -> Result { + // Modem Response String +CGATT:1 + // + let prefix = b"+CGATT: "; + // Check if the response starts with the expected prefix + if !cgatt_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse activate gprs respose")); + } + // Remove the prefix by skipping its length + let data = &cgatt_response[prefix.len()..]; + + // Parse the raw_rssi part as a u8 + let number = core::str::from_utf8(data) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + Ok(number) + } + + pub(crate) fn parse_mqtt_subscriber(&self, mqqt_publish_response: &[u8]) -> Result { + // Modem Response String +MQTTPUBLISH:1,app, 10,1234567890 + // + let prefix = b"+MQTTPUBLISH:"; + // Check if the response starts with the expected prefix + if !mqqt_publish_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse mqtt subscriber")); + } + // Remove the prefix by skipping its length + let data = &mqqt_publish_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (first_part, _second_part) = data.split_at(first_comma_idx); + + // Parse the raw_rssi part as a u8 + let number = core::str::from_utf8(first_part) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + Ok(number) + } + + pub(crate) fn parse_mqtt_publish(&self, mqqt_publish_response: &[u8]) -> Result { + // Modem Response String +MQTTPUBLISH: 1,test, 6,1234563 + // + let prefix = b"+MQTTPUBLISH: "; + // Check if the response starts with the expected prefix + if !mqqt_publish_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse mqtt publish")); + } + // Remove the prefix by skipping its length + let data = &mqqt_publish_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (first_part, _second_part) = data.split_at(first_comma_idx); + + // Parse the raw_rssi part as a u8 + let number = core::str::from_utf8(first_part) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + Ok(number) + } + pub fn parse_registration_status( + &mut self, + cgreg_response: &[u8], + ) -> Result<(RegistrationStatus, Status)> { + // Convert the prefix into a byte array + // +CGREG: 2,1,"10DC","0D2B" + let prefix = b"+CGREG:"; + + // debug_println!("parse_registration_status: {:?}", cgreg_response); + + // Check if the response starts with the expected prefix + if !cgreg_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse registration status")); + } + + // Remove the prefix by skipping its length + let data = &cgreg_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (first_part, second_part) = data.split_at(first_comma_idx); + + // Remove the first comma from the second part + let second_part = &second_part[1..]; + + // Parse the first part as a u8 + let _network_reg_mode = core::str::from_utf8(first_part) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + + // Parse the second part as a u8 + let network_reg_status = core::str::from_utf8(second_part) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + + // Convert the network_reg_status to a RegistrationStatus enum + match Self::registration_status_from_repr(network_reg_status) { + Some(rs) => Ok((rs, Status::OK)), + None => Err(Error::Custom("unknown code")), + } + } + + pub(crate) fn parse_network_registaration(&self, network_status_response: &[u8]) -> Result { + // +CREG: 1,1 + let prefix = b"+CREG: "; + // Check if the response starts with the expected prefix + if !network_status_response.starts_with(prefix) { + return Err(Error::Custom("no matches in parse network registaration")); + } + // Remove the prefix by skipping its length + let data = &network_status_response[prefix.len()..]; + + // Find the first comma in the remaining data + let first_comma_idx = data + .iter() + .position(|&x| x == b',') + .ok_or(Error::Custom("invalid format"))?; + + // Split the remaining data at the first comma position + let (first_part, second_part) = data.split_at(first_comma_idx); + // Remove the first comma from the second part + let part2 = &second_part[1..]; + + // Parse the raw_rssi part as a u8 + let n = core::str::from_utf8(first_part) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + // Parse the second part as a u8 + let _stat = core::str::from_utf8(part2) + .map_err(|_| Error::ParseError)? + .trim() + .parse::() + .map_err(|_| Error::ParseError)?; + Ok(n) + } + + pub(crate) fn get_pdp_context_states(&self, response: &[u8]) -> Result { + // Response +CGACT: (0,1) + let prefix = b"+CGACT: "; + + // Ensure the response starts with the expected prefix + if response.starts_with(prefix) { + // Find the position of the opening bracket '(' after the prefix + if let Some(start) = response.iter().position(|&b| b == b'(') { + // Find the position of the closing bracket ')' after the opening bracket + if let Some(end) = response.iter().position(|&b| b == b')') { + // Ensure the closing bracket comes after the opening bracket + if end > start { + // Extract the bytes within the brackets + let inside_brackets = &response[start + 1..end]; + // Extract the first digit and parse it + if let Some(&digit) = inside_brackets.iter().find(|&&b| b.is_ascii_digit()) + { + match digit { + b'0' => return Ok(PdpState::Deactivated), + b'1' => return Ok(PdpState::Activated), + _ => return Err(Error::InvalidState), + } + } + } + } + } + } + + Err(Error::ParseError) + } +} + +pub fn split_nested(bytes: &[u8], separator: Option<&[u8]>) -> (Vec>, Vec) { + let mut result = Vec::new(); + let mut result_final = Vec::new(); + result_final.push(b'<'); + let mut start = 0; + let delimiter = [13, 10, 13, 10]; + + // const SEPARATOR: &[u8] = b"AT+CIPSTATUS\r\n"; + // while let Some(end) = bytes[start..] + // .windows(delimiter.len()) + // .position(|window| window == delimiter) + // { + // result.push(bytes[start..start + end].to_vec()); + // start += end + delimiter.len(); + // } + + loop { + match bytes[start..] + .windows(delimiter.len()) + .position(|window| window == delimiter) + { + Some(end) => { + if let Some(index) = bytes[start..start + end] + .windows(separator.unwrap().len()) + .position(|window| window == separator.unwrap()) + { + let (part1, part2) = + bytes[start..start + end].split_at(index + separator.unwrap().len()); + // (part1, part2) + result.push(part1.to_vec()); + result.push(part2.to_vec()); + start += end + delimiter.len(); + } else { + // (response, &[]) + result.push(bytes[start..start + end].to_vec()); + start += end + delimiter.len(); + } + } + None => break, + } + } + + // Push the remaining part after the last delimiter + if start < bytes.len() { + result.push(bytes[start..].to_vec()); + // if bytes.len() > 1 { + // result.push(bytes[..delimiter[..2].len()].to_vec()); + // } else + } + // debug_println!("nested_chunks: {:?}", result); + + // result + // Add <> at the end of the array and use * to join the nested array + for slice in &result { + if !result_final.is_empty() { + result_final.push(b'*'); + } + result_final.extend_from_slice(&slice[..]); + } + result_final.push(b'>'); + + (result, result_final) +} +#[allow(unused)] +fn join_and_wrap(nested_slice: &[&[u8]]) -> Vec { + let mut result = Vec::new(); + result.push(b'<'); + + for slice in nested_slice { + if !result.is_empty() { + result.push(b'*'); + } + result.extend_from_slice(slice); + } + + result.push(b'>'); + result +} + +pub fn replace_crlf_with_lf(bytes: &[u8]) -> Vec { + let mut result = Vec::new(); + let mut i = 0; + + while i < bytes.len() { + if i < bytes.len() - 1 && bytes[i] == 13 && bytes[i + 1] == 10 { + result.push(10); // Append LF + i += 2; // Skip CR and LF + } else { + result.push(bytes[i]); + i += 1; + } + } + + result +} + +impl core::fmt::Debug for ModemResponse { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let cleaned = clean_array::remove_invalid_utf8(&self.command_sent[..]); + + let command_sent_str = core::str::from_utf8(&cleaned).unwrap_or(""); + f.debug_struct("ModemResponse") + .field("command_sent", &command_sent_str) + .field("response", &self.response) + .finish() + } +} + +impl fmt::Debug for Status { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // let command_sent_str = + // core::str::from_utf8(&self.command_sent).unwrap_or(""); + match self { + Status::OK => write!(f, "OK"), + Status::CONNECT => write!(f, "CONNECT"), + Status::ModemError(Some(e)) => { + // let cleaned = clean_array::remove_invalid_utf8(&bytes[..]); + // let error_bytes = core::str::from_utf8(&cleaned).unwrap_or(""); + // write!(f, "ModemError({:?})", error_bytes) + write!(f, "ModemError({:?})", e) + } + Status::ModemError(None) => write!(f, "ModemError(None)"), + } + } +} + +pub mod clean_array { + use alloc::vec::Vec; + const KEY_LEFTSHIFT: u8 = 42; + const KEY_RIGHTSHIFT: u8 = 54; + // const CHAR_LESS_THAN: u8 = b'<'; // ASCII value for '<' + // const CHAR_GREATER_THAN: u8 = b'>'; // ASCII value for '>' + const CHAR_LESS_THAN: u8 = 60; // ASCII value for '<' + const CHAR_GREATER_THAN: u8 = 62; // ASCII value for '>' + const CR: u8 = 13; // Carriage Return + const LF: u8 = 10; // Line Feed + + pub fn remove_invalid_utf8(input: &[u8]) -> Vec { + let mut output = Vec::with_capacity(input.len()); + let mut i = 0; + while i < input.len() { + if input[i] <= 127 { + // ASCII character + output.push(input[i]); + i += 1; + } else if i + 1 < input.len() && is_valid_utf8_start(input[i]) { + // Potential start of a multi-byte sequence + let char_len = utf8_char_length(input[i]); + if i + char_len <= input.len() && is_valid_utf8_sequence(&input[i..i + char_len]) { + // Valid multi-byte sequence + output.extend_from_slice(&input[i..i + char_len]); + i += char_len; + } else { + // Invalid sequence, skip this byte + i += 1; + } + } else { + // Invalid byte, skip it + i += 1; + } + } + output + } + + // A function to remove shift keys + pub fn remove_chars_and_add_newline(input: &[u8]) -> Vec { + let mut output: Vec = input + .iter() + .filter(|&&byte| { + byte != KEY_LEFTSHIFT + && byte != KEY_RIGHTSHIFT + && byte != CHAR_LESS_THAN + && byte != CHAR_GREATER_THAN + }) + .cloned() + .collect(); + + // Check if [13, 10] already exists at the end + if !output.ends_with(&[CR, LF]) { + // If [13, 10] doesn't exist at the end, check for [13] + if output.ends_with(&[CR]) { + // If it ends with [13], just add [10] + output.push(LF); + } else { + // If it doesn't end with [13], add both [13, 10] + output.extend_from_slice(&[CR, LF]); + } + } + + output + } + + // Function to combine remove_shift_keys and remove_invalid_utf8 operations if needed + pub fn clean_input(input: &[u8]) -> Vec { + let without_shift = remove_chars_and_add_newline(input); + remove_invalid_utf8(&without_shift) + } + + fn is_valid_utf8_start(byte: u8) -> bool { + byte & 0b1100_0000 == 0b1100_0000 + } + + fn utf8_char_length(byte: u8) -> usize { + if byte & 0b1000_0000 == 0 { + 1 + } else if byte & 0b1110_0000 == 0b1100_0000 { + 2 + } else if byte & 0b1111_0000 == 0b1110_0000 { + 3 + } else if byte & 0b1111_1000 == 0b1111_0000 { + 4 + } else { + 1 + } // Invalid start byte, treat as 1-byte char + } + + fn is_valid_utf8_sequence(seq: &[u8]) -> bool { + match seq.len() { + 2 => seq[1] & 0b1100_0000 == 0b1000_0000, + 3 => seq[1] & 0b1100_0000 == 0b1000_0000 && seq[2] & 0b1100_0000 == 0b1000_0000, + 4 => { + seq[1] & 0b1100_0000 == 0b1000_0000 + && seq[2] & 0b1100_0000 == 0b1000_0000 + && seq[3] & 0b1100_0000 == 0b1000_0000 + } + _ => false, + } + } +} diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..4142610 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,41 @@ +extern crate rand; +extern crate rand_core; // or your preferred panic handler + +use rand::rngs::SmallRng; +use rand_core::RngCore; +use rand_core::SeedableRng; + +#[macro_export] +macro_rules! singleton { + ($val:expr, $T:ty) => {{ + static STATIC_CELL: ::static_cell::StaticCell<$T> = ::static_cell::StaticCell::new(); + STATIC_CELL.init($val) + }}; +} + +// Dummy entropy source for demonstration purposes +struct DummyEntropySource; + +impl DummyEntropySource { + fn new() -> Self { + DummyEntropySource + } + + fn get_entropy(&self) -> [u8; 16] { + // In a real `no_std` environment, you need to replace this with a proper entropy source. + [0x42; 16] // Just an example, replace with real entropy + } +} + +pub fn generate_random_seed() -> u64 { + let entropy_source = DummyEntropySource::new(); + let seed = entropy_source.get_entropy(); + + let mut rng = SmallRng::from_seed(seed); + + // Generate random seed + let mut seed_bytes = [0u8; 8]; + rng.fill_bytes(&mut seed_bytes); + + u64::from_le_bytes(seed_bytes) +}