diff --git a/bulb/src/card.rs b/bulb/src/card.rs index dee4e89a7..f7815673f 100644 --- a/bulb/src/card.rs +++ b/bulb/src/card.rs @@ -995,7 +995,7 @@ async fn patch_changed_x(cv: &CardView) -> Result<()> { /// Handle click event for a button owned by the resource pub async fn handle_click(cv: &CardView, id: String) -> Result<()> { - if cv.view != View::Status { + if cv.view != View::Status && cv.view != View::Request { return Ok(()); } match cv.res { @@ -1008,7 +1008,7 @@ pub async fn handle_click(cv: &CardView, id: String) -> Result<()> { /// Handle click event for a button on a card async fn handle_click_x(cv: &CardView, id: String) -> Result<()> { let pri = fetch_primary::(&cv.name).await?; - let anc = fetch_ancillary(View::Status, &pri).await?; + let anc = fetch_ancillary(cv.view, &pri).await?; for action in pri.handle_click(anc, id) { action.perform().await?; } diff --git a/bulb/src/device.rs b/bulb/src/device.rs index ce3f1514a..a0bb59a45 100644 --- a/bulb/src/device.rs +++ b/bulb/src/device.rs @@ -19,6 +19,46 @@ use std::iter::{empty, once}; use std::marker::PhantomData; use wasm_bindgen::JsValue; +/// Device requests +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[allow(dead_code)] +pub enum DeviceReq { + NoRequest, + QueryConfiguration, + QuerySettings, + SendSettings, + QueryMessage, + QueryStatus, + QueryPixelFailures, + TestPixels, + TestFans, + TestLamps, + BrightnessGood, + BrightnessTooDim, + BrightnessTooBright, + ResetDevice, + ResetStatus, + QueryGpsLocation, + DisableSystem, + CameraFocusStop, + CameraFocusNear, + CameraFocusFar, + CameraFocusManual, + CameraFocusAuto, + CameraIrisStop, + CameraIrisClose, + CameraIrisOpen, + CameraIrisManual, + CameraIrisAuto, + CameraWiperOneShot, + CameraWasher, + CameraPowerOn, + CameraPowerOff, + CameraMenuOpen, + CameraMenuEnter, + CameraMenuCancel, +} + /// Device resource for controller IO pub trait Device { /// Get controller diff --git a/bulb/src/dms.rs b/bulb/src/dms.rs index f36b983c9..09928d129 100644 --- a/bulb/src/dms.rs +++ b/bulb/src/dms.rs @@ -11,7 +11,7 @@ // GNU General Public License for more details. // use crate::card::{html_title_row, AncillaryData, Card, View}; -use crate::device::{Device, DeviceAnc}; +use crate::device::{Device, DeviceAnc, DeviceReq}; use crate::error::Result; use crate::fetch::{Action, ContentType, Uri}; use crate::item::{ItemState, ItemStates}; @@ -961,24 +961,31 @@ impl Dms { "{title}\
\ Current Message\ - \ + \
\
\ Current Status\ - \ + \ +
\ +
\ + Pixel Errors\ + \ + \ + \ + \
\
\ Settings\ \ - \ - \ + \ + \ \
\
\ Configuration\ \ - \ - \ + \ + \ \
\
\ @@ -1077,6 +1084,17 @@ impl Dms { _ => Vec::new(), } } + + /// Create action to handle click on a device request button + fn device_req(&self, req: DeviceReq) -> Vec { + let uri = Dms::uri_name(&self.name); + let mut fields = Fields::new(); + fields.insert_num("device_req", req as u32); + let value = fields.into_value().to_string(); + let mut actions = Vec::with_capacity(1); + actions.push(Action::Patch(uri, value.into())); + actions + } } impl Device for Dms { @@ -1181,12 +1199,18 @@ impl Card for Dms { /// Handle click event for a button on the card fn handle_click(&self, anc: DmsAnc, id: String) -> Vec { - if &id == "mc_send" { - self.send_actions(anc) - } else if &id == "mc_blank" { - self.blank_actions(anc) - } else { - Vec::new() + match id.as_str() { + "mc_send" => self.send_actions(anc), + "mc_blank" => self.blank_actions(anc), + "rq_msg_query" => self.device_req(DeviceReq::QueryMessage), + "rq_status_query" => self.device_req(DeviceReq::QueryStatus), + "rq_pixel_test" => self.device_req(DeviceReq::TestPixels), + "rq_pixel_query" => self.device_req(DeviceReq::QueryPixelFailures), + "rq_settings_send" => self.device_req(DeviceReq::SendSettings), + "rq_settings_query" => self.device_req(DeviceReq::QuerySettings), + "rq_config_reset" => self.device_req(DeviceReq::ResetDevice), + "rq_config_query" => self.device_req(DeviceReq::QueryConfiguration), + _ => Vec::new(), } }