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 = "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]), // Lower Left
186                        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
187                        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
188                        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
189                        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
190                        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
191                        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
192                        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
193                        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
194                    }
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                        // Sub-area order is contractual: 0 = accelerometer, 1 = gyroscope, 2 = magnetometer.
210                        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
211                        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
212                        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
213                    }
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}