Skip to main content

feagi_structures/templates/
sensor_cortical_units.rs

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, // This property determines what type of registration funciton will be generated
11                    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                        // 1x1x16 default: one token per FEAGI tick, encoded into 16 bitplanes (supports GPT-2 vocab via token_id+1 offset).
135                        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]), // Lower Left
219                        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]), // Lower Middle
220                        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]), // Lower Right
221                        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]), // Middle Left
222                        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]), // Middle Middle
223                        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]), // Middle Right
224                        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]), // Upper Left
225                        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]), // Upper Middle
226                        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]) // Upper Right
227                    }
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                        // Sub-area order is contractual: 0 = accelerometer, 1 = gyroscope, 2 = magnetometer.
243                        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]), // Accelerometer
244                        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]), // Gyroscope
245                        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])  // Magnetometer
246                    }
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                        // 513x16x1 default: linear 1024-sample window with 16 phase steps.
296                        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}