/******************************************************************************
*  Filename:       rf_common_cmd.h
*  Revised:        $ $
*  Revision:       $ $
*
*  Description:    CC26xx API for common/generic commands
*
*  Copyright (c) 2015 - 2016, Texas Instruments Incorporated
*  All rights reserved.
*
*  Redistribution and use in source and binary forms, with or without
*  modification, are permitted provided that the following conditions are met:
*
*  1) Redistributions of source code must retain the above copyright notice,
*     this list of conditions and the following disclaimer.
*
*  2) Redistributions in binary form must reproduce the above copyright notice,
*     this list of conditions and the following disclaimer in the documentation
*     and/or other materials provided with the distribution.
*
*  3) Neither the name of the ORGANIZATION nor the names of its contributors may
*     be used to endorse or promote products derived from this software without
*     specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
*  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
*  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
*  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
*  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
*  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
*  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*  POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/

#ifndef __COMMON_CMD_H
#define __COMMON_CMD_H

#ifndef __RFC_STRUCT
#ifdef __GNUC__
#define __RFC_STRUCT __attribute__ ((aligned (4)))
#else
#define __RFC_STRUCT
#endif
#endif

//! \addtogroup rfc
//! @{

//! \addtogroup common_cmd
//! @{

#include <stdint.h>
#include <driverlib/rf_mailbox.h>

typedef struct __RFC_STRUCT rfc_command_s rfc_command_t;
typedef struct __RFC_STRUCT rfc_radioOp_s rfc_radioOp_t;
typedef struct __RFC_STRUCT rfc_CMD_NOP_s rfc_CMD_NOP_t;
typedef struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s rfc_CMD_RADIO_SETUP_t;
typedef struct __RFC_STRUCT rfc_CMD_FS_s rfc_CMD_FS_t;
typedef struct __RFC_STRUCT rfc_CMD_FS_OFF_s rfc_CMD_FS_OFF_t;
typedef struct __RFC_STRUCT rfc_CMD_RX_TEST_s rfc_CMD_RX_TEST_t;
typedef struct __RFC_STRUCT rfc_CMD_TX_TEST_s rfc_CMD_TX_TEST_t;
typedef struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s rfc_CMD_SYNC_STOP_RAT_t;
typedef struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s rfc_CMD_SYNC_START_RAT_t;
typedef struct __RFC_STRUCT rfc_CMD_COUNT_s rfc_CMD_COUNT_t;
typedef struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s rfc_CMD_FS_POWERUP_t;
typedef struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s rfc_CMD_FS_POWERDOWN_t;
typedef struct __RFC_STRUCT rfc_CMD_SCH_IMM_s rfc_CMD_SCH_IMM_t;
typedef struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s rfc_CMD_COUNT_BRANCH_t;
typedef struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s rfc_CMD_PATTERN_CHECK_t;
typedef struct __RFC_STRUCT rfc_CMD_ABORT_s rfc_CMD_ABORT_t;
typedef struct __RFC_STRUCT rfc_CMD_STOP_s rfc_CMD_STOP_t;
typedef struct __RFC_STRUCT rfc_CMD_GET_RSSI_s rfc_CMD_GET_RSSI_t;
typedef struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s rfc_CMD_UPDATE_RADIO_SETUP_t;
typedef struct __RFC_STRUCT rfc_CMD_TRIGGER_s rfc_CMD_TRIGGER_t;
typedef struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s rfc_CMD_GET_FW_INFO_t;
typedef struct __RFC_STRUCT rfc_CMD_START_RAT_s rfc_CMD_START_RAT_t;
typedef struct __RFC_STRUCT rfc_CMD_PING_s rfc_CMD_PING_t;
typedef struct __RFC_STRUCT rfc_CMD_READ_RFREG_s rfc_CMD_READ_RFREG_t;
typedef struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s rfc_CMD_ADD_DATA_ENTRY_t;
typedef struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s rfc_CMD_REMOVE_DATA_ENTRY_t;
typedef struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s rfc_CMD_FLUSH_QUEUE_t;
typedef struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s rfc_CMD_CLEAR_RX_t;
typedef struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s rfc_CMD_REMOVE_PENDING_ENTRIES_t;
typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s rfc_CMD_SET_RAT_CMP_t;
typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s rfc_CMD_SET_RAT_CPT_t;
typedef struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s rfc_CMD_DISABLE_RAT_CH_t;
typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s rfc_CMD_SET_RAT_OUTPUT_t;
typedef struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s rfc_CMD_ARM_RAT_CH_t;
typedef struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s rfc_CMD_DISARM_RAT_CH_t;
typedef struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s rfc_CMD_SET_TX_POWER_t;
typedef struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s rfc_CMD_UPDATE_FS_t;
typedef struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s rfc_CMD_BUS_REQUEST_t;

//! \addtogroup command
//! @{
struct __RFC_STRUCT rfc_command_s {
   uint16_t commandNo;                  //!<        The command ID number
};

//! @}

//! \addtogroup radioOp
//! @{
//! Common definition for radio operation commands

struct __RFC_STRUCT rfc_radioOp_s {
   uint16_t commandNo;                  //!<        The command ID number
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
};

//! @}

//! \addtogroup CMD_NOP
//! @{
#define CMD_NOP                                                 0x0801
//! No Operation Command
struct __RFC_STRUCT rfc_CMD_NOP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0801
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
};

//! @}

//! \addtogroup CMD_RADIO_SETUP
//! @{
#define CMD_RADIO_SETUP                                         0x0802
//! Radio Setup Command for Pre-Defined Schemes
struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0802
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint8_t mode;                        //!< \brief The main mode to use<br>
                                        //!<        0x00: BLE<br>
                                        //!<        0x01: IEEE 802.15.4<br>
                                        //!<        0x02: 2 Mbps GFSK<br>
                                        //!<        0x05: 5 Mbps coded 8-FSK<br>
                                        //!<        0xFF: Keep existing mode; update overrides only<br>
                                        //!<        Others: <i>Reserved</i>
   uint8_t __dummy0;
   struct {
      uint16_t frontEndMode:3;          //!< \brief 0x00: Differential mode<br>
                                        //!<        0x01: Single-ended mode RFP<br>
                                        //!<        0x02: Single-ended mode RFN<br>
                                        //!<        0x05 Single-ended mode RFP with external frontend control on RF pins (RFN and RXTX)<br>
                                        //!<        0x06 Single-ended mode RFN with external frontend control on RF pins (RFP and RXTX)<br>
                                        //!<        Others: <i>Reserved</i>
      uint16_t biasMode:1;              //!< \brief 0: Internal bias<br>
                                        //!<        1: External bias
      uint16_t analogCfgMode:6;         //!< \brief 0x00: Write analog configuration.<br>
                                        //!<        Required first time after boot and when changing frequency band
                                        //!<        or front-end configuration<br>
                                        //!<        0x2D: Keep analog configuration.<br>
                                        //!<        May be used after standby or when changing mode with the same frequency
                                        //!<        band and front-end configuration<br>
                                        //!<        Others: <i>Reserved</i>
      uint16_t bNoFsPowerUp:1;          //!< \brief 0: Power up frequency synth<br>
                                        //!<        1: Do not power up frequency synth
   } config;                            //!<        Configuration options
   uint16_t txPower;                    //!<        Transmit power
   uint32_t* pRegOverride;              //!< \brief Pointer to a list of hardware and configuration registers to override. If NULL, no
                                        //!<        override is used.
};

//! @}

//! \addtogroup CMD_FS
//! @{
#define CMD_FS                                                  0x0803
//! Frequency Synthesizer Programming Command
struct __RFC_STRUCT rfc_CMD_FS_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0803
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t frequency;                  //!<        The frequency in MHz to tune to
   uint16_t fractFreq;                  //!<        Fractional part of the frequency to tune to
   struct {
      uint8_t bTxMode:1;                //!< \brief 0: Start synth in RX mode<br>
                                        //!<        1: Start synth in TX mode
      uint8_t refFreq:6;                //!<        <i>Reserved</i>
   } synthConf;
   uint8_t __dummy0;                    //!<        <i>Reserved</i>, always write 0
   uint8_t __dummy1;                    //!<        <i>Reserved</i>
   uint8_t __dummy2;                    //!<        <i>Reserved</i>
   uint16_t __dummy3;                   //!<        <i>Reserved</i>
};

//! @}

//! \addtogroup CMD_FS_OFF
//! @{
#define CMD_FS_OFF                                              0x0804
//! Command for Turning off Frequency Synthesizer
struct __RFC_STRUCT rfc_CMD_FS_OFF_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0804
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
};

//! @}

//! \addtogroup CMD_RX_TEST
//! @{
#define CMD_RX_TEST                                             0x0807
//! Receiver Test Command
struct __RFC_STRUCT rfc_CMD_RX_TEST_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0807
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   struct {
      uint8_t bEnaFifo:1;               //!< \brief 0: Do not enable FIFO in modem, so that received data is not available<br>
                                        //!<        1: Enable FIFO in modem &ndash; the data must be read out by the application
      uint8_t bFsOff:1;                 //!< \brief 0: Keep frequency synth on after command<br>
                                        //!<        1: Turn frequency synth off after command
      uint8_t bNoSync:1;                //!< \brief 0: Run sync search as normal for the configured mode<br>
                                        //!<        1: Write correlation thresholds to the maximum value to avoid getting sync
   } config;
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } endTrigger;                        //!<        Trigger classifier for ending the operation
   uint32_t syncWord;                   //!<        Sync word to use for receiver
   ratmr_t endTime;                     //!<        Time to end the operation
};

//! @}

//! \addtogroup CMD_TX_TEST
//! @{
#define CMD_TX_TEST                                             0x0808
//! Transmitter Test Command
struct __RFC_STRUCT rfc_CMD_TX_TEST_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0808
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   struct {
      uint8_t bUseCw:1;                 //!< \brief 0: Send modulated signal<br>
                                        //!<        1: Send continuous wave
      uint8_t bFsOff:1;                 //!< \brief 0: Keep frequency synth on after command<br>
                                        //!<        1: Turn frequency synth off after command
      uint8_t whitenMode:2;             //!< \brief 0: No whitening<br>
                                        //!<        1: Default whitening<br>
                                        //!<        2: PRBS-15<br>
                                        //!<        3: PRBS-32
   } config;
   uint8_t __dummy0;
   uint16_t txWord;                     //!<        Value to send to the modem before whitening
   uint8_t __dummy1;
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } endTrigger;                        //!<        Trigger classifier for ending the operation
   uint32_t syncWord;                   //!<        Sync word to use for transmitter
   ratmr_t endTime;                     //!<        Time to end the operation
};

//! @}

//! \addtogroup CMD_SYNC_STOP_RAT
//! @{
#define CMD_SYNC_STOP_RAT                                       0x0809
//! Synchronize and Stop Radio Timer Command
struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0809
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t __dummy0;
   ratmr_t rat0;                        //!< \brief The returned RAT timer value corresponding to the value the RAT would have had when the
                                        //!<        RTC was zero
};

//! @}

//! \addtogroup CMD_SYNC_START_RAT
//! @{
#define CMD_SYNC_START_RAT                                      0x080A
//! Synchrously Start Radio Timer Command
struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x080A
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t __dummy0;
   ratmr_t rat0;                        //!< \brief The desired RAT timer value corresponding to the value the RAT would have had when the
                                        //!<        RTC was zero. This parameter is returned by CMD_SYNC_STOP_RAT
};

//! @}

//! \addtogroup CMD_COUNT
//! @{
#define CMD_COUNT                                               0x080B
//! Counter Command
struct __RFC_STRUCT rfc_CMD_COUNT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x080B
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t counter;                    //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation
                                        //!<        differs if the result is zero
};

//! @}

//! \addtogroup CMD_FS_POWERUP
//! @{
#define CMD_FS_POWERUP                                          0x080C
//! Power up Frequency Syntheszier Command
struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x080C
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t __dummy0;
   uint32_t* pRegOverride;              //!<        Pointer to a list of hardware and configuration registers to override. If NULL, no override is used.
};

//! @}

//! \addtogroup CMD_FS_POWERDOWN
//! @{
#define CMD_FS_POWERDOWN                                        0x080D
//! Power down Frequency Syntheszier Command
struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s {
   uint16_t commandNo;                  //!<        The command ID number 0x080D
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
};

//! @}

//! \addtogroup CMD_SCH_IMM
//! @{
#define CMD_SCH_IMM                                             0x0810
//! Run Immidiate Command as Radio Operation Command
struct __RFC_STRUCT rfc_CMD_SCH_IMM_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0810
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t __dummy0;
   uint32_t cmdrVal;                    //!<        Value as would be written to CMDR
   uint32_t cmdstaVal;                  //!<        Value as would be returned in CMDSTA
};

//! @}

//! \addtogroup CMD_COUNT_BRANCH
//! @{
#define CMD_COUNT_BRANCH                                        0x0812
//! Counter Command with Branch of Command Chain
struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0812
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   uint16_t counter;                    //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation
                                        //!<        differs if the result is zero
   rfc_radioOp_t *pNextOpIfOk;          //!<        Pointer to next operation if counter did not expire
};

//! @}

//! \addtogroup CMD_PATTERN_CHECK
//! @{
#define CMD_PATTERN_CHECK                                       0x0813
//! Command for Checking a Value in Memory aginst a Pattern
struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0813
   uint16_t status;                     //!< \brief An integer telling the status of the command. This value is
                                        //!<        updated by the radio CPU during operation and may be read by the
                                        //!<        system CPU at any time.
   rfc_radioOp_t *pNextOp;              //!<        Pointer to the next operation to run after this operation is done
   ratmr_t startTime;                   //!<        Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {
      uint8_t triggerType:4;            //!<        The type of trigger
      uint8_t bEnaCmd:1;                //!< \brief 0: No alternative trigger command<br>
                                        //!<        1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2;              //!<        The trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1;               //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!<        1: A trigger in the past is triggered as soon as possible
   } startTrigger;                      //!<        Identification of the trigger that starts the operation
   struct {
      uint8_t rule:4;                   //!<        Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4;                  //!<        Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   struct {
      uint16_t operation:2;             //!< \brief Operation to perform<br>
                                        //!<        0: True if value == <code>compareVal</code><br>
                                        //!<        1: True if value < <code>compareVal</code><br>
                                        //!<        2: True if value > <code>compareVal</code><br>
                                        //!<        3: <i>Reserved</i>
      uint16_t bByteRev:1;              //!< \brief If 1, interchange the four bytes of the value, so that they are read
                                        //!<        most-significant-byte-first.
      uint16_t bBitRev:1;               //!<        If 1, perform bit reversal of the value
      uint16_t signExtend:5;            //!< \brief 0: Treat value and <code>compareVal</code> as unsigned<br>
                                        //!<        1&ndash;31: Treat value and <code>compareVal</code> as signed, where the value
                                        //!<        gives the number of the most significant bit in the signed number.
      uint16_t bRxVal:1;                //!< \brief 0: Use <code>pValue</code> as a pointer<br>
                                        //!<        1: Use <code>pValue</code> as a signed offset to the start of the last
                                        //!<        committed RX entry element
   } patternOpt;                        //!<        Options for comparison
   rfc_radioOp_t *pNextOpIfOk;          //!<        Pointer to next operation if comparison result was true
   uint8_t* pValue;                     //!<        Pointer to read from, or offset from last RX entry if <code>patternOpt.bRxVal</code> == 1
   uint32_t mask;                       //!<        Bit mask to apply before comparison
   uint32_t compareVal;                 //!<        Value to compare to
};

//! @}

//! \addtogroup CMD_ABORT
//! @{
#define CMD_ABORT                                               0x0401
//! Abort Running Radio Operation Command
struct __RFC_STRUCT rfc_CMD_ABORT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0401
};

//! @}

//! \addtogroup CMD_STOP
//! @{
#define CMD_STOP                                                0x0402
//! Stop Running Radio Operation Command Gracefully
struct __RFC_STRUCT rfc_CMD_STOP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0402
};

//! @}

//! \addtogroup CMD_GET_RSSI
//! @{
#define CMD_GET_RSSI                                            0x0403
//! Read RSSI Command
struct __RFC_STRUCT rfc_CMD_GET_RSSI_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0403
};

//! @}

//! \addtogroup CMD_UPDATE_RADIO_SETUP
//! @{
#define CMD_UPDATE_RADIO_SETUP                                  0x0001
//! Update Radio Settings Command
struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0001
   uint16_t __dummy0;
   uint32_t* pRegOverride;              //!<        Pointer to a list of hardware and configuration registers to override
};

//! @}

//! \addtogroup CMD_TRIGGER
//! @{
#define CMD_TRIGGER                                             0x0404
//! Generate Command Trigger
struct __RFC_STRUCT rfc_CMD_TRIGGER_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0404
   uint8_t triggerNo;                   //!<        Command trigger number
};

//! @}

//! \addtogroup CMD_GET_FW_INFO
//! @{
#define CMD_GET_FW_INFO                                         0x0002
//! Request Information on the RF Core ROM Firmware
struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0002
   uint16_t versionNo;                  //!<        Firmware version number
   uint16_t startOffset;                //!<        The start of free RAM
   uint16_t freeRamSz;                  //!<        The size of free RAM
   uint16_t availRatCh;                 //!<        Bitmap of available RAT channels
};

//! @}

//! \addtogroup CMD_START_RAT
//! @{
#define CMD_START_RAT                                           0x0405
//! Asynchronously Start Radio Timer Command
struct __RFC_STRUCT rfc_CMD_START_RAT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0405
};

//! @}

//! \addtogroup CMD_PING
//! @{
#define CMD_PING                                                0x0406
//! Respond with Command ACK Only
struct __RFC_STRUCT rfc_CMD_PING_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0406
};

//! @}

//! \addtogroup CMD_READ_RFREG
//! @{
#define CMD_READ_RFREG                                          0x0601
//! Read RF Core Hardware Register
struct __RFC_STRUCT rfc_CMD_READ_RFREG_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0601
   uint16_t address;                    //!<        The offset from the start of the RF core HW register bank (0x40040000)
   uint32_t value;                      //!<        Returned value of the register
};

//! @}

//! \addtogroup CMD_ADD_DATA_ENTRY
//! @{
#define CMD_ADD_DATA_ENTRY                                      0x0005
//! Add Data Entry to Queue
struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0005
   uint16_t __dummy0;
   dataQueue_t* pQueue;                 //!<        Pointer to the queue structure to which the entry will be added
   uint8_t* pEntry;                     //!<        Pointer to the entry
};

//! @}

//! \addtogroup CMD_REMOVE_DATA_ENTRY
//! @{
#define CMD_REMOVE_DATA_ENTRY                                   0x0006
//! Remove First Data Entry from Queue
struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0006
   uint16_t __dummy0;
   dataQueue_t* pQueue;                 //!<        Pointer to the queue structure from which the entry will be removed
   uint8_t* pEntry;                     //!<        Pointer to the entry that was removed
};

//! @}

//! \addtogroup CMD_FLUSH_QUEUE
//! @{
#define CMD_FLUSH_QUEUE                                         0x0007
//! Flush Data Queue
struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0007
   uint16_t __dummy0;
   dataQueue_t* pQueue;                 //!<        Pointer to the queue structure to be flushed
   uint8_t* pFirstEntry;                //!<        Pointer to the first entry that was removed
};

//! @}

//! \addtogroup CMD_CLEAR_RX
//! @{
#define CMD_CLEAR_RX                                            0x0008
//! Clear all RX Queue Entries
struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0008
   uint16_t __dummy0;
   dataQueue_t* pQueue;                 //!<        Pointer to the queue structure to be cleared
};

//! @}

//! \addtogroup CMD_REMOVE_PENDING_ENTRIES
//! @{
#define CMD_REMOVE_PENDING_ENTRIES                              0x0009
//! Remove Pending Entries from Queue
struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0009
   uint16_t __dummy0;
   dataQueue_t* pQueue;                 //!<        Pointer to the queue structure to be flushed
   uint8_t* pFirstEntry;                //!<        Pointer to the first entry that was removed
};

//! @}

//! \addtogroup CMD_SET_RAT_CMP
//! @{
#define CMD_SET_RAT_CMP                                         0x000A
//! Set Radio Timer Channel in Compare Mode
struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s {
   uint16_t commandNo;                  //!<        The command ID number 0x000A
   uint8_t ratCh;                       //!<        The radio timer channel number
   uint8_t __dummy0;
   ratmr_t compareTime;                 //!<        The time at which the compare occurs
};

//! @}

//! \addtogroup CMD_SET_RAT_CPT
//! @{
#define CMD_SET_RAT_CPT                                         0x0603
//! Set Radio Timer Channel in Capture Mode
struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0603
   struct {
      uint16_t :3;
      uint16_t inputSrc:5;              //!<        Input source indicator
      uint16_t ratCh:4;                 //!<        The radio timer channel number
      uint16_t bRepeated:1;             //!< \brief 0: Single capture mode<br>
                                        //!<        1: Repeated capture mode
      uint16_t inputMode:2;             //!< \brief Input mode:<br>
                                        //!<        0: Capture on rising edge<br>
                                        //!<        1: Capture on falling edge<br>
                                        //!<        2: Capture on both edges<br>
                                        //!<        3: <i>Reserved</i>
   } config;
};

//! @}

//! \addtogroup CMD_DISABLE_RAT_CH
//! @{
#define CMD_DISABLE_RAT_CH                                      0x0408
//! Disable Radio Timer Channel
struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0408
   uint8_t ratCh;                       //!<        The radio timer channel number
};

//! @}

//! \addtogroup CMD_SET_RAT_OUTPUT
//! @{
#define CMD_SET_RAT_OUTPUT                                      0x0604
//! Set Radio Timer Output to a Specified Mode
struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0604
   struct {
      uint16_t :2;
      uint16_t outputSel:3;             //!<        Output event indicator
      uint16_t outputMode:3;            //!< \brief 0: Set output line low as default; and pulse on event. Duration of pulse is one RF Core clock period (ca. 41.67 ns).<br>
                                        //!<        1: Set output line high on event<br>
                                        //!<        2: Set output line low on event<br>
                                        //!<        3: Toggle (invert) output line state on event<br>
                                        //!<        4: Immediately set output line to low (does not change upon event)<br>
                                        //!<        5: Immediately set output line to high (does not change upon event)<br>
                                        //!<        Others: <i>Reserved</i>
      uint16_t ratCh:4;                 //!<        The radio timer channel number
   } config;
};

//! @}

//! \addtogroup CMD_ARM_RAT_CH
//! @{
#define CMD_ARM_RAT_CH                                          0x0409
//! Arm Radio Timer Channel
struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0409
   uint8_t ratCh;                       //!<        The radio timer channel number
};

//! @}

//! \addtogroup CMD_DISARM_RAT_CH
//! @{
#define CMD_DISARM_RAT_CH                                       0x040A
//! Disarm Radio Timer Channel
struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s {
   uint16_t commandNo;                  //!<        The command ID number 0x040A
   uint8_t ratCh;                       //!<        The radio timer channel number
};

//! @}

//! \addtogroup CMD_SET_TX_POWER
//! @{
#define CMD_SET_TX_POWER                                        0x0010
//! Set Transmit Power
struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0010
   uint16_t txPower;                    //!<        New TX power setting
};

//! @}

//! \addtogroup CMD_UPDATE_FS
//! @{
#define CMD_UPDATE_FS                                           0x0011
//! Set New Synthesizer Frequency without Recalibration
struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s {
   uint16_t commandNo;                  //!<        The command ID number 0x0011
   uint16_t __dummy0;
   uint32_t __dummy1;
   uint32_t __dummy2;
   uint16_t __dummy3;
   uint16_t frequency;                  //!<        The frequency in MHz to tune to
   uint16_t fractFreq;                  //!<        Fractional part of the frequency to tune to
};

//! @}

//! \addtogroup CMD_BUS_REQUEST
//! @{
#define CMD_BUS_REQUEST                                         0x040E
//! Request System Bus to be Availbale
struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s {
   uint16_t commandNo;                  //!<        The command ID number 0x040E
   uint8_t bSysBusNeeded;               //!< \brief 0: System bus may sleep<br>
                                        //!<        1: System bus access needed
};

//! @}

//! @}
//! @}
#endif
