#[macro_export]
macro_rules! sensor_cortical_units {
($callback:ident) => {
$callback! {
SensoryCorticalUnit {
#[doc = "Infrared distance sensor for object detection."]
Infrared => {
friendly_name: "Infrared Sensor",
accepted_wrapped_io_data_type: Percentage, cortical_id_unit_reference: *b"inf",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [10, 0, -20], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Proximity (distance) sensor for object detection."]
Proximity => {
friendly_name: "Proximity Sensor",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"pro",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [20, 0, -20], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Shock sensor for sensing 'pain'. Useful for training."]
Shock => {
friendly_name: "Shock sensor",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"shk",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [30, 0, -20], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Battery level sensor."]
Battery => {
friendly_name: "Battery Sensor",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"bat",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [40, 0, -20], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Servo encoder feedback for monitoring actuator position."]
Servo => {
friendly_name: "Servo Encoder",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"svm",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [25, 0, -10], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Analog GPIO input, such as an input from the GPIO pins on a Raspberry pi"]
AnalogGPIO => {
friendly_name: "Analog GPIO Sensor",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"agp",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [60, 0, -10], channel_dimensions_default: [8, 8, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1024, 1024, 1])
}
},
#[doc = "Digital GPIO input, such as an input from the GPIO pins on a Raspberry pi"]
DigitalGPIO => {
friendly_name: "Digital GPIO Sensor",
accepted_wrapped_io_data_type: Boolean,
cortical_id_unit_reference: *b"dgp",
number_cortical_areas: 1,
cortical_type_parameters: {},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Boolean, relative_position: [70, 0, -10], channel_dimensions_default: [1, 1, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1])
}
},
#[doc = "Miscellaneous sensor that does not fit existing templates."]
MiscData => {
friendly_name: "Miscellaneous Sensor",
accepted_wrapped_io_data_type: MiscData,
cortical_id_unit_reference: *b"mis",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [220, 0, -30], channel_dimensions_default: [8, 8, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1024, 1024, 1])
}
},
#[doc = "Text input (English) - token stream encoded as absolute fractional bitplanes along Z (z=0 is MSB)."]
TextEnglishInput => {
friendly_name: "Text Input (English)",
accepted_wrapped_io_data_type: MiscData,
cortical_id_unit_reference: *b"ten",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
},
allowed_frame_change_handling: [Absolute],
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [70, 0, -30], channel_dimensions_default: [1, 1, 16], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 32])
}
},
#[doc = "Count input - unsigned percentage encoding (linear, absolute)."]
CountInput => {
friendly_name: "Count Input",
accepted_wrapped_io_data_type: Percentage,
cortical_id_unit_reference: *b"cnt",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
allowed_frame_change_handling: [Absolute],
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::Percentage(frame_change_handling, percentage_neuron_positioning), relative_position: [110, 0, -30], channel_dimensions_default: [1, 1, 10], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1, 1, 1024])
}
},
#[doc = "Camera vision input"]
Vision => {
friendly_name: "Simple Vision",
accepted_wrapped_io_data_type: ImageFrame,
cortical_id_unit_reference: *b"img",
number_cortical_areas: 1,
default_firing_threshold: 150.0,
default_mp_charge_accumulation: false,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [-100, 30, 0], channel_dimensions_default: [64, 64, 3], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3])
}
},
#[doc = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
SegmentedVision => {
friendly_name: "Segmented Vision",
accepted_wrapped_io_data_type: SegmentedImageFrame,
cortical_id_unit_reference: *b"svi",
number_cortical_areas: 9,
default_firing_threshold: 150.0,
default_mp_charge_accumulation: false,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [-70, -70, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 1 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [60, -70, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 2 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [150, -70, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 3 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [-70, 60, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 4 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [0, 0, 0], channel_dimensions_default: [128, 128, 3], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 5 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [150, 60, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 6 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [-70, 150, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 7 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [60, 150, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]), 8 => (IOCorticalAreaConfigurationFlag::CartesianPlane(frame_change_handling), relative_position: [150, 150, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3]) }
},
#[doc = "Raw IMU: composite linear-vector sensor with three sub-cortical-areas (accelerometer + gyroscope + magnetometer), each a 3-axis signed percentage."]
RawIMU => {
friendly_name: "Raw IMU",
accepted_wrapped_io_data_type: RawIMU,
cortical_id_unit_reference: *b"rim",
number_cortical_areas: 3,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::SignedPercentage3D(frame_change_handling, percentage_neuron_positioning), relative_position: [70, 0, -10], channel_dimensions_default: [3, 1, 10], channel_dimensions_min: [3, 1, 1], channel_dimensions_max: [3, 1, 1024]), 1 => (IOCorticalAreaConfigurationFlag::SignedPercentage3D(frame_change_handling, percentage_neuron_positioning), relative_position: [80, 0, -10], channel_dimensions_default: [3, 1, 10], channel_dimensions_min: [3, 1, 1], channel_dimensions_max: [3, 1, 1024]), 2 => (IOCorticalAreaConfigurationFlag::SignedPercentage3D(frame_change_handling, percentage_neuron_positioning), relative_position: [90, 0, -10], channel_dimensions_default: [3, 1, 10], channel_dimensions_min: [3, 1, 1], channel_dimensions_max: [3, 1, 1024]) }
},
#[doc = "Smart IMU: orientation as a unit quaternion (w/x/y/z) in a single 4-axis signed-percentage sub-area."]
SmartIMU => {
friendly_name: "Smart IMU",
accepted_wrapped_io_data_type: SignedPercentage_4D,
cortical_id_unit_reference: *b"sim",
number_cortical_areas: 1,
cortical_type_parameters: {
frame_change_handling: FrameChangeHandling,
percentage_neuron_positioning: PercentageNeuronPositioning
},
cortical_area_properties: {
0 => (IOCorticalAreaConfigurationFlag::SignedPercentage4D(frame_change_handling, percentage_neuron_positioning), relative_position: [100, 0, -10], channel_dimensions_default: [4, 1, 10], channel_dimensions_min: [4, 1, 1], channel_dimensions_max: [4, 1, 1024])
}
},
}
}
};
}