working on datasets, stopped by "trait upcasting coercion is experimental"

This commit is contained in:
2023-12-08 22:21:49 +01:00
parent efc752637e
commit 59f4a82da9
4 changed files with 131 additions and 6 deletions

View File

@ -9,6 +9,7 @@ mod fsrc;
use core::fmt::Write;
use core::panic::PanicInfo;
use fsrc::datasets::{DataSetIF, DatapoolOwnerIF};
use fsrc::objectmanager::SystemObjectIF;
use fsrc::*;
@ -49,9 +50,18 @@ extern "C" fn rust_main() {
sifln!("Mission done");
}
#[derive (Copy, Clone, Default)]
struct HandlerData {
x: u32,
y: f32
}
impl datasets::Reflection for HandlerData {}
struct Handler {
id: objectmanager::ObjectId,
command_queue: queues::MessageQueue,
data: datasets::OwnedDataset<HandlerData>
}
struct HandlerSender {
@ -59,8 +69,10 @@ struct HandlerSender {
other_handler: objectmanager::ObjectId,
cycle: u8,
other_handler_queue: queues::MessageQueueSender,
other_data: datasets::ReferencedDataset<HandlerData>
}
impl Handler {
fn handle_message(&self, message: queues::Message) {
match message {
@ -123,6 +135,18 @@ impl SystemObjectIF for Handler {
}
}
impl datasets::DatapoolOwnerIF for Handler {
fn get_set(&self, type_id: datasets::TypeId) -> Option<&dyn datasets::DataSetIF>{
if type_id == self.data.get_type_id(){
Some(&self.data)
} else {
None
}
}
}
impl DatapoolOwnerIF for HandlerSender {}
impl SystemObjectIF for HandlerSender {
fn get_command_queue(&self) -> crate::fsrc::queues::MessageQueueSender {
queues::MessageQueueSender::new()
@ -131,11 +155,14 @@ impl SystemObjectIF for HandlerSender {
self.id
}
fn initialize(&mut self, object_manager: &dyn objectmanager::ObjectManager) -> Result<(), ()> {
let other_handler = object_manager.get_object(self.other_handler);
match other_handler {
Ok(other) => self.other_handler_queue = other.get_command_queue(),
let other_handler_maybe = object_manager.get_object(self.other_handler);
let other_handler =
match other_handler_maybe {
Ok(other) => other,
Err(_) => return Err(()),
}
};
self.other_handler_queue = other_handler.get_command_queue();
//TODO self.other_data.initialize(other_handler); // oh come on :/
Ok(())
}
}
@ -146,12 +173,14 @@ fn mission() {
let mut h1 = Handler {
id: 1,
command_queue: queues::MessageQueue::new(5),
data: datasets::OwnedDataset::new()
};
let mut h2 = HandlerSender {
id: 2,
other_handler: 3,
cycle: 0,
other_handler_queue: queues::MessageQueueSender::new(),
other_data: datasets::ReferencedDataset::new()
};
let array: &mut [&mut dyn objectmanager::SystemObjectIF] = &mut [&mut h1];