some minor cleaning up plus initial image file handling
This commit is contained in:
@ -24,7 +24,6 @@
|
||||
/// v Y
|
||||
///
|
||||
/// see also https://opssat1.esoc.esa.int/dmsf/files/6/view
|
||||
|
||||
use crate::requests::CompositeRequest;
|
||||
use derive_new::new;
|
||||
use log::debug;
|
||||
@ -37,6 +36,7 @@ use serde::{Deserialize, Serialize};
|
||||
use std::io::Error;
|
||||
use std::process::Command;
|
||||
use std::sync::mpsc;
|
||||
use satrs::pus::action::ActionReplyPus;
|
||||
|
||||
const DEFAULT_SINGLE_CAM_PARAMS: CameraPictureParameters = CameraPictureParameters {
|
||||
R: 8,
|
||||
@ -78,6 +78,10 @@ const BALANCED_SINGLE_FLATSAT_CAM_PARAMS: CameraPictureParameters = CameraPictur
|
||||
W: 1000,
|
||||
};
|
||||
|
||||
// TODO copy as action
|
||||
// TODO ls -l via cfdp
|
||||
// TODO howto downlink
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum CameraActionIds {
|
||||
DefaultSingle = 1,
|
||||
@ -126,19 +130,36 @@ pub struct CameraPictureParameters {
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(new)]
|
||||
#[derive(Debug)]
|
||||
pub struct IMS100BatchHandler {
|
||||
id: UniqueApidTargetId,
|
||||
// mode_interface: MpscModeLeafInterface,
|
||||
composite_request_receiver: mpsc::Receiver<GenericMessage<CompositeRequest>>,
|
||||
composite_request_rx: mpsc::Receiver<GenericMessage<CompositeRequest>>,
|
||||
// hk_reply_sender: mpsc::Sender<GenericMessage<HkReply>>,
|
||||
tm_sender: mpsc::Sender<PacketAsVec>,
|
||||
tm_tx: mpsc::Sender<PacketAsVec>,
|
||||
action_reply_tx: mpsc::Sender<GenericMessage<ActionReplyPus>>,
|
||||
stamp_helper: TimeStampHelper,
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
#[allow(dead_code)]
|
||||
impl IMS100BatchHandler {
|
||||
pub fn new(
|
||||
id: UniqueApidTargetId,
|
||||
composite_request_rx: mpsc::Receiver<GenericMessage<CompositeRequest>>,
|
||||
tm_tx: mpsc::Sender<PacketAsVec>,
|
||||
action_reply_tx: mpsc::Sender<GenericMessage<ActionReplyPus>>,
|
||||
stamp_helper: TimeStampHelper,
|
||||
) -> Self {
|
||||
Self {
|
||||
id,
|
||||
composite_request_rx,
|
||||
tm_tx,
|
||||
action_reply_tx,
|
||||
stamp_helper,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn periodic_operation(&mut self) {
|
||||
self.stamp_helper.update_from_now();
|
||||
// Handle requests.
|
||||
@ -148,13 +169,13 @@ impl IMS100BatchHandler {
|
||||
|
||||
pub fn handle_composite_requests(&mut self) {
|
||||
loop {
|
||||
match self.composite_request_receiver.try_recv() {
|
||||
match self.composite_request_rx.try_recv() {
|
||||
Ok(ref msg) => match &msg.message {
|
||||
CompositeRequest::Hk(hk_request) => {
|
||||
self.handle_hk_request(&msg.requestor_info, hk_request);
|
||||
}
|
||||
CompositeRequest::Action(action_request) => {
|
||||
self.handle_action_request(&msg.requestor_info, action_request);
|
||||
self.handle_action_request(&msg.requestor_info, action_request).unwrap();
|
||||
}
|
||||
},
|
||||
Err(_) => {}
|
||||
@ -236,6 +257,21 @@ impl IMS100BatchHandler {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn list_current_images(&self) -> std::io::Result<Vec<String>> {
|
||||
let output = Command::new("ls").arg("-l")
|
||||
.arg("*.png")
|
||||
.output()?;
|
||||
|
||||
if output.status.success() {
|
||||
let output_str = String::from_utf8(output.stdout).unwrap();
|
||||
let files: Vec<String> = output_str.lines().map(|s| s.to_string()).collect();
|
||||
Ok(files)
|
||||
}
|
||||
else {
|
||||
Err(Error::other("Error getting file list."))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take_picture_from_str(
|
||||
&mut self,
|
||||
R: &str,
|
||||
@ -277,34 +313,40 @@ impl IMS100BatchHandler {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::handlers::camera::{
|
||||
CameraActionIds, CameraPictureParameters, IMS100BatchHandler,
|
||||
DEFAULT_SINGLE_FLATSAT_CAM_PARAMS,
|
||||
};
|
||||
use crate::requests::CompositeRequest;
|
||||
use ops_sat_rs::config::components::CAMERA_HANDLER;
|
||||
use ops_sat_rs::TimeStampHelper;
|
||||
use satrs::action::{ActionRequest, ActionRequestVariant};
|
||||
use satrs::request::{GenericMessage, MessageMetadata};
|
||||
use satrs::tmtc::PacketAsVec;
|
||||
use std::sync::mpsc;
|
||||
use std::sync::mpsc::{Receiver, Sender};
|
||||
use satrs::action::{ActionRequest, ActionRequestVariant};
|
||||
use satrs::request::{GenericMessage, MessageMetadata, UniqueApidTargetId};
|
||||
use satrs::tmtc::PacketAsVec;
|
||||
use ops_sat_rs::TimeStampHelper;
|
||||
use crate::handlers::camera::{CameraActionIds, CameraPictureParameters, DEFAULT_SINGLE_FLATSAT_CAM_PARAMS, IMS100BatchHandler};
|
||||
use crate::requests::CompositeRequest;
|
||||
use satrs::pus::action::ActionReplyPus;
|
||||
|
||||
fn create_handler() -> (IMS100BatchHandler, Sender<GenericMessage<CompositeRequest>>, Receiver<PacketAsVec>) {
|
||||
let id = UniqueApidTargetId::new(1,1);
|
||||
let (req_tx,req_rx) = mpsc::channel();
|
||||
fn create_handler() -> (IMS100BatchHandler, Sender<GenericMessage<CompositeRequest>>, Receiver<PacketAsVec>, Receiver<GenericMessage<ActionReplyPus>>) {
|
||||
let (composite_request_tx, composite_request_rx) = mpsc::channel();
|
||||
let (tm_tx, tm_rx) = mpsc::channel();
|
||||
let (action_reply_tx, action_reply_rx) = mpsc::channel();
|
||||
let time_helper = TimeStampHelper::default();
|
||||
let mut cam_handler: IMS100BatchHandler = IMS100BatchHandler::new(id, req_rx, tm_tx, time_helper);
|
||||
(cam_handler, req_tx, tm_rx)
|
||||
let cam_handler: IMS100BatchHandler =
|
||||
IMS100BatchHandler::new(CAMERA_HANDLER, composite_request_rx, tm_tx, action_reply_tx, time_helper);
|
||||
(cam_handler, composite_request_tx, tm_rx, action_reply_rx)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn command_line_execution() {
|
||||
let (mut cam_handler, mut req_tx, mut tm_rx) = create_handler();
|
||||
cam_handler.take_picture(DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
let (mut cam_handler, req_tx, tm_rx, action_reply_rx) = create_handler();
|
||||
cam_handler
|
||||
.take_picture(DEFAULT_SINGLE_FLATSAT_CAM_PARAMS)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize_and_deserialize_command() {
|
||||
let (mut cam_handler, mut req_tx, mut tm_rx) = create_handler();
|
||||
|
||||
let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
println!("{}", data);
|
||||
let param: CameraPictureParameters = serde_json::from_str(&data).unwrap();
|
||||
@ -313,23 +355,33 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_action_req() {
|
||||
let (mut cam_handler, mut req_tx, mut tm_rx) = create_handler();
|
||||
let (mut cam_handler, req_tx, tm_rx, action_reply_rx) = create_handler();
|
||||
|
||||
let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
let req = ActionRequest::new(CameraActionIds::CustomParameters as u32, ActionRequestVariant::VecData(data.as_bytes().to_vec()));
|
||||
let req = ActionRequest::new(
|
||||
CameraActionIds::CustomParameters as u32,
|
||||
ActionRequestVariant::VecData(data.as_bytes().to_vec()),
|
||||
);
|
||||
|
||||
cam_handler.handle_action_request(&MessageMetadata::new(1,1),&req).unwrap();
|
||||
cam_handler
|
||||
.handle_action_request(&MessageMetadata::new(1, 1), &req)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_action_req_channel() {
|
||||
let (mut cam_handler, mut req_tx, mut tm_rx) = create_handler();
|
||||
let (mut cam_handler, req_tx, tm_rx, action_reply_rx) = create_handler();
|
||||
|
||||
let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap();
|
||||
let req = ActionRequest::new(CameraActionIds::CustomParameters as u32, ActionRequestVariant::VecData(data.as_bytes().to_vec()));
|
||||
let req = ActionRequest::new(
|
||||
CameraActionIds::CustomParameters as u32,
|
||||
ActionRequestVariant::VecData(data.as_bytes().to_vec()),
|
||||
);
|
||||
let req = CompositeRequest::Action(req);
|
||||
req_tx.send(GenericMessage::new(MessageMetadata::new(1,1), req)).unwrap();
|
||||
req_tx
|
||||
.send(GenericMessage::new(MessageMetadata::new(1, 1), req))
|
||||
.unwrap();
|
||||
|
||||
cam_handler.periodic_operation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user