1 // ********************************************************************* 2 // IQRF standards header file * 3 // ********************************************************************* 4 // Copyright (c) MICRORISC s.r.o. 5 // 6 // File: $RCSfile: IQRFstandard.h,v $ 7 // Version: $Revision: 1.125 $ 8 // Date: $Date: 2026/01/05 17:28:13 $ 9 // 10 // Revision history: 11 // 2025/05/30 Release for DPA 4.33 12 // 2024/11/05 Release for DPA 4.32 13 // 2024/04/17 Release for DPA 4.31 14 // 2023/03/07 Release for DPA 4.30 15 // 2022/10/05 Release for DPA 4.18 16 // 2022/02/24 Release for DPA 4.17 17 // 2021/08/20 Release for DPA 4.16 18 // 2020/09/03 Release for DPA 4.15 19 // 2020/04/03 Release for DPA 4.14 20 // 2020/02/27 Release for DPA 4.13 21 // 2020/01/09 Release for DPA 4.12 22 // 2019/12/11 Release for DPA 4.11 23 // 2019/10/09 Release for DPA 4.10 24 // 2019/06/12 Release for DPA 4.03 25 // 2019/06/03 Release for DPA 4.02 26 // 2019/03/07 Release for DPA 4.01 27 // 2019/01/20 Release for DPA 4.00 28 // 2018/10/25 Release for DPA 3.03 29 // 2017/11/16 Release for DPA 3.02 30 // 2017/08/14 Release for DPA 3.01 31 // 32 // ********************************************************************* 33 34 // Online DPA documentation https://doc.iqrf.org/DpaTechGuide/ 35 // IQRF Standards documentation https://doc.iqrf.org/ 36 37 #ifndef _IQRFSTD_HEADER_ 38 #define _IQRFSTD_HEADER_ 39 40 //############################################################################################ 41 42 // Enumerate command valid for standards, when applicable 43 #define PCMD_STD_ENUMERATE 0x3E 44 45 #define FRC_STD_FRC_NO_VALUE 0 46 #define FRC_STD_FRC_NOT_IMPLEMENTED_VALUE 1 47 #define FRC_STD_FRC_ERROR_VALUE 2 48 #define FRC_STD_FRC_RESERVED 3 49 50 // ------------------------------------------------------------------------------------------- 51 // IQRF Sensors standard 52 // ------------------------------------------------------------------------------------------- 53 // IQRF Sensors standard peripheral 54 #define PNUM_STD_SENSORS 0x5E 55 // IQRF Sensors standard peripheral type 56 #define PERIPHERAL_TYPE_STD_SENSORS 0x5E 57 // Current version 58 #define STD_SENSORS_VERSION 15 59 60 // IQRF Sensors standard peripheral - read sensor values command 61 #define PCMD_STD_SENSORS_READ_VALUES 0x00 62 // IQRF Sensors standard peripheral - read sensor types and values command 63 #define PCMD_STD_SENSORS_READ_TYPES_AND_VALUES 0x01 64 // IQRF Sensors standard peripheral - read past beaming(s), command is optional 65 #define PCMD_STD_SENSORS_READ_BEAMING 0x02 66 // IQRF Sensors standard peripheral - returns unique sensor ID, command is optional 67 #define PCMD_STD_SENSORS_GET_SENSOR_ID 0x03 68 69 // Beaming sensor command 70 #define PCMD_STD_SENSORS_READ_TYPES_AND_FRC_VALUES 0x7B 71 72 // IQRF Sensors standard peripheral - sensor types 73 #define STD_SENSOR_TYPE_NONE 0x00 74 // 2 bytes 75 #define STD_SENSOR_TYPE_TEMPERATURE 0x01 76 #define STD_SENSOR_TYPE_CO2 0x02 77 #define STD_SENSOR_TYPE_VOC 0x03 78 #define STD_SENSOR_TYPE_EXTRA_LOW_VOLTAGE 0x04 79 #define STD_SENSOR_TYPE_EARTHS_MAGNETIC_FIELD 0x05 80 #define STD_SENSOR_TYPE_LOW_VOLTAGE 0x06 81 #define STD_SENSOR_TYPE_CURRENT 0x07 82 #define STD_SENSOR_TYPE_POWER 0x08 83 #define STD_SENSOR_TYPE_MAINS_FREQUENCY 0x09 84 #define STD_SENSOR_TYPE_TIMESPAN 0x0A 85 #define STD_SENSOR_TYPE_ILLUMINANCE 0x0B 86 #define STD_SENSOR_TYPE_NO2 0x0C 87 #define STD_SENSOR_TYPE_SO2 0x0D 88 #define STD_SENSOR_TYPE_CO 0x0E 89 #define STD_SENSOR_TYPE_O3 0x0F 90 #define STD_SENSOR_TYPE_ATMOSPHERIC_PRESSURE 0x10 91 #define STD_SENSOR_TYPE_COLOR_TEMPERATURE 0x11 92 #define STD_SENSOR_TYPE_PARTICULATES_PM25 0x12 93 #define STD_SENSOR_TYPE_SOUND_PRESSURE_LEVEL 0x13 94 #define STD_SENSOR_TYPE_ALTITUDE 0x14 95 #define STD_SENSOR_TYPE_ACCELERATION 0x15 96 #define STD_SENSOR_TYPE_NH3 0x16 97 #define STD_SENSOR_TYPE_METHANE 0x17 98 #define STD_SENSOR_TYPE_SHORT_LENGTH 0x18 99 #define STD_SENSOR_TYPE_PARTICULATES_PM1 0x19 100 #define STD_SENSOR_TYPE_PARTICULATES_PM4 0x1A 101 #define STD_SENSOR_TYPE_PARTICULATES_PM10 0x1B 102 #define STD_SENSOR_TYPE_TVOC 0x1C 103 #define STD_SENSOR_TYPE_NOX 0x1D 104 #define STD_SENSOR_TYPE_ACTIVITY_CONCENTRATION 0x1E 105 #define STD_SENSOR_TYPE_BINARY_INPUT 0x1F 106 #define STD_SENSOR_TYPE_PARTICULATES_PM40 0x20 107 108 // 1 byte 109 #define STD_SENSOR_TYPE_HUMIDITY 0x80 110 #define STD_SENSOR_TYPE_BINARYDATA7 0x81 111 #define STD_SENSOR_TYPE_POWER_FACTOR 0x82 112 #define STD_SENSOR_TYPE_UV_INDEX 0x83 113 #define STD_SENSOR_TYPE_PH 0x84 114 #define STD_SENSOR_TYPE_RSSI 0x85 115 #define STD_SENSOR_TYPE_ACTION 0x86 116 117 // 4 bytes 118 #define STD_SENSOR_TYPE_BINARYDATA30 0xA0 119 #define STD_SENSOR_TYPE_CONSUMPTION 0xA1 120 #define STD_SENSOR_TYPE_DATETIME 0xA2 121 #define STD_SENSOR_TYPE_TIMESPAN_LONG 0xA3 122 #define STD_SENSOR_TYPE_LATITUDE 0xA4 123 #define STD_SENSOR_TYPE_LONGITUDE 0xA5 124 #define STD_SENSOR_TYPE_TEMPERATURE_FLOAT 0xA6 125 #define STD_SENSOR_TYPE_LENGTH 0xA7 126 #define STD_SENSOR_TYPE_FOUR_BYTES 0xA8 127 128 // Multiple bytes 129 #define STD_SENSOR_TYPE_DATA_BLOCK 0xC0 130 131 // Computes constant (otherwise not optimal) quantity size 132 #if !defined( __CC5X__ ) 133 134 #define STD_SENSOR_TYPE_SIZE(s) ( \ 135 ( (s) <= STD_SENSOR_TYPE_NONE || (s) >= STD_SENSOR_TYPE_DATA_BLOCK ) \ 136 ? ( 0/0 ) \ 137 : ( ( (s) & 0x80 ) == 0x00 \ 138 ? 2 \ 139 : ( ( (s) & 0xE0 ) == 0x80 \ 140 ? 1 \ 141 : 4 ) ) ) 142 143 #else 144 145 // CC5C has a limited expression complexity, does not support conditional expression and comparison with subsequent usage in computation, so the macro is rewritten using logical and bit operators only and simplified 146 #define STD_SENSOR_TYPE_SIZE(s) ( \ 147 ( \ 148 !( (s) & 0x80 ) * 2 + /* 2-byte quantity */ \ 149 !(( (s) & 0xE0 ) ^ 0x80 ) + /* 1-byte quantity */ \ 150 !(( (s) & 0xE0 ) ^ 0xA0 ) * 4 /* 4-byte quantity */ \ 151 ) / \ 152 ( \ 153 !!(( (s) & 0xC0 ) ^ 0xC0 ) /* variable-byte quantity */ \ 154 * !!(s) /* STD_SENSOR_TYPE_NONE */ \ 155 /* Test commented out because CC5X limit "Compiler size limit exceeded (Expression)" */ /* * !( (s) & ~0xFF ) */ /* out of [0x00;0xFF] */ \ 156 ) ) 157 158 #endif 159 160 // IQRF Sensors standard peripheral - FRC commands 161 #define FRC_STD_SENSORS_BIT 0x10 162 #define FRC_STD_SENSORS_1B 0x90 163 #define FRC_STD_SENSORS_2B 0xE0 164 #define FRC_STD_SENSORS_4B 0xF9 165 166 #define STD_SENSOR_ACTION_VALUE_NONE 0x00 167 #define STD_SENSOR_ACTION_VALUE_ERROR 0xFB 168 169 #define STD_SENSOR_ACTION_VALUE_BUTTON_1 0x01 170 #define STD_SENSOR_ACTION_VALUE_BUTTON_2 0x02 171 #define STD_SENSOR_ACTION_VALUE_BUTTON_3 0x03 172 #define STD_SENSOR_ACTION_VALUE_BUTTON_4 0x04 173 #define STD_SENSOR_ACTION_VALUE_BUTTON_5 0x05 174 #define STD_SENSOR_ACTION_VALUE_BUTTON_6 0x06 175 #define STD_SENSOR_ACTION_VALUE_BUTTON_7 0x07 176 #define STD_SENSOR_ACTION_VALUE_BUTTON_8 0x08 177 #define STD_SENSOR_ACTION_VALUE_BUTTON_9 0x09 178 #define STD_SENSOR_ACTION_VALUE_BUTTON_10 0x0A 179 #define STD_SENSOR_ACTION_VALUE_BUTTON_11 0x0B 180 #define STD_SENSOR_ACTION_VALUE_BUTTON_12 0x0C 181 #define STD_SENSOR_ACTION_VALUE_BUTTON_13 0x0D 182 #define STD_SENSOR_ACTION_VALUE_BUTTON_14 0x0E 183 #define STD_SENSOR_ACTION_VALUE_BUTTON_15 0x0F 184 #define STD_SENSOR_ACTION_VALUE_BUTTON_16 0x10 185 186 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_1 0x11 187 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_2 0x12 188 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_3 0x13 189 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_4 0x14 190 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_5 0x15 191 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_6 0x16 192 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_7 0x17 193 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_8 0x18 194 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_9 0x19 195 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_10 0x1A 196 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_11 0x1B 197 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_12 0x1C 198 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_13 0x1D 199 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_14 0x1E 200 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_15 0x1F 201 #define STD_SENSOR_ACTION_VALUE_LONG_BUTTON_16 0x20 202 203 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_1 0x21 204 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_2 0x22 205 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_3 0x23 206 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_4 0x24 207 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_5 0x25 208 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_6 0x26 209 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_7 0x27 210 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_8 0x28 211 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_9 0x29 212 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_10 0x2A 213 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_11 0x2B 214 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_12 0x2C 215 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_13 0x2D 216 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_14 0x2E 217 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_15 0x2F 218 #define STD_SENSOR_ACTION_VALUE_DOUBLE_BUTTON_16 0x30 219 220 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_1 0x31 221 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_2 0x32 222 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_3 0x33 223 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_4 0x34 224 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_5 0x35 225 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_6 0x36 226 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_7 0x37 227 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_8 0x38 228 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_9 0x39 229 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_10 0x3A 230 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_11 0x3B 231 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_12 0x3C 232 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_13 0x3D 233 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_14 0x3E 234 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_15 0x3F 235 #define STD_SENSOR_ACTION_VALUE_TRIPLE_BUTTON_16 0x40 236 237 typedef struct 238 { 239 // Equals to PNUM_STD_SENSORS 240 uns8 Header; 241 // Sensor type STD_SENSOR_TYPE_??? 242 uns8 SensorType; 243 // Sensor index (bits 0-4) + optional extended data (bits 5-7) 244 uns8 SensorIndex; 245 // Options 246 // bit 0 : sleep 247 // bits 1-7: reserved 248 uns8 Options; 249 // Optional sleep parameters 250 TPerOSSleep_Request SleepParameters; 251 } STRUCTATTR TPerStdSensorFrc; 252 253 #if defined( __CC5X__ ) && !defined( CC5XnotDPA ) 254 // The above structure located at memory 255 TPerStdSensorFrc PerStdSensorFrc @ DataOutBeforeResponseFRC; 256 #endif // #ifdef __CC5X__ 257 258 // Structure for PCMD_STD_SENSORS_READ[_TYPES_AND]_VALUES 259 260 typedef struct 261 { 262 uns8 Bitmap[4]; 263 uns8 WrittenData[DPA_MAX_DATA_LENGTH - 4]; 264 } STRUCTATTR TPerStdSensorRead_Request; 265 266 // IQRF Sensors standard peripheral - error values 267 // 2 bytes 268 #define STD_SENSOR_TYPE_TEMPERATURE_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 269 #define STD_SENSOR_TYPE_TEMPERATURE_IS_ERROR(v) ( (v) == 0x8000 ) 270 271 #define STD_SENSOR_TYPE_CO2_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 272 #define STD_SENSOR_TYPE_CO2_IS_ERROR(v) ( (v) == 0x8000 ) 273 274 #define STD_SENSOR_TYPE_VOC_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 275 #define STD_SENSOR_TYPE_VOC_IS_ERROR(v) ( (v) == 0x8000 ) 276 277 #define STD_SENSOR_TYPE_EXTRA_LOW_VOLTAGE_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 278 #define STD_SENSOR_TYPE_EXTRA_LOW_VOLTAGE_IS_ERROR(v) ( (v) == 0x8000 ) 279 280 #define STD_SENSOR_TYPE_EARTHS_MAGNETIC_FIELD_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 281 #define STD_SENSOR_TYPE_EARTHS_MAGNETIC_FIELD_IS_ERROR(v) ( (v) == 0x8000 ) 282 283 #define STD_SENSOR_TYPE_LOW_VOLTAGE_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 284 #define STD_SENSOR_TYPE_LOW_VOLTAGE_IS_ERROR(v) ( (v) == 0x8000 ) 285 286 #define STD_SENSOR_TYPE_CURRENT_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 287 #define STD_SENSOR_TYPE_CURRENT_IS_ERROR(v) ( (v) == 0x8000 ) 288 289 #define STD_SENSOR_TYPE_POWER_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 290 #define STD_SENSOR_TYPE_POWER_IS_ERROR(v) ( (v) == 0xFfFf ) 291 292 #define STD_SENSOR_TYPE_MAINS_FREQUENCY_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 293 #define STD_SENSOR_TYPE_MAINS_FREQUENCY_IS_ERROR(v) ( (v) == 0xFfFf ) 294 295 #define STD_SENSOR_TYPE_TIMESPAN_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 296 #define STD_SENSOR_TYPE_TIMESPAN_IS_ERROR(v) ( (v) == 0xFfFf ) 297 298 #define STD_SENSOR_TYPE_ILLUMINANCE_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 299 #define STD_SENSOR_TYPE_ILLUMINANCE_IS_ERROR(v) ( (v) == 0xFfFf ) 300 301 #define STD_SENSOR_TYPE_NO2_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 302 #define STD_SENSOR_TYPE_NO2_IS_ERROR(v) ( (v) == 0xFfFf ) 303 304 #define STD_SENSOR_TYPE_SO2_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 305 #define STD_SENSOR_TYPE_SO2_IS_ERROR(v) ( (v) == 0xFfFf ) 306 307 #define STD_SENSOR_TYPE_CO_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 308 #define STD_SENSOR_TYPE_CO_IS_ERROR(v) ( (v) == 0xFfFf ) 309 310 #define STD_SENSOR_TYPE_O3_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 311 #define STD_SENSOR_TYPE_O3_IS_ERROR(v) ( (v) == 0xFfFf ) 312 313 #define STD_SENSOR_TYPE_ATMOSPHERIC_PRESSURE_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 314 #define STD_SENSOR_TYPE_ATMOSPHERIC_PRESSURE_IS_ERROR(v) ( (v) == 0xFfFf ) 315 316 #define STD_SENSOR_TYPE_COLOR_TEMPERATURE_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 317 #define STD_SENSOR_TYPE_COLOR_TEMPERATURE_IS_ERROR(v) ( (v) == 0x8000 ) 318 319 #define STD_SENSOR_TYPE_PARTICULATES_PM25_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 320 #define STD_SENSOR_TYPE_PARTICULATES_PM25_IS_ERROR(v) ( (v) == 0x8000 ) 321 322 #define STD_SENSOR_TYPE_SOUND_PRESSURE_LEVEL_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 323 #define STD_SENSOR_TYPE_SOUND_PRESSURE_LEVEL_IS_ERROR(v) ( (v) == 0x8000 ) 324 325 #define STD_SENSOR_TYPE_ALTITUDE_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 326 #define STD_SENSOR_TYPE_ALTITUDE_IS_ERROR(v) ( (v) == 0xFfFf ) 327 328 #define STD_SENSOR_TYPE_ACCELERATION_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 329 #define STD_SENSOR_TYPE_ACCELERATION_IS_ERROR(v) ( (v) == 0x8000 ) 330 331 #define STD_SENSOR_TYPE_NH3_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 332 #define STD_SENSOR_TYPE_NH3_IS_ERROR(v) ( (v) == 0xFfFf ) 333 334 #define STD_SENSOR_TYPE_METHANE_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 335 #define STD_SENSOR_TYPE_METHANE_IS_ERROR(v) ( (v) == 0xFfFf ) 336 337 #define STD_SENSOR_TYPE_SHORT_LENGTH_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 338 #define STD_SENSOR_TYPE_SHORT_LENGTH_IS_ERROR(v) ( (v) == 0xFfFf ) 339 340 #define STD_SENSOR_TYPE_PARTICULATES_PM1_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 341 #define STD_SENSOR_TYPE_PARTICULATES_PM1_IS_ERROR(v) ( (v) == 0x8000 ) 342 343 #define STD_SENSOR_TYPE_PARTICULATES_PM4_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 344 #define STD_SENSOR_TYPE_PARTICULATES_PM4_IS_ERROR(v) ( (v) == 0x8000 ) 345 346 #define STD_SENSOR_TYPE_PARTICULATES_PM10_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 347 #define STD_SENSOR_TYPE_PARTICULATES_PM10_IS_ERROR(v) ( (v) == 0x8000 ) 348 349 #define STD_SENSOR_TYPE_TVOC_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 350 #define STD_SENSOR_TYPE_TVOC_IS_ERROR(v) ( (v) == 0xFfFf ) 351 352 #define STD_SENSOR_TYPE_NOX_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 353 #define STD_SENSOR_TYPE_NOX_IS_ERROR(v) ( (v) == 0xFfFf ) 354 355 #define STD_SENSOR_TYPE_ACTIVITY_CONCENTRATION_SET_ERROR(v) do { v = 0xFfFf; } while( 0 ) 356 #define STD_SENSOR_TYPE_ACTIVITY_CONCENTRATION_IS_ERROR(v) ( (v) == 0xFfFf ) 357 358 #define STD_SENSOR_TYPE_PARTICULATES_PM40_SET_ERROR(v) do { v = 0x8000; } while( 0 ) 359 #define STD_SENSOR_TYPE_PARTICULATES_PM40_IS_ERROR(v) ( (v) == 0x8000 ) 360 361 // 1 byte 362 #define STD_SENSOR_TYPE_HUMIDITY_SET_ERROR(v) do { v = 0xEE; } while( 0 ) 363 #define STD_SENSOR_TYPE_HUMIDITY_IS_ERROR(v) ( (v) == 0xEE ) 364 365 #define STD_SENSOR_TYPE_BINARYDATA7_SET_ERROR(v) do { v = 0x80; } while( 0 ) 366 #define STD_SENSOR_TYPE_BINARYDATA7_IS_ERROR(v) ( ( (v) & 0x80 ) != 0x00 ) 367 368 #define STD_SENSOR_TYPE_POWER_FACTOR_SET_ERROR(v) do { v = 0xEE; } while( 0 ) 369 #define STD_SENSOR_TYPE_POWER_FACTOR_IS_ERROR(v) ( (v) == 0xEE ) 370 371 #define STD_SENSOR_TYPE_UV_INDEX_SET_ERROR(v) do { v = 0xFF; } while( 0 ) 372 #define STD_SENSOR_TYPE_UV_INDEX_IS_ERROR(v) ( (v) == 0xFF ) 373 374 #define STD_SENSOR_TYPE_PH_INDEX_SET_ERROR(v) do { v = 0xFF; } while( 0 ) 375 #define STD_SENSOR_TYPE_PH_INDEX_IS_ERROR(v) ( (v) == 0xFF ) 376 377 #define STD_SENSOR_TYPE_RSSI_INDEX_SET_ERROR(v) do { v = 0xFF; } while( 0 ) 378 #define STD_SENSOR_TYPE_RSSI_INDEX_IS_ERROR(v) ( (v) == 0xFF ) 379 380 #define STD_SENSOR_TYPE_ACTION_SET_ERROR(v) do { v = STD_SENSOR_ACTION_VALUE_ERROR; } while( 0 ) 381 #define STD_SENSOR_TYPE_ACTION_IS_ERROR(v) ( (v) == STD_SENSOR_ACTION_VALUE_ERROR ) 382 383 // 4 bytes 384 #define STD_SENSOR_TYPE_BINARYDATA30_SET_ERROR(v) do { v = 0x80000000; } while( 0 ) 385 #define STD_SENSOR_TYPE_BINARYDATA30_IS_ERROR(v) ( ( (v) & 0x80000000 ) != 0x00000000 ) 386 387 #define STD_SENSOR_TYPE_CONSUMPTION_SET_ERROR(v) do { v = 0xFfFfFfFf; } while( 0 ) 388 #define STD_SENSOR_TYPE_CONSUMPTION_IS_ERROR(v) ( (v) == 0xFfFfFfFf ) 389 390 #define STD_SENSOR_TYPE_DATETIME_SET_ERROR(v) do { v = 0xFfFfFfFf; } while( 0 ) 391 #define STD_SENSOR_TYPE_DATETIME_IS_ERROR(v) ( (v) == 0xFfFfFfFf ) 392 393 #define STD_SENSOR_TYPE_TIMESPAN_LONG_SET_ERROR(v) do { v = 0xFfFfFfFf; } while( 0 ) 394 #define STD_SENSOR_TYPE_TIMESPAN_LONG_IS_ERROR(v) ( (v) == 0xFfFfFfFf ) 395 396 #define STD_SENSOR_TYPE_LATITUDE_SET_ERROR(v) do { v = 0xFF000000; } while( 0 ) 397 #define STD_SENSOR_TYPE_LATITUDE_IS_ERROR(v) ( ( (v) & 0xFF000000 ) == 0xFF000000 ) 398 399 #define STD_SENSOR_TYPE_LONGITUDE_SET_ERROR(v) do { v = 0xFF000000; } while( 0 ) 400 #define STD_SENSOR_TYPE_LONGITUDE_IS_ERROR(v) ( ( (v) & 0xFF000000 ) == 0xFF000000 ) 401 402 #define STD_SENSOR_TYPE_TEMPERATURE_FLOAT_SET_ERROR(v) do { v = 0x7FfFfFfF; /* NaN */ } while( 0 ) 403 #define STD_SENSOR_TYPE_TEMPERATURE_FLOAT_IS_ERROR(v) ( /* Test for NaN */ ( (v) & 0x7F800000 ) == 0x7F800000 /* Exponent==0xFF */ && ( (v) & 0x007FfFfF ) != 0 /* Fraction != 0 */ ) 404 405 #define STD_SENSOR_TYPE_LENGTH_SET_ERROR(v) do { v = 0x7FfFfFfF; /* NaN */ } while( 0 ) 406 #define STD_SENSOR_TYPE_LENGTH_IS_ERROR(v) ( /* Test for NaN */ ( (v) & 0x7F800000 ) == 0x7F800000 /* Exponent==0xFF */ && ( (v) & 0x007FfFfF ) != 0 /* Fraction != 0 */ ) 407 408 #define STD_SENSOR_TYPE_FOUR_BYTES_SET_ERROR(v) do { v = 0xFfFfFfFf } while( 0 ) 409 #define STD_SENSOR_TYPE_FOUR_BYTES_IS_ERROR(v) ( (v) == 0xFfFfFfFf ) 410 411 // Written data constants 412 #define STD_SENSOR_TYPE_TEMPERATURE_DATA_GET_1_POINT_CALIBRATION 1 413 #define STD_SENSOR_TYPE_TEMPERATURE_DATA_SET_1_POINT_CALIBRATION 2 414 415 #define STD_SENSOR_TYPE_HUMIDITY_DATA_GET_1_POINT_CALIBRATION 1 416 #define STD_SENSOR_TYPE_HUMIDITY_DATA_SET_1_POINT_CALIBRATION 2 417 418 // ------------------------------------------------------------------------------------------- 419 // IQRF Binary Outputs standard 420 // ------------------------------------------------------------------------------------------- 421 // IQRF Binary Outputs standard peripheral 422 #define PNUM_STD_BINARY_OUTPUTS 0x4B 423 // IQRF Binary Outputs peripheral type 424 #define PERIPHERAL_TYPE_STD_BINARY_OUTPUTS 0x4B 425 // Current version 426 #define STD_BINARY_OUTPUTS_VERSION 4 427 428 // IQRF Binary Outputs standard peripheral - set outputs 429 #define PCMD_STD_BINARY_OUTPUTS_SET 0x00 430 431 // Structure returned by PCMD_STD_ENUMERATE 432 433 typedef struct 434 { 435 uns8 Count; 436 } STRUCTATTR TPerStdBinaryOutputEnumerate_Response; 437 438 // Structure for PCMD_STD_BINARY_OUTPUTS_SET 439 440 typedef struct 441 { 442 uns8 Bitmap[4]; 443 uns8 NewState[DPA_MAX_DATA_LENGTH - 4]; 444 } STRUCTATTR TPerStdBinaryOutputSet_Request; 445 446 #define STD_BINARY_OUTPUT_STATE_OFF 0x00 447 #define STD_BINARY_OUTPUT_STATE_ON 0x01 448 449 #define STD_BINARY_OUTPUT_IS_STATE_OK(state) ( (state) != 0x80 ) 450 #define STD_BINARY_OUTPUT_IS_STATE_OFF(state) ( (state) == STD_BINARY_OUTPUT_STATE_OFF ) 451 #define STD_BINARY_OUTPUT_IS_STATE_ON(state) ( (state) >= STD_BINARY_OUTPUT_STATE_ON ) 452 #define STD_BINARY_OUTPUT_STATE_HAS_TIME(state) ( (state) > STD_BINARY_OUTPUT_STATE_ON ) 453 #define STD_BINARY_OUTPUT_STATE_TIME_IN_SECONDS(state) ( ( (state) & 0x80 ) != 0x00 ) 454 #define STD_BINARY_OUTPUT_STATE_GET_SECONDS(state) ( (state) & 0x7F ) 455 #define STD_BINARY_OUTPUT_STATE_TIME_IN_MINUTES(state) ( (state) > STD_BINARY_OUTPUT_STATE_ON && (state) <= 0x7F ) 456 #define STD_BINARY_OUTPUT_STATE_GET_MINUTES(state) (state) 457 458 // Structure returned by PCMD_STD_BINARY_OUTPUTS_SET 459 460 typedef struct 461 { 462 uns8 PreviousStates[4]; 463 } STRUCTATTR TPerStdBinaryOutputSet_Response; 464 465 // ------------------------------------------------------------------------------------------- 466 // IQRF Light standard 467 // ------------------------------------------------------------------------------------------- 468 469 // IQRF Light standard peripheral 470 #define PNUM_STD_LIGHT 0x4A 471 // IQRF Light standard peripheral type 472 #define PERIPHERAL_TYPE_STD_LIGHT 0x4A 473 // Current version 474 #define STD_LIGHT_VERSION 1 475 476 // IQRF Light standard peripheral - Send LDI commands 477 #define PCMD_STD_LIGHT_SEND_LDI_COMMANDS 0x00 478 // IQRF Light standard peripheral - Send LDI commands asynchronously 479 #define PCMD_STD_LIGHT_SEND_LDI_COMMANDS_ASYNC 0x01 480 // IQRF Light standard peripheral - Set/Read LAI value 481 #define PCMD_STD_LIGHT_SET_LAI 0x02 482 483 // IQRF Light standard peripheral - FRC LDI command 484 #define FRC_STD_LIGHT_LDI_SEND 0xE0 485 // IQRF Light standard peripheral - FRC LAI command 486 #define FRC_STD_LIGHT_LAI_READ 0xE1 487 488 // DI answer byte #0 489 #if defined( __CC5X__ ) 490 491 typedef struct 492 { 493 bit Answer; 494 bit AnswerError; 495 bit _bit2_reserved; 496 bit _bit3_reserved; 497 bit _bit4_reserved; 498 bit _bit5_reserved; 499 bit _bit6_reserved; 500 bit Always1; 501 } TSTL_LDI_Answer0; 502 #else 503 504 typedef struct 505 { 506 unsigned Answer : 1; 507 unsigned AnswerError : 1; 508 unsigned _bit2_reserved : 1; 509 unsigned _bit3_reserved : 1; 510 unsigned _bit4_reserved : 1; 511 unsigned _bit5_reserved : 1; 512 unsigned _bit6_reserved : 1; 513 unsigned Always1; 514 } STRUCTATTR TSTL_LDI_Answer0; 515 #endif 516 517 // ------------------------------------------------------------------------------------------- 518 519 // DPA Message data structure (packet w/o NADR, PNUM, PCMD, HWPID) for IQRF standards 520 521 typedef union 522 { 523 // Structure for PCMD_STD_SENSORS_READ[_TYPES_AND]_VALUES 524 TPerStdSensorRead_Request PerStdSensorRead_Request; 525 526 // Structure returned by PCMD_STD_ENUMERATE for binary output 527 TPerStdBinaryOutputEnumerate_Response PerStdBinaryOutputEnumerate_Response; 528 529 // Structure for PCMD_STD_BINARY_OUTPUTS_SET 530 TPerStdBinaryOutputSet_Request PerStdBinaryOutputSet_Request; 531 532 // Structure returned by PCMD_STD_BINARY_OUTPUTS_SET 533 TPerStdBinaryOutputSet_Response PerStdBinaryOutputSet_Response; 534 } TDpaMessageIqrfStd; 535 536 #if defined( __CC5X__ ) && !defined( CC5XnotDPA ) 537 // The structure above mapped at the DpaMessage 538 TDpaMessageIqrfStd _DpaMessageIqrfStd @ DpaRfMessage; 539 #endif // #ifdef __CC5X__ 540 541 // ------------------------------------------------------------------------------------------- 542 543 #endif // _IQRFSTD_HEADER_ 544 545 //############################################################################################