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, 20], 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 input that does not fit existing templates."]
110 MiscData => {
111 friendly_name: "Miscellaneous Input",
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, 1024])
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, -100], 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: [128, 128, 3], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 3])
168 }
169 },
170
171
172
173 #[doc = "Depth map input. One Z layer: X/Y encode sensor canvas topology and the potential is normalized depth in (0, 1]. Zero means no return."]
174 DepthMap => {
175 friendly_name: "Depth Map",
176 accepted_wrapped_io_data_type: MiscData,
177 cortical_id_unit_reference: *b"dpt",
178 number_cortical_areas: 1,
179 default_firing_threshold: 0.0001,
180 default_mp_charge_accumulation: false,
181 cortical_type_parameters: {
182 frame_change_handling: FrameChangeHandling,
183 },
184 cortical_area_properties: {
185 0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [-140, 30, 0], channel_dimensions_default: [64, 64, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 1])
186 }
187 },
188
189 #[doc = "Object semantic-segmentation labels. One Z layer: X/Y encode the source pixel and the potential is (class_id + 1) / class_count. Zero means unlabeled."]
190 ObjectSegmentationInput => {
191 friendly_name: "Object Segmentation",
192 accepted_wrapped_io_data_type: MiscData,
193 cortical_id_unit_reference: *b"seg",
194 number_cortical_areas: 1,
195 default_firing_threshold: 0.0001,
196 default_mp_charge_accumulation: false,
197 cortical_type_parameters: {
198 frame_change_handling: FrameChangeHandling,
199 },
200 allowed_frame_change_handling: [Absolute],
201 cortical_area_properties: {
202 0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [-170, 0, 0], channel_dimensions_default: [32, 32, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 1])
203 }
204 },
205
206 #[doc = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
207 SegmentedVision => {
208 friendly_name: "Segmented Vision",
209 accepted_wrapped_io_data_type: SegmentedImageFrame,
210 cortical_id_unit_reference: *b"svi",
211 number_cortical_areas: 9,
212 default_firing_threshold: 150.0,
213 default_mp_charge_accumulation: false,
214 cortical_type_parameters: {
215 frame_change_handling: FrameChangeHandling,
216 },
217 cortical_area_properties: {
218 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]) }
228 },
229
230
231 #[doc = "Raw IMU: composite linear-vector sensor with three sub-cortical-areas (accelerometer + gyroscope + magnetometer), each a 3-axis signed percentage."]
232 RawIMU => {
233 friendly_name: "Raw IMU",
234 accepted_wrapped_io_data_type: RawIMU,
235 cortical_id_unit_reference: *b"rim",
236 number_cortical_areas: 3,
237 cortical_type_parameters: {
238 frame_change_handling: FrameChangeHandling,
239 percentage_neuron_positioning: PercentageNeuronPositioning
240 },
241 cortical_area_properties: {
242 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]) }
247 },
248
249
250
251 #[doc = "Smart IMU: orientation as a unit quaternion (w/x/y/z) in a single 4-axis signed-percentage sub-area."]
252 SmartIMU => {
253 friendly_name: "Smart IMU",
254 accepted_wrapped_io_data_type: SignedPercentage_4D,
255 cortical_id_unit_reference: *b"sim",
256 number_cortical_areas: 1,
257 cortical_type_parameters: {
258 frame_change_handling: FrameChangeHandling,
259 percentage_neuron_positioning: PercentageNeuronPositioning
260 },
261 cortical_area_properties: {
262 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])
263 }
264 },
265
266 #[doc = "Cartesian position sensor: an absolute 3D position (x/y/z), each axis normalized to an unsigned percentage [0, 1] over a controller-defined workspace. Sensor-side counterpart of the SpatialPointer OPU's Absolute mode."]
267 CartesianPosition => {
268 friendly_name: "Cartesian Position Sensor",
269 accepted_wrapped_io_data_type: Percentage_3D,
270 cortical_id_unit_reference: *b"cpo",
271 number_cortical_areas: 1,
272 cortical_type_parameters: {
273 frame_change_handling: FrameChangeHandling,
274 percentage_neuron_positioning: PercentageNeuronPositioning
275 },
276 allowed_frame_change_handling: [Absolute],
277 cortical_area_properties: {
278 0 => (IOCorticalAreaConfigurationFlag::Percentage3D(frame_change_handling, percentage_neuron_positioning), relative_position: [115, 0, -10], channel_dimensions_default: [3, 1, 100], channel_dimensions_min: [3, 1, 1], channel_dimensions_max: [3, 1, 1024])
279 }
280 },
281
282 #[doc = "Audio spectrum input. X is the frequency column, Y is the quantized phase step, and membrane potential is the column magnitude on the registered decibel scale. Stereo uses a second unit index."]
283 AudioInput => {
284 friendly_name: "Audio Input",
285 accepted_wrapped_io_data_type: AudioSpectrumFrame,
286 cortical_id_unit_reference: *b"aud",
287 number_cortical_areas: 1,
288 default_firing_threshold: 0.01,
289 default_mp_charge_accumulation: false,
290 cortical_type_parameters: {
291 frame_change_handling: FrameChangeHandling,
292 },
293 allowed_frame_change_handling: [Absolute],
294 cortical_area_properties: {
295 0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [-100, -60, 0], channel_dimensions_default: [513, 16, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4097, 256, 1])
297 }
298 },
299
300 }
301 }
302 };
303}