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, 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                        // 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 = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
191                SegmentedVision => {
192                    friendly_name: "Segmented Vision",
193                    accepted_wrapped_io_data_type: SegmentedImageFrame,
194                    cortical_id_unit_reference: *b"svi",
195                    number_cortical_areas: 9,
196                    default_firing_threshold: 150.0,
197                    default_mp_charge_accumulation: false,
198                    cortical_type_parameters: {
199                        frame_change_handling: FrameChangeHandling,
200                    },
201                    cortical_area_properties: {
202                        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
203                        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
204                        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
205                        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
206                        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
207                        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
208                        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
209                        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
210                        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
211                    }
212                },
213
214
215                #[doc = "Raw IMU: composite linear-vector sensor with three sub-cortical-areas (accelerometer + gyroscope + magnetometer), each a 3-axis signed percentage."]
216                RawIMU => {
217                    friendly_name: "Raw IMU",
218                    accepted_wrapped_io_data_type: RawIMU,
219                    cortical_id_unit_reference: *b"rim",
220                    number_cortical_areas: 3,
221                    cortical_type_parameters: {
222                        frame_change_handling: FrameChangeHandling,
223                        percentage_neuron_positioning: PercentageNeuronPositioning
224                    },
225                    cortical_area_properties: {
226                        // Sub-area order is contractual: 0 = accelerometer, 1 = gyroscope, 2 = magnetometer.
227                        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
228                        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
229                        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
230                    }
231                },
232
233
234
235                #[doc = "Smart IMU: orientation as a unit quaternion (w/x/y/z) in a single 4-axis signed-percentage sub-area."]
236                SmartIMU => {
237                    friendly_name: "Smart IMU",
238                    accepted_wrapped_io_data_type: SignedPercentage_4D,
239                    cortical_id_unit_reference: *b"sim",
240                    number_cortical_areas: 1,
241                    cortical_type_parameters: {
242                        frame_change_handling: FrameChangeHandling,
243                        percentage_neuron_positioning: PercentageNeuronPositioning
244                    },
245                    cortical_area_properties: {
246                        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])
247                    }
248                },
249
250
251
252
253            }
254        }
255    };
256}