@@ -7,88 +7,59 @@ use defmt::debug;
77use embassy_executor:: task;
88use embassy_futures:: select:: select;
99use firmware_protocol:: {
10- BoardType , CbPacket , ImuType , McuType , SbPacket , SensorDataType , SensorStatus ,
10+ sansio:: { self , SbBuf } ,
11+ CbPacket , SlimeQuaternion ,
1112} ;
1213
1314use crate :: imu:: Quat ;
14- use crate :: utils:: Unreliable ;
15-
16- #[ allow( dead_code) ]
17- mod v2;
15+ use crate :: utils:: { Reliable , Unreliable } ;
1816
1917#[ task]
20- pub async fn control_task (
18+ pub async fn protocol_task (
2119 packets : & ' static Packets ,
2220 quat : & ' static Unreliable < Quat > ,
2321) -> ! {
2422 debug ! ( "Control task!" ) ;
2523 async {
24+ let mut proto_state = sansio:: State :: new ( ) ;
25+ let mut sb_buf = SbBuf :: new ( ) ;
2626 loop {
27- do_work ( packets, quat) . await ;
27+ proto_state = match proto_state {
28+ sansio:: State :: Disconnected ( s) => {
29+ while_disconnected ( s, & mut sb_buf, & packets. clientbound ) . await
30+ }
31+ sansio:: State :: Connected ( s) => {
32+ while_connected ( s, & mut sb_buf, & packets. clientbound , quat) . await
33+ }
34+ } ;
35+ while !sb_buf. is_empty ( ) {
36+ let sb = sb_buf. pop ( ) . unwrap ( ) ;
37+ packets. serverbound . send ( sb) . await ;
38+ }
2839 }
2940 }
3041 . await
3142}
3243
33- async fn do_work ( packets : & Packets , quat : & Unreliable < Quat > ) {
34- let event = select ( packets. clientbound . recv ( ) , quat. wait ( ) ) . await ;
44+ async fn while_disconnected (
45+ state : sansio:: Disconnected ,
46+ sb_buf : & mut SbBuf ,
47+ cb : & Reliable < CbPacket > ,
48+ ) -> sansio:: State {
49+ let cb_msg = cb. recv ( ) . await ;
50+ state. received_msg ( cb_msg, sb_buf)
51+ }
52+
53+ async fn while_connected (
54+ state : sansio:: Connected ,
55+ sb_buf : & mut SbBuf ,
56+ cb : & Reliable < CbPacket > ,
57+ quat : & Unreliable < Quat > ,
58+ ) -> sansio:: State {
59+ let event = select ( cb. recv ( ) , quat. wait ( ) ) . await ;
3560 use embassy_futures:: select:: Either ;
3661 match event {
37- Either :: First ( cb_packet) => todo ! ( ) ,
38- Either :: Second ( quat) => todo ! ( ) ,
39- }
40-
41- match packets. clientbound . recv ( ) . await {
42- // Identify ourself when discovery packet is received
43- CbPacket :: Discovery => {
44- packets
45- . serverbound
46- . send ( SbPacket :: Handshake {
47- // TODO: Compile time constants for board and MCU
48- board : BoardType :: Custom ,
49- // Should this IMU type be whatever the first IMU of the system is?
50- imu : ImuType :: Unknown ( 0xFF ) ,
51- mcu : McuType :: Esp32 ,
52- imu_info : ( 0 , 0 , 0 ) , // These appear to be inert
53- // Needs to be >=9 to use newer protocol, this is hard-coded in
54- // the java server :(
55- build : 10 ,
56- firmware : "SlimeVR-Rust" . into ( ) ,
57- mac_address : [ 0 ; 6 ] ,
58- } )
59- . await ;
60- debug ! ( "Handshake" ) ;
61-
62- // After handshake, we are supposed to send `SensorInfo` only once.
63- packets
64- . serverbound
65- . send ( SbPacket :: SensorInfo {
66- sensor_id : 0 , // First sensor (of two)
67- sensor_status : SensorStatus :: Ok ,
68- sensor_type : ImuType :: Unknown ( 0xFF ) ,
69- } )
70- . await ;
71- debug ! ( "SensorInfo" ) ;
72- }
73- // When heartbeat is received, we should reply with heartbeat 0 aka Discovery
74- // The protocol is asymmetric so its a bit unintuitive.
75- CbPacket :: Heartbeat => {
76- packets. serverbound . send ( SbPacket :: Heartbeat ) . await ;
77- }
78- // Pings are basically like heartbeats, just echo data back
79- CbPacket :: Ping { challenge } => {
80- packets. serverbound . send ( SbPacket :: Ping { challenge } ) . await ;
81- }
82- _ => ( ) ,
62+ Either :: First ( cb_msg) => state. received_msg ( cb_msg, sb_buf) ,
63+ Either :: Second ( quat) => state. send_imu ( 0 , SlimeQuaternion :: from ( quat) , sb_buf) ,
8364 }
84-
85- packets
86- . serverbound
87- . send ( SbPacket :: RotationData {
88- sensor_id : 0 , // First sensor
89- data_type : SensorDataType :: Normal , // Rotation data without magnetometer correction.
90- quat : quat. wait ( ) . await . into_inner ( ) . into ( ) ,
91- calibration_info : 0 ,
92- } )
93- . await ;
9465}
0 commit comments