diff options
author | Galen Guyer <galen@galenguyer.com> | 2022-11-28 13:40:18 -0500 |
---|---|---|
committer | Galen Guyer <galen@galenguyer.com> | 2022-11-28 13:40:18 -0500 |
commit | 163c64e7f06f09ed34b30fdec9a6073d52d74185 (patch) | |
tree | c29aef3a064de625f7c30e1c5f7a0c085da5dac4 | |
parent | f5319daf3fc87c93ea6a770d3885f999cf3775a9 (diff) |
Load talkgroups from CSV file
-rw-r--r-- | .gitignore | 7 | ||||
-rw-r--r-- | Cargo.lock | 65 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/main.rs | 52 |
4 files changed, 112 insertions, 14 deletions
@@ -1,6 +1,3 @@ venv/ - - -# Added by cargo - -/target +/target/ +*.csv
\ No newline at end of file @@ -72,6 +72,18 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -219,6 +231,28 @@ dependencies = [ ] [[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" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -425,6 +459,12 @@ dependencies = [ [[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" @@ -819,6 +859,12 @@ dependencies = [ ] [[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" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -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]] @@ -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<T: cpal::Sample + std::fmt::Debug>( } fn main() { + // Load talkgroups from file + let mut csv_reader = csv::Reader::from_path("talkgroups.csv").unwrap(); + let mut talkgroups: HashMap<u32, TalkGroup> = 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::<Vec<_>>(); + 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::<Vec<_>>(); + 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(); |