|
1 | | -use capnp::message::Builder; |
2 | | -use capnp::serialize; |
3 | | -use ordered_float::OrderedFloat; |
4 | 1 | use sbp::messages::SBP; |
5 | | -use std::sync::{mpsc, Arc, Mutex}; |
6 | 2 |
|
7 | | -use crate::console_backend_capnp as m; |
8 | | - |
9 | | -use crate::tracking_tab::*; |
10 | | -use crate::types::SharedState; |
| 3 | +use crate::main_tab::*; |
| 4 | +use crate::types::*; |
11 | 5 |
|
12 | 6 | pub fn process_messages( |
13 | 7 | messages: impl Iterator<Item = sbp::Result<SBP>>, |
14 | | - shared_state: &Arc<Mutex<SharedState>>, |
15 | | - client_send_clone: mpsc::Sender<Vec<u8>>, |
| 8 | + shared_state: SharedState, |
| 9 | + client_send_clone: ClientSender, |
16 | 10 | ) { |
17 | | - let mut hpoints: Vec<(f64, OrderedFloat<f64>)> = vec![]; |
18 | | - let mut vpoints: Vec<(f64, OrderedFloat<f64>)> = vec![]; |
19 | | - let mut tow: f64; |
20 | | - let shared_state_clone = Arc::clone(&shared_state); |
21 | | - let mut tracking_signals = TrackingSignalsTab::new(&shared_state_clone); |
22 | | - |
| 11 | + let mut main = MainTab::new(shared_state); |
23 | 12 | for message in messages { |
24 | 13 | match message { |
25 | 14 | Ok(SBP::MsgTrackingState(msg)) => { |
26 | | - tracking_signals |
27 | | - .handle_msg_tracking_state(msg.states.clone(), client_send_clone.clone()); |
| 15 | + main.tracking_signals_tab |
| 16 | + .handle_msg_tracking_state(msg.states.clone(), &mut client_send_clone.clone()); |
28 | 17 | } |
29 | 18 | Ok(SBP::MsgObs(msg)) => { |
30 | | - tracking_signals.handle_obs( |
| 19 | + main.tracking_signals_tab.handle_obs( |
31 | 20 | ObservationMsg::MsgObs(msg.clone()), |
32 | | - client_send_clone.clone(), |
| 21 | + &mut client_send_clone.clone(), |
33 | 22 | ); |
34 | 23 | } |
35 | 24 | Ok(SBP::MsgMeasurementState(msg)) => { |
36 | | - tracking_signals |
37 | | - .handle_msg_measurement_state(msg.states.clone(), client_send_clone.clone()); |
| 25 | + main.tracking_signals_tab.handle_msg_measurement_state( |
| 26 | + msg.states.clone(), |
| 27 | + &mut client_send_clone.clone(), |
| 28 | + ); |
38 | 29 | } |
39 | 30 | Ok(SBP::MsgObsDepA(_msg)) => { |
40 | 31 | //CPP-85 Unhandled for tracking signals plot tab. |
41 | 32 | println!("The message type, MsgObsDepA, is not handled in the Tracking->SignalsPlot tab."); |
42 | 33 | } |
43 | 34 | Ok(SBP::MsgObsDepB(msg)) => { |
44 | | - tracking_signals.handle_obs( |
| 35 | + main.tracking_signals_tab.handle_obs( |
45 | 36 | ObservationMsg::MsgObsDepB(msg.clone()), |
46 | | - client_send_clone.clone(), |
| 37 | + &mut client_send_clone.clone(), |
47 | 38 | ); |
48 | 39 | } |
49 | 40 | Ok(SBP::MsgObsDepC(msg)) => { |
50 | | - tracking_signals.handle_obs( |
| 41 | + main.tracking_signals_tab.handle_obs( |
51 | 42 | ObservationMsg::MsgObsDepC(msg.clone()), |
52 | | - client_send_clone.clone(), |
| 43 | + &mut client_send_clone.clone(), |
53 | 44 | ); |
54 | 45 | } |
55 | | - |
56 | | - Ok(SBP::MsgVelNED(velocity_ned)) => { |
57 | | - let n = velocity_ned.n as f64; |
58 | | - let e = velocity_ned.e as f64; |
59 | | - let d = velocity_ned.d as f64; |
60 | | - |
61 | | - let h_vel = f64::sqrt(f64::powi(n, 2) + f64::powi(e, 2)) / 1000.0; |
62 | | - let v_vel = (-1.0 * d) / 1000.0; |
63 | | - |
64 | | - tow = velocity_ned.tow as f64 / 1000.0; |
65 | | - |
66 | | - let mut _min = 0.0; |
67 | | - let mut _max = 1.0; |
68 | | - { |
69 | | - let vmin = vpoints |
70 | | - .iter() |
71 | | - .min_by_key(|i| i.1) |
72 | | - .unwrap_or(&(0.0, OrderedFloat(0.0))); |
73 | | - let vmax = vpoints |
74 | | - .iter() |
75 | | - .max_by_key(|i| i.1) |
76 | | - .unwrap_or(&(1.0, OrderedFloat(0.0))); |
77 | | - let hmin = hpoints |
78 | | - .iter() |
79 | | - .min_by_key(|i| i.1) |
80 | | - .unwrap_or(&(0.0, OrderedFloat(0.0))); |
81 | | - let hmax = hpoints |
82 | | - .iter() |
83 | | - .max_by_key(|i| i.1) |
84 | | - .unwrap_or(&(1.0, OrderedFloat(0.0))); |
85 | | - |
86 | | - if vmin.1.into_inner() < hmin.1.into_inner() { |
87 | | - _min = vmin.1.into_inner(); |
88 | | - } else { |
89 | | - _min = hmin.1.into_inner(); |
90 | | - } |
91 | | - if vmax.1.into_inner() > hmax.1.into_inner() { |
92 | | - _max = vmax.1.into_inner(); |
93 | | - } else { |
94 | | - _max = hmax.1.into_inner(); |
95 | | - } |
96 | | - } |
97 | | - |
98 | | - if hpoints.len() >= 200 { |
99 | | - hpoints.remove(0); |
100 | | - } |
101 | | - if vpoints.len() >= 200 { |
102 | | - vpoints.remove(0); |
103 | | - } |
104 | | - hpoints.push((tow, OrderedFloat(h_vel))); |
105 | | - vpoints.push((tow, OrderedFloat(v_vel))); |
106 | | - |
107 | | - let mut builder = Builder::new_default(); |
108 | | - let msg = builder.init_root::<m::message::Builder>(); |
109 | | - |
110 | | - let mut velocity_status = msg.init_velocity_status(); |
111 | | - |
112 | | - velocity_status.set_min(_min); |
113 | | - velocity_status.set_max(_max); |
114 | | - |
115 | | - { |
116 | | - let mut hvel_points = velocity_status |
117 | | - .reborrow() |
118 | | - .init_hpoints(hpoints.len() as u32); |
119 | | - for (i, (x, OrderedFloat(y))) in hpoints.iter().enumerate() { |
120 | | - let mut point_val = hvel_points.reborrow().get(i as u32); |
121 | | - point_val.set_x(*x); |
122 | | - point_val.set_y(*y); |
123 | | - } |
124 | | - } |
125 | | - { |
126 | | - let mut vvel_points = velocity_status |
127 | | - .reborrow() |
128 | | - .init_vpoints(vpoints.len() as u32); |
129 | | - for (i, (x, OrderedFloat(y))) in vpoints.iter().enumerate() { |
130 | | - let mut point_val = vvel_points.reborrow().get(i as u32); |
131 | | - point_val.set_x(*x); |
132 | | - point_val.set_y(*y); |
133 | | - } |
134 | | - } |
135 | | - |
136 | | - let mut msg_bytes: Vec<u8> = vec![]; |
137 | | - serialize::write_message(&mut msg_bytes, &builder).unwrap(); |
138 | | - |
139 | | - client_send_clone.send(msg_bytes).unwrap(); |
| 46 | + Ok(SBP::MsgVelNED(msg)) => { |
| 47 | + main.solution_velocity_tab |
| 48 | + .handle_vel_ned(msg.clone(), &mut client_send_clone.clone()); |
140 | 49 | } |
| 50 | + |
141 | 51 | _ => { |
142 | 52 | // no-op |
143 | 53 | } |
|
0 commit comments