ghpascon_rust/devices/rfid/r700/
transport.rs1use std::sync::{Arc, Mutex};
2
3use serde_json::Value;
4
5use crate::utils::dummy_event::dummy_event;
6
7use super::types::{R700Event, R700Tag};
8
9pub type EventHandler = dyn FnMut(&str, &str, Option<Value>) + Send + 'static;
10pub type SharedEventHandler = Arc<Mutex<Box<EventHandler>>>;
11
12pub fn default_event_handler() -> SharedEventHandler {
13 Arc::new(Mutex::new(Box::new(|name, event_type, event_data| {
14 dummy_event(name, event_type, event_data);
15 })))
16}
17
18pub fn event_to_wire(event: &R700Event) -> (&'static str, Option<Value>) {
19 match event {
20 R700Event::Connection(v) => ("connection", Some(Value::Bool(*v))),
21 R700Event::Reading(v) => ("reading", Some(Value::Bool(*v))),
22 R700Event::Tag(tag) => ("tag", Some(tag_to_value(tag))),
23 R700Event::SerialNumber(v) => ("serial_number", Some(Value::String(v.clone()))),
24 }
25}
26
27pub fn dispatch_event(handler: &SharedEventHandler, name: &str, event: &R700Event) {
28 let (event_type, payload) = event_to_wire(event);
29 if let Ok(mut guard) = handler.lock() {
30 (guard)(name, event_type, payload);
31 }
32}
33
34fn tag_to_value(tag: &R700Tag) -> Value {
35 let mut obj = serde_json::Map::new();
36 obj.insert(
37 "epc".to_string(),
38 tag.epc.clone().map(Value::String).unwrap_or(Value::Null),
39 );
40 obj.insert(
41 "tid".to_string(),
42 tag.tid.clone().map(Value::String).unwrap_or(Value::Null),
43 );
44 obj.insert("ant".to_string(), Value::Number(tag.ant.into()));
45 obj.insert("rssi".to_string(), Value::Number(tag.rssi.into()));
46 obj.insert("protected".to_string(), Value::Bool(tag.protected));
47 Value::Object(obj)
48}