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, 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 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]), 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]), 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]), 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]), 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]), 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]), 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]), 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]), 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]) }
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}