got basic action stuff running, now to make error handling better
This commit is contained in:
@ -36,7 +36,9 @@ use serde::{Deserialize, Serialize};
|
||||
use std::io::Error;
|
||||
use std::process::Command;
|
||||
use std::sync::mpsc;
|
||||
use satrs::pus::action::ActionReplyPus;
|
||||
use satrs::pus::action::{ActionReplyPus, ActionReplyVariant};
|
||||
|
||||
const IMS_TESTAPP: &str = "scripts/ims100_testapp";
|
||||
|
||||
const DEFAULT_SINGLE_CAM_PARAMS: CameraPictureParameters = CameraPictureParameters {
|
||||
R: 8,
|
||||
@ -83,7 +85,7 @@ const BALANCED_SINGLE_FLATSAT_CAM_PARAMS: CameraPictureParameters = CameraPictur
|
||||
// TODO howto downlink
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum CameraActionIds {
|
||||
pub enum CameraActionId {
|
||||
DefaultSingle = 1,
|
||||
BalancedSingle = 2,
|
||||
DefaultSingleFlatSat = 3,
|
||||
@ -91,25 +93,25 @@ pub enum CameraActionIds {
|
||||
CustomParameters = 5,
|
||||
}
|
||||
|
||||
impl TryFrom<u32> for CameraActionIds {
|
||||
impl TryFrom<u32> for CameraActionId {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(value: u32) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
value if value == CameraActionIds::DefaultSingle as u32 => {
|
||||
Ok(CameraActionIds::DefaultSingle)
|
||||
value if value == CameraActionId::DefaultSingle as u32 => {
|
||||
Ok(CameraActionId::DefaultSingle)
|
||||
}
|
||||
value if value == CameraActionIds::BalancedSingle as u32 => {
|
||||
Ok(CameraActionIds::BalancedSingle)
|
||||
value if value == CameraActionId::BalancedSingle as u32 => {
|
||||
Ok(CameraActionId::BalancedSingle)
|
||||
}
|
||||
value if value == CameraActionIds::DefaultSingleFlatSat as u32 => {
|
||||
Ok(CameraActionIds::DefaultSingleFlatSat)
|
||||
value if value == CameraActionId::DefaultSingleFlatSat as u32 => {
|
||||
Ok(CameraActionId::DefaultSingleFlatSat)
|
||||
}
|
||||
value if value == CameraActionIds::BalancedSingleFlatSat as u32 => {
|
||||
Ok(CameraActionIds::BalancedSingleFlatSat)
|
||||
value if value == CameraActionId::BalancedSingleFlatSat as u32 => {
|
||||
Ok(CameraActionId::BalancedSingleFlatSat)
|
||||
}
|
||||
value if value == CameraActionIds::CustomParameters as u32 => {
|
||||
Ok(CameraActionIds::CustomParameters)
|
||||
value if value == CameraActionId::CustomParameters as u32 => {
|
||||
Ok(CameraActionId::CustomParameters)
|
||||
}
|
||||
_ => Err(()),
|
||||
}
|
||||
@ -193,15 +195,15 @@ impl IMS100BatchHandler {
|
||||
|
||||
pub fn handle_action_request(
|
||||
&mut self,
|
||||
_requestor_info: &MessageMetadata,
|
||||
requestor_info: &MessageMetadata,
|
||||
action_request: &ActionRequest,
|
||||
) -> std::io::Result<()> {
|
||||
let param = match CameraActionIds::try_from(action_request.action_id).unwrap() {
|
||||
CameraActionIds::DefaultSingle => DEFAULT_SINGLE_CAM_PARAMS,
|
||||
CameraActionIds::BalancedSingle => BALANCED_SINGLE_CAM_PARAMS,
|
||||
CameraActionIds::DefaultSingleFlatSat => DEFAULT_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
CameraActionIds::BalancedSingleFlatSat => BALANCED_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
CameraActionIds::CustomParameters => match &action_request.variant {
|
||||
let param = match CameraActionId::try_from(action_request.action_id).expect("Invalid action id") {
|
||||
CameraActionId::DefaultSingle => DEFAULT_SINGLE_CAM_PARAMS,
|
||||
CameraActionId::BalancedSingle => BALANCED_SINGLE_CAM_PARAMS,
|
||||
CameraActionId::DefaultSingleFlatSat => DEFAULT_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
CameraActionId::BalancedSingleFlatSat => BALANCED_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
CameraActionId::CustomParameters => match &action_request.variant {
|
||||
ActionRequestVariant::NoData => return Err(Error::other("No Data sent!")),
|
||||
ActionRequestVariant::StoreData(_) => {
|
||||
// let param = serde_json::from_slice()
|
||||
@ -223,11 +225,13 @@ impl IMS100BatchHandler {
|
||||
_ => return Err(Error::other("Invalid Action Request Variant!")),
|
||||
},
|
||||
};
|
||||
self.take_picture(param)
|
||||
self.take_picture(param)?;
|
||||
self.action_reply_tx.send(GenericMessage::new(*requestor_info, ActionReplyPus::new(action_request.action_id, ActionReplyVariant::Completed))).unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn take_picture(&mut self, param: CameraPictureParameters) -> std::io::Result<()> {
|
||||
let mut cmd = Command::new("ims100_testapp");
|
||||
let mut cmd = Command::new(IMS_TESTAPP);
|
||||
cmd.arg("-R")
|
||||
.arg(¶m.R.to_string())
|
||||
.arg("-G")
|
||||
@ -314,7 +318,7 @@ impl IMS100BatchHandler {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::handlers::camera::{
|
||||
CameraActionIds, CameraPictureParameters, IMS100BatchHandler,
|
||||
CameraActionId, CameraPictureParameters, IMS100BatchHandler,
|
||||
DEFAULT_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
};
|
||||
use crate::requests::CompositeRequest;
|
||||
@ -359,7 +363,7 @@ mod tests {
|
||||
|
||||
let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
let req = ActionRequest::new(
|
||||
CameraActionIds::CustomParameters as u32,
|
||||
CameraActionId::CustomParameters as u32,
|
||||
ActionRequestVariant::VecData(data.as_bytes().to_vec()),
|
||||
);
|
||||
|
||||
@ -374,7 +378,7 @@ mod tests {
|
||||
|
||||
let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
let req = ActionRequest::new(
|
||||
CameraActionIds::CustomParameters as u32,
|
||||
CameraActionId::CustomParameters as u32,
|
||||
ActionRequestVariant::VecData(data.as_bytes().to_vec()),
|
||||
);
|
||||
let req = CompositeRequest::Action(req);
|
||||
|
Reference in New Issue
Block a user