From 163c64e7f06f09ed34b30fdec9a6073d52d74185 Mon Sep 17 00:00:00 2001 From: Galen Guyer Date: Mon, 28 Nov 2022 13:40:18 -0500 Subject: Load talkgroups from CSV file --- .gitignore | 7 ++----- Cargo.lock | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- Cargo.toml | 2 ++ src/main.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 112 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index cabb7ce..6943c5e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ venv/ - - -# Added by cargo - -/target +/target/ +*.csv \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 400414f..cee579e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,6 +71,18 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.11.1" @@ -218,6 +230,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "csv" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa 0.4.8", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "cty" version = "0.2.2" @@ -423,6 +457,12 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "itoa" version = "1.0.4" @@ -818,6 +858,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + [[package]] name = "regex-syntax" version = "0.6.28" @@ -892,15 +938,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" +dependencies = [ + "serde_derive", +] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ "proc-macro2", "quote", @@ -913,7 +962,7 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ - "itoa", + "itoa 1.0.4", "ryu", "serde", ] @@ -996,9 +1045,9 @@ checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ "proc-macro2", "quote", @@ -1060,8 +1109,10 @@ version = "0.1.0" dependencies = [ "chrono", "cpal", + "csv", "dasp", "ringbuf", + "serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8c740fa..d813090 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,5 +8,7 @@ edition = "2021" [dependencies] chrono = "0.4.23" cpal = "0.14.1" +csv = "1.1.6" dasp = { version = "0.11.0", features = ["all"] } ringbuf = "0.3.1" +serde = { version = "1.0.148", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs index b9d044f..86e7c75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,31 @@ use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; use ringbuf::HeapRb; -use std::net::UdpSocket; +use serde::Deserialize; +use std::{collections::HashMap, net::UdpSocket}; + +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +struct TalkGroup { + #[serde(rename(deserialize = "DEC"))] + id: u32, + #[serde(rename(deserialize = "Alpha Tag"))] + name: String, + #[serde(rename(deserialize = "Description"))] + description: String, + #[serde(rename(deserialize = "Tag"))] + tag: String, + #[serde(rename(deserialize = "Group"))] + group: String, + #[serde(rename(deserialize = "Priority"))] + priority: i32, +} fn init_cpal() -> (cpal::Device, cpal::SupportedStreamConfig) { let host = cpal::default_host(); let device = host .devices() .expect("no output device available") - .nth(4) + .nth(4) // TODO: Don't hardcode this .expect("couldn't find device"); let mut supported_configs_range = device @@ -39,6 +57,36 @@ fn write_audio( } fn main() { + // Load talkgroups from file + let mut csv_reader = csv::Reader::from_path("talkgroups.csv").unwrap(); + let mut talkgroups: HashMap = HashMap::new(); + for result in csv_reader.deserialize() { + let record: TalkGroup = result.expect("Failed to deserialize talkgroup"); + talkgroups.insert(record.id, record); + } + // Print TalkGroup info + { + let mut tg_info = format!("Talkgroups loaded: {}", talkgroups.len()); + for i in 1..=32 { + let at_pri = talkgroups + .values() + .filter(|tg| tg.priority == i) + .collect::>(); + if !at_pri.is_empty() { + tg_info.push_str(&format!("\n\tPriority {}: {} talkgroups", i, at_pri.len())); + } + } + let i = -1; + let at_pri = talkgroups + .values() + .filter(|tg| tg.priority == i) + .collect::>(); + if !at_pri.is_empty() { + tg_info.push_str(&format!("\n\tPriority {}: {} talkgroups", i, at_pri.len())); + } + println!("{}", tg_info); + } + let socket = UdpSocket::bind("0.0.0.0:9123").expect("couldn't bind to address"); let (device, stream_config) = init_cpal(); -- cgit v1.2.3