summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGalen Guyer <galen@galenguyer.com>2022-11-28 13:40:18 -0500
committerGalen Guyer <galen@galenguyer.com>2022-11-28 13:40:18 -0500
commit163c64e7f06f09ed34b30fdec9a6073d52d74185 (patch)
treec29aef3a064de625f7c30e1c5f7a0c085da5dac4
parentf5319daf3fc87c93ea6a770d3885f999cf3775a9 (diff)
Load talkgroups from CSV file
-rw-r--r--.gitignore7
-rw-r--r--Cargo.lock65
-rw-r--r--Cargo.toml2
-rw-r--r--src/main.rs52
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
@@ -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]]
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<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();