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 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                        // 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, -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 = "Depth map input where X/Y encode sensor canvas topology and Z encodes quantized depth bins."]
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.01,
180                    default_firing_threshold_increment: [0.0, 0.0, 0.01],
181                    default_mp_charge_accumulation: false,
182                    cortical_type_parameters: {
183                        frame_change_handling: FrameChangeHandling,
184                    },
185                    cortical_area_properties: {
186                        0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [-140, 30, 0], channel_dimensions_default: [64, 64, 64], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 1024])
187                    }
188                },
189
190                #[doc = "Object semantic-segmentation labels where X/Y encode the source pixel and Z encodes the stable class ID. PSP magnitude encodes confidence."]
191                ObjectSegmentationInput => {
192                    friendly_name: "Object Segmentation",
193                    accepted_wrapped_io_data_type: MiscData,
194                    cortical_id_unit_reference: *b"seg",
195                    number_cortical_areas: 1,
196                    default_firing_threshold: 0.01,
197                    default_mp_charge_accumulation: false,
198                    cortical_type_parameters: {
199                        frame_change_handling: FrameChangeHandling,
200                    },
201                    allowed_frame_change_handling: [Absolute],
202                    cortical_area_properties: {
203                        0 => (IOCorticalAreaConfigurationFlag::Misc(frame_change_handling), relative_position: [-170, 0, 0], channel_dimensions_default: [32, 32, 8], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [4096, 4096, 1024])
204                    }
205                },
206
207                #[doc = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
208                SegmentedVision => {
209                    friendly_name: "Segmented Vision",
210                    accepted_wrapped_io_data_type: SegmentedImageFrame,
211                    cortical_id_unit_reference: *b"svi",
212                    number_cortical_areas: 9,
213                    default_firing_threshold: 150.0,
214                    default_mp_charge_accumulation: false,
215                    cortical_type_parameters: {
216                        frame_change_handling: FrameChangeHandling,
217                    },
218                    cortical_area_properties: {
219                        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
220                        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
221                        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
222                        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
223                        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
224                        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
225                        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
226                        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
227                        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
228                    }
229                },
230
231
232                #[doc = "Raw IMU: composite linear-vector sensor with three sub-cortical-areas (accelerometer + gyroscope + magnetometer), each a 3-axis signed percentage."]
233                RawIMU => {
234                    friendly_name: "Raw IMU",
235                    accepted_wrapped_io_data_type: RawIMU,
236                    cortical_id_unit_reference: *b"rim",
237                    number_cortical_areas: 3,
238                    cortical_type_parameters: {
239                        frame_change_handling: FrameChangeHandling,
240                        percentage_neuron_positioning: PercentageNeuronPositioning
241                    },
242                    cortical_area_properties: {
243                        // Sub-area order is contractual: 0 = accelerometer, 1 = gyroscope, 2 = magnetometer.
244                        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
245                        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
246                        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
247                    }
248                },
249
250
251
252                #[doc = "Smart IMU: orientation as a unit quaternion (w/x/y/z) in a single 4-axis signed-percentage sub-area."]
253                SmartIMU => {
254                    friendly_name: "Smart IMU",
255                    accepted_wrapped_io_data_type: SignedPercentage_4D,
256                    cortical_id_unit_reference: *b"sim",
257                    number_cortical_areas: 1,
258                    cortical_type_parameters: {
259                        frame_change_handling: FrameChangeHandling,
260                        percentage_neuron_positioning: PercentageNeuronPositioning
261                    },
262                    cortical_area_properties: {
263                        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])
264                    }
265                },
266
267                #[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."]
268                CartesianPosition => {
269                    friendly_name: "Cartesian Position Sensor",
270                    accepted_wrapped_io_data_type: Percentage_3D,
271                    cortical_id_unit_reference: *b"cpo",
272                    number_cortical_areas: 1,
273                    cortical_type_parameters: {
274                        frame_change_handling: FrameChangeHandling,
275                        percentage_neuron_positioning: PercentageNeuronPositioning
276                    },
277                    allowed_frame_change_handling: [Absolute],
278                    cortical_area_properties: {
279                        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])
280                    }
281                },
282
283            }
284        }
285    };
286}