diff --git a/copper_derive/Cargo.toml b/copper_derive/Cargo.toml index 302da25c0..84acbbc34 100644 --- a/copper_derive/Cargo.toml +++ b/copper_derive/Cargo.toml @@ -7,11 +7,12 @@ edition = "2021" proc-macro = true [dependencies] -syn = { version = "2.0.63", features = ["full"]} +syn = { version = "2.0.63", features = ["full"] } quote = "1.0.36" proc-macro2 = { version = "1.0.82" } walkdir = "2.5.0" syntect = "5.2.0" +backtrace = "0.3.71" copper = { path = "../copper" } [build-dependencies] diff --git a/copper_derive/src/lib.rs b/copper_derive/src/lib.rs index 08a894554..7a4d72eff 100644 --- a/copper_derive/src/lib.rs +++ b/copper_derive/src/lib.rs @@ -2,10 +2,13 @@ extern crate proc_macro; use proc_macro::TokenStream; -use quote::quote; -use syn::{Field, ItemStruct, LitStr, parse_macro_input, parse_quote, parse_str, Type, TypeTuple}; -use syn::Fields::{Named, Unit, Unnamed}; +use backtrace::Backtrace; +use std::panic; + +use quote::{quote, ToTokens}; use syn::meta::parser; +use syn::Fields::{Named, Unit, Unnamed}; +use syn::{parse_macro_input, parse_quote, parse_str, Field, ItemStruct, LitStr, Type, TypeTuple}; use copper::config::CopperConfig; use format::{highlight_rust_code, rustfmt_generated_code}; @@ -42,8 +45,9 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream { let (all_tasks_types_names, all_tasks_types) = extract_tasks_types(&copper_config); // Build the tuple of all those types + // note the extraneous , at the end is to make the tuple work even if this is only one element let task_types_tuple: TypeTuple = parse_quote! { - (#(#all_tasks_types),*) + (#(#all_tasks_types),*,) }; // add that to a new field @@ -53,14 +57,11 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream { let (all_msgs_types_names, all_msgs_types) = extract_msgs_types(&copper_config); - // Build the tuple of all those types - let msgs_types_tuple: TypeTuple = parse_quote! { - (#(#all_msgs_types),*) - }; + let msgs_types_tuple: TypeTuple = parse_quote! { (#(#all_msgs_types),*,)}; let copper_lists_field: Field = parse_quote! { - copper_lists: CircularQueue - } + copper_lists: CircularQueue + }; let name = &item_struct.ident; @@ -71,7 +72,7 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream { } Unnamed(fields_unnamed) => { fields_unnamed.unnamed.push(task_instances_field); - fields_unnamed.unnamed.push(copper_lists_field); + // fields_unnamed.unnamed.push(copper_lists_field); } Unit => { // Handle unit structs if necessary @@ -95,10 +96,21 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream { }) .collect(); + // Generate the code to create instances of the messages + let msg_instances_init_code: Vec<_> = all_msgs_types + .iter() + .map(|ty| { + quote! { + #ty::default() + } + }) + .collect(); + // Convert the modified struct back into a TokenStream let result = quote! { use std::fs::read_to_string; use copper::common::CircularQueue; + use copper::common::U1; use copper::config::Node; use copper::config::CopperConfig; use copper::config::NodeInstanceConfig; @@ -123,19 +135,20 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream { let all_instances_configs: Vec> = copper_config.get_all_nodes().iter().map(|node_config| node_config.get_instance_config()).collect(); let task_instances = ( - #(#task_instances_init_code),* + #(#task_instances_init_code),*, ); Ok(#name { task_instances, + copper_lists: Box::new(CircularQueue::new()), }) } - pub fn hello(&self) { - println!("Hello from CopperRuntime"); - } + //fn create_new_copper_list() -> CopperList { + // (#(#msg_instances_init_code),*,) + //} + } }; - let tokens: TokenStream = result.into(); // Print and format the generated code using rustfmt @@ -161,10 +174,7 @@ fn extract_tasks_types(copper_config: &CopperConfig) -> (Vec, Vec) // Transform them as Rust types let all_types: Vec = all_types_names .iter() - .map(|name| { - println!("Found type: {}", name); - parse_str(name).unwrap() - }) + .map(|name| parse_str(name).unwrap()) .collect(); (all_types_names, all_types) } @@ -184,10 +194,7 @@ fn extract_msgs_types(copper_config: &CopperConfig) -> (Vec, Vec) // Transform them as Rust types let all_types: Vec = all_types_names .iter() - .map(|name| { - println!("Found type: {}", name); - parse_str(name).unwrap() - }) + .map(|name| parse_str(name).unwrap()) .collect(); (all_types_names, all_types) } diff --git a/examples/v4lsrc/src/lib.rs b/examples/v4lsrc/src/lib.rs index b5357b402..23a9b9513 100644 --- a/examples/v4lsrc/src/lib.rs +++ b/examples/v4lsrc/src/lib.rs @@ -21,6 +21,15 @@ impl Default for ImageMsg { } } +impl PartialEq for ImageMsg { + fn eq(&self, other: &Self) -> bool { + self.buffer + .iter() + .flatten() + .eq(other.buffer.iter().flatten()) + } +} + impl ImageMsg { fn copy_from(&mut self, buff_src: &[u8]) { let mut x = 0usize;