Skip to content

Commit fb40977

Browse files
Implement restart, firmware_restart and emergency stop
1 parent 1acfc2e commit fb40977

14 files changed

Lines changed: 267 additions & 50 deletions

moonraker-rs/src/connector/websocket_read.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl MoonrakerConnectionReadLoop {
7272
Err(e) => {
7373
// Assume connection lost
7474
self.inbound_sender
75-
.send(Arc::new(WebsocketEvent::Error(e.to_string())))
75+
.send(Arc::new(WebsocketEvent::ApplicationError(e.to_string())))
7676
.expect("Failed to internally send an error event");
7777
self.inbound_sender
7878
.send(Arc::new(WebsocketEvent::Disconnected))
@@ -118,8 +118,8 @@ impl MoonrakerConnectionReadLoop {
118118
pub async fn on_frame_text(&mut self, frame: &mut Frame<'static>) -> Result<(), Error> {
119119
let payload = String::from_utf8(frame.payload.to_vec()).expect("Invalid UTF-8 data");
120120

121-
#[cfg(debug_assertions)]
122-
println!("Received text frame: {}", payload);
121+
//#[cfg(debug_assertions)]
122+
//println!("Received text frame: {}", payload);
123123

124124
let data = serde_json::from_str::<JsonRpcResponse>(&payload)?;
125125

moonraker-rs/src/moonraker_connection.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub struct MoonrakerErrorReply
5353
pub enum WebsocketEvent {
5454
Connected,
5555
Disconnected,
56-
Error(String),
56+
ApplicationError(String),
5757
MoonrakerEvent(MoonrakerEvent),
5858
MoonrakerReply(MoonrakerReply),
5959
MoonrakerErrorReply(MoonrakerErrorReply),
@@ -298,4 +298,8 @@ impl MoonrakerConnection {
298298
pub fn get_listener(&self) -> Receiver<Arc<WebsocketEvent>> {
299299
self.inbound_event_listener.resubscribe()
300300
}
301+
302+
pub fn send_request_error(&self, message : String) {
303+
self.inbound_event_sender.send(Arc::new(WebsocketEvent::ApplicationError(message))).expect("Failed to internally send an error event");
304+
}
301305
}

moonraker-rs/src/requests/printer_administration.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ pub trait PrinterAdministrationRequestHandler {
1313
objects: Vec<String>,
1414
) -> Result<PrinterObjectsSubscribeResult, Error>;
1515
async fn run_gcode_script(&self, script: &str) -> Result<String, Error>;
16+
async fn emergency_stop(&self) -> Result<String, Error>;
17+
async fn restart(&self) -> Result<String, Error>;
18+
async fn firmware_restart(&self) -> Result<String, Error>;
1619
}
1720

1821
impl PrinterAdministrationRequestHandler for MoonrakerConnection {
@@ -41,6 +44,18 @@ impl PrinterAdministrationRequestHandler for MoonrakerConnection {
4144
let args = serde_json::json!({ "script": script });
4245
self.send_request("printer.gcode.script", Some(args)).await
4346
}
47+
48+
async fn emergency_stop(&self) -> Result<String, Error> {
49+
self.send_request("printer.emergency_stop", None).await
50+
}
51+
52+
async fn restart(&self) -> Result<String, Error> {
53+
self.send_request("printer.restart", None).await
54+
}
55+
56+
async fn firmware_restart(&self) -> Result<String, Error> {
57+
self.send_request("printer.firmware_restart", None).await
58+
}
4459
}
4560

4661
#[derive(Debug, Deserialize)]

src/event_loop/event_loop.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ impl EventLoop
3737
WebsocketEvent::Connected => self.on_connected().await,
3838
WebsocketEvent::Disconnected => self.on_disconnected().await,
3939
WebsocketEvent::MoonrakerEvent(event) => self.on_event(event).await,
40+
WebsocketEvent::ApplicationError(err_msg) => {
41+
// TODO: Do something with this
42+
eprintln!("Failed to send request: {}", err_msg);
43+
Ok(())
44+
}
4045
_ => Ok(()),
4146
}
4247
{

src/main.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use moonraker_rs::{
1010
use slint::{Image, Model, ModelRc, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel};
1111
use tokio::sync::Mutex;
1212

13-
use crate::{config::MoonrakerConfig, event_loop::EventLoop, hardware::init_display, ui_functions::{register_filesystem_download_thumbnails, register_filesystem_list_files, register_temperature_set_new_target_temperature, register_util_format_bytes, register_util_image_exists, register_util_prettify_name}};
13+
use crate::{config::MoonrakerConfig, event_loop::EventLoop, hardware::init_display, ui_functions::{register_filesystem_download_thumbnails, register_filesystem_list_files, register_printer_emergency_stop, register_printer_firmware_restart, register_printer_restart, register_temperature_set_new_target_temperature, register_util_format_bytes, register_util_image_exists, register_util_prettify_name}};
1414

1515
mod application_error;
1616
mod config;
@@ -91,6 +91,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
9191
register_util_format_bytes(&ui);
9292
register_util_prettify_name(&ui);
9393

94+
register_printer_emergency_stop(&ui, &moonraker_connection);
95+
register_printer_firmware_restart(&ui, &moonraker_connection);
96+
register_printer_restart(&ui, &moonraker_connection);
97+
9498
tokio::task::block_in_place(|| {
9599
ui.run().unwrap();
96100
});

src/ui_functions/filesystem_download_thumbnail.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::sync::Arc;
22

3-
use moonraker_rs::{moonraker_connection::{self, MoonrakerConnection}, requests::FileManagementRequestHandler};
3+
use moonraker_rs::{moonraker_connection::{MoonrakerConnection}, requests::FileManagementRequestHandler};
44
use slint::{ComponentHandle, Image, Model, Rgba8Pixel, SharedPixelBuffer, VecModel};
55
use tokio::sync::Mutex;
66

src/ui_functions/filesystem_list_files.rs

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ pub fn register_filesystem_list_files(ui : &AppWindow, moonraker_connection : &A
1010
let ui_weak = ui.as_weak();
1111
let moonraker_connection = moonraker_connection.clone();
1212
ui.global::<Filesystem>().on_list_files(move || {
13-
println!("List files clicked");
1413
let moonraker_connection = moonraker_connection.clone();
1514
let ui_weak = ui_weak.clone();
1615
ui_weak
@@ -19,41 +18,48 @@ pub fn register_filesystem_list_files(ui : &AppWindow, moonraker_connection : &A
1918
.global::<Filesystem>()
2019
.set_loading(true);
2120
slint::spawn_local(async move {
22-
if let Ok(mut files) = moonraker_connection.list_gcode_files().await {
23-
files.sort_by(|a, b| {
24-
if a.modified > b.modified {
25-
Ordering::Less
26-
} else if a.modified < b.modified {
27-
Ordering::Greater
28-
} else {
29-
Ordering::Equal
30-
}
31-
});
32-
33-
println!("Files: {:?}", files);
34-
35-
let ui = ui_weak.upgrade().unwrap();
36-
37-
let converted_files: Vec<MoonrakerFileTest> = files
38-
.iter()
39-
.map(|f| MoonrakerFileTest {
40-
path: SharedString::from(&f.path),
41-
modified: f.modified,
42-
size: f.size,
43-
permissions: SharedString::from(&f.permissions),
44-
thumbnail: Image::default(),
45-
})
46-
.collect();
47-
48-
ui.global::<Filesystem>()
49-
.set_files(ModelRc::new(Rc::new(VecModel::from(converted_files))));
50-
ui.global::<Filesystem>().set_loading(false);
51-
ui.global::<Filesystem>().invoke_download_thumbnail(0);
52-
ui.global::<Filesystem>().invoke_download_thumbnail(1);
53-
ui.global::<Filesystem>().invoke_download_thumbnail(2);
54-
ui.global::<Filesystem>().invoke_download_thumbnail(3);
55-
ui.global::<Filesystem>().invoke_download_thumbnail(4);
56-
}
21+
let mut files = match moonraker_connection.list_gcode_files().await
22+
{
23+
Ok(f) => f,
24+
Err(e) => {
25+
moonraker_connection.send_request_error(format!("Failed to list files: {}", e));
26+
return;
27+
}
28+
};
29+
30+
files.sort_by(|a, b| {
31+
if a.modified > b.modified {
32+
Ordering::Less
33+
} else if a.modified < b.modified {
34+
Ordering::Greater
35+
} else {
36+
Ordering::Equal
37+
}
38+
});
39+
40+
println!("Files: {:?}", files);
41+
42+
let ui = ui_weak.upgrade().unwrap();
43+
44+
let converted_files: Vec<MoonrakerFileTest> = files
45+
.iter()
46+
.map(|f| MoonrakerFileTest {
47+
path: SharedString::from(&f.path),
48+
modified: f.modified,
49+
size: f.size,
50+
permissions: SharedString::from(&f.permissions),
51+
thumbnail: Image::default(),
52+
})
53+
.collect();
54+
55+
ui.global::<Filesystem>()
56+
.set_files(ModelRc::new(Rc::new(VecModel::from(converted_files))));
57+
ui.global::<Filesystem>().set_loading(false);
58+
ui.global::<Filesystem>().invoke_download_thumbnail(0);
59+
ui.global::<Filesystem>().invoke_download_thumbnail(1);
60+
ui.global::<Filesystem>().invoke_download_thumbnail(2);
61+
ui.global::<Filesystem>().invoke_download_thumbnail(3);
62+
ui.global::<Filesystem>().invoke_download_thumbnail(4);
5763
})
5864
.unwrap();
5965
});

src/ui_functions/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@ pub mod util_image_exists;
44
pub mod filesystem_list_files;
55
pub mod util_prettify_name;
66
pub mod temperature_set_new_target_temperature;
7+
pub mod printer_emergency_stop;
8+
pub mod printer_restart;
9+
pub mod printer_firmware_restart;
710

811
pub use util_format_bytes::*;
912
pub use filesystem_download_thumbnail::*;
1013
pub use util_image_exists::*;
1114
pub use filesystem_list_files::*;
1215
pub use util_prettify_name::*;
13-
pub use temperature_set_new_target_temperature::*;
16+
pub use temperature_set_new_target_temperature::*;
17+
pub use printer_emergency_stop::*;
18+
pub use printer_restart::*;
19+
pub use printer_firmware_restart::*;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use std::sync::Arc;
2+
3+
use moonraker_rs::{moonraker_connection::MoonrakerConnection, requests::PrinterAdministrationRequestHandler};
4+
use slint::ComponentHandle;
5+
6+
use crate::{AppWindow, PrinterAdministration};
7+
8+
9+
pub fn register_printer_emergency_stop(ui : &AppWindow, moonraker_connection : &Arc<MoonrakerConnection>)
10+
{
11+
let moonraker_connection = moonraker_connection.clone();
12+
13+
ui.global::<PrinterAdministration>().on_emergency_stop(move || {
14+
let moonraker_connection = moonraker_connection.clone();
15+
16+
slint::spawn_local(async move {
17+
if let Err(e) = moonraker_connection.emergency_stop().await
18+
{
19+
moonraker_connection.send_request_error(format!("Failed to send emergency stop command: {}", e));
20+
}
21+
}).unwrap();
22+
});
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use std::sync::Arc;
2+
3+
use moonraker_rs::{moonraker_connection::MoonrakerConnection, requests::PrinterAdministrationRequestHandler};
4+
use slint::ComponentHandle;
5+
6+
use crate::{AppWindow, PrinterAdministration};
7+
8+
9+
pub fn register_printer_firmware_restart(ui : &AppWindow, moonraker_connection : &Arc<MoonrakerConnection>)
10+
{
11+
let moonraker_connection = moonraker_connection.clone();
12+
13+
ui.global::<PrinterAdministration>().on_firmware_restart(move || {
14+
let moonraker_connection = moonraker_connection.clone();
15+
16+
slint::spawn_local(async move {
17+
if let Err(e) = moonraker_connection.firmware_restart().await
18+
{
19+
moonraker_connection.send_request_error(format!("Failed to send firmware restart command: {}", e));
20+
}
21+
}).unwrap();
22+
});
23+
}

0 commit comments

Comments
 (0)