Skip to main content

ghpascon_rust/devices/rfid/x714/
transport.rs

1use std::sync::{Arc, Mutex};
2
3use serde_json::Value;
4
5use crate::utils::dummy_event::dummy_event;
6
7use super::types::{X714Event, X714Tag};
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: &X714Event) -> (&'static str, Option<Value>) {
19    match event {
20        X714Event::Connection(value) => ("connection", Some(Value::Bool(*value))),
21        X714Event::Reading(value) => ("reading", Some(Value::Bool(*value))),
22        X714Event::Tag(tag) => ("tag", Some(tag_to_value(tag))),
23        X714Event::TagsCleared => ("tags_cleared", Some(Value::Bool(true))),
24        X714Event::SetupDone => ("setup_done", Some(Value::Bool(true))),
25        X714Event::SerialNumber(value) => ("serial_number", Some(Value::String(value.clone()))),
26        X714Event::Receive(value) => ("receive", Some(Value::String(value.clone()))),
27    }
28}
29
30pub fn dispatch_event(handler: &SharedEventHandler, name: &str, event: &X714Event) {
31    let (event_type, payload) = event_to_wire(event);
32    if let Ok(mut guard) = handler.lock() {
33        (guard)(name, event_type, payload);
34    }
35}
36
37fn tag_to_value(tag: &X714Tag) -> Value {
38    let mut obj = serde_json::Map::new();
39    obj.insert(
40        "epc".to_string(),
41        tag.epc.clone().map(Value::String).unwrap_or(Value::Null),
42    );
43    obj.insert(
44        "tid".to_string(),
45        tag.tid.clone().map(Value::String).unwrap_or(Value::Null),
46    );
47    obj.insert("ant".to_string(), Value::Number(tag.ant.into()));
48    obj.insert("rssi".to_string(), Value::Number(tag.rssi.into()));
49    obj.insert(
50        "protected".to_string(),
51        tag.protected
52            .clone()
53            .map(Value::String)
54            .unwrap_or(Value::Null),
55    );
56    Value::Object(obj)
57}