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 //############################################################################################