1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
//! ## SDR Runtime
use futures::channel::mpsc;
use futures::channel::oneshot;
use std::result;
use thiserror::Error;
mod block;
mod block_meta;
pub mod buffer;
pub mod config;
#[cfg(not(target_arch = "wasm32"))]
mod ctrl_port;
#[cfg(target_arch = "wasm32")]
#[path = "ctrl_port_wasm.rs"]
mod ctrl_port;
use crate::runtime::ctrl_port::ControlPort;
#[cfg(all(not(target_arch = "wasm32"), not(target_os = "android")))]
mod logging;
#[cfg(target_os = "android")]
#[path = "logging_android.rs"]
mod logging;
#[cfg(target_arch = "wasm32")]
#[path = "logging_wasm.rs"]
mod logging;
mod flowgraph;
pub mod message_io;
mod mocker;
#[allow(clippy::module_inception)]
mod runtime;
pub mod scheduler;
pub mod stream_io;
mod tag;
mod topology;
pub use block::Block;
pub use block::Kernel;
pub use block::TypedBlock;
pub use block::WorkIo;
pub use block_meta::BlockMeta;
pub use block_meta::BlockMetaBuilder;
pub use flowgraph::Flowgraph;
pub use flowgraph::FlowgraphHandle;
pub use message_io::MessageInput;
pub use message_io::MessageIo;
pub use message_io::MessageIoBuilder;
pub use message_io::MessageOutput;
pub use mocker::Mocker;
pub use runtime::Runtime;
pub use runtime::RuntimeHandle;
pub use stream_io::StreamInput;
pub use stream_io::StreamIo;
pub use stream_io::StreamIoBuilder;
pub use stream_io::StreamOutput;
pub use tag::ItemTag;
pub use tag::Tag;
pub use topology::Topology;
pub use futuresdr_types::BlockDescription;
pub use futuresdr_types::FlowgraphDescription;
pub use futuresdr_types::Pmt;
pub use futuresdr_types::PortId;
use buffer::BufferReader;
use buffer::BufferWriter;
/// Initialize runtime
///
/// This function does not have to be called. Once a [`Runtime`] is started,
/// this function is called automatically.
///
/// At the moment, this only enables logging. Calling it manually, allows using
/// FutureSDR logging before a [`Runtime`] is started.
///
pub fn init() {
logging::init();
}
/// Flowgraph inbox message type
#[derive(Debug)]
pub enum FlowgraphMessage {
/// Terminate
Terminate,
/// Initialize
Initialized,
/// Block is done
BlockDone {
/// Block Id
block_id: usize,
/// Block
block: Block,
},
/// Block encountered an error
BlockError {
/// BlockId
block_id: usize,
/// Block
block: Block,
},
/// Call handler of block (ignoring result)
BlockCall {
/// Block Id
block_id: usize,
/// Message handler Id
port_id: PortId,
/// Input data
data: Pmt,
/// Back channel for result
tx: oneshot::Sender<result::Result<(), Error>>,
},
/// Call handler of block
BlockCallback {
/// Block Id
block_id: usize,
/// Message handler Id
port_id: PortId,
/// Input data
data: Pmt,
/// Back channel for result
tx: oneshot::Sender<result::Result<Pmt, Error>>,
},
/// Get [`FlowgraphDescription`]
FlowgraphDescription {
/// Back channel for result
tx: oneshot::Sender<FlowgraphDescription>,
},
/// Get [`BlockDescription`]
BlockDescription {
/// Block Id
block_id: usize,
/// Back channel for result
tx: oneshot::Sender<result::Result<BlockDescription, Error>>,
},
}
/// Block inbox message type
#[derive(Debug)]
pub enum BlockMessage {
/// Initialize
Initialize,
/// Terminate
Terminate,
/// Notify
Notify,
/// Get [`BlockDescription`]
BlockDescription {
/// Channel for return value
tx: oneshot::Sender<BlockDescription>,
},
/// Initialize [`StreamOutput`]
StreamOutputInit {
/// Stream output ID
src_port: usize,
/// [`BufferWriter`]
writer: BufferWriter,
},
/// Initialize [`StreamInput`]
StreamInputInit {
/// Stream input Id
dst_port: usize,
/// [`BufferReader`]
reader: BufferReader,
},
/// Stream input port is done
StreamInputDone {
/// Stream input Id
input_id: usize,
},
/// Stream output port is done
StreamOutputDone {
/// Stream output Id
output_id: usize,
},
/// Connect message output
MessageOutputConnect {
/// Message output port Id
src_port: usize,
/// Destination input port Id
dst_port: usize,
/// Destination block inbox
dst_inbox: mpsc::Sender<BlockMessage>,
},
/// Call handler (return value is ignored)
Call {
/// Message handler Id
port_id: PortId,
/// [`Pmt`] input data
data: Pmt,
},
/// Call handler
Callback {
/// Message handler Id
port_id: PortId,
/// [`Pmt`] input data
data: Pmt,
/// Back channel for handler result
tx: oneshot::Sender<result::Result<Pmt, Error>>,
},
}
/// FutureSDR Error
#[derive(Error, Debug, Clone)]
#[non_exhaustive]
pub enum Error {
/// Block does not exist
#[error("Block does not exist")]
InvalidBlock,
/// Flowgraph does not exist or terminated
#[error("Flowgraph terminated")]
FlowgraphTerminated,
/// Handler does not exist
#[error("Handler does not exist (Id {0:?})")]
InvalidHandler(PortId),
/// Error in Handler
#[error("Error in handler")]
HandlerError,
/// Block is already terminated
#[error("Block already terminated")]
BlockTerminated,
/// Runtime error
#[error("Error in runtime")]
RuntimeError,
}