use crate::{
rpc::{
Key,
functions::{RpcContext, RpcResult},
},
util::rtt::{RttChannelConfig, RttConfig, client::RttClient},
};
use postcard_rpc::header::VarHeader;
use postcard_schema::Schema;
use probe_rs::{Session, rtt};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Serialize, Deserialize, Schema)]
pub enum ScanRegion {
#[default]
Ram,
TargetDefault,
Ranges(Vec<(u64, u64)>),
Exact(u64),
}
#[derive(Serialize, Deserialize, Schema)]
pub struct CreateRttClientRequest {
pub sessid: Key<Session>,
pub scan_regions: ScanRegion,
pub config: Vec<RttChannelConfig>,
}
#[derive(Serialize, Deserialize, Schema)]
pub struct RttClientData {
pub handle: Key<RttClient>,
}
pub type CreateRttClientResponse = RpcResult<RttClientData>;
pub async fn create_rtt_client(
ctx: &mut RpcContext,
_header: VarHeader,
request: CreateRttClientRequest,
) -> CreateRttClientResponse {
let session = ctx.session(request.sessid).await;
let rtt_scan_regions = match request.scan_regions {
ScanRegion::Ram => rtt::ScanRegion::Ram,
ScanRegion::TargetDefault => session.target().rtt_scan_regions.clone(),
ScanRegion::Ranges(ranges) => {
rtt::ScanRegion::Ranges(ranges.into_iter().map(|(start, end)| start..end).collect())
}
ScanRegion::Exact(addr) => rtt::ScanRegion::Exact(addr),
};
let client = RttClient::new(
RttConfig {
enabled: true,
channels: request.config,
},
rtt_scan_regions,
session.target(),
);
Ok(RttClientData {
handle: ctx.store_object(client).await,
})
}