Skip to content

Commit f64b42a

Browse files
authored
Merge pull request #6 from FKMTime/new-ws-packets
New packets structure
2 parents 8f46fe1 + 4f1eb2b commit f64b42a

File tree

10 files changed

+133
-95
lines changed

10 files changed

+133
-95
lines changed

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ uuid = "1.10.0"
3333
dbus = { version = "0.9.7", features = ["vendored"] }
3434
rand = "0.8.5"
3535
unix-utils = { path = "./unix-utils" }
36+
crc32fast = "1.4.2"

src/handler.rs

Lines changed: 68 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
http::EspConnectInfo,
3-
structs::{SharedAppState, TimerPacket},
3+
structs::{SharedAppState, TimerPacket, TimerPacketInner},
44
};
55
use anyhow::Result;
66
use axum::extract::ws::{Message, WebSocket};
@@ -97,18 +97,22 @@ async fn send_device_status(
9797
let state = state.inner.read().await;
9898
let settings = state.devices_settings.get(&esp_connect_info.id);
9999
let frame = if let Some(settings) = settings {
100-
TimerPacket::DeviceSettings {
101-
esp_id: esp_connect_info.id,
102-
use_inspection: settings.use_inspection,
103-
secondary_text: settings.secondary_text.clone(),
104-
added: true,
100+
TimerPacket {
101+
tag: None,
102+
data: TimerPacketInner::DeviceSettings {
103+
use_inspection: settings.use_inspection,
104+
secondary_text: settings.secondary_text.clone(),
105+
added: true,
106+
},
105107
}
106108
} else {
107-
TimerPacket::DeviceSettings {
108-
esp_id: esp_connect_info.id,
109-
use_inspection: false,
110-
secondary_text: "".to_string(),
111-
added: false,
109+
TimerPacket {
110+
tag: None,
111+
data: TimerPacketInner::DeviceSettings {
112+
use_inspection: false,
113+
secondary_text: "".to_string(),
114+
added: false,
115+
},
112116
}
113117
};
114118

@@ -118,10 +122,13 @@ async fn send_device_status(
118122
}
119123

120124
async fn send_epoch_time(socket: &mut WebSocket) -> Result<()> {
121-
let packet = TimerPacket::EpochTime {
122-
current_epoch: std::time::SystemTime::now()
123-
.duration_since(std::time::UNIX_EPOCH)?
124-
.as_secs(),
125+
let packet = TimerPacket {
126+
tag: None,
127+
data: TimerPacketInner::EpochTime {
128+
current_epoch: std::time::SystemTime::now()
129+
.duration_since(std::time::UNIX_EPOCH)?
130+
.as_secs(),
131+
},
125132
};
126133

127134
let resp = serde_json::to_string(&packet)?;
@@ -147,7 +154,7 @@ async fn on_ws_msg(
147154
tracing::trace!("WS payload recv [{}]: {payload}", esp_connect_info.id);
148155

149156
let response: TimerPacket = serde_json::from_str(&payload)?;
150-
let res = on_timer_response(socket, response).await;
157+
let res = on_timer_response(socket, response, esp_connect_info).await;
151158
if let Err(e) = res {
152159
error!("on_timer_response error: {e:?}");
153160
}
@@ -161,17 +168,25 @@ async fn on_ws_msg(
161168
Ok(false)
162169
}
163170

164-
async fn on_timer_response(socket: &mut WebSocket, response: TimerPacket) -> Result<()> {
165-
match response {
166-
TimerPacket::CardInfoRequest {
171+
async fn on_timer_response(
172+
socket: &mut WebSocket,
173+
response: TimerPacket,
174+
esp_connect_info: &EspConnectInfo,
175+
) -> Result<()> {
176+
let esp_id = esp_connect_info.id;
177+
178+
match response.data {
179+
TimerPacketInner::CardInfoRequest {
167180
card_id,
168-
esp_id,
169181
attendance_device,
170182
} => {
171183
let attendance_device = attendance_device.unwrap_or(false);
172184
if attendance_device {
173185
_ = crate::socket::api::mark_attendance(esp_id, card_id).await;
174-
let resp = serde_json::to_string(&TimerPacket::AttendanceMarked { esp_id })?;
186+
let resp = serde_json::to_string(&TimerPacket {
187+
tag: response.tag,
188+
data: TimerPacketInner::AttendanceMarked,
189+
})?;
175190
socket.send(Message::Text(resp)).await?;
176191

177192
return Ok(());
@@ -185,32 +200,35 @@ async fn on_timer_response(socket: &mut WebSocket, response: TimerPacket) -> Res
185200
};
186201

187202
trace!("Card info: {} {} {:?}", card_id, esp_id, info);
188-
let response = TimerPacket::CardInfoResponse {
189-
card_id,
190-
esp_id,
191-
country_iso2: info.country_iso2.unwrap_or_default(),
192-
display: format!("{}{}", info.name, registrant_display),
193-
can_compete: info.can_compete,
203+
let response = TimerPacket {
204+
tag: response.tag,
205+
data: TimerPacketInner::CardInfoResponse {
206+
card_id,
207+
country_iso2: info.country_iso2.unwrap_or_default(),
208+
display: format!("{}{}", info.name, registrant_display),
209+
can_compete: info.can_compete,
210+
},
194211
};
195212

196213
response
197214
}
198-
Err(e) => TimerPacket::ApiError {
199-
esp_id,
200-
error: e.message,
201-
should_reset_time: e.should_reset_time,
215+
Err(e) => TimerPacket {
216+
tag: response.tag,
217+
data: TimerPacketInner::ApiError {
218+
error: e.message,
219+
should_reset_time: e.should_reset_time,
220+
},
202221
},
203222
};
204223

205224
let response = serde_json::to_string(&response)?;
206225
socket.send(Message::Text(response)).await?;
207226
}
208-
TimerPacket::Solve {
227+
TimerPacketInner::Solve {
209228
solve_time,
210229
penalty,
211230
competitor_id,
212231
judge_id,
213-
esp_id,
214232
timestamp,
215233
session_id,
216234
delegate,
@@ -237,23 +255,27 @@ async fn on_timer_response(socket: &mut WebSocket, response: TimerPacket) -> Res
237255
return Ok(());
238256
}
239257

240-
TimerPacket::SolveConfirm {
241-
esp_id,
242-
session_id,
243-
competitor_id,
258+
TimerPacket {
259+
tag: response.tag,
260+
data: TimerPacketInner::SolveConfirm {
261+
session_id,
262+
competitor_id,
263+
},
244264
}
245265
}
246-
Err(e) => TimerPacket::ApiError {
247-
esp_id,
248-
error: e.message,
249-
should_reset_time: e.should_reset_time,
266+
Err(e) => TimerPacket {
267+
tag: response.tag,
268+
data: TimerPacketInner::ApiError {
269+
error: e.message,
270+
should_reset_time: e.should_reset_time,
271+
},
250272
},
251273
};
252274

253275
let response = serde_json::to_string(&resp)?;
254276
socket.send(Message::Text(response)).await?;
255277
}
256-
TimerPacket::Logs { logs, esp_id } => {
278+
TimerPacketInner::Logs { logs } => {
257279
for log in logs.iter().rev() {
258280
for line in log.msg.lines() {
259281
if line.is_empty() {
@@ -264,21 +286,17 @@ async fn on_timer_response(socket: &mut WebSocket, response: TimerPacket) -> Res
264286
}
265287
}
266288
}
267-
TimerPacket::Battery {
268-
esp_id,
269-
level,
270-
voltage: _,
271-
} => {
289+
TimerPacketInner::Battery { level, voltage: _ } => {
272290
_ = crate::socket::api::send_battery_status(esp_id, level).await;
273291
}
274-
TimerPacket::Add { esp_id, firmware } => {
292+
TimerPacketInner::Add { firmware } => {
275293
_ = crate::socket::api::add_device(esp_id, &firmware).await;
276294
trace!("Add device: {}", esp_id);
277295
}
278-
TimerPacket::Snapshot(data) => {
296+
TimerPacketInner::Snapshot(data) => {
279297
_ = crate::socket::api::send_snapshot_data(data).await;
280298
}
281-
TimerPacket::TestAck { esp_id } => {
299+
TimerPacketInner::TestAck => {
282300
_ = crate::socket::api::send_test_ack(esp_id).await;
283301
}
284302
_ => {

src/http.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ pub struct EspConnectInfo {
2929
#[serde(default = "default_chip")]
3030
pub chip: String,
3131

32-
#[serde(rename = "bt")]
33-
pub build_time: u64,
34-
3532
#[serde(default = "default_firmware")]
3633
pub firmware: String,
3734
}

src/socket/mod.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::structs::{SharedAppState, TimerPacket};
1+
use crate::structs::{SharedAppState, TimerPacket, TimerPacketInner};
22
use anyhow::Result;
33
use std::{collections::HashMap, sync::Arc, time::Duration};
44
use tokio::{
@@ -237,11 +237,13 @@ async fn process_untagged_response(data: UnixResponseData) -> Result<()> {
237237
should_scan_cards,
238238
attempt,
239239
} => {
240-
let packet = TimerPacket::DelegateResponse {
241-
esp_id,
242-
should_scan_cards,
243-
solve_time: attempt.value.map(|x| x * 10), // from cs to ms
244-
penalty: attempt.penalty,
240+
let packet = TimerPacket {
241+
tag: None,
242+
data: TimerPacketInner::DelegateResponse {
243+
should_scan_cards,
244+
solve_time: attempt.value.map(|x| x * 10), // from cs to ms
245+
penalty: attempt.penalty,
246+
},
245247
};
246248

247249
let inner = crate::UNIX_SOCKET.get_inner().await?;
@@ -256,7 +258,13 @@ async fn process_untagged_response(data: UnixResponseData) -> Result<()> {
256258
let state = &inner.state;
257259

258260
state
259-
.send_timer_packet(esp_id, TimerPacket::TestPacket(data))
261+
.send_timer_packet(
262+
esp_id,
263+
TimerPacket {
264+
tag: None,
265+
data: TimerPacketInner::TestPacket(data),
266+
},
267+
)
260268
.await?;
261269
}
262270
_ => {}

src/structs.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ use serde::{Deserialize, Serialize};
22
use std::collections::HashMap;
33
use unix_utils::{SnapshotData, TestPacketData};
44

5+
#[derive(Serialize, Deserialize, Debug, Clone)]
6+
pub struct TimerPacket {
7+
#[serde(skip_serializing_if = "Option::is_none")]
8+
pub tag: Option<u64>,
9+
pub data: TimerPacketInner,
10+
}
11+
512
#[derive(Serialize, Deserialize, Debug, Clone)]
613
pub struct LogData {
714
pub millis: u64,
@@ -10,32 +17,29 @@ pub struct LogData {
1017

1118
#[derive(Serialize, Deserialize, Debug, Clone)]
1219
#[serde(rename_all = "snake_case")]
13-
pub enum TimerPacket {
20+
pub enum TimerPacketInner {
1421
StartUpdate {
15-
esp_id: u32,
1622
version: String,
1723
build_time: u64, // NOT USED
18-
size: i64,
24+
size: u32,
25+
crc: u32,
1926
firmware: String,
2027
},
2128
Solve {
2229
solve_time: u64,
2330
penalty: i64,
2431
competitor_id: u64,
2532
judge_id: u64,
26-
esp_id: u32,
2733
timestamp: u64,
2834
session_id: String, // UUID
2935
delegate: bool,
3036
inspection_time: i64,
3137
},
3238
SolveConfirm {
33-
esp_id: u32,
3439
competitor_id: u64,
3540
session_id: String,
3641
},
3742
DelegateResponse {
38-
esp_id: u32,
3943
should_scan_cards: bool,
4044

4145
#[serde(skip_serializing_if = "Option::is_none")]
@@ -45,44 +49,35 @@ pub enum TimerPacket {
4549
penalty: Option<i64>,
4650
},
4751
ApiError {
48-
esp_id: u32,
4952
error: String,
5053
should_reset_time: bool,
5154
},
5255
CardInfoRequest {
5356
card_id: u64,
54-
esp_id: u32,
5557

5658
#[serde(skip_serializing_if = "Option::is_none")]
5759
attendance_device: Option<bool>,
5860
},
5961
CardInfoResponse {
6062
card_id: u64,
61-
esp_id: u32,
6263
display: String,
6364
country_iso2: String,
6465
can_compete: bool,
6566
},
66-
AttendanceMarked {
67-
esp_id: u32,
68-
},
67+
AttendanceMarked,
6968
DeviceSettings {
70-
esp_id: u32,
7169
use_inspection: bool,
7270
secondary_text: String,
7371
added: bool,
7472
},
7573
Logs {
76-
esp_id: u32,
7774
logs: Vec<LogData>,
7875
},
7976
Battery {
80-
esp_id: u32,
8177
level: Option<f64>,
8278
voltage: Option<f64>,
8379
},
8480
Add {
85-
esp_id: u32,
8681
firmware: String,
8782
},
8883
EpochTime {
@@ -92,9 +87,7 @@ pub enum TimerPacket {
9287
// packet for end to end testing
9388
TestPacket(TestPacketData),
9489
Snapshot(SnapshotData),
95-
TestAck {
96-
esp_id: u32,
97-
},
90+
TestAck,
9891
}
9992

10093
#[derive(Debug, Clone)]

0 commit comments

Comments
 (0)