Mercurial > public > ostc4
annotate Common/Inc/data_exchange.h @ 1078:082825daccb5 Icon_Integration tip
Added control views for HUD:
The HUD implementation may now be activated by the compile switch ENABLE_HUD_SUPPORT. The HUD will become visible onces detected in the CvOpt overview menu. The first implementation is for testing only => The LEDs may be operated by a number field. Positiv values activate the red, negativ the green LEDs. Depending on the value blink sequences will be scheduled.
At the moment no dive specific data is mapped to the LED operation (like e.g. warnings).
| author | Ideenmodellierer |
|---|---|
| date | Mon, 02 Mar 2026 17:30:38 +0100 |
| parents | 4499227a2db8 |
| children |
| rev | line source |
|---|---|
| 38 | 1 /////////////////////////////////////////////////////////////////////////////// |
| 2 /// -*- coding: UTF-8 -*- | |
| 3 /// | |
| 4 /// \file Common/Inc/data_exchange.h | |
| 5 /// \brief Data exchange between RTE and Discovery processors. | |
| 6 /// \author Heinrichs Weikamp | |
| 7 /// \date 2018 | |
| 8 /// | |
| 9 /// $Id$ | |
| 10 /////////////////////////////////////////////////////////////////////////////// | |
| 11 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
| 12 /// | |
| 13 /// This program is free software: you can redistribute it and/or modify | |
| 14 /// it under the terms of the GNU General Public License as published by | |
| 15 /// the Free Software Foundation, either version 3 of the License, or | |
| 16 /// (at your option) any later version. | |
| 17 /// | |
| 18 /// This program is distributed in the hope that it will be useful, | |
| 19 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 20 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 21 /// GNU General Public License for more details. | |
| 22 /// | |
| 23 /// You should have received a copy of the GNU General Public License | |
| 24 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 25 ////////////////////////////////////////////////////////////////////////////// | |
| 26 | |
| 27 #ifndef DATA_EXCHANGE_H | |
| 28 #define DATA_EXCHANGE_H | |
| 29 | |
| 30 #include "data_central.h" | |
| 31 #include "settings.h" | |
| 32 #include "stm32f4xx_hal.h" | |
| 33 | |
| 691 | 34 /* Command definitions for control of external interface */ |
| 35 /* 1st nibble binary on/off states */ | |
|
957
3420e3ba698d
External sensor commands: Add sensor ID to command:
Ideenmodellierer
parents:
955
diff
changeset
|
36 /* 2nd nibble target sensor ID (if sensor command is active) */ |
| 1078 | 37 /* 3 + 4th nibble control channel */ |
| 691 | 38 #define EXT_INTERFACE_33V_ON (0x8000u) /* Bit set to enable 3.3V power interface */ |
| 39 #define EXT_INTERFACE_ADC_ON (0x4000u) /* Bit set to enable ADC conversion */ | |
| 951 | 40 #define EXT_INTERFACE_BUZZER_ON (0x2000u) /* Bit set to enable the buzzer */ |
|
702
6d7c812fc173
Added digital o2 sensor to settings and data exchange:
Ideenmodellierer
parents:
691
diff
changeset
|
41 |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
42 /* Command subset */ |
|
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
43 #define EXT_INTERFACE_AUTODETECT (0x0001u) /* Start auto detection of connected sensors */ |
|
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
44 #define EXT_INTERFACE_COPY_SENSORMAP (0x0002u) /* Use the sensor map provided by master for internal operations */ |
|
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
45 #define EXT_INTERFACE_CO2_CALIB (0x0010u) /* Request calibration of CO2Sensor */ |
| 1078 | 46 #define EXT_INTERFACE_O2_INDICATE (0x0020u) /* Request LED to blink */ |
| 47 #define EXT_INTERFACE_HUD_UPDATE (0x0030u) /* Update status sequence */ | |
| 48 #define EXT_INTERFACE_HUD_ABORT (0x0031u) /* Abort status sequence */ | |
|
702
6d7c812fc173
Added digital o2 sensor to settings and data exchange:
Ideenmodellierer
parents:
691
diff
changeset
|
49 |
| 691 | 50 #define DATA_BUFFER_ADC (0x01u) |
| 51 #define DATA_BUFFER_CO2 (0x02u) | |
| 662 | 52 |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
53 #define EXTIF_SENSOR_INFO_SIZE (32u) /* size of data array reserved for extended sensor data from external interface */ |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
54 |
| 756 | 55 #define CO2_WARNING_LEVEL_PPM (2000u) /* Early warning to indicate unexpected high co2 concentration (yellow) */ |
| 56 #define CO2_ALARM_LEVEL_PPM (5000u) /* starting by this level CO2 has a negative impact on health (long exposure) */ | |
| 57 | |
| 949 | 58 #define GNSS_ALIVE_STATE_ALIVE (0x01u) /* Communication to module active */ |
| 59 #define GNSS_ALIVE_STATE_TIME (0x02u) /* Time information valid */ | |
| 955 | 60 #define GNSS_ALIVE_BACKUP_POS (0x04u) /* Backup position not older than x hours */ |
| 949 | 61 |
|
1070
4499227a2db8
Added compile option for o2/diluent pressure display:
Ideenmodellierer
parents:
989
diff
changeset
|
62 #define PRESSURE_BOTTLE_CNT (0x2u) /* Number of bottle information (max 255 bar) */ |
|
4499227a2db8
Added compile option for o2/diluent pressure display:
Ideenmodellierer
parents:
989
diff
changeset
|
63 |
| 38 | 64 enum MODE |
| 65 { | |
| 66 MODE_SURFACE = 0, | |
| 67 MODE_DIVE = 1, | |
| 68 MODE_CALIB = 2, | |
| 69 MODE_SLEEP = 3, | |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
70 MODE_SHUTDOWN = 4, |
| 38 | 71 MODE_ENDDIVE = 5, |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
72 MODE_BOOT = 6, |
| 38 | 73 MODE_CHARGESTART = 7, |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
74 MODE_TEST = 8, |
| 38 | 75 MODE_POWERUP = 9, |
| 76 }; | |
| 77 | |
| 78 enum ACCIDENT_BITS | |
| 79 { | |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
80 ACCIDENT_DECOSTOP = 0x01, |
|
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
81 ACCIDENT_CNS = 0x02, |
| 38 | 82 ACCIDENT_CNSLVL2 = 0x02 + 0x04, |
| 83 ACCIDENT_SPARE2 = 0x08, | |
| 84 ACCIDENT_SPARE3 = 0x10, | |
| 85 ACCIDENT_SPARE4 = 0x20, | |
| 86 ACCIDENT_SPARE5 = 0x40, | |
| 87 ACCIDENT_SPARE6 = 0x80 | |
| 88 }; | |
| 89 | |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
90 |
| 38 | 91 typedef struct{ |
| 92 uint8_t button:1; | |
| 93 uint8_t date:1; | |
| 94 uint8_t time:1; | |
| 95 uint8_t clearDeco:1; | |
| 96 uint8_t compass:1; | |
| 97 uint8_t devicedata:1; | |
| 98 uint8_t batterygauge:1; | |
| 99 uint8_t accident:1; | |
| 100 } confirmbit8_t; | |
| 101 | |
|
555
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
102 typedef struct{ |
| 559 | 103 uint8_t checkCompass:1; |
| 104 uint8_t checkADC:1; | |
| 105 uint8_t reserve:5; | |
|
555
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
106 uint8_t extADC:1; |
|
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
107 uint8_t compass:8; |
|
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
108 } hw_Info_t; |
|
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
109 |
|
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
110 |
| 38 | 111 #define CRBUTTON (0x01) |
| 112 #define CRDATE (0x02) | |
| 113 #define CRTIME (0x04) | |
| 662 | 114 #define CRCLEARDECO (0x08) |
| 115 #define CRCOMPASS (0x10) | |
| 116 #define CRDEVICEDATA (0x20) | |
| 117 #define CRBATTERY (0x40) | |
| 118 #define CRACCIDENT (0x80) | |
| 38 | 119 |
| 120 typedef union{ | |
| 121 confirmbit8_t ub; | |
| 122 uint8_t uw; | |
| 123 } confirmbit8_Type; | |
| 124 | |
| 125 typedef struct | |
| 126 { | |
| 127 uint8_t checkCode[4]; | |
| 128 | |
| 129 } SDataExchangeHeader; | |
| 130 | |
| 131 typedef struct | |
| 132 { | |
| 133 uint8_t checkCode[4]; | |
| 134 | |
| 135 } SDataExchangeFooter; | |
| 136 | |
| 137 typedef struct | |
| 138 { | |
| 139 SDataExchangeHeader header; | |
| 140 SLifeData lifeData; | |
| 141 } SDataExchangeMasterToSlave; | |
| 142 | |
| 143 typedef struct | |
| 144 { | |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
145 int32_t temperature; |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
146 uint32_t status; |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
147 uint64_t sensorId; |
| 723 | 148 int32_t intensity; |
| 149 int32_t ambient; | |
| 150 int32_t pressure; | |
| 151 int32_t humidity; | |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
152 } SSensorDataDiveO2; |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
153 |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
154 typedef struct |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
155 { |
| 38 | 156 //pressure |
| 157 float temperature; | |
| 158 float pressure_mbar; | |
| 159 float surface_mbar; | |
| 160 float ascent_rate_meter_per_min; | |
| 161 //toxic | |
| 162 float otu; | |
| 163 float cns; | |
| 164 uint16_t desaturation_time_minutes; | |
| 165 uint16_t no_fly_time_minutes; | |
| 166 //tisssue | |
| 167 float tissue_nitrogen_bar[16]; | |
| 168 float tissue_helium_bar[16]; | |
| 169 //maxcrushingpressure | |
| 170 float max_crushing_pressure_he[16]; | |
| 171 float max_crushing_pressure_n2[16]; | |
| 172 float adjusted_critical_radius_he[16]; | |
| 173 float adjusted_critical_radius_n2[16]; | |
| 174 // Compass | |
| 175 float compass_heading; | |
| 176 float compass_roll; | |
| 177 float compass_pitch; | |
| 178 int16_t compass_DX_f; | |
| 179 int16_t compass_DY_f; | |
| 180 int16_t compass_DZ_f; | |
| 181 //time | |
| 182 uint16_t counterSecondsShallowDepth; | |
| 183 uint32_t localtime_rtc_tr; | |
| 184 uint32_t localtime_rtc_dr; | |
| 185 uint32_t divetime_seconds; | |
| 186 uint32_t surfacetime_seconds; | |
| 187 uint32_t dive_time_seconds_without_surface_time; | |
| 188 //battery /* take care of uint8_t count to be in multiplies of 4 */ | |
| 189 float battery_voltage; | |
| 190 float battery_charge; | |
| 191 //ambient light | |
| 192 uint16_t ambient_light_level; | |
|
555
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
193 uint16_t SPARE_ALIGN32; |
|
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
194 float extADC_voltage[3]; |
| 662 | 195 uint16_t CO2_ppm; |
| 196 uint16_t CO2_signalStrength; | |
| 197 uint16_t externalInterface_CmdAnswer; | |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
198 uint8_t alignmentdummy; |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
199 uint8_t externalInterface_SensorID; /* Used to identify how to read the sensor data array */ |
|
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
702
diff
changeset
|
200 uint8_t sensor_data[EXTIF_SENSOR_INFO_SIZE]; /* sensor specific data array. Content may vary from sensor type to sensor type */ |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
201 uint8_t sensor_map[EXT_INTERFACE_SENSOR_CNT]; |
|
1070
4499227a2db8
Added compile option for o2/diluent pressure display:
Ideenmodellierer
parents:
989
diff
changeset
|
202 uint8_t pressure_bottle[PRESSURE_BOTTLE_CNT]; |
|
4499227a2db8
Added compile option for o2/diluent pressure display:
Ideenmodellierer
parents:
989
diff
changeset
|
203 uint8_t SPARE_OldWireless[3]; /* 64 - 12 for extADC - 6 for CO2 - 34 for sensor (+dummmy) - sensor map - pressure*/ |
| 38 | 204 // PIC data |
|
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
756
diff
changeset
|
205 uint8_t button_setting[4]; /* see dependency to SlaveData->buttonPICdata */ |
| 38 | 206 uint8_t SPARE1; |
| 207 //debug | |
| 208 uint32_t pressure_uTick; | |
| 209 uint32_t compass_uTick; | |
| 931 | 210 SGnssInfo gnssInfo; |
| 38 | 211 |
| 212 } SExchangeData; | |
| 213 | |
| 214 typedef struct | |
| 215 { | |
| 216 uint8_t VPMconservatism; | |
| 217 SGas actualGas; | |
| 218 | |
| 219 int8_t offsetPressureSensor_mbar; | |
| 220 int8_t offsetTemperatureSensor_centiDegree; | |
| 221 | |
| 662 | 222 uint16_t externalInterface_Cmd; |
| 38 | 223 |
|
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
224 uint8_t externalInterface_SensorMap[EXT_INTERFACE_SENSOR_CNT]; |
|
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
723
diff
changeset
|
225 |
| 1078 | 226 uint8_t externalInterface_HUD_Update[EXT_INTERFACE_HUD_LED_MAX]; |
| 227 uint8_t externalInterface_HUD_Brightness; | |
| 228 uint8_t UNUSED0[3]; | |
| 229 float UNUSED1[16-6];//VPM_adjusted_critical_radius_he[16]; => Reuse HUD_Update | |
| 38 | 230 float UNUSED2[16];//VPM_adjusted_critical_radius_n2[16]; |
| 231 float UNUSED3[16];//VPM_adjusted_crushing_pressure_he[16]; | |
| 232 float UNUSED4[16];//VPM_adjusted_crushing_pressure_n2[16]; | |
| 233 float UNUSED5[16];//VPM_initial_allowable_gradient_he[16]; | |
| 234 float UNUSED6[16];//VPM_initial_allowable_gradient_n2[16]; | |
| 235 float UNUSED7[16];//VPM_max_actual_gradient[16]; | |
| 236 | |
| 237 RTC_TimeTypeDef newTime; | |
| 238 RTC_DateTypeDef newDate; | |
| 239 | |
| 240 float ambient_pressure_mbar_ceiling; | |
| 241 float descend_rate_bar_per_minute; | |
| 242 float ascend_rate_bar_per_minute; | |
| 243 | |
| 244 uint16_t timeoutDiveReachedZeroDepth; | |
| 245 uint16_t divetimeToCreateLogbook; | |
| 246 | |
| 247 uint8_t buttonResponsiveness[4]; | |
| 248 | |
| 249 SDevice DeviceData; | |
| 250 | |
| 251 float newBatteryGaugePercentageFloat; | |
| 252 | |
| 253 } SReceiveData; | |
| 254 | |
| 255 | |
| 256 typedef struct | |
| 257 { | |
| 258 SDataExchangeHeader header; | |
| 259 | |
| 260 uint8_t mode; | |
| 261 uint8_t power_on_reset; | |
| 262 uint8_t RTE_VERSION_high; | |
| 263 uint8_t RTE_VERSION_low; | |
| 264 | |
| 265 uint8_t chargeStatus; | |
| 266 uint8_t boolPICdata; | |
| 267 confirmbit8_Type confirmRequest; // confirmbit8_Type | |
| 691 | 268 uint8_t boolADCO2Data; |
| 38 | 269 |
| 270 uint8_t boolPressureData; | |
| 271 uint8_t boolCompassData; | |
| 272 uint8_t boolTisssueData; | |
| 273 uint8_t boolCrushingData; | |
| 274 | |
| 275 uint8_t boolToxicData; | |
| 276 uint8_t boolTimeData; | |
| 277 uint8_t boolBatteryData; | |
| 278 uint8_t boolAmbientLightData; | |
| 279 | |
| 280 uint8_t accidentFlags; | |
| 281 uint8_t sensorErrors; | |
| 282 uint8_t spare2; | |
| 283 uint8_t spare3; | |
| 284 | |
| 285 SExchangeData data[2]; | |
| 286 SDataExchangeFooter footer; | |
| 287 uint8_t CRC_feature_by_SPI[4]; | |
| 288 } SDataExchangeSlaveToMaster; | |
| 289 | |
| 290 | |
| 291 typedef struct | |
| 292 { | |
| 293 SDataExchangeHeader header; | |
| 294 | |
| 295 uint8_t mode; | |
| 296 uint8_t power_on_reset; | |
| 297 uint8_t RTE_VERSION_high; | |
| 298 uint8_t RTE_VERSION_low; | |
| 299 | |
| 300 uint8_t chargeStatus; | |
|
555
573a2bc796c8
Added HW_Info to Discovery <=> RTE data exchange:
Ideenmodellierer
parents:
51
diff
changeset
|
301 hw_Info_t hw_Info; |
| 38 | 302 uint8_t spare1; |
| 303 | |
| 304 uint8_t boolDeviceData; | |
| 305 uint8_t boolVpmRepetitiveDataValid; | |
| 306 uint8_t bool3; | |
| 307 uint8_t bool4; | |
| 308 | |
| 309 uint8_t spare1_1; | |
| 310 uint8_t spare1_2; | |
| 311 uint8_t spare1_3; | |
| 312 uint8_t spare1_4; | |
| 313 | |
| 314 uint8_t spare2_1; | |
| 315 uint8_t spare2_2; | |
| 316 uint8_t spare2_3; | |
| 317 uint8_t spare2_4; | |
| 318 | |
| 319 SDevice DeviceData[2]; | |
| 320 SVpmRepetitiveData VpmRepetitiveData; | |
| 321 | |
| 322 uint8_t arraySizeOfMinimumSExChangeDate[(2 * sizeof(SExchangeData)) - ((2 * sizeof(SDevice)) + sizeof(SVpmRepetitiveData))]; | |
| 323 SDataExchangeFooter footer; | |
| 324 uint8_t CRC_feature_by_SPI[4]; | |
| 325 } SDataExchangeSlaveToMasterDeviceData; | |
| 326 | |
| 327 | |
| 328 typedef struct | |
| 329 { | |
| 330 SDataExchangeHeader header; | |
| 331 | |
| 332 uint8_t mode; | |
| 333 uint8_t getDeviceDataNow; | |
| 334 uint8_t diveModeInfo; | |
| 335 uint8_t setEndDive; | |
| 336 | |
| 337 uint8_t bool4; | |
| 338 uint8_t setButtonSensitivityNow; | |
| 339 uint8_t setDateNow; | |
| 340 uint8_t setTimeNow; | |
| 341 | |
| 342 uint8_t calibrateCompassNow; | |
| 343 uint8_t clearDecoNow; | |
| 344 uint8_t setBatteryGaugeNow; | |
| 345 uint8_t bool9; | |
| 346 | |
| 347 uint8_t revisionHardware; | |
| 348 uint8_t revisionCRCx0x7A; | |
| 989 | 349 uint8_t displayVersion; |
| 38 | 350 uint8_t spare1_4; |
| 351 | |
| 352 uint8_t setAccidentFlag; | |
| 353 uint8_t spare2_1; | |
| 354 uint8_t spare2_2; | |
| 355 uint8_t spare2_3; | |
| 356 | |
| 357 SReceiveData data; | |
| 358 uint8_t arraySizeOfMinimumSExChangeDate[(2 * sizeof(SExchangeData)) - sizeof(SReceiveData)]; | |
| 359 SDataExchangeFooter footer; | |
| 360 uint8_t CRC_feature_by_SPI[4]; | |
| 361 } SDataReceiveFromMaster; | |
| 362 | |
| 363 | |
| 364 /* Size of Transmission buffer */ | |
| 365 #define EXCHANGE_BUFFERSIZE (sizeof(SDataExchangeSlaveToMaster) - 2) | |
| 366 #define EXCHANGE_BUFFERSIZE2 (sizeof(SDataReceiveFromMaster) - 2) | |
| 367 // header: 5 | |
| 368 // mode+bool: 5 | |
| 369 // data 552 ( 69 * float/4 * 2 ) | |
| 370 // footer: 4 | |
| 371 // ______________ | |
| 372 // SUM 566 | |
| 373 // CRC_feature does not count into BUFFERSIZE! | |
| 374 | |
| 375 //(COUNTOF(struct SDataExchangeSlaveToMaster) + 1) | |
| 376 | |
| 377 /* Exported macro ------------------------------------------------------------*/ | |
| 378 //#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__))) | |
| 379 | |
| 380 #endif /* DATA_EXCHANGE_H */ | |
| 381 |
