extern crate meshtastic;
use std::io::{self, BufRead};
use meshtastic::api::StreamApi;
use meshtastic::utils;
use meshtastic::Message;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let stream_api = StreamApi::new();
let available_ports = utils::stream::available_serial_ports()?;
println!("Available ports: {:?}", available_ports);
println!("Enter the name of a port to connect to:");
let stdin = io::stdin();
let entered_port = stdin
.lock()
.lines()
.next()
.expect("Failed to find next line")
.expect("Could not read next line");
let serial_stream = utils::stream::build_serial_stream(entered_port, None, None, None)?;
let (mut decoded_listener, stream_api) = stream_api.connect(serial_stream).await;
let config_id = utils::generate_rand_id();
let stream_api = stream_api.configure(config_id).await?;
while let Some(decoded_packet) = decoded_listener.recv().await {
handle_from_radio_packet(decoded_packet)
}
let _stream_api = stream_api.disconnect().await?;
Ok(())
}
fn handle_from_radio_packet(from_radio_packet: meshtastic::protobufs::FromRadio) {
let payload_variant = match from_radio_packet.payload_variant {
Some(payload_variant) => payload_variant,
None => {
println!("Received FromRadio packet with no payload variant, not handling...");
return;
}
};
match payload_variant {
meshtastic::protobufs::from_radio::PayloadVariant::Channel(channel) => {
println!("Received channel packet: {:?}", channel);
}
meshtastic::protobufs::from_radio::PayloadVariant::NodeInfo(node_info) => {
println!("Received node info packet: {:?}", node_info);
}
meshtastic::protobufs::from_radio::PayloadVariant::Packet(mesh_packet) => {
handle_mesh_packet(mesh_packet);
}
_ => {
println!("Received other FromRadio packet, not handling...");
}
};
}
fn handle_mesh_packet(mesh_packet: meshtastic::protobufs::MeshPacket) {
let payload_variant = match mesh_packet.payload_variant {
Some(payload_variant) => payload_variant,
None => {
println!("Received mesh packet with no payload variant, not handling...");
return;
}
};
let packet_data = match payload_variant {
meshtastic::protobufs::mesh_packet::PayloadVariant::Decoded(decoded_mesh_packet) => {
decoded_mesh_packet
}
meshtastic::protobufs::mesh_packet::PayloadVariant::Encrypted(_encrypted_mesh_packet) => {
println!("Received encrypted mesh packet, not handling...");
return;
}
};
match packet_data.portnum() {
meshtastic::protobufs::PortNum::PositionApp => {
let decoded_position =
meshtastic::protobufs::Position::decode(packet_data.payload.as_slice()).unwrap();
println!("Received position packet: {:?}", decoded_position);
}
meshtastic::protobufs::PortNum::TextMessageApp => {
let decoded_text_message = String::from_utf8(packet_data.payload).unwrap();
println!("Received text message packet: {:?}", decoded_text_message);
}
meshtastic::protobufs::PortNum::WaypointApp => {
let decoded_waypoint =
meshtastic::protobufs::Waypoint::decode(packet_data.payload.as_slice()).unwrap();
println!("Received waypoint packet: {:?}", decoded_waypoint);
}
_ => {
println!(
"Received mesh packet on port {:?}, not handling...",
packet_data.portnum
);
}
}
}