Skip to content

Commit 9d06aad

Browse files
john-michaelburkenotoriagaJason Mobarak
authored
Remaining Update Tab Functionality + Nag messages[CPP-312][CPP-306][CPP-302][CPP-305][CPP-304][CPP-172] (#124)
* More update WIP. * Update console_backend/src/update_tab.rs Co-authored-by: Steven Meyer <[email protected]> * Update resources/UpdateTab.qml Co-authored-by: Jason Mobarak <[email protected]> * Update resources/UpdateTab.qml Co-authored-by: Jason Mobarak <[email protected]> * Update resources/UpdateTab.qml Co-authored-by: Jason Mobarak <[email protected]> * Respond to review requests. * Clean up formatting and name variables, remove unneeded comments. Co-authored-by: Steven Meyer <[email protected]> Co-authored-by: Jason Mobarak <[email protected]>
1 parent e1786a3 commit 9d06aad

24 files changed

+1248
-141
lines changed

Makefile.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ args = [
167167
[tasks.store-version]
168168
script_runner = "@shell"
169169
script = '''
170-
echo $(git describe --tags) > console_backend/src/version.txt
170+
git describe --tags --always > console_backend/src/version.txt
171171
'''
172172

173173
[tasks.install-backend]

console_backend/src/common_constants.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,18 @@ pub enum Keys {
237237
TITLE,
238238
#[strum(serialize = "IMPORT_STATUS")]
239239
IMPORT_STATUS,
240+
#[strum(serialize = "FW_OUTDATED")]
241+
FW_OUTDATED,
242+
#[strum(serialize = "FW_V2_OUTDATED")]
243+
FW_V2_OUTDATED,
244+
#[strum(serialize = "SERIAL_PROMPT")]
245+
SERIAL_PROMPT,
246+
#[strum(serialize = "CONSOLE_OUTDATED")]
247+
CONSOLE_OUTDATED,
248+
#[strum(serialize = "CONSOLE_VERSION_CURRENT")]
249+
CONSOLE_VERSION_CURRENT,
250+
#[strum(serialize = "CONSOLE_VERSION_LATEST")]
251+
CONSOLE_VERSION_LATEST,
240252
}
241253

242254
#[derive(Clone, Debug, Display, EnumString, EnumVariantNames, Eq, Hash, PartialEq)]

console_backend/src/connection.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ impl Connection {
184184
pub fn settings_enabled(&self) -> bool {
185185
matches!(self, Connection::Tcp(_) | Connection::Serial(_))
186186
}
187+
pub fn is_serial(&self) -> bool {
188+
matches!(self, Connection::Serial(_))
189+
}
187190
pub fn try_connect(
188191
&self,
189192
shared_state: Option<SharedState>,

console_backend/src/errors.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ pub(crate) const SERVER_STATE_DISCONNECT_FAILURE: &str = "server state disconnec
1616
pub(crate) const CONSOLE_LOG_JSON_TO_STRING_FAILURE: &str = "unable to convert json to string";
1717
pub(crate) const CROSSBEAM_SCOPE_UNWRAP_FAILURE: &str = "unable to unwrap crossbeam scope";
1818
pub(crate) const UNABLE_TO_CLONE_UPDATE_SHARED: &str = "unable to clone update shared";
19+
pub(crate) const FILEIO_CHANNEL_SEND_FAILURE: &str =
20+
"failure attempting to send via fileio channel";

console_backend/src/fileio.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use sbp::messages::{
1717
SBP,
1818
};
1919

20+
use crate::errors::FILEIO_CHANNEL_SEND_FAILURE;
2021
use crate::types::{MsgSender, Result};
2122

2223
const MAX_RETRIES: usize = 20;
@@ -88,7 +89,9 @@ impl<'a> Fileio<'a> {
8889
backoff.snooze();
8990
}
9091
send_msg(sequence, offset)?;
91-
req_tx.send((sequence, ReadReq::new(offset))).unwrap();
92+
req_tx
93+
.send((sequence, ReadReq::new(offset)))
94+
.expect(FILEIO_CHANNEL_SEND_FAILURE);
9295
offset += READ_CHUNK_SIZE as u32;
9396
sequence += 1;
9497
open_requests.fetch_add(1);
@@ -98,7 +101,7 @@ impl<'a> Fileio<'a> {
98101
});
99102

100103
let key = self.link.register(move |msg: MsgFileioReadResp| {
101-
res_tx.send(msg).unwrap();
104+
res_tx.send(msg).expect(FILEIO_CHANNEL_SEND_FAILURE);
102105
});
103106

104107
loop {
@@ -127,7 +130,7 @@ impl<'a> Fileio<'a> {
127130
open_requests.fetch_sub(1);
128131
if !last_sent && bytes_read != READ_CHUNK_SIZE as usize {
129132
last_sent = true;
130-
stop_req_tx.send(true).unwrap();
133+
stop_req_tx.send(true).expect(FILEIO_CHANNEL_SEND_FAILURE);
131134
}
132135
if last_sent && open_requests.load() == 0 {
133136
break
@@ -230,7 +233,9 @@ impl<'a> Fileio<'a> {
230233
let chunk_len = std::cmp::min(state.chunk_size, data_len - slice_offset);
231234
let req = WriteReq::new(slice_offset, end_offset, chunk_len < state.chunk_size);
232235
send_msg(&state, &req)?;
233-
req_tx.send((state.clone(), req)).unwrap();
236+
req_tx
237+
.send((state.clone(), req))
238+
.expect(FILEIO_CHANNEL_SEND_FAILURE);
234239
state.update(chunk_len);
235240
slice_offset += chunk_len;
236241
open_requests.fetch_add(1);
@@ -240,7 +245,7 @@ impl<'a> Fileio<'a> {
240245
});
241246

242247
let key = self.link.register(move |msg: MsgFileioWriteResp| {
243-
res_tx.send(msg).unwrap();
248+
res_tx.send(msg).expect(FILEIO_CHANNEL_SEND_FAILURE);
244249
});
245250

246251
let mut pending: HashMap<u32, (WriteState, WriteReq)> = HashMap::new();
@@ -294,7 +299,7 @@ impl<'a> Fileio<'a> {
294299
let (tx, rx) = channel::unbounded();
295300

296301
let key = self.link.register(move |msg: MsgFileioReadDirResp| {
297-
tx.send(msg).unwrap();
302+
tx.send(msg).expect(FILEIO_CHANNEL_SEND_FAILURE);
298303
});
299304

300305
self.sender.send(SBP::from(MsgFileioReadDirReq {
@@ -358,10 +363,11 @@ impl<'a> Fileio<'a> {
358363
let sequence = new_sequence();
359364
let (stop_tx, stop_rx) = channel::bounded(0);
360365
let (tx, rx) = channel::bounded(1);
361-
366+
let stop_tx_clone = stop_tx.clone();
362367
let key = self.link.register(move |msg: MsgFileioConfigResp| {
363-
tx.send(FileioConfig::new(msg)).unwrap();
364-
stop_tx.send(true).unwrap();
368+
tx.send(FileioConfig::new(msg))
369+
.expect(FILEIO_CHANNEL_SEND_FAILURE);
370+
stop_tx_clone.send(true).expect(FILEIO_CHANNEL_SEND_FAILURE);
365371
});
366372

367373
let sender = &self.sender;
@@ -376,10 +382,12 @@ impl<'a> Fileio<'a> {
376382
}
377383
});
378384

379-
match rx.recv_timeout(CONFIG_REQ_TIMEOUT) {
385+
let res = match rx.recv_timeout(CONFIG_REQ_TIMEOUT) {
380386
Ok(config) => config,
381387
Err(_) => Default::default(),
382-
}
388+
};
389+
stop_tx.send(true).expect(FILEIO_CHANNEL_SEND_FAILURE);
390+
res
383391
})
384392
.unwrap();
385393

console_backend/src/process_messages.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ where
224224
.lock()
225225
.expect(UNABLE_TO_CLONE_UPDATE_SHARED)
226226
.clone_update_tab_context();
227+
update_tab_context.set_serial_prompt(conn.is_serial());
227228
let client_send_clone = client_send.clone();
228229
let (update_tab_tx, update_tab_rx) = tabs.update.lock().unwrap().clone_channel();
229230
let settings_parker = Parker::new();
@@ -237,11 +238,12 @@ where
237238
settings_parker.park();
238239
}
239240
});
240-
let handle = scope.spawn(|_| {
241+
scope.spawn(|_| {
241242
update_tab::update_tab_thread(
242243
update_tab_tx.clone(),
243244
update_tab_rx,
244245
update_tab_context,
246+
shared_state.clone(),
245247
client_send_clone,
246248
source.stateless_link(),
247249
msg_sender.clone(),
@@ -284,10 +286,8 @@ where
284286
}
285287
log::logger().flush();
286288
}
287-
if update_tab_tx.send(None).is_ok() {
288-
if let Err(err) = handle.join() {
289-
error!("Error joining update tab, {:?}", err);
290-
}
289+
if let Err(err) = update_tab_tx.send(None) {
290+
error!("Issue stopping update tab: {}", err);
291291
}
292292
if conn.close_when_done() {
293293
shared_state.set_running(false, client_send.clone());

console_backend/src/server_recv_thread.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ pub fn server_recv_thread(
191191
let download_latest_firmware = cv_in.get_download_latest_firmware();
192192
let update_firmware = cv_in.get_update_firmware();
193193
let send_file_to_device = cv_in.get_send_file_to_device();
194+
let serial_prompt_confirm = cv_in.get_serial_prompt_confirm();
194195
let firmware_directory = match cv_in.get_download_directory().which() {
195196
Ok(m::update_tab_status_front::download_directory::Directory(
196197
Ok(directory),
@@ -254,18 +255,19 @@ pub fn server_recv_thread(
254255
}
255256
_ => None,
256257
};
257-
update_tab_sender
258-
.send(Some(UpdateTabUpdate {
259-
download_latest_firmware,
260-
update_firmware,
261-
send_file_to_device,
262-
firmware_directory,
263-
firmware_local_filepath,
264-
firmware_local_filename,
265-
fileio_local_filepath,
266-
fileio_destination_filepath,
267-
}))
268-
.unwrap();
258+
if let Err(err) = update_tab_sender.send(Some(UpdateTabUpdate {
259+
download_latest_firmware,
260+
update_firmware,
261+
send_file_to_device,
262+
firmware_directory,
263+
firmware_local_filepath,
264+
firmware_local_filename,
265+
fileio_local_filepath,
266+
fileio_destination_filepath,
267+
serial_prompt_confirm,
268+
})) {
269+
error!("{}", err);
270+
}
269271
}
270272
}
271273
m::message::SettingsRefreshRequest(Ok(_)) => {

console_backend/src/settings_tab.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ use crate::shared_state::SharedState;
1717
use crate::types::{CapnProtoSender, Error, MsgSender, Result};
1818
use crate::utils::*;
1919

20+
const FIRMWARE_VERSION_SETTING_KEY: &str = "firmware_version";
21+
const DGNSS_SOLUTION_MODE_SETTING_KEY: &str = "dgnss_solution_mode";
22+
2023
pub struct SettingsTab<'link, S> {
2124
client_sender: S,
2225
shared_state: SharedState,
@@ -203,6 +206,13 @@ impl<'link, S: CapnProtoSender> SettingsTab<'link, S> {
203206
continue;
204207
}
205208
};
209+
if FIRMWARE_VERSION_SETTING_KEY == setting.name {
210+
self.shared_state
211+
.set_firmware_version(setting.clone().value);
212+
}
213+
if DGNSS_SOLUTION_MODE_SETTING_KEY == setting.name {
214+
self.shared_state.set_dgnss_enabled(setting.clone().value);
215+
}
206216

207217
// update possible enum values with the possible values returned by the device
208218
if !setting.fmt_type.is_empty() && current_setting.setting.kind == SettingKind::Enum {

console_backend/src/shared_state.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,26 @@ impl SharedState {
259259
let mut shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
260260
shared_data.settings_tab.write = setting;
261261
}
262+
pub fn console_version(&self) -> String {
263+
let shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
264+
(*shared_data).console_version.clone()
265+
}
266+
pub fn set_firmware_version(&self, firmware_version: String) {
267+
let mut shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
268+
shared_data.firmware_version = Some(firmware_version);
269+
}
270+
pub fn firmware_version(&self) -> Option<String> {
271+
let mut shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
272+
shared_data.firmware_version.take()
273+
}
274+
pub fn dgnss_enabled(&self) -> bool {
275+
let shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
276+
shared_data.dgnss_enabled
277+
}
278+
pub fn set_dgnss_enabled(&self, dgnss_solution_mode: String) {
279+
let mut shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
280+
shared_data.dgnss_enabled = dgnss_solution_mode != "No DGNSS";
281+
}
262282
}
263283

264284
impl Deref for SharedState {
@@ -298,6 +318,9 @@ pub struct SharedStateInner {
298318
pub(crate) advanced_spectrum_analyzer_tab: AdvancedSpectrumAnalyzerTabState,
299319
pub(crate) update_tab_sender: Option<Sender<Option<UpdateTabUpdate>>>,
300320
pub(crate) settings_tab: SettingsTabState,
321+
pub(crate) console_version: String,
322+
pub(crate) firmware_version: Option<String>,
323+
pub(crate) dgnss_enabled: bool,
301324
}
302325
impl SharedStateInner {
303326
pub fn new() -> SharedStateInner {
@@ -318,6 +341,9 @@ impl SharedStateInner {
318341
advanced_spectrum_analyzer_tab: AdvancedSpectrumAnalyzerTabState::new(),
319342
update_tab_sender: None,
320343
settings_tab: SettingsTabState::new(),
344+
console_version: String::from(include_str!("version.txt").trim()),
345+
firmware_version: None,
346+
dgnss_enabled: false,
321347
}
322348
}
323349
}

console_backend/src/status_bar.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,18 @@ impl<S: CapnProtoSender> StatusBar<S> {
7272
pub fn new(shared_state: SharedState, client_sender: S) -> StatusBar<S> {
7373
let heartbeat_data = Heartbeat::new();
7474
let is_running = ArcBool::new();
75-
let version = String::from(include_str!("version.txt").trim());
75+
let version = shared_state.console_version();
7676
StatusBar {
7777
client_sender,
7878
shared_state: shared_state.clone(),
7979
heartbeat_data: heartbeat_data.clone(),
8080
port: shared_state.current_connection(),
8181
version,
82-
heartbeat_handler: StatusBar::<S>::heartbeat_thread(is_running.clone(), heartbeat_data),
82+
heartbeat_handler: StatusBar::<S>::heartbeat_thread(
83+
is_running.clone(),
84+
heartbeat_data,
85+
shared_state,
86+
),
8387
is_running,
8488
}
8589
}
@@ -89,14 +93,19 @@ impl<S: CapnProtoSender> StatusBar<S> {
8993
/// # Parameters:
9094
/// - `client_send`: Client Sender channel for communication from backend to frontend.
9195
/// - `shared_state`: The shared state for communicating between frontend/backend/other backend tabs.
92-
fn heartbeat_thread(is_running: ArcBool, heartbeat_data: Heartbeat) -> JoinHandle<()> {
96+
fn heartbeat_thread(
97+
is_running: ArcBool,
98+
heartbeat_data: Heartbeat,
99+
shared_state: SharedState,
100+
) -> JoinHandle<()> {
93101
is_running.set(true);
94102
let mut last_time = Instant::now();
95103
spawn(move || loop {
96104
if !is_running.get() {
97105
break;
98106
}
99-
heartbeat_data.heartbeat();
107+
let dgnss_enabled = shared_state.dgnss_enabled();
108+
heartbeat_data.heartbeat(dgnss_enabled);
100109
let new_time = Instant::now();
101110
let time_diff = (new_time - last_time).as_secs_f64();
102111
let delay_time = UPDATE_TOLERANCE_SECONDS - time_diff;
@@ -144,10 +153,7 @@ impl<S: CapnProtoSender> StatusBar<S> {
144153
status_bar_status.set_ins(&sb_update.ins_status);
145154
status_bar_status.set_data_rate(&sb_update.data_rate);
146155
status_bar_status.set_solid_connection(sb_update.solid_connection);
147-
status_bar_status.set_title(&format!(
148-
"{}(###) Swift Console {}",
149-
self.port, self.version
150-
));
156+
status_bar_status.set_title(&format!("{} Swift Console {}", self.port, self.version));
151157

152158
self.client_sender
153159
.send_data(serialize_capnproto_builder(builder));
@@ -374,10 +380,11 @@ impl HeartbeatInner {
374380
}
375381
}
376382

377-
pub fn baseline_ned_update(&mut self) {
383+
pub fn baseline_ned_update(&mut self, dgnss_enabled: bool) {
378384
if let Some(last_btime_update) = self.last_btime_update {
379-
//TODO(@john-michaelburke) [CPP-172] Add missing dgnss_enabled logic.
380-
if (self.current_time - last_btime_update).as_secs_f64() < UPDATE_TOLERANCE_SECONDS {
385+
if dgnss_enabled
386+
&& (self.current_time - last_btime_update).as_secs_f64() < UPDATE_TOLERANCE_SECONDS
387+
{
381388
self.baseline_display_mode = if let Some(bsoln_mode) =
382389
rtk_mode_dict.get(&(self.baseline_solution_mode as i32))
383390
{
@@ -486,12 +493,12 @@ impl Heartbeat {
486493
pub fn new() -> Heartbeat {
487494
Heartbeat(Arc::new(Mutex::new(HeartbeatInner::default())))
488495
}
489-
pub fn heartbeat(&self) {
496+
pub fn heartbeat(&self, dgnss_enabled: bool) {
490497
let mut shared_data = self.lock().expect(SHARED_STATE_LOCK_MUTEX_FAILURE);
491498
let good_heartbeat: bool = (*shared_data).check_heartbeat();
492499
if good_heartbeat {
493500
(*shared_data).pos_llh_update();
494-
(*shared_data).baseline_ned_update();
501+
(*shared_data).baseline_ned_update(dgnss_enabled);
495502
(*shared_data).ins_update();
496503
(*shared_data).age_of_corrections_update();
497504
(*shared_data).prepare_update_packet();

console_backend/src/update_downloader.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ use std::{
1111
const INDEX_URL: &str =
1212
"https://s3-us-west-1.amazonaws.com/downloads.swiftnav.com/index_https.json";
1313

14+
const V2_LINK: &str =
15+
"https://www.swiftnav.com/resource-files/Piksi%20Multi/v2.0.0/Firmware/PiksiMulti-v2.0.0.bin";
16+
1417
#[derive(Clone, Debug, Deserialize, Serialize)]
1518
struct PiksiMultiDataConsole {
1619
version: String,
@@ -69,6 +72,15 @@ impl UpdateDownloader {
6972
}
7073
}
7174

75+
pub fn download_multi_v2_firmware(
76+
&mut self,
77+
directory: PathBuf,
78+
update_shared: Option<UpdateTabContext>,
79+
) -> anyhow::Result<PathBuf> {
80+
let filepath_url = String::from(V2_LINK);
81+
self.download_file_from_url(filepath_url, directory, update_shared)
82+
}
83+
7284
pub fn download_multi_firmware(
7385
&mut self,
7486
directory: PathBuf,

0 commit comments

Comments
 (0)