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 position sensor for monitoring actuator position."]
68                Servo => {
69                    friendly_name: "Servo Sensor",
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: [8, 8, 1], channel_dimensions_min: [1, 1, 1], channel_dimensions_max: [1024, 1024, 1])
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: [30, 10, -20], 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: [55, 0, -10], 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: [100, 0, -20], 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                    cortical_type_parameters: {
162                        frame_change_handling: FrameChangeHandling,
163                    },
164                    cortical_area_properties: {
165                        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])
166                    }
167                },
168
169
170
171                #[doc = "Segmented vision processing, with a higher resolution center and lower resolution peripherals"]
172                SegmentedVision => {
173                    friendly_name: "Segmented Vision",
174                    accepted_wrapped_io_data_type: SegmentedImageFrame,
175                    cortical_id_unit_reference: *b"svi",
176                    number_cortical_areas: 9,
177                    cortical_type_parameters: {
178                        frame_change_handling: FrameChangeHandling,
179                    },
180                    cortical_area_properties: {
181                        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
182                        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
183                        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
184                        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
185                        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
186                        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
187                        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
188                        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
189                        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
190                    }
191                },
192
193
194                #[doc = "Accelerometer, allows for relative tracking of position and motion"]
195                Accelerometer => {
196                    friendly_name: "Accelerometer",
197                    accepted_wrapped_io_data_type: Percentage_3D,
198                    cortical_id_unit_reference: *b"acc",
199                    number_cortical_areas: 1,
200                    cortical_type_parameters: {
201                        frame_change_handling: FrameChangeHandling,
202                        percentage_neuron_positioning: PercentageNeuronPositioning
203                    },
204                    cortical_area_properties: {
205                        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])
206                    }
207                },
208
209
210
211                #[doc = "Gyroscope (Quaternion), Allows for tracking rotation without gimbal lock"]
212                Gyroscope => {
213                    friendly_name: "Gyroscope",
214                    accepted_wrapped_io_data_type: SignedPercentage_4D,
215                    cortical_id_unit_reference: *b"gyq",
216                    number_cortical_areas: 1,
217                    cortical_type_parameters: {
218                        frame_change_handling: FrameChangeHandling,
219                        percentage_neuron_positioning: PercentageNeuronPositioning
220                    },
221                    cortical_area_properties: {
222                        0 => (IOCorticalAreaConfigurationFlag::SignedPercentage4D(frame_change_handling, percentage_neuron_positioning), relative_position: [80, 0, -10], channel_dimensions_default: [4, 1, 10], channel_dimensions_min: [4, 1, 1], channel_dimensions_max: [4, 1, 1024])
223                    }
224                },
225
226
227
228
229            }
230        }
231    };
232}