Skip to content

Commit

Permalink
Fixed a tuple generation bug
Browse files Browse the repository at this point in the history
  • Loading branch information
gbin committed May 22, 2024
1 parent 57ee763 commit 0a3d1a1
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 25 deletions.
3 changes: 2 additions & 1 deletion copper_derive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
55 changes: 31 additions & 24 deletions copper_derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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
Expand All @@ -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<CopperList, 10>
}
copper_lists: CircularQueue<CopperList, U1>
};

let name = &item_struct.ident;

Expand All @@ -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
Expand All @@ -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;
Expand All @@ -123,19 +135,20 @@ pub fn copper_runtime(args: TokenStream, input: TokenStream) -> TokenStream {
let all_instances_configs: Vec<Option<&NodeInstanceConfig>> = 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
Expand All @@ -161,10 +174,7 @@ fn extract_tasks_types(copper_config: &CopperConfig) -> (Vec<String>, Vec<Type>)
// Transform them as Rust types
let all_types: Vec<Type> = 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)
}
Expand All @@ -184,10 +194,7 @@ fn extract_msgs_types(copper_config: &CopperConfig) -> (Vec<String>, Vec<Type>)
// Transform them as Rust types
let all_types: Vec<Type> = 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)
}
9 changes: 9 additions & 0 deletions examples/v4lsrc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 0a3d1a1

Please sign in to comment.