1#[macro_export]
2macro_rules! sensor_cortical_units {
3 ($callback:ident) => {
4 $callback! {
5 SensoryCorticalUnit {
6
7 #[doc = "Infrared distance sensor for object detection."]
8 Infrared => {
9 friendly_name: "Infrared Sensor",
10 accepted_wrapped_io_data_type: Percentage, cortical_id_unit_reference: *b"inf",
12 number_cortical_areas: 1,
13 cortical_type_parameters: {
14 frame_change_handling: FrameChangeHandling,
15 percentage_neuron_positioning: PercentageNeuronPositioning
16 },
17 cortical_area_properties: {
18 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])
19 }
20 },
21
22 #[doc = "Proximity (distance) sensor for object detection."]
23 Proximity => {
24 friendly_name: "Proximity Sensor",
25 accepted_wrapped_io_data_type: Percentage,
26 cortical_id_unit_reference: *b"pro",
27 number_cortical_areas: 1,
28 cortical_type_parameters: {
29 frame_change_handling: FrameChangeHandling,
30 percentage_neuron_positioning: PercentageNeuronPositioning
31 },
32 cortical_area_properties: {
33 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])
34 }
35 },
36
37 #[doc = "Shock sensor for sensing 'pain'. Useful for training."]
38 Shock => {
39 friendly_name: "Shock sensor",
40 accepted_wrapped_io_data_type: Percentage,
41 cortical_id_unit_reference: *b"shk",
42 number_cortical_areas: 1,
43 cortical_type_parameters: {
44 frame_change_handling: FrameChangeHandling,
45 percentage_neuron_positioning: PercentageNeuronPositioning
46 },
47 cortical_area_properties: {
48 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])
49 }
50 },
51
52 #[doc = "Battery level sensor."]
53 Battery => {
54 friendly_name: "Battery Sensor",
55 accepted_wrapped_io_data_type: Percentage,
56 cortical_id_unit_reference: *b"bat",
57 number_cortical_areas: 1,
58 cortical_type_parameters: {
59 frame_change_handling: FrameChangeHandling,
60 percentage_neuron_positioning: PercentageNeuronPositioning
61 },
62 cortical_area_properties: {
63 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])
64 }
65 },
66
67 #[doc = "Servo encoder feedback for monitoring actuator position."]
68 Servo => {
69 friendly_name: "Servo Encoder",
70 accepted_wrapped_io_data_type: Percentage,
71 cortical_id_unit_reference: *b"svm",
72 number_cortical_areas: 1,
73 cortical_type_parameters: {
74 frame_change_handling: FrameChangeHandling,
75 percentage_neuron_positioning: PercentageNeuronPositioning
76 },
77 cortical_area_properties: {
78 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])
79 }
80 },
81
82 #[doc = "Analog GPIO input, such as an input from the GPIO pins on a Raspberry pi"]
83 AnalogGPIO => {
84 friendly_name: "Analog GPIO Sensor",
85 accepted_wrapped_io_data_type: Percentage,
86 cortical_id_unit_reference: *b"agp",
87 number_cortical_areas: 1,
88 cortical_type_parameters: {
89 frame_change_handling: FrameChangeHandling,
90 percentage_neuron_positioning: PercentageNeuronPositioning
91 },
92 cortical_area_properties: {
93 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])
94 }
95 },
96
97 #[doc = "Digital GPIO input, such as an input from the GPIO pins on a Raspberry pi"]
98 DigitalGPIO => {
99 friendly_name: "Digital GPIO Sensor",
100 accepted_wrapped_io_data_type: Boolean,
101 cortical_id_unit_reference: *b"dgp",
102 number_cortical_areas: 1,
103 cortical_type_parameters: {},
104 cortical_area_properties: {
105 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])
106 }
107 },
108
109 #[doc = "Miscellaneous sensor that does not fit existing templates."]
110 MiscData => {
111 friendly_name: "Miscellaneous Sensor",
112 accepted_wrapped_io_data_type: MiscData,
113 cortical_id_unit_reference: *b"mis",
114 number_cortical_areas: 1,
115 cortical_type_parameters: {
116 frame_change_handling: FrameChangeHandling,
117 },
118 cortical_area_properties: {
119 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])
120 }
121 },
122
123 #[doc = "Text input (English) - token stream encoded as absolute fractional bitplanes along Z (z=0 is MSB)."]
124 TextEnglishInput => {
125 friendly_name: "Text Input (English)",
126 accepted_wrapped_io_data_type: MiscData,
127 cortical_id_unit_reference: *b"ten",
128 number_cortical_areas: 1,
129 cortical_type_parameters: {
130 frame_change_handling: FrameChangeHandling,
131 },
132 allowed_frame_change_handling: [Absolute],
133 cortical_area_properties: {
134 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])
136 }
137 },
138
139 #[doc = "Count input - unsigned percentage encoding (linear, absolute)."]
140 CountInput => {
141 friendly_name: "Count Input",
142 accepted_wrapped_io_data_type: Percentage,
143 cortical_id_unit_reference: *b"cnt",
144 number_cortical_areas: 1,
145 cortical_type_parameters: {
146 frame_change_handling: FrameChangeHandling,
147 percentage_neuron_positioning: PercentageNeuronPositioning
148 },
149 allowed_frame_change_handling: [Absolute],
150 cortical_area_properties: {
151 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])
152 }
153 },
154
155 #[doc = "Camera vision input"]
156 Vision => {
157 friendly_name: "Simple Vision",
158 accepted_wrapped_io_data_type: ImageFrame,
159 cortical_id_unit_reference: *b"img",
160 number_cortical_areas: 1,
161 default_firing_threshold: 150.0,
162 default_mp_charge_accumulation: false,
163 cortical_type_parameters: {
164 frame_change_handling: FrameChangeHandling,
165 },
166 cortical_area_properties: {
167 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])
168 }
169 },
170
171
172
173 #[doc = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
174 SegmentedVision => {
175 friendly_name: "Segmented Vision",
176 accepted_wrapped_io_data_type: SegmentedImageFrame,
177 cortical_id_unit_reference: *b"svi",
178 number_cortical_areas: 9,
179 default_firing_threshold: 150.0,
180 default_mp_charge_accumulation: false,
181 cortical_type_parameters: {
182 frame_change_handling: FrameChangeHandling,
183 },
184 cortical_area_properties: {
185 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]) }
195 },
196
197
198 #[doc = "Raw IMU: composite linear-vector sensor with three sub-cortical-areas (accelerometer + gyroscope + magnetometer), each a 3-axis signed percentage."]
199 RawIMU => {
200 friendly_name: "Raw IMU",
201 accepted_wrapped_io_data_type: RawIMU,
202 cortical_id_unit_reference: *b"rim",
203 number_cortical_areas: 3,
204 cortical_type_parameters: {
205 frame_change_handling: FrameChangeHandling,
206 percentage_neuron_positioning: PercentageNeuronPositioning
207 },
208 cortical_area_properties: {
209 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]) }
214 },
215
216
217
218 #[doc = "Smart IMU: orientation as a unit quaternion (w/x/y/z) in a single 4-axis signed-percentage sub-area."]
219 SmartIMU => {
220 friendly_name: "Smart IMU",
221 accepted_wrapped_io_data_type: SignedPercentage_4D,
222 cortical_id_unit_reference: *b"sim",
223 number_cortical_areas: 1,
224 cortical_type_parameters: {
225 frame_change_handling: FrameChangeHandling,
226 percentage_neuron_positioning: PercentageNeuronPositioning
227 },
228 cortical_area_properties: {
229 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])
230 }
231 },
232
233
234
235
236 }
237 }
238 };
239}