Skip to main content

agent_can/
protocol.rs

1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3use uuid::Uuid;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Request {
7    pub id: Uuid,
8    pub action: RequestAction,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
13pub enum RequestAction {
14    Status,
15    Mailboxes,
16    Mailbox {
17        message: String,
18    },
19    SendRaw {
20        arb_id: u32,
21        data_hex: String,
22        flags: Option<u8>,
23    },
24    SendMessage {
25        message: String,
26        signals: BTreeMap<String, f64>,
27    },
28    Close,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct Response {
33    pub id: Uuid,
34    pub success: bool,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub data: Option<ResponseData>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub error: Option<String>,
39}
40
41impl Response {
42    pub fn ok(id: Uuid, data: ResponseData) -> Self {
43        Self {
44            id,
45            success: true,
46            data: Some(data),
47            error: None,
48        }
49    }
50
51    pub fn err(id: Uuid, message: impl Into<String>) -> Self {
52        Self {
53            id,
54            success: false,
55            data: None,
56            error: Some(message.into()),
57        }
58    }
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
63pub enum ResponseData {
64    Ack,
65    Status {
66        bus: String,
67        adapter: String,
68        dbc_path: String,
69        bitrate: u32,
70        bitrate_data: u32,
71        fd_capable: bool,
72        mailbox_count: usize,
73        rx_seen: u64,
74        rx_decoded: u64,
75        rx_dropped: u64,
76    },
77    Mailboxes {
78        messages: Vec<MailboxMessageData>,
79    },
80    Mailbox {
81        message: MailboxMessageData,
82    },
83    SentRaw {
84        arb_id: u32,
85        len: u8,
86    },
87    SentMessage {
88        message: String,
89        arb_id: u32,
90        len: u8,
91    },
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct MailboxMessageData {
96    pub message: String,
97    pub arb_id: u32,
98    pub extended: bool,
99    pub len: u8,
100    pub update_seq: u64,
101    pub signals: Vec<MailboxSignalData>,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct MailboxSignalData {
106    pub name: String,
107    pub value: f64,
108    pub unit: Option<String>,
109}