#
################################################################################
- {
  section: Common,

  ncpCpps: ~,

  typedefs: [
    {
      name: "EmberNodeId",
      description: "16-bit ZigBee network address.",
      definition: "uint16_t"
    },
    {
      name: "EmberPanId",
      description: "802.15.4 PAN ID.",
      definition: "uint16_t"
    },
    {
      name: "EmberMulticastId",
      description: "16-bit ZigBee multicast group identifier.",
      definition: "uint16_t"
    },
    {
      name: "EmberEUI64",
      description: "EUI 64-bit ID (an IEEE address).",
      definition: "uint8_t[8]"
    },
    {
      name: "EmberNetworkParameters",
      description: "Network parameters.",
      definition: [
        {
          type: "uint8_t[8]",
          name: "extendedPanId",
          description: "The network's extended PAN identifier.",
        },
        {
          type: "uint16_t",
          name: "panId",
          description: "The network's PAN identifier.",
        },
        {
          type: "int8_t",
          name: "radioTxPower",
          description: "A power setting, in dBm.",
        },
        {
          type: "uint8_t",
          name: "radioChannel",
          description: "A radio channel.",
        },
        {
          type: "EmberJoinMethod",
          name: "joinMethod",
          description: "The method used to initially join the network.",
        },
        {
          type: "EmberNodeId",
          name: "nwkManagerId",
          description: "NWK Manager ID. The ID of the network manager
                        in the current network. This may only be set
                        at joining when using EMBER_USE_NWK_COMMISSIONING
                        as the join method.",
        },
        {
          type: "uint8_t",
          name: "nwkUpdateId",
          description: "NWK Update ID. The value of the ZigBee
                        nwkUpdateId known by the stack. This is used to
                        determine the newest instance of the network
                        after a PAN ID or channel change. This may
                        only be set at joining when using
                        EMBER_USE_NWK_COMMISSIONING as the join method.",
        },
        {
          type: "uint32_t",
          name: "channels",
          description: "NWK channel mask. The list of preferred
                        channels that the NWK manager has told this
                        device to use when searching for the network.
                        This may only be set at joining when using
                        EMBER_USE_NWK_COMMISSIONING as the join method.",
        },
      ]
    },
    {
      name: "EmberMultiPhyRadioParameters",
      description: "Radio parameters.",
      definition: [
        {
          type: "int8_t",
          name: "radioTxPower",
          description: "A power setting, in dBm.",
        },
        {
          type: "uint8_t",
          name: "radioPage",
          description: "A radio page.",
        },
        {
          type: "uint8_t",
          name: "radioChannel",
          description: "A radio channel.",
        },
      ]
    },
    {
      name: "EmberZigbeeNetwork",
      description: "The parameters of a ZigBee network.",
      definition: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The 802.15.4 channel associated with the
                        network.",
        },
        {
          type: "uint16_t",
          name: "panId",
          description: "The network's PAN identifier.",
        },
        {
          type: "uint8_t[8]",
          name: "extendedPanId",
          description: "The network's extended PAN identifier.",
        },
        {
          type: "bool",
          name: "allowingJoin",
          description: "Whether the network is allowing MAC associations.",
        },
        {
          type: "uint8_t",
          name: "stackProfile",
          description: "The Stack Profile associated with the network.",
        },
        {
          type: "uint8_t",
          name: "nwkUpdateId",
          description: "The instance of the Network.",
        },
      ]
    },
    {
      name: "EmberApsFrame",
      description: "ZigBee APS frame parameters.",
      definition: [
        {
          type: "uint16_t",
          name: "profileId",
          description: "The application profile ID that describes the
                        format of the message.",
        },
        {
          type: "uint16_t",
          name: "clusterId",
          description: "The cluster ID for this message.",
        },
        {
          type: "uint8_t",
          name: "sourceEndpoint",
          description: "The source endpoint.",
        },
        {
          type: "uint8_t",
          name: "destinationEndpoint",
          description: "The destination endpoint.",
        },
        {
          type: "EmberApsOption",
          name: "options",
          description: "A bitmask of options.",
        },
        {
          type: "uint16_t",
          name: "groupId",
          description: "The group ID for this message, if it is
                        multicast mode.",
        },
        {
          type: "uint8_t",
          name: "sequence",
          description: "The sequence number.",
        },
      ]
    },
    {
      name: "EmberBindingTableEntry",
      description: "An entry in the binding table.",
      definition: [
        {
          type: "EmberBindingType",
          name: "type",
          description: "The type of binding.",
        },
        {
          type: "uint8_t",
          name: "local",
          description: "The endpoint on the local node.",
        },
        {
          type: "uint16_t",
          name: "clusterId",
          description: "A cluster ID that matches one from the local
                        endpoint's simple descriptor. This cluster ID is
                        set by the provisioning application to indicate
                        which part an endpoint's functionality is bound
                        to this particular remote node and is used to
                        distinguish between unicast and multicast
                        bindings. Note that a binding can be used to
                        send messages with any cluster ID, not just
                        the one listed in the binding.",
        },
        {
          type: "uint8_t",
          name: "remote",
          description: "The endpoint on the remote node (specified by
                        identifier).",
        },
        {
          type: "EmberEUI64",
          name: "identifier",
          description: "A 64-bit identifier. This is either the
                        destination EUI64 (for unicasts) or the 64-bit
                        group address (for multicasts).",
        },
        {
          type: "uint8_t",
          name: "networkIndex",
          description: "The index of the network the binding belongs
                        to.",
        },
      ]
    },
    {
      name: "EmberMulticastTableEntry",
      description: "A multicast table entry indicates that a particular
                    endpoint is a member of a particular multicast
                    group. Only devices with an endpoint in a multicast
                    group will receive messages sent to that multicast
                    group.",
      definition: [
        {
          type: "EmberMulticastId",
          name: "multicastId",
          description: "The multicast group ID.",
        },
        {
          type: "uint8_t",
          name: "endpoint",
          description: "The endpoint that is a member, or 0 if this
                        entry is not in use (the ZDO is not a member
                        of any multicast groups.)",
        },
        {
          type: "uint8_t",
          name: "networkIndex",
          description: "The network index of the network the entry is
                        related to.",
        },
      ]
    },
    {
      name: "EmberKeyData",
      description: "A 128-bit key.",
      definition: [
        {
          type: "uint8_t[16]",
          name: "contents",
          description: "The key data.",
        },
      ]
    },
    {
      name: "EmberCertificateData",
      description: "The implicit certificate used in CBKE.",
      definition: [
        {
          type: "uint8_t[48]",
          name: "contents",
          description: "The certificate data.",
        },
      ]
    },
    {
      name: "EmberPublicKeyData",
      description: "The public key data used in CBKE.",
      definition: [
        {
          type: "uint8_t[22]",
          name: "contents",
          description: "The public key data.",
        },
      ]
    },
    {
      name: "EmberPrivateKeyData",
      description: "The private key data used in CBKE.",
      definition: [
        {
          type: "uint8_t[21]",
          name: "contents",
          description: "The private key data.",
        },
      ]
    },
    {
      name: "EmberSmacData",
      description: "The Shared Message Authentication Code data used in
                    CBKE.",
      definition: [
        {
          type: "uint8_t[16]",
          name: "contents",
          description: "The Shared Message Authentication Code data.",
        },
      ]
    },
    {
      name: "EmberSignatureData",
      description: "An ECDSA signature",
      definition: [
        {
          type: "uint8_t[42]",
          name: "contents",
          description: "The signature data.",
        },
      ]
    },
    {
      name: "EmberCertificate283k1Data",
      description: "The implicit certificate used in CBKE.",
      definition: [
        {
          type: "uint8_t[74]",
          name: "contents",
          description: "The 283k1 certificate data.",
        },
      ]
    },
    {
      name: "EmberPublicKey283k1Data",
      description: "The public key data used in CBKE.",
      definition: [
        {
          type: "uint8_t[37]",
          name: "contents",
          description: "The 283k1 public key data.",
        },
      ]
    },
    {
      name: "EmberPrivateKey283k1Data",
      description: "The private key data used in CBKE.",
      definition: [
        {
          type: "uint8_t[36]",
          name: "contents",
          description: "The 283k1 private key data.",
        },
      ]
    },
    {
      name: "EmberSignature283k1Data",
      description: "An ECDSA signature",
      definition: [
        {
          type: "uint8_t[72]",
          name: "contents",
          description: "The 283k1 signature data.",
        },
      ]
    },
    {
      name: "EmberMessageDigest",
      description: "The calculated digest of a message",
      definition: [
        {
          type: "uint8_t[16]",
          name: "contents",
          description: "The calculated digest of a message.",
        },
      ]
    },
    {
      name: "EmberAesMmoHashContext",
      description: "The hash context for an ongoing hash operation.",
      definition: [
        {
          type: "uint8_t[16]",
          name: "result",
          description: "The result of ongoing the hash operation.",
        },
        {
          type: "uint32_t",
          name: "length",
          description: "The total length of the data that has been
                        hashed so far.",
        },
      ]
    },
{
name: "EmberBeaconClassificationParams",
description: "The parameters related to beacon prioritization.",
definition: [
{
type: "int8_t",
name: "minRssiForReceivingPkts",
description: "The min rssi value for receiving packets that is used is some beacon prioritization algorithms.",
},
{
type: "uint16_t",
name: "beaconClassificationMask",
description: "The beacon classification mask that identifies which beacon prioritization algorithm to pick, and defines the relevant parameters.",
},
]
},
    {
      name: "EmberNeighborTableEntry",
      description: "A neighbor table entry stores information about the
                    reliability of RF links to and from neighboring
                    nodes.",
      definition: [
        {
          type: "uint16_t",
          name: "shortId",
          description: "The neighbor's two byte network id",
        },
        {
          type: "uint8_t",
          name: "averageLqi",
          description: "An exponentially weighted moving average of the
                        link quality values of incoming packets from
                        this neighbor as reported by the PHY.",
        },
        {
          type: "uint8_t",
          name: "inCost",
          description: "The incoming cost for this neighbor, computed
                        from the average LQI. Values range from 1 for
                        a good link to 7 for a bad link.",
        },
        {
          type: "uint8_t",
          name: "outCost",
          description: "The outgoing cost for this neighbor, obtained
                        from the most recently received neighbor exchange
                        message from the neighbor. A value of zero
                        means that a neighbor exchange message from the
                        neighbor has not been received recently enough,
                        or that our id was not present in the most
                        recently received one.",
        },
        {
          type: "uint8_t",
          name: "age",
          description: "The number of aging periods elapsed since a
                        link status message was last received from this
                        neighbor. The aging period is 16 seconds.",
        },
        {
          type: "EmberEUI64",
          name: "longId",
          description: "The 8 byte EUI64 of the neighbor.",
        },
      ]
    },
    {
      name: "EmberRouteTableEntry",
      description: "A route table entry stores information about the
                    next hop along the route to the destination.",
      definition: [
        {
          type: "uint16_t",
          name: "destination",
          description: "The short id of the destination. A value of
                        0xFFFF indicates the entry is unused.",
        },
        {
          type: "uint16_t",
          name: "nextHop",
          description: "The short id of the next hop to this
                        destination.",
        },
        {
          type: "uint8_t",
          name: "status",
          description: "Indicates whether this entry is active (0),
                        being discovered (1), unused (3), or validating
                        (4).",
        },
        {
          type: "uint8_t",
          name: "age",
          description: "The number of seconds since this route entry
                        was last used to send a packet.",
        },
        {
          type: "uint8_t",
          name: "concentratorType",
          description: "Indicates whether this destination is a High
                        RAM Concentrator (2), a Low RAM Concentrator
                        (1), or not a concentrator (0).",
        },
        {
          type: "uint8_t",
          name: "routeRecordState",
          description: "For a High RAM Concentrator, indicates whether
                        a route record is needed (2), has been sent
                        (1), or is no long needed (0) because a source
                        routed message from the concentrator has been
                        received.",
        },
      ]
    },
    {
      name: "EmberInitialSecurityState",
      description: "The security data used to set the configuration
                    for the stack, or the retrieved configuration
                    currently in use.",
      definition: [
        {
          type: "EmberInitialSecurityBitmask",
          name: "bitmask",
          description: "A bitmask indicating the security state used to
                        indicate what the security configuration will be
                        when the device forms or joins the network.",
        },
        {
          type: "EmberKeyData",
          name: "preconfiguredKey",
          description: "The pre-configured Key data that should be used
                        when forming or joining the network. The
                        security bitmask must be set with the
                        EMBER_HAVE_PRECONFIGURED_KEY bit to indicate that
                        the key contains valid data.",
        },
        {
          type: "EmberKeyData",
          name: "networkKey",
          description: "The Network Key that should be used by the
                        Trust Center when it forms the network, or the
                        Network Key currently in use by a joined
                        device. The security bitmask must be set with
                        EMBER_HAVE_NETWORK_KEY to indicate that the key
                        contains valid data.",
        },
        {
          type: "uint8_t",
          name: "networkKeySequenceNumber",
          description: "The sequence number associated with the network
                        key. This is only valid if the
                        EMBER_HAVE_NETWORK_KEY has been set in the
                        security bitmask.",
        },
        {
          type: "EmberEUI64",
          name: "preconfiguredTrustCenterEui64",
          description: "This is the long address of the trust center
                        on the network that will be joined. It is
                        usually NOT set prior to joining the network
                        and instead it is learned during the joining
                        message exchange. This field is only examined if
                        ::EMBER_HAVE_TRUST_CENTER_EUI64 is set in the
                        EmberInitialSecurityState::bitmask. Most devices
                        should clear that bit and leave this field
                        alone. This field must be set when using
                        commissioning mode.",
        },
      ]
    },
    {
      name: "EmberCurrentSecurityState",
      description: "The security options and information currently used
                    by the stack.",
      definition: [
        {
          type: "EmberCurrentSecurityBitmask",
          name: "bitmask",
          description: "A bitmask indicating the security options
                        currently in use by a device joined in the
                        network.",
        },
        {
          type: "EmberEUI64",
          name: "trustCenterLongAddress",
          description: "The IEEE Address of the Trust Center device.",
        },
      ]
    },
    {
      name: "EmberKeyStruct",
      description: "A structure containing a key and its associated
                    data.",
      definition: [
        {
          type: "EmberKeyStructBitmask",
          name: "bitmask",
          description: "A bitmask indicating the presence of data
                        within the various fields in the structure.",
        },
        {
          type: "EmberKeyType",
          name: "type",
          description: "The type of the key.",
        },
        {
          type: "EmberKeyData",
          name: "key",
          description: "The actual key data.",
        },
        {
          type: "uint32_t",
          name: "outgoingFrameCounter",
          description: "The outgoing frame counter associated with the
                        key.",
        },
        {
          type: "uint32_t",
          name: "incomingFrameCounter",
          description: "The frame counter of the partner device
                        associated with the key.",
        },
        {
          type: "uint8_t",
          name: "sequenceNumber",
          description: "The sequence number associated with the key.",
        },
        {
          type: "EmberEUI64",
          name: "partnerEUI64",
          description: "The IEEE address of the partner device also in
                        possession of the key.",
        },
      ]
    },
    {
      name: "EmberNetworkInitStruct",
      description: "Network Initialization parameters.",
      definition: [
        {
          type: "EmberNetworkInitBitmask",
          name: "bitmask",
          description: "Configuration options for network init.",
        },
      ]
    },
    {
      name: "EmberZllSecurityAlgorithmData",
      description: "Data associated with the ZLL security algorithm.",
      definition: [
        {
          type: "uint32_t",
          name: "transactionId",
          description: "Transaction identifier.",
        },
        {
          type: "uint32_t",
          name: "responseId",
          description: "Response identifier.",
        },
        {
          type: "uint16_t",
          name: "bitmask",
          description: "Bitmask.",
        },
      ]
    },
    {
      name: "EmberZllNetwork",
      description: "The parameters of a ZLL network.",
      definition: [
        {
          type: "EmberZigbeeNetwork",
          name: "zigbeeNetwork",
          description: "The parameters of a ZigBee network.",
        },
        {
          type: "EmberZllSecurityAlgorithmData",
          name: "securityAlgorithm",
          description: "Data associated with the ZLL security algorithm.",
        },
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "Associated EUI64.",
        },
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The node id.",
        },
        {
          type: "EmberZllState",
          name: "state",
          description: "The ZLL state.",
        },
        {
          type: "EmberNodeType",
          name: "nodeType",
          description: "The node type.",
        },
        {
          type: "uint8_t",
          name: "numberSubDevices",
          description: "The number of sub devices.",
        },
        {
          type: "uint8_t",
          name: "totalGroupIdentifiers",
          description: "The total number of group identifiers.",
        },
        {
          type: "uint8_t",
          name: "rssiCorrection",
          description: "RSSI correction value.",
        },
      ]
    },
    {
      name: "EmberZllInitialSecurityState",
      description: "Describes the initial security features and
                    requirements that will be used when forming or
                    joining ZLL networks.",
      definition: [
        {
          type: "uint32_t",
          name: "bitmask",
          description: "Unused bitmask; reserved for future use.",
        },
        {
          type: "EmberZllKeyIndex",
          name: "keyIndex",
          description: "The key encryption algorithm advertised by the
                        application.",
        },
        {
          type: "EmberKeyData",
          name: "encryptionKey",
          description: "The encryption key for use by algorithms that
                        require it.",
        },
        {
          type: "EmberKeyData",
          name: "preconfiguredKey",
          description: "The pre-configured link key used during
                        classical ZigBee commissioning.",
        },
      ]
    },
    {
      name: "EmberZllDeviceInfoRecord",
      description: "Information about a specific ZLL Device.",
      definition: [
        {
          type: "EmberEUI64",
          name: "ieeeAddress",
          description: "EUI64 associated with the device.",
        },
        {
          type: "uint8_t",
          name: "endpointId",
          description: "Endpoint id.",
        },
        {
          type: "uint16_t",
          name: "profileId",
          description: "Profile id.",
        },
        {
          type: "uint16_t",
          name: "deviceId",
          description: "Device id.",
        },
        {
          type: "uint8_t",
          name: "version",
          description: "Associated version.",
        },
        {
          type: "uint8_t",
          name: "groupIdCount",
          description: "Number of relevant group ids.",
        },
      ]
    },
    {
      name: "EmberZllAddressAssignment",
      description: "ZLL address assignment data.",
      definition: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "Relevant node id.",
        },
        {
          type: "EmberNodeId",
          name: "freeNodeIdMin",
          description: "Minimum free node id.",
        },
        {
          type: "EmberNodeId",
          name: "freeNodeIdMax",
          description: "Maximum free node id.",
        },
        {
          type: "EmberMulticastId",
          name: "groupIdMin",
          description: "Minimum group id.",
        },
        {
          type: "EmberMulticastId",
          name: "groupIdMax",
          description: "Maximum group id.",
        },
        {
          type: "EmberMulticastId",
          name: "freeGroupIdMin",
          description: "Minimum free group id.",
        },
        {
          type: "EmberMulticastId",
          name: "freeGroupIdMax",
          description: "Maximum free group id.",
        },
      ]
    },
    {
      name: "EmberTokTypeStackZllData",
      description: "Public API for ZLL stack data token.",
      definition: [
        {
          type: "uint32_t",
          name: "bitmask",
          description: "Token bitmask.",
        },
        {
          type: "uint16_t",
          name: "freeNodeIdMin",
          description: "Minimum free node id.",
        },
        {
          type: "uint16_t",
          name: "freeNodeIdMax",
          description: "Maximum free node id.",
        },
        {
          type: "uint16_t",
          name: "myGroupIdMin",
          description: "Local minimum group id.",
        },
        {
          type: "uint16_t",
          name: "freeGroupIdMin",
          description: "Minimum free group id.",
        },
        {
          type: "uint16_t",
          name: "freeGroupIdMax",
          description: "Maximum free group id.",
        },
        {
          type: "uint8_t",
          name: "rssiCorrection",
          description: "RSSI correction value.",
        },
      ]
    },
    {
      name: "EmberTokTypeStackZllSecurity",
      description: "Public API for ZLL stack security token.",
      definition: [
        {
          type: "uint32_t",
          name: "bitmask",
          description: "Token bitmask.",
        },
        {
          type: "uint8_t",
          name: "keyIndex",
          description: "Key index.",
        },
        {
          type: "uint8_t[16]",
          name: "encryptionKey",
          description: "Encryption key.",
        },
        {
          type: "uint8_t[16]",
          name: "preconfiguredKey",
          description: "Preconfigured key.",
        },
      ]
    },
    {
      name: "EmberDutyCycleHectoPct",
      description: "The percent of duty cycle for a limit.
                    Duty Cycle, Limits, and Thresholds are reported in
                    units of Percent * 100 (i.e. 10000 = 100.00%, 1 = 0.01%).",
      definition: "uint16_t"
    },
    {
      name: "EmberDutyCycleLimits",
      description: "A structure containing duty cycle limit configurations.
                    All limits are absolute, and are required to be as
                    follows: suspLimit > critThresh > limitThresh
                    For example:  suspLimit = 250 (2.5%),
                    critThresh = 180 (1.8%), limitThresh 100 (1.00%).",
      definition: [
        {
          type: "EmberDutyCycleHectoPct",
          name: "limitThresh",
          description: "The Limited Threshold in % * 100",
        },
        {
          type: "EmberDutyCycleHectoPct",
          name: "critThresh",
          description: "The Critical Threshold in % * 100.",
        },
        {
          type: "EmberDutyCycleHectoPct",
          name: "suspLimit",
          description: "The Suspended Limit (LBT) in % * 100.",
        },
      ]
    },
    {
      name: "EmberPerDeviceDutyCycle",
      description: "A structure containing per device overall duty cycle
                    consumed (up to the suspend limit).",
      definition: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "Node Id of device whose duty cycle is reported.",
        },
        {
          type: "EmberDutyCycleHectoPct",
          name: "dutyCycleConsumed",
          description: "Amount of overall duty cycle consumed (up to suspend limit).",
        },
      ]
    },
    {
      name: "EmberTransientKeyData",
      description: "The transient key data structure.",
      definition: [
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The IEEE address paired with the transient link key.",
        },
        {
          type: "EmberKeyData",
          name: "keyData",
          description: "The key data structure matching the transient key.",
        },
        {
          type: "uint32_t",
          name: "incomingFrameCounter",
          description: "The incoming frame counter associated with this key.",
        },
        {
          type: "uint32_t",
          name: "countdownTimerMs",
          description: "The number of milliseconds remaining before the key is
                        automatically timed out of the transient key table.",
        },
      ]
    },
    {
      name: "EmberChildData",
      description: "A structure containing a child node's data.",
      definition: [
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The EUI64 of the child",
        },
        {
          type: "EmberNodeType",
          name: "type",
          description: "The node type of the child",
        },
        {
          type: "EmberNodeId",
          name: "id",
          description: "The short address of the child",
        },
        {
          type: "uint8_t",
          name: "phy",
          description: "The phy of the child",
        },
        {
          type: "uint8_t",
          name: "power",
          description: "The power of the child",
        },
        {
          type: "uint8_t",
          name: "timeout",
          description: "The timeout of the child",
        },
      ],
    },
  ],

  enums: [
    {
      name: "bool",
      type: "uint8_t",
      description: "Boolean type with values true and false.",
      items: [
        {
          name: "false",
          value: "0x00",
          description: "An alias for zero, used for clarity.",
        },
        {
          name: "true",
          value: "0x01",
          description: "An alias for one, used for clarity.",
        },
      ],
    },
    {
      name: "EzspConfigId",
      type: "uint8_t",
      description: "Identifies a configuration value.",
      items: [
        {
          name: "EZSP_CONFIG_PACKET_BUFFER_COUNT",
          value: "0x01",
          description: "The number of packet buffers available to the
                        stack. When set to the special value 0xFF,
                        the NCP will allocate all remaining
                        configuration RAM towards packet buffers,
                        such that the resulting count will be the
                        largest whole number of packet buffers
                        that can fit into the available memory.",
        },
        {
          name: "EZSP_CONFIG_NEIGHBOR_TABLE_SIZE",
          value: "0x02",
          description: "The maximum number of router neighbors the
                        stack can keep track of. A neighbor is a node
                        within radio range.",
        },
        {
          name: "EZSP_CONFIG_APS_UNICAST_MESSAGE_COUNT",
          value: "0x03",
          description: "The maximum number of APS retried messages the
                        stack can be transmitting at any time.",
        },
        {
          name: "EZSP_CONFIG_BINDING_TABLE_SIZE",
          value: "0x04",
          description: "The maximum number of non-volatile bindings
                        supported by the stack.",
        },
        {
          name: "EZSP_CONFIG_ADDRESS_TABLE_SIZE",
          value: "0x05",
          description: "The maximum number of EUI64 to network address
                        associations that the stack can maintain for
                        the application. (Note, the total number of such
                        address associations maintained by the NCP is
                        the sum of the value of this setting and the value
                        of ::EZSP_CONFIG_TRUST_CENTER_ADDRESS_CACHE_SIZE.",
        },
        {
          name: "EZSP_CONFIG_MULTICAST_TABLE_SIZE",
          value: "0x06",
          description: "The maximum number of multicast groups that the
                        device may be a member of.",
        },
        {
          name: "EZSP_CONFIG_ROUTE_TABLE_SIZE",
          value: "0x07",
          description: "The maximum number of destinations to which a
                        node can route messages. This includes both
                        messages originating at this node and those
                        relayed for others.",
        },
        {
          name: "EZSP_CONFIG_DISCOVERY_TABLE_SIZE",
          value: "0x08",
          description: "The number of simultaneous route discoveries
                        that a node will support.",
        },
        {
          name: "EZSP_CONFIG_STACK_PROFILE",
          value: "0x0C",
          description: "Specifies the stack profile.",
        },
        {
          name: "EZSP_CONFIG_SECURITY_LEVEL",
          value: "0x0D",
          description: "The security level used for security at the
                        MAC and network layers. The supported values are
                        0 (no security) and 5 (payload is encrypted and
                        a four-byte MIC is used for authentication).",
        },
        {
          name: "EZSP_CONFIG_MAX_HOPS",
          value: "0x10",
          description: "The maximum number of hops for a message.",
        },
        {
          name: "EZSP_CONFIG_MAX_END_DEVICE_CHILDREN",
          value: "0x11",
          description: "The maximum number of end device children that
                        a router will support.",
        },
        {
          name: "EZSP_CONFIG_INDIRECT_TRANSMISSION_TIMEOUT",
          value: "0x12",
          description: "The maximum amount of time that the MAC will
                        hold a message for indirect transmission to a
                        child.",
        },
        {
          name: "EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT",
          value: "0x13",
          description: "The maximum amount of time that an end device
                        child can wait between polls. If no poll is
                        heard within this timeout, then the parent
                        removes the end device from its tables.",
        },
        {
          name: "EZSP_CONFIG_TX_POWER_MODE",
          value: "0x17",
          description: "Enables boost power mode and/or the alternate
                        transmitter output.",
        },
        {
          name: "EZSP_CONFIG_DISABLE_RELAY",
          value: "0x18",
          description: "0: Allow this node to relay messages. 1:
                        Prevent this node from relaying messages.",
        },
        {
          name: "EZSP_CONFIG_TRUST_CENTER_ADDRESS_CACHE_SIZE",
          value: "0x19",
          description: "The maximum number of EUI64 to network address
                        associations that the Trust Center can maintain.
                        These address cache entries are reserved for and
                        reused by the Trust Center when processing device
                        join/rejoin authentications. This cache size
                        limits the number of overlapping joins the Trust
                        Center can process within a narrow time window
                        (e.g. two seconds), and thus should be set to the
                        maximum number of near simultaneous joins the Trust
                        Center is expected to accommodate. (Note, the total
                        number of such address associations maintained by
                        the NCP is the sum of the value of this setting and
                        the value of ::EZSP_CONFIG_ADDRESS_TABLE_SIZE.)",
        },
        {
          name: "EZSP_CONFIG_SOURCE_ROUTE_TABLE_SIZE",
          value: "0x1A",
          description: "The size of the source route table.",
        },
        {
          name: "EZSP_CONFIG_END_DEVICE_POLL_TIMEOUT_SHIFT",
          value: "0x1B",
          description: "The units used for timing out end devices on
                        their parents.",
        },
        {
          name: "EZSP_CONFIG_FRAGMENT_WINDOW_SIZE",
          value: "0x1C",
          description: "The number of blocks of a fragmented message
                        that can be sent in a single window.",
        },
        {
          name: "EZSP_CONFIG_FRAGMENT_DELAY_MS",
          value: "0x1D",
          description: "The time the stack will wait (in milliseconds)
                        between sending blocks of a fragmented message.",
        },
        {
          name: "EZSP_CONFIG_KEY_TABLE_SIZE",
          value: "0x1E",
          description: "The size of the Key Table used for storing
                        individual link keys (if the device is a Trust
                        Center) or Application Link Keys (if the device
                        is a normal node).",
        },
        {
          name: "EZSP_CONFIG_APS_ACK_TIMEOUT",
          value: "0x1F",
          description: "The APS ACK timeout value. The stack waits
                        this amount of time between resends of APS
                        retried messages.",
        },
        {
          name: "EZSP_CONFIG_BEACON_JITTER_DURATION",
          value: "0x20",
          description: "The duration of a beacon jitter, in the units
                        used by the 15.4 scan parameter (((1 <<
                        duration) + 1) * 15ms), when responding to a beacon
                        request.",
        },
        {
          name: "EZSP_CONFIG_END_DEVICE_BIND_TIMEOUT",
          value: "0x21",
          description: "The time the coordinator will wait (in seconds)
                        for a second end device bind request to arrive.",
        },
        {
          name: "EZSP_CONFIG_PAN_ID_CONFLICT_REPORT_THRESHOLD",
          value: "0x22",
          description: "The number of PAN id conflict reports that
                        must be received by the network manager within
                        one minute to trigger a PAN id change.",
        },
        {
          name: "EZSP_CONFIG_REQUEST_KEY_TIMEOUT",
          value: "0x24",
          description: "The timeout value in minutes for how long the
                        Trust Center or a normal node waits for the
                        ZigBee Request Key to complete. On the Trust
                        Center this controls whether or not the device
                        buffers the request, waiting for a matching pair
                        of ZigBee Request Key. If the value is
                        non-zero, the Trust Center buffers and waits for
                        that amount of time. If the value is zero, the
                        Trust Center does not buffer the request and
                        immediately responds to the request. Zero is the
                        most compliant behavior.",
        },
        {
          name: "EZSP_CONFIG_CERTIFICATE_TABLE_SIZE",
          value: "0x29",
          description: "This value indicates the size of the runtime
                        modifiable certificate table. Normally certificates
                        are stored in MFG tokens but this table can be
                        used to field upgrade devices with new Smart
                        Energy certificates. This value cannot be set,
                        it can only be queried.",
        },
        {
          name: "EZSP_CONFIG_APPLICATION_ZDO_FLAGS",
          value: "0x2A",
          description: "This is a bitmask that controls which incoming
                        ZDO request messages are passed to the
                        application. The bits are defined in the
                        EmberZdoConfigurationFlags enumeration. To see if
                        the application is required to send a ZDO
                        response in reply to an incoming message, the
                        application must check the APS options bitfield
                        within the incomingMessageHandler callback to see
                        if the EMBER_APS_OPTION_ZDO_RESPONSE_REQUIRED flag
                        is set.",
        },
        {
          name: "EZSP_CONFIG_BROADCAST_TABLE_SIZE",
          value: "0x2B",
          description: "The maximum number of broadcasts during a
                        single broadcast timeout period.",
        },
        {
          name: "EZSP_CONFIG_MAC_FILTER_TABLE_SIZE",
          value: "0x2C",
          description: "The size of the MAC filter list table.",
        },
        {
          name: "EZSP_CONFIG_SUPPORTED_NETWORKS",
          value: "0x2D",
          description: "The number of supported networks.",
        },
        {
          name: "EZSP_CONFIG_SEND_MULTICASTS_TO_SLEEPY_ADDRESS",
          value: "0x2E",
          description: "Whether multicasts are sent to the
                        RxOnWhenIdle=true address (0xFFFD) or the sleepy
                        broadcast address (0xFFFF). The RxOnWhenIdle=true
                        address is the ZigBee compliant destination for
                        multicasts.",
        },
        {
          name: "EZSP_CONFIG_ZLL_GROUP_ADDRESSES",
          value: "0x2F",
          description: "ZLL group address initial configuration.",
        },
        {
          name: "EZSP_CONFIG_ZLL_RSSI_THRESHOLD",
          value: "0x30",
          description: "ZLL rssi threshold initial configuration.",
        },
        {
          name: "EZSP_CONFIG_MTORR_FLOW_CONTROL",
          value: "0x33",
          description: "Toggles the mtorr flow control in the stack.",
        },
        {
          name: "EZSP_CONFIG_RETRY_QUEUE_SIZE",
          value: "0x34",
          description: "Setting the retry queue size",
        },
        {
          name: "EZSP_CONFIG_NEW_BROADCAST_ENTRY_THRESHOLD",
          value: "0x35",
          description: "Setting the new broadcast entry threshold",
        },
        {
          name: "EZSP_CONFIG_TRANSIENT_KEY_TIMEOUT_S",
          value: "0x36",
          description: "The length of time, in seconds, that a trust center will
                        store a transient link key that a device can use
                        to join its network. A transient key is added with a call
                        to emberAddTransientLinkKey. After the transient key is
                        added, it will be removed once this amount of time has
                        passed. A joining device will not be able to use that
                        key to join until it is added again on the trust center.
                        The default value is 300 seconds, i.e., 5 minutes."
        },
        {
          name: "EZSP_CONFIG_BROADCAST_MIN_ACKS_NEEDED",
          value: "0x37",
          description: "The number of passive acknowledgements to record from
                        neighbors before we stop re-transmitting broadcasts",
        },
        {
          name: "EZSP_CONFIG_TC_REJOINS_USING_WELL_KNOWN_KEY_TIMEOUT_S",
          value: "0x38",
          description: "The length of time, in seconds, that a trust center will
                        allow a Trust Center (insecure) rejoin for a device that
                        is using the well-known link key. This timeout takes
                        effect once rejoins using the well-known key has been
                        allowed. This command updates the
                        emAllowTcRejoinsUsingWellKnownKeyTimeoutSec value.",
        },
      ],
    },
    {
      name: "EzspValueId",
      type: "uint8_t",
      description: "Identifies a value.",
      items: [
        {
          name: "EZSP_VALUE_TOKEN_STACK_NODE_DATA",
          value: "0x00",
          description: "The contents of the node data stack token.",
        },
        {
          name: "EZSP_VALUE_MAC_PASSTHROUGH_FLAGS",
          value: "0x01",
          description: "The types of MAC passthrough messages that the
                        host wishes to receive.",
        },
        {
          name: "EZSP_VALUE_EMBERNET_PASSTHROUGH_SOURCE_ADDRESS",
          value: "0x02",
          description: "The source address used to filter legacy
                        EmberNet messages when the
                        EMBER_MAC_PASSTHROUGH_EMBERNET_SOURCE flag is set
                        in EZSP_VALUE_MAC_PASSTHROUGH_FLAGS.",
        },
        {
          name: "EZSP_VALUE_FREE_BUFFERS",
          value: "0x03",
          description: "The number of available message buffers.",
        },
        {
          name: "EZSP_VALUE_UART_SYNCH_CALLBACKS",
          value: "0x04",
          description: "Selects sending synchronous callbacks in
                        ezsp-uart.",
        },
        {
          name: "EZSP_VALUE_MAXIMUM_INCOMING_TRANSFER_SIZE",
          value: "0x05",
          description: "The maximum incoming transfer size for the
                        local node.",
        },
        {
          name: "EZSP_VALUE_MAXIMUM_OUTGOING_TRANSFER_SIZE",
          value: "0x06",
          description: "The maximum outgoing transfer size for the
                        local node.",
        },
        {
          name: "EZSP_VALUE_STACK_TOKEN_WRITING",
          value: "0x07",
          description: "A bool indicating whether stack tokens are
                        written to persistent storage as they change.",
        },
        {
          name: "EZSP_VALUE_STACK_IS_PERFORMING_REJOIN",
          value: "0x08",
          description: "A read-only value indicating whether the stack
                        is currently performing a rejoin.",
        },
        {
          name: "EZSP_VALUE_MAC_FILTER_LIST",
          value: "0x09",
          description: "A list of EmberMacFilterMatchData values.",
        },
        {
          name: "EZSP_VALUE_EXTENDED_SECURITY_BITMASK",
          value: "0x0A",
          description: "The Ember Extended Security Bitmask.",
        },
        {
          name: "EZSP_VALUE_NODE_SHORT_ID",
          value: "0x0B",
          description: "The node short ID.",
        },
        {
          name: "EZSP_VALUE_DESCRIPTOR_CAPABILITY",
          value: "0x0C",
          description: "The descriptor capability of the local node.",
        },
        {
          name: "EZSP_VALUE_STACK_DEVICE_REQUEST_SEQUENCE_NUMBER",
          value: "0x0D",
          description: "The stack device request sequence number of the
                        local node.",
        },
        {
          name: "EZSP_VALUE_RADIO_HOLD_OFF",
          value: "0x0E",
          description: "Enable or disable radio hold-off.",
        },
        {
          name: "EZSP_VALUE_ENDPOINT_FLAGS",
          value: "0x0F",
          description: "The flags field associated with the endpoint
                        data.",
        },
        {
          name: "EZSP_VALUE_MFG_SECURITY_CONFIG",
          value: "0x10",
          description: "Enable/disable the Mfg security config key
                        settings.",
        },
        {
          name: "EZSP_VALUE_VERSION_INFO",
          value: "0x11",
          description: "Retrieves the version information from the stack
                        on the NCP.",
        },
        {
          name: "EZSP_VALUE_NEXT_HOST_REJOIN_REASON",
          value: "0x12",
          description: "This will get/set the rejoin reason noted by
                        the host for a subsequent call to
                        emberFindAndRejoinNetwork(). After a call to
                        emberFindAndRejoinNetwork() the host's rejoin
                        reason will be set to EMBER_REJOIN_REASON_NONE.
                        The NCP will store the rejoin reason used by
                        the call to emberFindAndRejoinNetwork()",
        },
        {
          name: "EZSP_VALUE_LAST_REJOIN_REASON",
          value: "0x13",
          description: "This is the reason that the last rejoin took
                        place. This value may only be retrieved, not
                        set. The rejoin may have been initiated by the
                        stack (NCP) or the application (host). If a
                        host initiated a rejoin the reason will be set
                        by default to EMBER_REJOIN_DUE_TO_APP_EVENT_1. If
                        the application wishes to denote its own rejoin
                        reasons it can do so by calling
                        ezspSetValue(EMBER_VALUE_HOST_REJOIN_REASON,
                        EMBER_REJOIN_DUE_TO_APP_EVENT_X). X is a number
                        corresponding to one of the app events defined.
                        If the NCP initiated a rejoin it will record
                        this value internally for retrieval by
                        ezspGetValue(EZSP_VALUE_REAL_REJOIN_REASON).",
        },
        {
          name: "EZSP_VALUE_NEXT_ZIGBEE_SEQUENCE_NUMBER",
          value: "0x14",
          description: "The next ZigBee sequence number.",
        },
        {
          name: "EZSP_VALUE_CCA_THRESHOLD",
          value: "0x15",
          description: "CCA energy detect threshold for radio.",
        },
        {
          name: "EZSP_VALUE_SET_COUNTER_THRESHOLD",
          value: "0x17",
          description: "The threshold value for a counter",
        },
        {
          name: "EZSP_VALUE_RESET_COUNTER_THRESHOLDS",
          value: "0x18",
          description: "Resets all counters thresholds to 0xFF",
        },
        {
          name: "EZSP_VALUE_CLEAR_COUNTERS",
          value: "0x19",
          description: "Clears all the counters",
        },
        {
          name: "EZSP_VALUE_CERTIFICATE_283K1",
          value: "0x1A",
          description: "The node's new certificate signed by the CA.",
        },
        {
          name: "EZSP_VALUE_PUBLIC_KEY_283K1",
          value: "0x1B",
          description: "The Certificate Authority's public key.",
        },
        {
          name: "EZSP_VALUE_PRIVATE_KEY_283K1",
          value: "0x1C",
          description: "The node's new static private key.",
        },
        {
          name: "EZSP_VALUE_NWK_FRAME_COUNTER",
          value: "0x23",
          description: "The NWK layer security frame counter value",
        },
        {
          name: "EZSP_VALUE_APS_FRAME_COUNTER",
          value: "0x24",
          description: "The APS layer security frame counter value",
        },
        {
          name: "EZSP_VALUE_RETRY_DEVICE_TYPE",
          value: "0x25",
          description: "Sets the device type to use on the next rejoin using device type",
        },
        {
          name: "EZSP_VALUE_ENABLE_R21_BEHAVIOR",
          value: "0x29",
          description: "Setting this byte enables R21 behavior on the NCP.",
        },
        {
          name: "EZSP_VALUE_ANTENNA_MODE",
          value: "0x30",
          description: "Configure the antenna mode(0-primary,1-secondary,2-toggle on tx ack fail).",
        },
        {
          name: "EZSP_VALUE_ENABLE_PTA",
          value: "0x31",
          description: "Enable or disable packet traffic arbitration.",
        },
        {
          name: "EZSP_VALUE_PTA_OPTIONS",
          value: "0x32",
          description: "Set packet traffic arbitration configuration options.",
        },
        {
          name: "EZSP_VALUE_MFGLIB_OPTIONS",
          value: "0x33",
          description: "Configure manufacturing library options (0-non-CSMA transmits,1-CSMA transmits).",
        },
        {
          name: "EZSP_VALUE_USE_NEGOTIATED_POWER_BY_LPD",
          value: "0x34",
          description: "Sets the flag to use either negotiated power by link power delta (LPD)
                        or fixed power value provided by user while forming/joining a network
                        for packet transmissions on subghz interface. This is mainly for testing purposes.",
        },
        {
          name: "EZSP_VALUE_PTA_PWM_OPTIONS",
          value: "0x35",
          description: "Set packet traffic arbitration configuration PWM options.",
        }    
      ],
    },
    {
      name: "EzspExtendedValueId",
      type: "uint8_t",
      description: "Identifies a value based on specified
                    characteristics. Each set of characteristics is
                    unique to that value and is specified during the
                    call to get the extended value.",
      items: [
        {
          name: "EZSP_EXTENDED_VALUE_ENDPOINT_FLAGS",
          value: "0x00",
          description: "The flags field associated with the specified
                        endpoint.",
        },
        {
          name: "EZSP_EXTENDED_VALUE_LAST_LEAVE_REASON",
          value: "0x01",
          description: "This is the reason for the node to leave the
                        network as well as the device that told it to
                        leave. The leave reason is the 1st byte of the
                        value while the node ID is the 2nd and 3rd
                        byte. If the leave was caused due to an API
                        call rather than an over the air message, the
                        node ID will be EMBER_UNKNOWN_NODE_ID (0xFFFD).",
        },
        {
          name: "EZSP_EXTENDED_VALUE_GET_SOURCE_ROUTE_OVERHEAD",
          value: "0x02",
          description: "This number of bytes of overhead required in
                        the network frame for source routing to a
                        particular destination.",
        },
      ],
    },
    {
      name: "EzspEndpointFlags",
      type: "uint16_t",
      description: "Flags associated with the endpoint data configured
                    on the NCP.",
      items: [
        {
          name: "EZSP_ENDPOINT_DISABLED",
          value: "0x00",
          description: "Indicates that the endpoint is disabled and NOT
                        discoverable via ZDO.",
        },
        {
          name: "EZSP_ENDPOINT_ENABLED",
          value: "0x01",
          description: "Indicates that the endpoint is enabled and
                        discoverable via ZDO.",
        },
      ],
    },
    {
      name: "EmberConfigTxPowerMode",
      type: "uint16_t",
      description: "Values for EZSP_CONFIG_TX_POWER_MODE.",
      items: [
        {
          name: "EMBER_TX_POWER_MODE_DEFAULT",
          value: "0x00",
          description: "Normal power mode and bi-directional RF
                        transmitter output.",
        },
        {
          name: "EMBER_TX_POWER_MODE_BOOST",
          value: "0x01",
          description: "Enable boost power mode. This is a high
                        performance radio mode which offers increased
                        receive sensitivity and transmit power at the
                        cost of an increase in power consumption.",
        },
        {
          name: "EMBER_TX_POWER_MODE_ALTERNATE",
          value: "0x02",
          description: "Enable the alternate transmitter output. This
                        allows for simplified connection to an external
                        power amplifier via the RF_TX_ALT_P and
                        RF_TX_ALT_N pins.",
        },
        {
          name: "EMBER_TX_POWER_MODE_BOOST_AND_ALTERNATE",
          value: "0x03",
          description: "Enable both boost mode and the alternate
                        transmitter output.",
        },
      ],
    },
    {
      name: "EzspPolicyId",
      type: "uint8_t",
      description: "Identifies a policy.",
      items: [
        {
          name: "EZSP_TRUST_CENTER_POLICY",
          value: "0x00",
          description: "Controls trust center behavior.",
        },
        {
          name: "EZSP_BINDING_MODIFICATION_POLICY",
          value: "0x01",
          description: "Controls how external binding modification
                        requests are handled.",
        },
        {
          name: "EZSP_UNICAST_REPLIES_POLICY",
          value: "0x02",
          description: "Controls whether the Host supplies unicast
                        replies.",
        },
        {
          name: "EZSP_POLL_HANDLER_POLICY",
          value: "0x03",
          description: "Controls whether pollHandler callbacks are
                        generated.",
        },
        {
          name: "EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY",
          value: "0x04",
          description: "Controls whether the message contents are
                        included in the messageSentHandler callback.",
        },
        {
          name: "EZSP_TC_KEY_REQUEST_POLICY",
          value: "0x05",
          description: "Controls whether the Trust Center will respond
                        to Trust Center link key requests.",
        },
        {
          name: "EZSP_APP_KEY_REQUEST_POLICY",
          value: "0x06",
          description: "Controls whether the Trust Center will respond
                        to application link key requests.",
        },
        {
          name: "EZSP_PACKET_VALIDATE_LIBRARY_POLICY",
          value: "0x07",
          description: "Controls whether ZigBee packets that appear
                        invalid are automatically dropped by the stack.
                        A counter will be incremented when this occurs.",
        },
        {
          name: "EZSP_ZLL_POLICY",
          value: "0x08",
          description: "Controls whether the stack will process ZLL
                        messages.",
        },
        {
          name: "EZSP_TC_REJOINS_USING_WELL_KNOWN_KEY_POLICY",
          value: "0x09",
          description: "Controls whether Trust Center (insecure) rejoins for
                        devices using the well-known link key are accepted. If
                        rejoining using the well-known key is allowed, it is
                        disabled again after
                        emAllowTcRejoinsUsingWellKnownKeyTimeoutSec seconds.",
        },
      ],
    },
    {
      name: "EzspDecisionId",
      type: "uint8_t",
      description: "Identifies a policy decision.",
      items: [
        {
          name: "EZSP_ALLOW_JOINS",
          value: "0x00",
          description: "Send the network key in the clear to all
                        joining and rejoining devices.",
        },
        {
          name: "EZSP_ALLOW_PRECONFIGURED_KEY_JOINS",
          value: "0x01",
          description: "Send the network key encrypted with the joining
                        or rejoining device's trust center link key. The
                        trust center and any joining or rejoining device
                        are assumed to share a link key, either
                        preconfigured or obtained under a previous
                        policy. This is the default value for the
                        EZSP_TRUST_CENTER_POLICY.",
        },
        {
          name: "EZSP_ALLOW_REJOINS_ONLY",
          value: "0x02",
          description: "Send the network key encrypted with the
                        rejoining device's trust center link key. The
                        trust center and any rejoining device are
                        assumed to share a link key, either
                        preconfigured or obtained under a previous
                        policy. No new devices are allowed to join.",
        },
        {
          name: "EZSP_DISALLOW_ALL_JOINS_AND_REJOINS",
          value: "0x03",
          description: "Reject all unsecured join and rejoin attempts.",
        },
        {
          name: "EZSP_ALLOW_JOINS_REJOINS_HAVE_LINK_KEY",
          value: "0x04",
          description: "Send the network key in the clear to all
                        joining devices. Rejoining devices are sent the
                        network key encrypted with their trust center
                        link key. The trust center and any rejoining
                        device are assumed to share a link key, either
                        preconfigured or obtained under a previous
                        policy.",
        },
        {
          name: "EZSP_IGNORE_TRUST_CENTER_REJOINS",
          value: "0x05",
          description: "Take no action on trust center rejoin attempts."
        },
        {
          name: "EZSP_BDB_JOIN_USES_INSTALL_CODE_KEY",
          value: "0x06",
          description: "Admit joins only if there is an entry in the transient
                        key table. This corresponds to the Base Device Behavior
                        specification where a Trust Center enforces all devices
                        to join with an install code-derived link key."
        },
        {
          name: "EZSP_DISALLOW_BINDING_MODIFICATION",
          value: "0x10",
          description: "EZSP_BINDING_MODIFICATION_POLICY default decision.
                        Do not allow the local binding table to be
                        changed by remote nodes.",
        },
        {
          name: "EZSP_ALLOW_BINDING_MODIFICATION",
          value: "0x11",
          description: "EZSP_BINDING_MODIFICATION_POLICY decision. Allow
                        remote nodes to change the local binding table.",
        },
        {
          name: "EZSP_CHECK_BINDING_MODIFICATIONS_ARE_VALID_ENDPOINT_CLUSTERS",
          value: "0x12",
          description: "EZSP_BINDING_MODIFICATION_POLICY decision. Allows
                        remote nodes to set local binding entries only
                        if the entries correspond to endpoints defined
                        on the device, and for output clusters bound to
                        those endpoints.",
        },
        {
          name: "EZSP_HOST_WILL_NOT_SUPPLY_REPLY",
          value: "0x20",
          description: "EZSP_UNICAST_REPLIES_POLICY default decision. The
                        NCP will automatically send an empty reply
                        (containing no payload) for every unicast
                        received.",
        },
        {
          name: "EZSP_HOST_WILL_SUPPLY_REPLY",
          value: "0x21",
          description: "EZSP_UNICAST_REPLIES_POLICY decision. The NCP will
                        only send a reply if it receives a sendReply
                        command from the Host.",
        },
        {
          name: "EZSP_POLL_HANDLER_IGNORE",
          value: "0x30",
          description: "EZSP_POLL_HANDLER_POLICY default decision. Do not
                        inform the Host when a child polls.",
        },
        {
          name: "EZSP_POLL_HANDLER_CALLBACK",
          value: "0x31",
          description: "EZSP_POLL_HANDLER_POLICY decision. Generate a
                        pollHandler callback when a child polls.",
        },
        {
          name: "EZSP_MESSAGE_TAG_ONLY_IN_CALLBACK",
          value: "0x40",
          description: "EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY default
                        decision. Include only the message tag in the
                        messageSentHandler callback.",
        },
        {
          name: "EZSP_MESSAGE_TAG_AND_CONTENTS_IN_CALLBACK",
          value: "0x41",
          description: "EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY decision.
                        Include both the message tag and the message
                        contents in the messageSentHandler callback.",
        },
        {
          name: "EZSP_DENY_TC_KEY_REQUESTS",
          value: "0x50",
          description: "EZSP_TC_KEY_REQUEST_POLICY decision. When the
                        Trust Center receives a request for a Trust
                        Center link key, it will be ignored.",
        },
        {
          name: "EZSP_ALLOW_TC_KEY_REQUESTS_AND_SEND_CURRENT_KEY",
          value: "0x51",
          description: "EZSP_TC_KEY_REQUEST_POLICY decision. When the
                        Trust Center receives a request for a Trust
                        Center link key, it will reply to it with the
                        corresponding key.",
        },
        {
          name: "EZSP_ALLOW_TC_KEY_REQUEST_AND_GENERATE_NEW_KEY",
          value: "0x52",
          description: "EZSP_TC_KEY_REQUEST_POLICY decision. When the
                        Trust Center receives a request for a Trust
                        Center link key, it will generate a key to
                        send to the joiner. After generation, the key
                        will be added to the transient key tabe and
                        After verification, this key will be added
                        into the link key table",
        },
        {
          name: "EZSP_DENY_APP_KEY_REQUESTS",
          value: "0x60",
          description: "EZSP_APP_KEY_REQUEST_POLICY decision. When the
                        Trust Center receives a request for an
                        application link key, it will be ignored.",
        },
        {
          name: "EZSP_ALLOW_APP_KEY_REQUESTS",
          value: "0x61",
          description: "EZSP_APP_KEY_REQUEST_POLICY decision. When the
                        Trust Center receives a request for an
                        application link key, it will randomly generate
                        a key and send it to both partners.",
        },
        {
          name: "EZSP_PACKET_VALIDATE_LIBRARY_CHECKS_ENABLED",
          value: "0x62",
          description: "Indicates that packet validate library checks
                        are enabled on the NCP.",
        },
        {
          name: "EZSP_PACKET_VALIDATE_LIBRARY_CHECKS_DISABLED",
          value: "0x63",
          description: "Indicates that packet validate library checks
                        are NOT enabled on the NCP.",
        },
      ],
    },
    {
      name: "EzspMfgTokenId",
      type: "uint8_t",
      description: "Manufacturing token IDs used by ezspGetMfgToken().",
      items: [
        {
          name: "EZSP_MFG_CUSTOM_VERSION",
          value: "0x00",
          description: "Custom version (2 bytes).",
        },
        {
          name: "EZSP_MFG_STRING",
          value: "0x01",
          description: "Manufacturing string (16 bytes).",
        },
        {
          name: "EZSP_MFG_BOARD_NAME",
          value: "0x02",
          description: "Board name (16 bytes).",
        },
        {
          name: "EZSP_MFG_MANUF_ID",
          value: "0x03",
          description: "Manufacturing ID (2 bytes).",
        },
        {
          name: "EZSP_MFG_PHY_CONFIG",
          value: "0x04",
          description: "Radio configuration (2 bytes).",
        },
        {
          name: "EZSP_MFG_BOOTLOAD_AES_KEY",
          value: "0x05",
          description: "Bootload AES key (16 bytes).",
        },
        {
          name: "EZSP_MFG_ASH_CONFIG",
          value: "0x06",
          description: "ASH configuration (40 bytes).",
        },
        {
          name: "EZSP_MFG_EZSP_STORAGE",
          value: "0x07",
          description: "EZSP storage (8 bytes).",
        },
        {
          name: "EZSP_STACK_CAL_DATA",
          value: "0x08",
          description: "Radio calibration data (64 bytes). 4 bytes are
                        stored for each of the 16 channels. This token
                        is not stored in the Flash Information Area. It
                        is updated by the stack each time a calibration
                        is performed.",
        },
        {
          name: "EZSP_MFG_CBKE_DATA",
          value: "0x09",
          description: "Certificate Based Key Exchange (CBKE) data (92
                        bytes).",
        },
        {
          name: "EZSP_MFG_INSTALLATION_CODE",
          value: "0x0A",
          description: "Installation code (20 bytes).",
        },
        {
          name: "EZSP_STACK_CAL_FILTER",
          value: "0x0B",
          description: "Radio channel filter calibration data (1 byte).
                        This token is not stored in the Flash
                        Information Area. It is updated by the stack
                        each time a calibration is performed.",
        },
        {
          name: "EZSP_MFG_CUSTOM_EUI_64",
          value: "0x0C",
          description: "Custom EUI64 MAC address (8 bytes).",
        },
        {
          name: "EZSP_MFG_CTUNE",
          value: "0x0D",
          description: "CTUNE value (2 byte).",
        },
      ],
    },
    {
      name: "EzspStatus",
      type: "uint8_t",
      description: "Status values used by EZSP.",
      items: [
        {
          name: "EZSP_SUCCESS",
          value: "0x00",
          description: "Success.",
        },
        {
          name: "EZSP_SPI_ERR_FATAL",
          value: "0x10",
          description: "Fatal error.",
        },
        {
          name: "EZSP_SPI_ERR_NCP_RESET",
          value: "0x11",
          description: "The Response frame of the current transaction
                        indicates the NCP has reset.",
        },
        {
          name: "EZSP_SPI_ERR_OVERSIZED_EZSP_FRAME",
          value: "0x12",
          description: "The NCP is reporting that the Command frame of
                        the current transaction is oversized (the length
                        byte is too large).",
        },
        {
          name: "EZSP_SPI_ERR_ABORTED_TRANSACTION",
          value: "0x13",
          description: "The Response frame of the current transaction
                        indicates the previous transaction was aborted
                        (nSSEL deasserted too soon).",
        },
        {
          name: "EZSP_SPI_ERR_MISSING_FRAME_TERMINATOR",
          value: "0x14",
          description: "The Response frame of the current transaction
                        indicates the frame terminator is missing from
                        the Command frame.",
        },
        {
          name: "EZSP_SPI_ERR_WAIT_SECTION_TIMEOUT",
          value: "0x15",
          description: "The NCP has not provided a Response within the
                        time limit defined by WAIT_SECTION_TIMEOUT.",
        },
        {
          name: "EZSP_SPI_ERR_NO_FRAME_TERMINATOR",
          value: "0x16",
          description: "The Response frame from the NCP is missing the
                        frame terminator.",
        },
        {
          name: "EZSP_SPI_ERR_EZSP_COMMAND_OVERSIZED",
          value: "0x17",
          description: "The Host attempted to send an oversized Command
                        (the length byte is too large) and the AVR's
                        spi-protocol.c blocked the transmission.",
        },
        {
          name: "EZSP_SPI_ERR_EZSP_RESPONSE_OVERSIZED",
          value: "0x18",
          description: "The NCP attempted to send an oversized Response
                        (the length byte is too large) and the AVR's
                        spi-protocol.c blocked the reception.",
        },
        {
          name: "EZSP_SPI_WAITING_FOR_RESPONSE",
          value: "0x19",
          description: "The Host has sent the Command and is still
                        waiting for the NCP to send a Response.",
        },
        {
          name: "EZSP_SPI_ERR_HANDSHAKE_TIMEOUT",
          value: "0x1A",
          description: "The NCP has not asserted nHOST_INT within the
                        time limit defined by WAKE_HANDSHAKE_TIMEOUT.",
        },
        {
          name: "EZSP_SPI_ERR_STARTUP_TIMEOUT",
          value: "0x1B",
          description: "The NCP has not asserted nHOST_INT after an
                        NCP reset within the time limit defined by
                        STARTUP_TIMEOUT.",
        },
        {
          name: "EZSP_SPI_ERR_STARTUP_FAIL",
          value: "0x1C",
          description: "The Host attempted to verify the SPI Protocol
                        activity and version number, and the verification
                        failed.",
        },
        {
          name: "EZSP_SPI_ERR_UNSUPPORTED_SPI_COMMAND",
          value: "0x1D",
          description: "The Host has sent a command with a SPI Byte
                        that is unsupported by the current mode the NCP
                        is operating in.",
        },
        {
          name: "EZSP_ASH_IN_PROGRESS",
          value: "0x20",
          description: "Operation not yet complete.",
        },
        {
          name: "EZSP_HOST_FATAL_ERROR",
          value: "0x21",
          description: "Fatal error detected by host.",
        },
        {
          name: "EZSP_ASH_NCP_FATAL_ERROR",
          value: "0x22",
          description: "Fatal error detected by NCP.",
        },
        {
          name: "EZSP_DATA_FRAME_TOO_LONG",
          value: "0x23",
          description: "Tried to send DATA frame too long.",
        },
        {
          name: "EZSP_DATA_FRAME_TOO_SHORT",
          value: "0x24",
          description: "Tried to send DATA frame too short.",
        },
        {
          name: "EZSP_NO_TX_SPACE",
          value: "0x25",
          description: "No space for tx'ed DATA frame.",
        },
        {
          name: "EZSP_NO_RX_SPACE",
          value: "0x26",
          description: "No space for rec'd DATA frame.",
        },
        {
          name: "EZSP_NO_RX_DATA",
          value: "0x27",
          description: "No receive data available.",
        },
        {
          name: "EZSP_NOT_CONNECTED",
          value: "0x28",
          description: "Not in Connected state.",
        },
        {
          name: "EZSP_ERROR_VERSION_NOT_SET",
          value: "0x30",
          description: "The NCP received a command before the EZSP
                        version had been set.",
        },
        {
          name: "EZSP_ERROR_INVALID_FRAME_ID",
          value: "0x31",
          description: "The NCP received a command containing an
                        unsupported frame ID.",
        },
        {
          name: "EZSP_ERROR_WRONG_DIRECTION",
          value: "0x32",
          description: "The direction flag in the frame control field
                        was incorrect.",
        },
        {
          name: "EZSP_ERROR_TRUNCATED",
          value: "0x33",
          description: "The truncated flag in the frame control field
                        was set, indicating there was not enough memory
                        available to complete the response or that the
                        response would have exceeded the maximum EZSP
                        frame length.",
        },
        {
          name: "EZSP_ERROR_OVERFLOW",
          value: "0x34",
          description: "The overflow flag in the frame control field
                        was set, indicating one or more callbacks
                        occurred since the previous response and there
                        was not enough memory available to report them
                        to the Host.",
        },
        {
          name: "EZSP_ERROR_OUT_OF_MEMORY",
          value: "0x35",
          description: "Insufficient memory was available.",
        },
        {
          name: "EZSP_ERROR_INVALID_VALUE",
          value: "0x36",
          description: "The value was out of bounds.",
        },
        {
          name: "EZSP_ERROR_INVALID_ID",
          value: "0x37",
          description: "The configuration id was not recognized.",
        },
        {
          name: "EZSP_ERROR_INVALID_CALL",
          value: "0x38",
          description: "Configuration values can no longer be modified.",
        },
        {
          name: "EZSP_ERROR_NO_RESPONSE",
          value: "0x39",
          description: "The NCP failed to respond to a command.",
        },
        {
          name: "EZSP_ERROR_COMMAND_TOO_LONG",
          value: "0x40",
          description: "The length of the command exceeded the maximum
                        EZSP frame length.",
        },
        {
          name: "EZSP_ERROR_QUEUE_FULL",
          value: "0x41",
          description: "The UART receive queue was full causing a
                        callback response to be dropped.",
        },
        {
          name: "EZSP_ERROR_COMMAND_FILTERED",
          value: "0x42",
          description: "The command has been filtered out by NCP.",
        },
        {
          name: "EZSP_ERROR_SECURITY_KEY_ALREADY_SET",
          value: "0x43",
          description: "EZSP Security Key is already set",
        },
        {
          name: "EZSP_ERROR_SECURITY_TYPE_INVALID",
          value: "0x44",
          description: "EZSP Security Type is invalid",
        },
        {
          name: "EZSP_ERROR_SECURITY_PARAMETERS_INVALID",
          value: "0x45",
          description: "EZSP Security Parameters are invalid",
        },
        {
          name: "EZSP_ERROR_SECURITY_PARAMETERS_ALREADY_SET",
          value: "0x46",
          description: "EZSP Security Parameters are already set",
        },
        {
          name: "EZSP_ERROR_SECURITY_KEY_NOT_SET",
          value: "0x47",
          description: "EZSP Security Key is not set",
        },
        {
          name: "EZSP_ERROR_SECURITY_PARAMETERS_NOT_SET",
          value: "0x48",
          description: "EZSP Security Parameters are not set",
        },
        {
          name: "EZSP_ERROR_UNSUPPORTED_CONTROL",
          value: "0x49",
          description: "Received frame with unsupported control byte",
        },
        {
          name: "EZSP_ERROR_UNSECURE_FRAME",
          value: "0x4A",
          description: "Received frame is unsecure, when security is established",
        },
        {
          name: "EZSP_ASH_ERROR_VERSION",
          value: "0x50",
          description: "Incompatible ASH version",
        },
        {
          name: "EZSP_ASH_ERROR_TIMEOUTS",
          value: "0x51",
          description: "Exceeded max ACK timeouts",
        },
        {
          name: "EZSP_ASH_ERROR_RESET_FAIL",
          value: "0x52",
          description: "Timed out waiting for RSTACK",
        },
        {
          name: "EZSP_ASH_ERROR_NCP_RESET",
          value: "0x53",
          description: "Unexpected ncp reset",
        },
        {
          name: "EZSP_ERROR_SERIAL_INIT",
          value: "0x54",
          description: "Serial port initialization failed",
        },
        {
          name: "EZSP_ASH_ERROR_NCP_TYPE",
          value: "0x55",
          description: "Invalid ncp processor type",
        },
        {
          name: "EZSP_ASH_ERROR_RESET_METHOD",
          value: "0x56",
          description: "Invalid ncp reset method",
        },
        {
          name: "EZSP_ASH_ERROR_XON_XOFF",
          value: "0x57",
          description: "XON/XOFF not supported by host driver",
        },
        {
          name: "EZSP_ASH_STARTED",
          value: "0x70",
          description: "ASH protocol started",
        },
        {
          name: "EZSP_ASH_CONNECTED",
          value: "0x71",
          description: "ASH protocol connected",
        },
        {
          name: "EZSP_ASH_DISCONNECTED",
          value: "0x72",
          description: "ASH protocol disconnected",
        },
        {
          name: "EZSP_ASH_ACK_TIMEOUT",
          value: "0x73",
          description: "Timer expired waiting for ack",
        },
        {
          name: "EZSP_ASH_CANCELLED",
          value: "0x74",
          description: "Frame in progress cancelled",
        },
        {
          name: "EZSP_ASH_OUT_OF_SEQUENCE",
          value: "0x75",
          description: "Received frame out of sequence",
        },
        {
          name: "EZSP_ASH_BAD_CRC",
          value: "0x76",
          description: "Received frame with CRC error",
        },
        {
          name: "EZSP_ASH_COMM_ERROR",
          value: "0x77",
          description: "Received frame with comm error",
        },
        {
          name: "EZSP_ASH_BAD_ACKNUM",
          value: "0x78",
          description: "Received frame with bad ackNum",
        },
        {
          name: "EZSP_ASH_TOO_SHORT",
          value: "0x79",
          description: "Received frame shorter than minimum",
        },
        {
          name: "EZSP_ASH_TOO_LONG",
          value: "0x7A",
          description: "Received frame longer than maximum",
        },
        {
          name: "EZSP_ASH_BAD_CONTROL",
          value: "0x7B",
          description: "Received frame with illegal control byte",
        },
        {
          name: "EZSP_ASH_BAD_LENGTH",
          value: "0x7C",
          description: "Received frame with illegal length for its type",
        },
        {
          name: "EZSP_ASH_ACK_RECEIVED",
          value: "0x7D",
          description: "Received ASH Ack",
        },
        {
          name: "EZSP_ASH_ACK_SENT",
          value: "0x7E",
          description: "Sent ASH Ack",
        },       
        {
          name: "EZSP_ASH_NAK_RECEIVED",
          value: "0x7F",
          description: "Received ASH Nak",
        },
        {
          name: "EZSP_ASH_NAK_SENT",
          value: "0x80",
          description: "Sent ASH Nak",
        },
        {
          name: "EZSP_ASH_RST_RECEIVED",
          value: "0x81",
          description: "Received ASH RST",
        },
        {
          name: "EZSP_ASH_RST_SENT",
          value: "0x82",
          description: "Sent ASH RST",
        },
        {
          name: "EZSP_ASH_STATUS",
          value: "0x83",
          description: "ASH Status",
        },
        {
          name: "EZSP_ASH_TX",
          value: "0x84",
          description: "ASH TX",
        },
        {
          name: "EZSP_ASH_RX",
          value: "0x85",
          description: "ASH RX",
        },
        {
          name: "EZSP_NO_ERROR",
          value: "0xFF",
          description: "No reset or error",
        },
      ],
    },
    {
      name: "EmberStatus",
      type: "uint8_t",
      description: "Return type for stack functions.",
      items: [
        {
          name: "EMBER_SUCCESS",
          value: "0x00",
          description: "The generic 'no error' message.",
        },
        {
          name: "EMBER_ERR_FATAL",
          value: "0x01",
          description: "The generic 'fatal error' message.",
        },
        {
          name: "EMBER_BAD_ARGUMENT",
          value: "0x02",
          description: "An invalid value was passed as an argument to
                        a function",
        },
        {
          name: "EMBER_EEPROM_MFG_STACK_VERSION_MISMATCH",
          value: "0x04",
          description: "The manufacturing and stack token format in
                        non-volatile memory is different than what the
                        stack expects (returned at initialization).",
        },
        {
          name: "EMBER_INCOMPATIBLE_STATIC_MEMORY_DEFINITIONS",
          value: "0x05",
          description: "The static memory definitions in
                        ember-static-memory.h are incompatible with this
                        stack version.",
        },
        {
          name: "EMBER_EEPROM_MFG_VERSION_MISMATCH",
          value: "0x06",
          description: "The manufacturing token format in non-volatile
                        memory is different than what the stack expects
                        (returned at initialization).",
        },
        {
          name: "EMBER_EEPROM_STACK_VERSION_MISMATCH",
          value: "0x07",
          description: "The stack token format in non-volatile memory
                        is different than what the stack expects
                        (returned at initialization).",
        },
        {
          name: "EMBER_NO_BUFFERS",
          value: "0x18",
          description: "There are no more buffers.",
        },
        {
          name: "EMBER_SERIAL_INVALID_BAUD_RATE",
          value: "0x20",
          description: "Specified an invalid baud rate.",
        },
        {
          name: "EMBER_SERIAL_INVALID_PORT",
          value: "0x21",
          description: "Specified an invalid serial port.",
        },
        {
          name: "EMBER_SERIAL_TX_OVERFLOW",
          value: "0x22",
          description: "Tried to send too much data.",
        },
        {
          name: "EMBER_SERIAL_RX_OVERFLOW",
          value: "0x23",
          description: "There was not enough space to store a received
                        character and the character was dropped.",
        },
        {
          name: "EMBER_SERIAL_RX_FRAME_ERROR",
          value: "0x24",
          description: "Detected a UART framing error.",
        },
        {
          name: "EMBER_SERIAL_RX_PARITY_ERROR",
          value: "0x25",
          description: "Detected a UART parity error.",
        },
        {
          name: "EMBER_SERIAL_RX_EMPTY",
          value: "0x26",
          description: "There is no received data to process.",
        },
        {
          name: "EMBER_SERIAL_RX_OVERRUN_ERROR",
          value: "0x27",
          description: "The receive interrupt was not handled in time,
                        and a character was dropped.",
        },
        {
          name: "EMBER_MAC_TRANSMIT_QUEUE_FULL",
          value: "0x39",
          description: "The MAC transmit queue is full.",
        },
        {
          name: "EMBER_MAC_UNKNOWN_HEADER_TYPE",
          value: "0x3A",
          description: "MAC header FCR error on receive.",
        },
        {
          name: "EMBER_MAC_SCANNING",
          value: "0x3D",
          description: "The MAC can't complete this task because it is
                        scanning.",
        },
        {
          name: "EMBER_MAC_NO_DATA",
          value: "0x31",
          description: "No pending data exists for device doing a data
                        poll.",
        },
        {
          name: "EMBER_MAC_JOINED_NETWORK",
          value: "0x32",
          description: "Attempt to scan when we are joined to a
                        network.",
        },
        {
          name: "EMBER_MAC_BAD_SCAN_DURATION",
          value: "0x33",
          description: "Scan duration must be 0 to 14 inclusive.
                        Attempt was made to scan with an incorrect
                        duration value.",
        },
        {
          name: "EMBER_MAC_INCORRECT_SCAN_TYPE",
          value: "0x34",
          description: "emberStartScan was called with an incorrect scan
                        type.",
        },
        {
          name: "EMBER_MAC_INVALID_CHANNEL_MASK",
          value: "0x35",
          description: "emberStartScan was called with an invalid
                        channel mask.",
        },
        {
          name: "EMBER_MAC_COMMAND_TRANSMIT_FAILURE",
          value: "0x36",
          description: "Failed to scan current channel because we were
                        unable to transmit the relevant MAC command.",
        },
        {
          name: "EMBER_MAC_NO_ACK_RECEIVED",
          value: "0x40",
          description: "We expected to receive an ACK following the
                        transmission, but the MAC level ACK was never
                        received.",
        },
        {
          name: "EMBER_MAC_INDIRECT_TIMEOUT",
          value: "0x42",
          description: "Indirect data message timed out before polled.",
        },
        {
          name: "EMBER_SIM_EEPROM_ERASE_PAGE_GREEN",
          value: "0x43",
          description: "The Simulated EEPROM is telling the application
                        that there is at least one flash page to be
                        erased. The GREEN status means the current page
                        has not filled above the ERASE_CRITICAL_THRESHOLD.
                        The application should call the function
                        halSimEepromErasePage when it can to erase a
                        page.",
        },
        {
          name: "EMBER_SIM_EEPROM_ERASE_PAGE_RED",
          value: "0x44",
          description: "The Simulated EEPROM is telling the application
                        that there is at least one flash page to be
                        erased. The RED status means the current page
                        has filled above the ERASE_CRITICAL_THRESHOLD. Due
                        to the shrinking availability of write space,
                        there is a danger of data loss. The application
                        must call the function halSimEepromErasePage as
                        soon as possible to erase a page.",
        },
        {
          name: "EMBER_SIM_EEPROM_FULL",
          value: "0x45",
          description: "The Simulated EEPROM has run out of room to
                        write any new data and the data trying to be
                        set has been lost. This error code is the
                        result of ignoring the SIM_EEPROM_ERASE_PAGE_RED
                        error code. The application must call the
                        function halSimEepromErasePage to make room for
                        any further calls to set a token.",
        },
        {
          name: "EMBER_ERR_FLASH_WRITE_INHIBITED",
          value: "0x46",
          description: "A fatal error has occurred while trying to
                        write data to the Flash. The target memory
                        attempting to be programmed is already
                        programmed. The flash write routines were asked
                        to flip a bit from a 0 to 1, which is
                        physically impossible and the write was therefore
                        inhibited. The data in the flash cannot be
                        trusted after this error.",
        },
        {
          name: "EMBER_ERR_FLASH_VERIFY_FAILED",
          value: "0x47",
          description: "A fatal error has occurred while trying to
                        write data to the Flash and the write
                        verification has failed. The data in the flash
                        cannot be trusted after this error, and it is
                        possible this error is the result of exceeding
                        the life cycles of the flash.",
        },
        {
          name: "EMBER_SIM_EEPROM_INIT_1_FAILED",
          value: "0x48",
          description: "Attempt 1 to initialize the Simulated EEPROM
                        has failed. This failure means the information
                        already stored in Flash (or a lack thereof), is
                        fatally incompatible with the token information
                        compiled into the code image being run.",
        },
        {
          name: "EMBER_SIM_EEPROM_INIT_2_FAILED",
          value: "0x49",
          description: "Attempt 2 to initialize the Simulated EEPROM
                        has failed. This failure means Attempt 1 failed,
                        and the token system failed to properly reload
                        default tokens and reset the Simulated EEPROM.",
        },
        {
          name: "EMBER_SIM_EEPROM_INIT_3_FAILED",
          value: "0x4A",
          description: "Attempt 3 to initialize the Simulated EEPROM
                        has failed. This failure means one or both of
                        the tokens TOKEN_MFG_NVDATA_VERSION or
                        TOKEN_STACK_NVDATA_VERSION were incorrect and the
                        token system failed to properly reload default
                        tokens and reset the Simulated EEPROM.",
        },
        {
          name: "EMBER_ERR_FLASH_PROG_FAIL",
          value: "0x4B",
          description: "A fatal error has occurred while trying to
                        write data to the flash, possibly due to write
                        protection or an invalid address. The data in
                        the flash cannot be trusted after this error,
                        and it is possible this error is the result of
                        exceeding the life cycles of the flash.",
        },
        {
          name: "EMBER_ERR_FLASH_ERASE_FAIL",
          value: "0x4C",
          description: "A fatal error has occurred while trying to
                        erase flash, possibly due to write protection.
                        The data in the flash cannot be trusted after
                        this error, and it is possible this error is
                        the result of exceeding the life cycles of the
                        flash.",
        },
        {
          name: "EMBER_ERR_BOOTLOADER_TRAP_TABLE_BAD",
          value: "0x58",
          description: "The bootloader received an invalid message
                        (failed attempt to go into bootloader).",
        },
        {
          name: "EMBER_ERR_BOOTLOADER_TRAP_UNKNOWN",
          value: "0x59",
          description: "Bootloader received an invalid message (failed
                        attempt to go into bootloader).",
        },
        {
          name: "EMBER_ERR_BOOTLOADER_NO_IMAGE",
          value: "0x5A",
          description: "The bootloader cannot complete the bootload
                        operation because either an image was not found
                        or the image exceeded memory bounds.",
        },
        {
          name: "EMBER_DELIVERY_FAILED",
          value: "0x66",
          description: "The APS layer attempted to send or deliver a
                        message, but it failed.",
        },
        {
          name: "EMBER_BINDING_INDEX_OUT_OF_RANGE",
          value: "0x69",
          description: "This binding index is out of range of the
                        current binding table.",
        },
        {
          name: "EMBER_ADDRESS_TABLE_INDEX_OUT_OF_RANGE",
          value: "0x6A",
          description: "This address table index is out of range for
                        the current address table.",
        },
        {
          name: "EMBER_INVALID_BINDING_INDEX",
          value: "0x6C",
          description: "An invalid binding table index was given to a
                        function.",
        },
        {
          name: "EMBER_INVALID_CALL",
          value: "0x70",
          description: "The API call is not allowed given the current
                        state of the stack.",
        },
        {
          name: "EMBER_COST_NOT_KNOWN",
          value: "0x71",
          description: "The link cost to a node is not known.",
        },
        {
          name: "EMBER_MAX_MESSAGE_LIMIT_REACHED",
          value: "0x72",
          description: "The maximum number of in-flight messages (i.e.
                        EMBER_APS_UNICAST_MESSAGE_COUNT) has been reached.",
        },
        {
          name: "EMBER_MESSAGE_TOO_LONG",
          value: "0x74",
          description: "The message to be transmitted is too big to
                        fit into a single over-the-air packet.",
        },
        {
          name: "EMBER_BINDING_IS_ACTIVE",
          value: "0x75",
          description: "The application is trying to delete or
                        overwrite a binding that is in use.",
        },
        {
          name: "EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE",
          value: "0x76",
          description: "The application is trying to overwrite an
                        address table entry that is in use.",
        },
        {
          name: "EMBER_ADC_CONVERSION_DONE",
          value: "0x80",
          description: "Conversion is complete.",
        },
        {
          name: "EMBER_ADC_CONVERSION_BUSY",
          value: "0x81",
          description: "Conversion cannot be done because a request is
                        being processed.",
        },
        {
          name: "EMBER_ADC_CONVERSION_DEFERRED",
          value: "0x82",
          description: "Conversion is deferred until the current request
                        has been processed.",
        },
        {
          name: "EMBER_ADC_NO_CONVERSION_PENDING",
          value: "0x84",
          description: "No results are pending.",
        },
        {
          name: "EMBER_SLEEP_INTERRUPTED",
          value: "0x85",
          description: "Sleeping (for a duration) has been abnormally
                        interrupted and exited prematurely.",
        },
        {
          name: "EMBER_PHY_TX_UNDERFLOW",
          value: "0x88",
          description: "The transmit hardware buffer underflowed.",
        },
        {
          name: "EMBER_PHY_TX_INCOMPLETE",
          value: "0x89",
          description: "The transmit hardware did not finish
                        transmitting a packet.",
        },
        {
          name: "EMBER_PHY_INVALID_CHANNEL",
          value: "0x8A",
          description: "An unsupported channel setting was specified.",
        },
        {
          name: "EMBER_PHY_INVALID_POWER",
          value: "0x8B",
          description: "An unsupported power setting was specified.",
        },
        {
          name: "EMBER_PHY_TX_BUSY",
          value: "0x8C",
          description: "The packet cannot be transmitted because the
                        physical MAC layer is currently transmitting a
                        packet. (This is used for the MAC backoff
                        algorithm.)",
        },
        {
          name: "EMBER_PHY_TX_CCA_FAIL",
          value: "0x8D",
          description: "The transmit attempt failed because all CCA
                        attempts indicated that the channel was busy",
        },
        {
          name: "EMBER_PHY_OSCILLATOR_CHECK_FAILED",
          value: "0x8E",
          description: "The software installed on the hardware doesn't
                        recognize the hardware radio type.",
        },
        {
          name: "EMBER_PHY_ACK_RECEIVED",
          value: "0x8F",
          description: "The expected ACK was received after the last
                        transmission.",
        },
        {
          name: "EMBER_NETWORK_UP",
          value: "0x90",
          description: "The stack software has completed initialization
                        and is ready to send and receive packets over
                        the air.",
        },
        {
          name: "EMBER_NETWORK_DOWN",
          value: "0x91",
          description: "The network is not operating.",
        },
        {
          name: "EMBER_JOIN_FAILED",
          value: "0x94",
          description: "An attempt to join a network failed.",
        },
        {
          name: "EMBER_MOVE_FAILED",
          value: "0x96",
          description: "After moving, a mobile node's attempt to
                        re-establish contact with the network failed.",
        },
        {
          name: "EMBER_CANNOT_JOIN_AS_ROUTER",
          value: "0x98",
          description: "An attempt to join as a router failed due to
                        a ZigBee versus ZigBee Pro incompatibility.
                        ZigBee devices joining ZigBee Pro networks (or
                        vice versa) must join as End Devices, not
                        Routers.",
        },
        {
          name: "EMBER_NODE_ID_CHANGED",
          value: "0x99",
          description: "The local node ID has changed. The application
                        can obtain the new node ID by calling
                        emberGetNodeId().",
        },
        {
          name: "EMBER_PAN_ID_CHANGED",
          value: "0x9A",
          description: "The local PAN ID has changed. The application
                        can obtain the new PAN ID by calling
                        emberGetPanId().",
        },
        {
          name: "EMBER_NO_BEACONS",
          value: "0xAB",
          description: "An attempt to join or rejoin the network
                        failed because no router beacons could be heard
                        by the joining node.",
        },
        {
          name: "EMBER_RECEIVED_KEY_IN_THE_CLEAR",
          value: "0xAC",
          description: "An attempt was made to join a Secured Network
                        using a pre-configured key, but the Trust Center
                        sent back a Network Key in-the-clear when an
                        encrypted Network Key was required.",
        },
        {
          name: "EMBER_NO_NETWORK_KEY_RECEIVED",
          value: "0xAD",
          description: "An attempt was made to join a Secured Network,
                        but the device did not receive a Network Key.",
        },
        {
          name: "EMBER_NO_LINK_KEY_RECEIVED",
          value: "0xAE",
          description: "After a device joined a Secured Network, a
                        Link Key was requested but no response was ever
                        received.",
        },
        {
          name: "EMBER_PRECONFIGURED_KEY_REQUIRED",
          value: "0xAF",
          description: "An attempt was made to join a Secured Network
                        without a pre-configured key, but the Trust
                        Center sent encrypted data using a pre-configured
                        key.",
        },
        {
          name: "EMBER_NOT_JOINED",
          value: "0x93",
          description: "The node has not joined a network.",
        },
        {
          name: "EMBER_INVALID_SECURITY_LEVEL",
          value: "0x95",
          description: "The chosen security level (the value of
                        EMBER_SECURITY_LEVEL) is not supported by the
                        stack.",
        },
        {
          name: "EMBER_NETWORK_BUSY",
          value: "0xA1",
          description: "A message cannot be sent because the network
                        is currently overloaded.",
        },
        {
          name: "EMBER_INVALID_ENDPOINT",
          value: "0xA3",
          description: "The application tried to send a message using
                        an endpoint that it has not defined.",
        },
        {
          name: "EMBER_BINDING_HAS_CHANGED",
          value: "0xA4",
          description: "The application tried to use a binding that
                        has been remotely modified and the change has
                        not yet been reported to the application.",
        },
        {
          name: "EMBER_INSUFFICIENT_RANDOM_DATA",
          value: "0xA5",
          description: "An attempt to generate random bytes failed
                        because of insufficient random data from the
                        radio.",
        },
        {
          name: "EMBER_APS_ENCRYPTION_ERROR",
          value: "0xA6",
          description: "There was an error in trying to encrypt at
                        the APS Level. This could result from either an
                        inability to determine the long address of the
                        recipient from the short address (no entry in
                        the binding table) or there is no link key
                        entry in the table associated with the
                        destination, or there was a failure to load the
                        correct key into the encryption core.",
        },
        {
          name: "EMBER_SECURITY_STATE_NOT_SET",
          value: "0xA8",
          description: "There was an attempt to form or join a
                        network with security without calling
                        emberSetInitialSecurityState() first.",
        },
        {
          name: "EMBER_KEY_TABLE_INVALID_ADDRESS",
          value: "0xB3",
          description: "There was an attempt to set an entry in the
                        key table using an invalid long address. An
                        entry cannot be set using either the local
                        device's or Trust Center's IEEE address. Or an
                        entry already exists in the table with the same
                        IEEE address. An Address of all zeros or all
                        F's are not valid addresses in 802.15.4.",
        },
        {
          name: "EMBER_SECURITY_CONFIGURATION_INVALID",
          value: "0xB7",
          description: "There was an attempt to set a security
                        configuration that is not valid given the other
                        security settings.",
        },
        {
          name: "EMBER_TOO_SOON_FOR_SWITCH_KEY",
          value: "0xB8",
          description: "There was an attempt to broadcast a key switch
                        too quickly after broadcasting the next network
                        key. The Trust Center must wait at least a
                        period equal to the broadcast timeout so that
                        all routers have a chance to receive the
                        broadcast of the new network key.",
        },
        {
          name: "EMBER_KEY_NOT_AUTHORIZED",
          value: "0xBB",
          description: "The message could not be sent because the link
                        key corresponding to the destination is not
                        authorized for use in APS data messages. APS
                        Commands (sent by the stack) are allowed. To
                        use it for encryption of APS data messages it
                        must be authorized using a key agreement
                        protocol (such as CBKE).",
        },
        {
          name: "EMBER_SECURITY_DATA_INVALID",
          value: "0xBD",
          description: "The security data provided was not valid, or
                        an integrity check failed.",
        },
        {
          name: "EMBER_SOURCE_ROUTE_FAILURE",
          value: "0xA9",
          description: "A ZigBee route error command frame was received
                        indicating that a source routed message from
                        this node failed en route.",
        },
        {
          name: "EMBER_MANY_TO_ONE_ROUTE_FAILURE",
          value: "0xAA",
          description: "A ZigBee route error command frame was received
                        indicating that a message sent to this node
                        along a many-to-one route failed en route. The
                        route error frame was delivered by an ad-hoc
                        search for a functioning route.",
        },
        {
          name: "EMBER_STACK_AND_HARDWARE_MISMATCH",
          value: "0xB0",
          description: "A critical and fatal error indicating that the
                        version of the stack trying to run does not
                        match with the chip it is running on. The
                        software (stack) on the chip must be replaced
                        with software that is compatible with the chip.",
        },
        {
          name: "EMBER_INDEX_OUT_OF_RANGE",
          value: "0xB1",
          description: "An index was passed into the function that was
                        larger than the valid range.",
        },
        {
          name: "EMBER_TABLE_FULL",
          value: "0xB4",
          description: "There are no empty entries left in the table.",
        },
        {
          name: "EMBER_TABLE_ENTRY_ERASED",
          value: "0xB6",
          description: "The requested table entry has been erased and
                        contains no valid data.",
        },
        {
          name: "EMBER_LIBRARY_NOT_PRESENT",
          value: "0xB5",
          description: "The requested function cannot be executed
                        because the library that contains the necessary
                        functionality is not present.",
        },
        {
          name: "EMBER_OPERATION_IN_PROGRESS",
          value: "0xBA",
          description: "The stack accepted the command and is currently
                        processing the request. The results will be
                        returned via an appropriate handler.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_0",
          value: "0xF0",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_1",
          value: "0xF1",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_2",
          value: "0xF2",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_3",
          value: "0xF3",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_4",
          value: "0xF4",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_5",
          value: "0xF5",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_6",
          value: "0xF6",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_7",
          value: "0xF7",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_8",
          value: "0xF8",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_9",
          value: "0xF9",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_10",
          value: "0xFA",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_11",
          value: "0xFB",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_12",
          value: "0xFC",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_13",
          value: "0xFD",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_14",
          value: "0xFE",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
        {
          name: "EMBER_APPLICATION_ERROR_15",
          value: "0xFF",
          description: "This error is reserved for customer application
                        use. This will never be returned from any
                        portion of the network stack or HAL.",
        },
      ],
    },
    {
      name: "EmberEventUnits",
      type: "uint8_t",
      description: "Either marks an event as inactive or specifies the
                    units for the event execution time.",
      items: [
        {
          name: "EMBER_EVENT_INACTIVE",
          value: "0x00",
          description: "The event is not scheduled to run.",
        },
        {
          name: "EMBER_EVENT_MS_TIME",
          value: "0x01",
          description: "The execution time is in approximate
                        milliseconds.",
        },
        {
          name: "EMBER_EVENT_QS_TIME",
          value: "0x02",
          description: "The execution time is in 'binary' quarter
                        seconds (256 approximate milliseconds each).",
        },
        {
          name: "EMBER_EVENT_MINUTE_TIME",
          value: "0x03",
          description: "The execution time is in 'binary' minutes
                        (65536 approximate milliseconds each).",
        },
      ],
    },
    {
      name: "EmberNodeType",
      type: "uint8_t",
      description: "The type of the node.",
      items: [
        {
          name: "EMBER_UNKNOWN_DEVICE",
          value: "0x00",
          description: "Device is not joined.",
        },
        {
          name: "EMBER_COORDINATOR",
          value: "0x01",
          description: "Will relay messages and can act as a parent
                        to other nodes.",
        },
        {
          name: "EMBER_ROUTER",
          value: "0x02",
          description: "Will relay messages and can act as a parent
                        to other nodes.",
        },
        {
          name: "EMBER_END_DEVICE",
          value: "0x03",
          description: "Communicates only with its parent and will not
                        relay messages.",
        },
        {
          name: "EMBER_SLEEPY_END_DEVICE",
          value: "0x04",
          description: "An end device whose radio can be turned off
                        to save power. The application must poll to
                        receive messages.",
        },
      ],
    },
    {
      name: "EmberNetworkStatus",
      type: "uint8_t",
      description: "The possible join states for a node.",
      items: [
        {
          name: "EMBER_NO_NETWORK",
          value: "0x00",
          description: "The node is not associated with a network in
                        any way.",
        },
        {
          name: "EMBER_JOINING_NETWORK",
          value: "0x01",
          description: "The node is currently attempting to join a
                        network.",
        },
        {
          name: "EMBER_JOINED_NETWORK",
          value: "0x02",
          description: "The node is joined to a network.",
        },
        {
          name: "EMBER_JOINED_NETWORK_NO_PARENT",
          value: "0x03",
          description: "The node is an end device joined to a network
                        but its parent is not responding.",
        },
        {
          name: "EMBER_LEAVING_NETWORK",
          value: "0x04",
          description: "The node is in the process of leaving its
                        current network.",
        },
      ],
    },
    {
      name: "EmberIncomingMessageType",
      type: "uint8_t",
      description: "Incoming message types.",
      items: [
        {
          name: "EMBER_INCOMING_UNICAST",
          value: "0x00",
          description: "Unicast.",
        },
        {
          name: "EMBER_INCOMING_UNICAST_REPLY",
          value: "0x01",
          description: "Unicast reply.",
        },
        {
          name: "EMBER_INCOMING_MULTICAST",
          value: "0x02",
          description: "Multicast.",
        },
        {
          name: "EMBER_INCOMING_MULTICAST_LOOPBACK",
          value: "0x03",
          description: "Multicast sent by the local device.",
        },
        {
          name: "EMBER_INCOMING_BROADCAST",
          value: "0x04",
          description: "Broadcast.",
        },
        {
          name: "EMBER_INCOMING_BROADCAST_LOOPBACK",
          value: "0x05",
          description: "Broadcast sent by the local device.",
        },
        {
          name: "EMBER_INCOMING_MANY_TO_ONE_ROUTE_REQUEST",
          value: "0x06",
          description: "Many to one route request.",
        },
      ],
    },
    {
      name: "EmberOutgoingMessageType",
      type: "uint8_t",
      description: "Outgoing message types.",
      items: [
        {
          name: "EMBER_OUTGOING_DIRECT",
          value: "0x00",
          description: "Unicast sent directly to an EmberNodeId.",
        },
        {
          name: "EMBER_OUTGOING_VIA_ADDRESS_TABLE",
          value: "0x01",
          description: "Unicast sent using an entry in the address
                        table.",
        },
        {
          name: "EMBER_OUTGOING_VIA_BINDING",
          value: "0x02",
          description: "Unicast sent using an entry in the binding
                        table.",
        },
        {
          name: "EMBER_OUTGOING_MULTICAST",
          value: "0x03",
          description: "Multicast message. This value is passed to
                        emberMessageSentHandler() only. It may not be
                        passed to emberSendUnicast().",
        },
        {
          name: "EMBER_OUTGOING_BROADCAST",
          value: "0x04",
          description: "Broadcast message. This value is passed to
                        emberMessageSentHandler() only. It may not be
                        passed to emberSendUnicast().",
        },
      ],
    },
    {
      name: "EmberMacPassthroughType",
      type: "uint8_t",
      description: "MAC passthrough message type flags.",
      items: [
        {
          name: "EMBER_MAC_PASSTHROUGH_NONE",
          value: "0x00",
          description: "No MAC passthrough messages.",
        },
        {
          name: "EMBER_MAC_PASSTHROUGH_SE_INTERPAN",
          value: "0x01",
          description: "SE InterPAN messages.",
        },
        {
          name: "EMBER_MAC_PASSTHROUGH_EMBERNET",
          value: "0x02",
          description: "Legacy EmberNet messages.",
        },
        {
          name: "EMBER_MAC_PASSTHROUGH_EMBERNET_SOURCE",
          value: "0x04",
          description: "Legacy EmberNet messages filtered by their
                        source address.",
        },
      ],
    },
    {
      name: "EmberBindingType",
      type: "uint8_t",
      description: "Binding types.",
      items: [
        {
          name: "EMBER_UNUSED_BINDING",
          value: "0x00",
          description: "A binding that is currently not in use.",
        },
        {
          name: "EMBER_UNICAST_BINDING",
          value: "0x01",
          description: "A unicast binding whose 64-bit identifier is
                        the destination EUI64.",
        },
        {
          name: "EMBER_MANY_TO_ONE_BINDING",
          value: "0x02",
          description: "A unicast binding whose 64-bit identifier is
                        the aggregator EUI64.",
        },
        {
          name: "EMBER_MULTICAST_BINDING",
          value: "0x03",
          description: "A multicast binding whose 64-bit identifier is
                        the group address. A multicast binding can be
                        used to send messages to the group and to
                        receive messages sent to the group.",
        },
      ],
    },
    {
      name: "EmberApsOption",
      type: "uint16_t",
      description: "Options to use when sending a message.",
      items: [
        {
          name: "EMBER_APS_OPTION_NONE",
          value: "0x0000",
          description: "No options.",
        },
        {
          name: "EMBER_APS_OPTION_ENCRYPTION",
          value: "0x0020",
          description: "Send the message using APS Encryption, using
                        the Link Key shared with the destination node
                        to encrypt the data at the APS Level.",
        },
        {
          name: "EMBER_APS_OPTION_RETRY",
          value: "0x0040",
          description: "Resend the message using the APS retry
                        mechanism.",
        },
        {
          name: "EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY",
          value: "0x0100",
          description: "Causes a route discovery to be initiated if no
                        route to the destination is known.",
        },
        {
          name: "EMBER_APS_OPTION_FORCE_ROUTE_DISCOVERY",
          value: "0x0200",
          description: "Causes a route discovery to be initiated even
                        if one is known.",
        },
        {
          name: "EMBER_APS_OPTION_SOURCE_EUI64",
          value: "0x0400",
          description: "Include the source EUI64 in the network frame.",
        },
        {
          name: "EMBER_APS_OPTION_DESTINATION_EUI64",
          value: "0x0800",
          description: "Include the destination EUI64 in the network
                        frame.",
        },
        {
          name: "EMBER_APS_OPTION_ENABLE_ADDRESS_DISCOVERY",
          value: "0x1000",
          description: "Send a ZDO request to discover the node ID of
                        the destination, if it is not already know.",
        },
        {
          name: "EMBER_APS_OPTION_POLL_RESPONSE",
          value: "0x2000",
          description: "Reserved.",
        },
        {
          name: "EMBER_APS_OPTION_ZDO_RESPONSE_REQUIRED",
          value: "0x4000",
          description: "This incoming message is a ZDO request not
                        handled by the EmberZNet stack, and the
                        application is responsible for sending a ZDO
                        response. This flag is used only when the ZDO
                        is configured to have requests handled by the
                        application. See the
                        EZSP_CONFIG_APPLICATION_ZDO_CONFIGURATION
                        configuration parameter for more information.",
        },
        {
          name: "EMBER_APS_OPTION_FRAGMENT",
          value: "0x8000",
          description: "This message is part of a fragmented message.
                        This option may only be set for unicasts. The
                        groupId field gives the index of this fragment
                        in the low-order byte. If the low-order byte is
                        zero this is the first fragment and the
                        high-order byte contains the number of fragments
                        in the message.",
        },
      ],
    },
    {
      name: "EzspNetworkScanType",
      type: "uint8_t",
      description: "Network scan types.",
      items: [
        {
          name: "EZSP_ENERGY_SCAN",
          value: "0x00",
          description: "An energy scan scans each channel for its RSSI
                        value.",
        },
        {
          name: "EZSP_ACTIVE_SCAN",
          value: "0x01",
          description: "An active scan scans each channel for available
                        networks.",
        },
      ],
    },
    {
      name: "EmberJoinDecision",
      type: "uint8_t",
      description: "Decision made by the trust center when a node
                    attempts to join.",
      items: [
        {
          name: "EMBER_USE_PRECONFIGURED_KEY",
          value: "0x00",
          description: "Allow the node to join. The joining node
                        should have a pre-configured key. The security
                        data sent to it will be encrypted with that
                        key.",
        },
        {
          name: "EMBER_SEND_KEY_IN_THE_CLEAR",
          value: "0x01",
          description: "Allow the node to join. Send the network key
                        in-the-clear to the joining device.",
        },
        {
          name: "EMBER_DENY_JOIN",
          value: "0x02",
          description: "Deny join.",
        },
        {
          name: "EMBER_NO_ACTION",
          value: "0x03",
          description: "Take no action.",
        },
      ],
    },
    {
      name: "EmberInitialSecurityBitmask",
      type: "uint16_t",
      description: "This is the Initial Security Bitmask that controls
                    the use of various security features.",
      items: [
        {
          name: "EMBER_STANDARD_SECURITY_MODE",
          value: "0x0000",
          description: "This enables ZigBee Standard Security on the
                        node.",
        },
        {
          name: "EMBER_DISTRIBUTED_TRUST_CENTER_MODE",
          value: "0x0002",
          description: "This enables Distributed Trust Center Mode for
                        the device forming the network. (Previously known
                        as EMBER_NO_TRUST_CENTER_MODE)",
        },
        {
          name: "EMBER_TRUST_CENTER_GLOBAL_LINK_KEY",
          value: "0x0004",
          description: "This enables a Global Link Key for the Trust
                        Center. All nodes will share the same Trust
                        Center Link Key.",
        },
        {
          name: "EMBER_PRECONFIGURED_NETWORK_KEY_MODE",
          value: "0x0008",
          description: "This enables devices that perform MAC
                        Association with a pre-configured Network Key to
                        join the network. It is only set on the Trust
                        Center.",
        },
        {
          name: "EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY",
          value: "0x0084",
          description: "This denotes that the preconfiguredKey is not
                        the actual Link Key but a Secret Key known
                        only to the Trust Center. It is hashed with
                        the IEEE Address of the destination device in
                        order to create the actual Link Key used in
                        encryption. This is bit is only used by the
                        Trust Center. The joining device need not set
                        this.",
        },
        {
          name: "EMBER_HAVE_PRECONFIGURED_KEY",
          value: "0x0100",
          description: "This denotes that the preconfiguredKey element
                        has valid data that should be used to configure
                        the initial security state.",
        },
        {
          name: "EMBER_HAVE_NETWORK_KEY",
          value: "0x0200",
          description: "This denotes that the networkKey element has
                        valid data that should be used to configure the
                        initial security state.",
        },
        {
          name: "EMBER_GET_LINK_KEY_WHEN_JOINING",
          value: "0x0400",
          description: "This denotes to a joining node that it should
                        attempt to acquire a Trust Center Link Key
                        during joining. This is only necessary if the
                        device does not have a pre-configured key.",
        },
        {
          name: "EMBER_REQUIRE_ENCRYPTED_KEY",
          value: "0x0800",
          description: "This denotes that a joining device should only
                        accept an encrypted network key from the Trust
                        Center (using its pre-configured key). A key
                        sent in-the-clear by the Trust Center will be
                        rejected and the join will fail. This option is
                        only valid when utilizing a pre-configured key.",
        },
        {
          name: "EMBER_NO_FRAME_COUNTER_RESET",
          value: "0x1000",
          description: "This denotes whether the device should NOT
                        reset its outgoing frame counters (both NWK and
                        APS) when ::emberSetInitialSecurityState() is
                        called. Normally it is advised to reset the
                        frame counter before joining a new network.
                        However in cases where a device is joining to
                        the same network a again (but not using
                        ::emberRejoinNetwork()) it should keep the NWK
                        and APS frame counters stored in its tokens.",
        },
        {
          name: "EMBER_GET_PRECONFIGURED_KEY_FROM_INSTALL_CODE",
          value: "0x2000",
          description: "This denotes that the device should obtain its
                        preconfigured key from an installation code
                        stored in the manufacturing token. The token
                        contains a value that will be hashed to obtain
                        the actual preconfigured key. If that token is
                        not valid, then the call to
                        emberSetInitialSecurityState() will fail.",
        },
        {
          name: "EMBER_HAVE_TRUST_CENTER_EUI64",
          value: "0x0040",
          description: "This denotes that the
                        ::EmberInitialSecurityState::preconfiguredTrustCenterEui64
                        has a value in it containing the trust center
                        EUI64. The device will only join a network and
                        accept commands from a trust center with that
                        EUI64. Normally this bit is NOT set, and the
                        EUI64 of the trust center is learned during the
                        join process. When commissioning a device to
                        join onto an existing network, which is using a
                        trust center, and without sending any messages,
                        this bit must be set and the field
                        ::EmberInitialSecurityState::preconfiguredTrustCenterEui64
                        must be populated with the appropriate EUI64.",
        },
      ],
    },
    {
      name: "EmberCurrentSecurityBitmask",
      type: "uint16_t",
      description: "This is the Current Security Bitmask that details
                    the use of various security features.",
      items: [
        {
          name: "EMBER_STANDARD_SECURITY_MODE",
          value: "0x0000",
          description: "This denotes that the device is running in a
                        network with ZigBee Standard Security.",
        },
        {
          name: "EMBER_DISTRIBUTED_TRUST_CENTER_MODE",
          value: "0x0002",
          description: "This denotes that the device is running in a
                        network without a centralized Trust Center.",
        },
        {
          name: "EMBER_TRUST_CENTER_GLOBAL_LINK_KEY",
          value: "0x0004",
          description: "This denotes that the device has a Global Link
                        Key. The Trust Center Link Key is the same
                        across multiple nodes.",
        },
        {
          name: "EMBER_HAVE_TRUST_CENTER_LINK_KEY",
          value: "0x0010",
          description: "This denotes that the node has a Trust Center
                        Link Key.",
        },
        {
          name: "EMBER_TRUST_CENTER_USES_HASHED_LINK_KEY",
          value: "0x0084",
          description: "This denotes that the Trust Center is using a
                        Hashed Link Key.",
        },
      ],
    },
    {
      name: "EmberKeyType",
      type: "uint8_t",
      description: "Describes the type of ZigBee security key.",
      items: [
        {
          name: "EMBER_TRUST_CENTER_LINK_KEY",
          value: "0x01",
          description: "A shared key between the Trust Center and a
                        device.",
        },
        {
          name: "EMBER_CURRENT_NETWORK_KEY",
          value: "0x03",
          description: "The current active Network Key used by all
                        devices in the network.",
        },
        {
          name: "EMBER_NEXT_NETWORK_KEY",
          value: "0x04",
          description: "The alternate Network Key that was previously
                        in use, or the newer key that will be switched
                        to.",
        },
        {
          name: "EMBER_APPLICATION_LINK_KEY",
          value: "0x05",
          description: "An Application Link Key shared with another
                        (non-Trust Center) device.",
        },
      ],
    },
    {
      name: "EmberKeyStructBitmask",
      type: "uint16_t",
      description: "Describes the presence of valid data within the
                    EmberKeyStruct structure.",
      items: [
        {
          name: "EMBER_KEY_HAS_SEQUENCE_NUMBER",
          value: "0x0001",
          description: "The key has a sequence number associated with
                        it.",
        },
        {
          name: "EMBER_KEY_HAS_OUTGOING_FRAME_COUNTER",
          value: "0x0002",
          description: "The key has an outgoing frame counter
                        associated with it.",
        },
        {
          name: "EMBER_KEY_HAS_INCOMING_FRAME_COUNTER",
          value: "0x0004",
          description: "The key has an incoming frame counter
                        associated with it.",
        },
        {
          name: "EMBER_KEY_HAS_PARTNER_EUI64",
          value: "0x0008",
          description: "The key has a Partner IEEE address associated
                        with it.",
        },
      ],
    },
    {
      name: "EmberDeviceUpdate",
      type: "uint8_t",
      description: "The status of the device update.",
      items: [
        {
          name: "EMBER_STANDARD_SECURITY_SECURED_REJOIN",
          value: "0x0",
          description: "",
        },
        {
          name: "EMBER_STANDARD_SECURITY_UNSECURED_JOIN",
          value: "0x1",
          description: "",
        },
        {
          name: "EMBER_DEVICE_LEFT",
          value: "0x2",
          description: "",
        },
        {
          name: "EMBER_STANDARD_SECURITY_UNSECURED_REJOIN",
          value: "0x3",
          description: "",
        },
      ],
    },
    {
      name: "EmberKeyStatus",
      type: "uint8_t",
      description: "The status of the attempt to establish a key.",
      items: [
        {
          name: "EMBER_APP_LINK_KEY_ESTABLISHED",
          value: "0x01",
          description: "",
        },
        {
          name: "EMBER_TRUST_CENTER_LINK_KEY_ESTABLISHED",
          value: "0x03",
          description: "",
        },
        {
          name: "EMBER_KEY_ESTABLISHMENT_TIMEOUT",
          value: "0x04",
          description: "",
        },
        {
          name: "EMBER_KEY_TABLE_FULL",
          value: "0x05",
          description: "",
        },
        {
          name: "EMBER_TC_RESPONDED_TO_KEY_REQUEST",
          value: "0x06",
          description: "",
        },
        {
          name: "EMBER_TC_APP_KEY_SENT_TO_REQUESTER",
          value: "0x07",
          description: "",
        },
        {
          name: "EMBER_TC_RESPONSE_TO_KEY_REQUEST_FAILED",
          value: "0x08",
          description: "",
        },
        {
          name: "EMBER_TC_REQUEST_KEY_TYPE_NOT_SUPPORTED",
          value: "0x09",
          description: "",
        },
        {
          name: "EMBER_TC_NO_LINK_KEY_FOR_REQUESTER",
          value: "0x0A",
          description: "",
        },
        {
          name: "EMBER_TC_REQUESTER_EUI64_UNKNOWN",
          value: "0x0B",
          description: "",
        },
        {
          name: "EMBER_TC_RECEIVED_FIRST_APP_KEY_REQUEST",
          value: "0x0C",
          description: "",
        },
        {
          name: "EMBER_TC_TIMEOUT_WAITING_FOR_SECOND_APP_KEY_REQUEST",
          value: "0x0D",
          description: "",
        },
        {
          name: "EMBER_TC_NON_MATCHING_APP_KEY_REQUEST_RECEIVED",
          value: "0x0E",
          description: "",
        },
        {
          name: "EMBER_TC_FAILED_TO_SEND_APP_KEYS",
          value: "0x0F",
          description: "",
        },
        {
          name: "EMBER_TC_FAILED_TO_STORE_APP_KEY_REQUEST",
          value: "0x10",
          description: "",
        },
        {
          name: "EMBER_TC_REJECTED_APP_KEY_REQUEST",
          value: "0x11",
          description: "",
        },
      ],
    },
    {
      name: "EmberCounterType",
      type: "uint8_t",
      description: "Defines the events reported to the application by
                    the <i>readAndClearCounters</i> command.",
      items: [
        {
          name: "EMBER_COUNTER_MAC_RX_BROADCAST",
          value: "0",
          description: "The MAC received a broadcast.",
        },
        {
          name: "EMBER_COUNTER_MAC_TX_BROADCAST",
          value: "1",
          description: "The MAC transmitted a broadcast.",
        },
        {
          name: "EMBER_COUNTER_MAC_RX_UNICAST",
          value: "2",
          description: "The MAC received a unicast.",
        },
        {
          name: "EMBER_COUNTER_MAC_TX_UNICAST_SUCCESS",
          value: "3",
          description: "The MAC successfully transmitted a unicast.",
        },
        {
          name: "EMBER_COUNTER_MAC_TX_UNICAST_RETRY",
          value: "4",
          description: "The MAC retried a unicast.",
        },
        {
          name: "EMBER_COUNTER_MAC_TX_UNICAST_FAILED",
          value: "5",
          description: "The MAC unsuccessfully transmitted a unicast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_RX_BROADCAST",
          value: "6",
          description: "The APS layer received a data broadcast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_TX_BROADCAST",
          value: "7",
          description: "The APS layer transmitted a data broadcast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_RX_UNICAST",
          value: "8",
          description: "The APS layer received a data unicast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_TX_UNICAST_SUCCESS",
          value: "9",
          description: "The APS layer successfully transmitted a data
                        unicast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_TX_UNICAST_RETRY",
          value: "10",
          description: "The APS layer retried a data unicast.",
        },
        {
          name: "EMBER_COUNTER_APS_DATA_TX_UNICAST_FAILED",
          value: "11",
          description: "The APS layer unsuccessfully transmitted a data
                        unicast.",
        },
        {
          name: "EMBER_COUNTER_ROUTE_DISCOVERY_INITIATED",
          value: "12",
          description: "The network layer successfully submitted a new
                        route discovery to the MAC.",
        },
        {
          name: "EMBER_COUNTER_NEIGHBOR_ADDED",
          value: "13",
          description: "An entry was added to the neighbor table.",
        },
        {
          name: "EMBER_COUNTER_NEIGHBOR_REMOVED",
          value: "14",
          description: "An entry was removed from the neighbor table.",
        },
        {
          name: "EMBER_COUNTER_NEIGHBOR_STALE",
          value: "15",
          description: "A neighbor table entry became stale because it
                        had not been heard from.",
        },
        {
          name: "EMBER_COUNTER_JOIN_INDICATION",
          value: "16",
          description: "A node joined or rejoined to the network via
                        this node.",
        },
        {
          name: "EMBER_COUNTER_CHILD_REMOVED",
          value: "17",
          description: "An entry was removed from the child table.",
        },
        {
          name: "EMBER_COUNTER_ASH_OVERFLOW_ERROR",
          value: "18",
          description: "EZSP-UART only. An overflow error occurred in
                        the UART.",
        },
        {
          name: "EMBER_COUNTER_ASH_FRAMING_ERROR",
          value: "19",
          description: "EZSP-UART only. A framing error occurred in the
                        UART.",
        },
        {
          name: "EMBER_COUNTER_ASH_OVERRUN_ERROR",
          value: "20",
          description: "EZSP-UART only. An overrun error occurred in
                        the UART.",
        },
        {
          name: "EMBER_COUNTER_NWK_FRAME_COUNTER_FAILURE",
          value: "21",
          description: "A message was dropped at the network layer
                        because the NWK frame counter was not higher
                        than the last message seen from that source.",
        },
        {
          name: "EMBER_COUNTER_APS_FRAME_COUNTER_FAILURE",
          value: "22",
          description: "A message was dropped at the APS layer because
                        the APS frame counter was not higher than the
                        last message seen from that source.",
        },
        {
          name: "EMBER_COUNTER_UTILITY",
          value: "23",
          description: "Utility counter for general debugging use.",
        },
        {
          name: "EMBER_COUNTER_APS_LINK_KEY_NOT_AUTHORIZED",
          value: "24",
          description: "A message was dropped at the APS layer because
                        it had APS encryption but the key associated
                        with the sender has not been authenticated, and
                        thus the key is not authorized for use in APS
                        data messages.",
        },
        {
          name: "EMBER_COUNTER_NWK_DECRYPTION_FAILURE",
          value: "25",
          description: "A NWK encrypted message was received but
                        dropped because decryption failed.",
        },
        {
          name: "EMBER_COUNTER_APS_DECRYPTION_FAILURE",
          value: "26",
          description: "An APS encrypted message was received but
                        dropped because decryption failed.",
        },
        {
          name: "EMBER_COUNTER_ALLOCATE_PACKET_BUFFER_FAILURE",
          value: "27",
          description: "The number of times we failed to allocate a
                        set of linked packet buffers. This doesn't
                        necessarily mean that the packet buffer count
                        was 0 at the time, but that the number
                        requested was greater than the number free.",
        },
        {
          name: "EMBER_COUNTER_RELAYED_UNICAST",
          value: "28",
          description: "The number of relayed unicast packets.",
        },
        {
          name: "EMBER_COUNTER_PHY_TO_MAC_QUEUE_LIMIT_REACHED",
          value: "29",
          description: "The number of times we dropped a packet due to reaching the preset PHY to MAC queue limit (emMaxPhyToMacQueueLength).",
        },
        {
          name: "EMBER_COUNTER_PACKET_VALIDATE_LIBRARY_DROPPED_COUNT",
          value: "30",
          description: "The number of times we dropped a packet due to the packet-validate library checking a packet and rejecting it due to length or other formatting problems.",
        },
        {
          name: "EMBER_COUNTER_TYPE_NWK_RETRY_OVERFLOW",
          value: "31",
          description: "The number of times the NWK retry queue is full and a new message failed to be added.",
        },
        {
          name: "EMBER_COUNTER_PHY_CCA_FAIL_COUNT",
          value: "32",
          description: "The number of times the PHY layer was unable to transmit due to a failed CCA.",
        },
        {
          name: "EMBER_COUNTER_BROADCAST_TABLE_FULL",
          value: "33",
          description: "The number of times a NWK broadcast was dropped because the broadcast table was full.",
        },
        {
          name: "EMBER_COUNTER_PTA_LO_PRI_REQUESTED",
          value: "34",
          description: "The number of low priority packet traffic arbitration requests.",
        },
        {
          name: "EMBER_COUNTER_PTA_HI_PRI_REQUESTED",
          value: "35",
          description: "The number of high priority packet traffic arbitration requests.",
        },
        {
          name: "EMBER_COUNTER_PTA_LO_PRI_DENIED",
          value: "36",
          description: "The number of low priority packet traffic arbitration requests denied.",
        },
        {
          name: "EMBER_COUNTER_PTA_HI_PRI_DENIED",
          value: "37",
          description: "The number of high priority packet traffic arbitration requests denied.",
        },
        {
          name: "EMBER_COUNTER_PTA_LO_PRI_TX_ABORTED",
          value: "38",
          description: "The number of aborted low-priority packet traffic arbitration transmissions.",
        },
        {
          name: "EMBER_COUNTER_PTA_HI_PRI_TX_ABORTED",
          value: "39",
          description: "The number of aborted high-priority packet traffic arbitration transmissions.",
        },
        {
          name: "EMBER_COUNTER_TYPE_COUNT",
          value: "40",
          description: "A placeholder giving the number of Ember
                        counter types.",
        },
      ],
    },
    {
      name: "EmberJoinMethod",
      type: "uint8_t",
      description: "The type of method used for joining.",
      items: [
        {
          name: "EMBER_USE_MAC_ASSOCIATION",
          value: "0x0",
          description: "Normally devices use MAC Association to join a
                        network, which respects the \"permit joining\" flag
                        in the MAC Beacon.  
                        This value should be used by default.",
        },
        {
          name: "EMBER_USE_NWK_REJOIN",
          value: "0x1",
          description: "For those networks where the \"permit joining\" flag
                        is never turned on, they will need to use a ZigBee
                        NWK Rejoin.  This value causes the rejoin to be
                        sent without NWK security and the Trust Center
                        will be asked to send the NWK key to the device.
                        The NWK key sent to the device can be encrypted
                        with the device's corresponding Trust Center link
                        key.  That is determined by the ::EmberJoinDecision
                        on the Trust Center returned by the
                        ::emberTrustCenterJoinHandler().",
        },
        {
          name: "EMBER_USE_NWK_REJOIN_HAVE_NWK_KEY",
          value: "0x2",
          description: "For those networks where the \"permit joining\" flag
                        is never turned on, they will need to use a NWK
                        Rejoin.  If those devices have been preconfigured
                        with the  NWK key (including sequence number)
                        they can use a secured rejoin.  This is only
                        necessary for end devices since they need a
                        parent.  Routers can simply use the
                        ::EMBER_USE_NWK_COMMISSIONING join method below.",
        },
        {
          name: "EMBER_USE_NWK_COMMISSIONING",
          value: "0x3",
          description: "For those networks where all network and
                        security information is known ahead of time,
                        a router device may be commissioned such that
                        it does not need to send any messages to begin
                        communicating on the network.",
        },
      ],
    },
    {
      name: "EmberZdoConfigurationFlags",
      type: "uint8_t",
      description: "Flags for controlling which incoming ZDO requests
                    are passed to the application. To see if the
                    application is required to send a ZDO response to
                    an incoming message, the application must check the
                    APS options bitfield within the incomingMessageHandler
                    callback to see if the
                    EMBER_APS_OPTION_ZDO_RESPONSE_REQUIRED flag is set.",
      items: [
        {
          name: "EMBER_APP_RECEIVES_SUPPORTED_ZDO_REQUESTS",
          value: "0x01",
          description: "Set this flag in order to receive supported
                        ZDO request messages via the
                        incomingMessageHandler callback. A supported ZDO
                        request is one that is handled by the EmberZNet
                        stack. The stack will continue to handle the
                        request and send the appropriate ZDO response
                        even if this configuration option is enabled.",
        },
        {
          name: "EMBER_APP_HANDLES_UNSUPPORTED_ZDO_REQUESTS",
          value: "0x02",
          description: "Set this flag in order to receive unsupported
                        ZDO request messages via the
                        incomingMessageHandler callback. An unsupported ZDO
                        request is one that is not handled by the
                        EmberZNet stack, other than to send a 'not
                        supported' ZDO response. If this configuration
                        option is enabled, the stack will no longer
                        send any ZDO response, and it is the
                        application's responsibility to do so.",
        },
        {
          name: "EMBER_APP_HANDLES_ZDO_ENDPOINT_REQUESTS",
          value: "0x04",
          description: "Set this flag in order to receive the
                        following ZDO request messages via the
                        incomingMessageHandler callback:
                        SIMPLE_DESCRIPTOR_REQUEST, MATCH_DESCRIPTORS_REQUEST,
                        and ACTIVE_ENDPOINTS_REQUEST. If this configuration
                        option is enabled, the stack will no longer
                        send any ZDO response for these requests, and
                        it is the application's responsibility to do so.",
        },
        {
          name: "EMBER_APP_HANDLES_ZDO_BINDING_REQUESTS",
          value: "0x08",
          description: "Set this flag in order to receive the
                        following ZDO request messages via the
                        incomingMessageHandler callback:
                        BINDING_TABLE_REQUEST, BIND_REQUEST, and
                        UNBIND_REQUEST. If this configuration option is
                        enabled, the stack will no longer send any ZDO
                        response for these requests, and it is the
                        application's responsibility to do so.",
        },
      ],
    },
    {
      name: "EmberConcentratorType",
      type: "uint16_t",
      description: "Type of concentrator.",
      items: [
        {
          name: "EMBER_LOW_RAM_CONCENTRATOR",
          value: "0xFFF8",
          description: "A concentrator with insufficient memory to store
                        source routes for the entire network. Route
                        records are sent to the concentrator prior to
                        every inbound APS unicast.",
        },
        {
          name: "EMBER_HIGH_RAM_CONCENTRATOR",
          value: "0xFFF9",
          description: "A concentrator with sufficient memory to store
                        source routes for the entire network. Remote
                        nodes stop sending route records once the
                        concentrator has successfully received one.",
        },
      ],
    },
    {
      name: "EmberZllState",
      type: "uint16_t",
      description: "ZLL device state identifier",
      items: [
        {
          name: "EMBER_ZLL_STATE_NONE",
          value: "0x0000",
          description: "No state.",
        },
        {
          name: "EMBER_ZLL_STATE_FACTORY_NEW",
          value: "0x0001",
          description: "The device is factory new.",
        },
        {
          name: "EMBER_ZLL_STATE_ADDRESS_ASSIGNMENT_CAPABLE",
          value: "0x0002",
          description: "The device is capable of assigning addresses to
                        other devices.",
        },
        {
          name: "EMBER_ZLL_STATE_LINK_INITIATOR",
          value: "0x0010",
          description: "The device is initiating a link operation.",
        },
        {
          name: "EMBER_ZLL_STATE_LINK_PRIORITY_REQUEST",
          value: "0x0020",
          description: "The device is requesting link priority.",
        },
        {
          name: "EMBER_ZLL_STATE_NON_ZLL_NETWORK",
          value: "0x0100",
          description: "The device is on a non-ZLL network.",
        },
      ],
    },
    {
      name: "EmberZllKeyIndex",
      type: "uint8_t",
      description: "ZLL key encryption algorithm enumeration.",
      items: [
        {
          name: "EMBER_ZLL_KEY_INDEX_DEVELOPMENT",
          value: "0x00",
          description: "Key encryption algorithm for use during
                        development.",
        },
        {
          name: "EMBER_ZLL_KEY_INDEX_MASTER",
          value: "0x04",
          description: "Key encryption algorithm shared by all certified
                        devices.",
        },
        {
          name: "EMBER_ZLL_KEY_INDEX_CERTIFICATION",
          value: "0x0F",
          description: "Key encryption algorithm for use during
                        development and certification.",
        },
      ],
    },
    {
      name: "EzspZllNetworkOperation",
      type: "uint8_t",
      description: "Differentiates among ZLL network operations.",
      items: [
        {
          name: "EZSP_ZLL_FORM_NETWORK",
          value: "0x00",
          description: "ZLL form network command.",
        },
        {
          name: "EZSP_ZLL_JOIN_TARGET",
          value: "0x01",
          description: "ZLL join target command.",
        },
      ],
    },
    {
      name: "EzspSourceRouteOverheadInformation",
      type: "uint8_t",
      description: "Validates Source Route Overhead Information cached",
      items: [
        {
          name: "EZSP_SOURCE_ROUTE_OVERHEAD_UNKNOWN",
          value: "0xFF",
          description: "Ezsp source route overhead unknown",
        },
      ],
    },
    {
      name: "EmberNetworkInitBitmask",
      type: "uint16_t",
      description: "Bitmask options for emberNetworkInit()",
      items: [
        {
          name: "EMBER_NETWORK_INIT_NO_OPTIONS",
          value: "0x0000",
          description: "No options for Network Init",
        },
        {
          name: "EMBER_NETWORK_INIT_PARENT_INFO_IN_TOKEN",
          value: "0x0001",
          description: "Save parent info (node ID and EUI64) in a
                        token during joining/rejoin, and restore on
                        reboot.",
        },
        {
          name: "EMBER_NETWORK_INIT_END_DEVICE_REJOIN_ON_REBOOT",
          value: "0x0002",
          description: "Send a rejoin request as an end device on
                        reboot if parent information is persisted.",
        },
      ],
    },
    {
      name: "EmberMultiPhyNwkConfig",
      type: "uint8_t",
      description: "Network configuration for the desired radio interface
                    for multi phy network.",
      items: [
        {
          name: "EMBER_BROADCAST_SUPPORT",
          value: "0x01",
          description: "Enable broadcast support on Routers",
        },
      ],
    },
    {
      name: "EmberDutyCycleState",
      type: "uint8_t",
      description: "Duty cycle states.",
      items: [
        {
          name: "EMBER_DUTY_CYCLE_TRACKING_OFF",
          value: "0",
          description: "No Duty cycle tracking or metrics are taking
                        place.",
        },
        {
          name: "EMBER_DUTY_CYCLE_LBT_NORMAL",
          value: "1",
          description: "Duty Cycle is tracked and has not exceeded
                        any thresholds.",
        },
        {
          name: "EMBER_DUTY_CYCLE_LBT_LIMITED_THRESHOLD_REACHED",
          value: "2",
          description: "We have exceeded the limited threshold of our
                        total duty cycle allotment.",
        },
        {
          name: "EMBER_DUTY_CYCLE_LBT_CRITICAL_THRESHOLD_REACHED",
          value: "3",
          description: "We have exceeded the critical threshold of our
                        total duty cycle allotment",
        },
        {
          name: "EMBER_DUTY_CYCLE_LBT_SUSPEND_LIMIT_REACHED",
          value: "4",
          description: "We have reached the suspend limit and are blocking
                        all outbound transmissions.",
        },
      ],
    },
    {
      name: "EmberRadioPowerMode",
      type: "uint8_t",
      description: "Radio power modes.",
      items: [
        {
          name: "EMBER_RADIO_POWER_MODE_RX_ON",
          value: "0",
          description: "The radio receiver is switched on.",
        },
        {
          name: "EMBER_RADIO_POWER_MODE_OFF",
          value: "1",
          description: "The radio receiver is switched off.",
        },
      ],
    },
  ],

  frames: ~,

}
# END Common

################################################################################
- {
  section: Configuration Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## VERSION
    {
      value: "0x00",
      commandName: "version",
      description: "The command allows the Host to specify the desired
                    EZSP version and must be sent before any other
                    command. This document describes EZSP version 4 and
                    stack type 2 (mesh). The response provides
                    information about the firmware running on the NCP.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "desiredProtocolVersion",
          description: "The EZSP version the Host wishes to use. To
                        successfully set the version and allow other
                        commands, this must be 4.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "protocolVersion",
          description: "The EZSP version the NCP is using (4).",
        },
        {
          type: "uint8_t",
          name: "stackType",
          description: "The type of stack running on the NCP (2).",
        },
        {
          type: "uint16_t",
          name: "stackVersion",
          description: "The version number of the stack.",
        },
      ],
    },
    ## GET_CONFIGURATION_VALUE
    {
      value: "0x52",
      commandName: "getConfigurationValue",
      description: "Reads a configuration value from the NCP.",
      commandArguments: [
        {
          type: "EzspConfigId",
          name: "configId",
          description: "Identifies which configuration value to read.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the value was read successfully,
                        EZSP_ERROR_INVALID_ID if the NCP does not
                        recognize <i>configId</i>.",
        },
        {
          type: "uint16_t",
          name: "value",
          description: "The configuration value.",
        },
      ],
    },
    ## SET_CONFIGURATION_VALUE
    {
      value: "0x53",
      commandName: "setConfigurationValue",
      description: "Writes a configuration value to the NCP.
                    Configuration values can be modified by the Host
                    after the NCP has reset. Once the status of the
                    stack changes to EMBER_NETWORK_UP, configuration
                    values can no longer be modified and this command
                    will respond with EZSP_ERROR_INVALID_CALL.",
      commandArguments: [
        {
          type: "EzspConfigId",
          name: "configId",
          description: "Identifies which configuration value to change.",
        },
        {
          type: "uint16_t",
          name: "value",
          description: "The new configuration value.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the configuration value was
                        changed, EZSP_ERROR_OUT_OF_MEMORY if the new value
                        exceeded the available memory,
                        EZSP_ERROR_INVALID_VALUE if the new value was out
                        of bounds, EZSP_ERROR_INVALID_ID if the NCP does
                        not recognize <i>configId</i>,
                        EZSP_ERROR_INVALID_CALL if configuration values can
                        no longer be modified.",
        },
      ],
    },
    ## ADD_ENDPOINT
    {
      value: "0x02",
      commandName: "addEndpoint",
      description: "Configures endpoint information on the NCP. The NCP
                    does not remember these settings after a reset.
                    Endpoints can be added by the Host after the NCP
                    has reset. Once the status of the stack changes to
                    EMBER_NETWORK_UP, endpoints can no longer be added
                    and this command will respond with
                    EZSP_ERROR_INVALID_CALL.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "endpoint",
          description: "The application endpoint to be added.",
        },
        {
          type: "uint16_t",
          name: "profileId",
          description: "The endpoint's application profile.",
        },
        {
          type: "uint16_t",
          name: "deviceId",
          description: "The endpoint's device ID within the application
                        profile.",
        },
        {
          type: "uint8_t",
          name: "deviceVersion",
          description: "The endpoint's device version.",
        },
        {
          type: "uint8_t",
          name: "inputClusterCount",
          description: "The number of cluster IDs in
                        <i>inputClusterList</i>.",
        },
        {
          type: "uint8_t",
          name: "outputClusterCount",
          description: "The number of cluster IDs in
                        <i>outputClusterList</i>.",
        },
        {
          type: "uint16_t[inputClusterCount]",
          name: "inputClusterList",
          description: "Input cluster IDs the endpoint will accept.",
        },
        {
          type: "uint16_t[outputClusterCount]",
          name: "outputClusterList",
          description: "Output cluster IDs the endpoint may send.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the endpoint was added,
                        EZSP_ERROR_OUT_OF_MEMORY if there is not enough
                        memory available to add the endpoint,
                        EZSP_ERROR_INVALID_VALUE if the endpoint already
                        exists, EZSP_ERROR_INVALID_CALL if endpoints can
                        no longer be added.",
        },
      ],
    },
    ## SET_POLICY
    {
      value: "0x55",
      commandName: "setPolicy",
      description: "Allows the Host to change the policies used by
                    the NCP to make fast decisions.",
      commandArguments: [
        {
          type: "EzspPolicyId",
          name: "policyId",
          description: "Identifies which policy to modify.",
        },
        {
          type: "EzspDecisionId",
          name: "decisionId",
          description: "The new decision for the specified policy.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the policy was changed,
                        EZSP_ERROR_INVALID_ID if the NCP does not
                        recognize <i>policyId</i>.",
        },
      ],
    },
    ## GET_POLICY
    {
      value: "0x56",
      commandName: "getPolicy",
      description: "Allows the Host to read the policies used by the
                    NCP to make fast decisions.",
      commandArguments: [
        {
          type: "EzspPolicyId",
          name: "policyId",
          description: "Identifies which policy to read.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the policy was read
                        successfully, EZSP_ERROR_INVALID_ID if the NCP
                        does not recognize <i>policyId</i>.",
        },
        {
          type: "EzspDecisionId",
          name: "decisionId",
          description: "The current decision for the specified policy.",
        },
      ],
    },
    ## GET_VALUE
    {
      value: "0xAA",
      commandName: "getValue",
      description: "Reads a value from the NCP.",
      commandArguments: [
        {
          type: "EzspValueId",
          name: "valueId",
          description: "Identifies which value to read.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the value was read successfully,
                        EZSP_ERROR_INVALID_ID if the NCP does not
                        recognize <i>valueId</i>.",
        },
        {
          type: "uint8_t",
          name: "valueLength",
          description: "The length of the <i>value</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[valueLength]",
          name: "value",
          description: "The value.",
        },
      ],
    },
    ## GET_EXTENDED_VALUE
    {
      value: "0x03",
      commandName: "getExtendedValue",
      description: "Reads a value from the NCP but passes an extra
                    argument specific to the value being retrieved.",
      commandArguments: [
        {
          type: "EzspExtendedValueId",
          name: "valueId",
          description: "Identifies which extended value ID to read.",
        },
        {
          type: "uint32_t",
          name: "characteristics",
          description: "Identifies which characteristics of the extended
                        value ID to read. These are specific to the
                        value being read.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the value was read successfully,
                        EZSP_ERROR_INVALID_ID if the NCP does not
                        recognize <i>valueId</i>.",
        },
        {
          type: "uint8_t",
          name: "valueLength",
          description: "The length of the <i>value</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[valueLength]",
          name: "value",
          description: "The value.",
        },
      ],
    },
    ## SET_VALUE
    {
      value: "0xAB",
      commandName: "setValue",
      description: "Writes a value to the NCP.",
      commandArguments: [
        {
          type: "EzspValueId",
          name: "valueId",
          description: "Identifies which value to change.",
        },
        {
          type: "uint8_t",
          name: "valueLength",
          description: "The length of the <i>value</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[valueLength]",
          name: "value",
          description: "The new value.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the value was changed,
                        EZSP_ERROR_INVALID_VALUE if the new value was out
                        of bounds, EZSP_ERROR_INVALID_ID if the NCP does
                        not recognize <i>valueId</i>,
                        EZSP_ERROR_INVALID_CALL if the value could not be
                        modified.",
        },
      ],
    },
    ## SET_GPIO_CURRENT_CONFIGURATION
    {
      value: "0xAC",
      commandName: "setGpioCurrentConfiguration",
      description: "Sets the GPIO configuration and output values for
                    the specified pin.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "portPin",
          description: "The pin to configure.",
        },
        {
          type: "uint8_t",
          name: "cfg",
          description: "The new configuration value.",
        },
        {
          type: "uint8_t",
          name: "out",
          description: "The new output value.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the values were changed,
                        EZSP_ERROR_INVALID_VALUE if the pin was out of
                        bounds, EZSP_ERROR_INVALID_CALL if the pin could
                        not be modified because it is required for
                        communication with the NCP.",
        },
      ],
    },
    ## SET_GPIO_POWER_UP_DOWN_CONFIGURATION
    {
      value: "0xAD",
      commandName: "setGpioPowerUpDownConfiguration",
      description: "Sets the GPIO configuration and output values to
                    be used for the specified pin when the NCP is
                    powered up and down.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "portPin",
          description: "The pin to configure.",
        },
        {
          type: "uint8_t",
          name: "puCfg",
          description: "The new configuration value for power up.",
        },
        {
          type: "uint8_t",
          name: "puOut",
          description: "The new output value for power up.",
        },
        {
          type: "uint8_t",
          name: "pdCfg",
          description: "The new configuration value for power down.",
        },
        {
          type: "uint8_t",
          name: "pdOut",
          description: "The new output value for power down.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "EZSP_SUCCESS if the values were changed,
                        EZSP_ERROR_INVALID_VALUE if the pin was out of
                        bounds, EZSP_ERROR_INVALID_CALL if the pin could
                        not be modified because it is required for
                        communication with the NCP.",
        },
      ],
    },
    ## SET_GPIO_RADIO_POWER_MASK
    {
      value: "0xAE",
      commandName: "setGpioRadioPowerMask",
      description: "Sets the mask that controls which pins will have
                    their GPIO configuration and output values set to
                    their power-up and power-down values when the NCP
                    powers the radio up and down.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "mask",
          description: "The new mask.",
        },
      ],
      responseArguments: [
      ],
    },
    ## SET_CTUNE
    {
      value: "0xF5",
      commandName: "setCtune",
      description: "Apply a new CTUNE value.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "ctune",
          description: "The new CTUNE value. Valid range is 0x0000-0x01FF.
                        Higher order bits (0xFE00) of the 16-bit value
                        are ignored.",
        },
      ],
      responseArguments: [
      ],
    },
    ## GET_CTUNE
    {
      value: "0xF6",
      commandName: "getCtune",
      description: "Retrieves the current CTUNE value.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint16_t",
          name: "ctune",
          description: "The current CTUNE value.",
        },
      ],
    },
  ],

}
# END Configuration Frames

################################################################################
- {
  section: Utilities Frames,

  ncpCpps: ~,

  typedefs: [
    {
      name: "EmberLibraryStatus",
      description: "The presence and status of the Ember library.",
      definition: "uint8_t"
    },
  ],

  enums: ~,

  frames: [
    ## NOP
    {
      value: "0x05",
      commandName: "nop",
      description: "A command which does nothing. The Host can use
                    this to set the sleep mode or to check the status
                    of the NCP.",
      commandArguments: [
      ],
      responseArguments: [
      ],
    },
    ## ECHO
    {
      value: "0x81",
      commandName: "echo",
      description: "Variable length data from the Host is echoed back
                    by the NCP. This command has no other effects and
                    is designed for testing the link between the Host
                    and NCP.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "dataLength",
          description: "The length of the <i>data</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[dataLength]",
          name: "data",
          description: "The data to be echoed back.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "echoLength",
          description: "The length of the <i>echo</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[echoLength]",
          name: "echo",
          description: "The echo of the data.",
        },
      ],
    },
    ## INVALID_COMMAND
    {
      value: "0x58",
      commandName: "invalidCommand",
      description: "Indicates that the NCP received an invalid command.",
      responseArguments: [
        {
          type: "EzspStatus",
          name: "reason",
          description: "The reason why the command was invalid.",
        },
      ],
    },
    ## CALLBACK
    {
      value: "0x06",
      commandName: "callback",
      description: "Allows the NCP to respond with a pending callback.",
      commandArguments: [
      ],
    },
    ## NO_CALLBACKS
    {
      value: "0x07",
      commandName: "noCallbacks",
      description: "Indicates that there are currently no pending
                    callbacks.",
      responseArguments: [
      ],
    },
    ## SET_TOKEN
    {
      value: "0x09",
      commandName: "setToken",
      description: "Sets a token (8 bytes of non-volatile storage) in
                    the Simulated EEPROM of the NCP.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "tokenId",
          description: "Which token to set (0 to 7).",
        },
        {
          type: "uint8_t[8]",
          name: "tokenData",
          description: "The data to write to the token.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_TOKEN
    {
      value: "0x0A",
      commandName: "getToken",
      description: "Retrieves a token (8 bytes of non-volatile storage)
                    from the Simulated EEPROM of the NCP.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "tokenId",
          description: "Which token to read (0 to 31 for EM357, 0 to
                        7 for other NCPs).",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "uint8_t[8]",
          name: "tokenData",
          description: "The contents of the token.",
        },
      ],
    },
    ## GET_MFG_TOKEN
    {
      value: "0x0B",
      commandName: "getMfgToken",
      description: "Retrieves a manufacturing token from the Flash
                    Information Area of the NCP (except for
                    EZSP_STACK_CAL_DATA which is managed by the stack).",
      commandArguments: [
        {
          type: "EzspMfgTokenId",
          name: "tokenId",
          description: "Which manufacturing token to read.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "tokenDataLength",
          description: "The length of the <i>tokenData</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[tokenDataLength]",
          name: "tokenData",
          description: "The manufacturing token data.",
        },
      ],
    },
    ## SET_MFG_TOKEN
    {
      value: "0x0C",
      commandName: "setMfgToken",
      description: "Sets a manufacturing token in the Customer
                    Information Block (CIB) area of the NCP if that
                    token currently unset (fully erased). Cannot be used
                    with EZSP_STACK_CAL_DATA, EZSP_STACK_CAL_FILTER,
                    EZSP_MFG_ASH_CONFIG, or EZSP_MFG_CBKE_DATA token.",
      commandArguments: [
        {
          type: "EzspMfgTokenId",
          name: "tokenId",
          description: "Which manufacturing token to set.",
        },
        {
          type: "uint8_t",
          name: "tokenDataLength",
          description: "The length of the <i>tokenData</i> parameter in
                        bytes.",
        },
        {
          type: "uint8_t[tokenDataLength]",
          name: "tokenData",
          description: "The manufacturing token data.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## STACK_TOKEN_CHANGED_HANDLER
    {
      value: "0x0D",
      commandName: "stackTokenChangedHandler",
      description: "A callback invoked to inform the application that
                    a stack token has changed.",
      responseArguments: [
        {
          type: "uint16_t",
          name: "tokenAddress",
          description: "The address of the stack token that has
                        changed.",
        },
      ],
    },
    ## GET_RANDOM_NUMBER
    {
      value: "0x49",
      commandName: "getRandomNumber",
      description: "Returns a pseudorandom number.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "Always returns EMBER_SUCCESS.",
        },
        {
          type: "uint16_t",
          name: "value",
          description: "A pseudorandom number.",
        },
      ],
    },
    ## SET_TIMER
    {
      value: "0x0E",
      commandName: "setTimer",
      description: "Sets a timer on the NCP. There are 2 independent
                    timers available for use by the Host. A timer can
                    be cancelled by setting <i>time</i> to 0 or
                    <i>units</i> to EMBER_EVENT_INACTIVE.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "timerId",
          description: "Which timer to set (0 or 1).",
        },
        {
          type: "uint16_t",
          name: "time",
          description: "The delay before the <i>timerHandler</i> callback
                        will be generated. Note that the timer clock is
                        free running and is not synchronized with this
                        command. This means that the actual delay will
                        be between <i>time</i> and (<i>time</i> - 1).
                        The maximum delay is 32767.",
        },
        {
          type: "EmberEventUnits",
          name: "units",
          description: "The units for <i>time</i>.",
        },
        {
          type: "bool",
          name: "repeat",
          description: "If true, a <i>timerHandler</i> callback will be
                        generated repeatedly. If false, only a single
                        <i>timerHandler</i> callback will be generated.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_TIMER
    {
      value: "0x4E",
      commandName: "getTimer",
      description: "Gets information about a timer. The Host can use
                    this command to find out how much longer it will
                    be before a previously set timer will generate a
                    callback.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "timerId",
          description: "Which timer to get information about (0 or 1).",
        },
      ],
      responseArguments: [
        {
          type: "uint16_t",
          name: "time",
          description: "The delay before the <i>timerHandler</i> callback
                        will be generated.",
        },
        {
          type: "EmberEventUnits",
          name: "units",
          description: "The units for <i>time</i>.",
        },
        {
          type: "bool",
          name: "repeat",
          description: "True if a <i>timerHandler</i> callback will be
                        generated repeatedly. False if only a single
                        <i>timerHandler</i> callback will be generated.",
        },
      ],
    },
    ## TIMER_HANDLER
    {
      value: "0x0F",
      commandName: "timerHandler",
      description: "A callback from the timer.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "timerId",
          description: "Which timer generated the callback (0 or 1).",
        },
      ],
    },
    ## DEBUG_WRITE
    {
      value: "0x12",
      commandName: "debugWrite",
      description: "Sends a debug message from the Host to the
                    Network Analyzer utility via the NCP.",
      commandArguments: [
        {
          type: "bool",
          name: "binaryMessage",
          description: "true if the message should be interpreted as
                        binary data, false if the message should be
                        interpreted as ASCII text.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The binary message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## READ_AND_CLEAR_COUNTERS
    {
      value: "0x65",
      commandName: "readAndClearCounters",
      description: "Retrieves and clears Ember counters. See the
                    EmberCounterType enumeration for the counter types.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint16_t[EMBER_COUNTER_TYPE_COUNT]",
          name: "values",
          description: "A list of all counter values ordered according
                        to the EmberCounterType enumeration.",
        },
      ],
    },
    ## READ_COUNTERS
    {
      value: "0xF1",
      commandName: "readCounters",
      description: "Retrieves Ember counters. See the EmberCounterType
                    enumeration for the counter types.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint16_t[EMBER_COUNTER_TYPE_COUNT]",
          name: "values",
          description: "A list of all counter values ordered according
                        to the EmberCounterType enumeration.",
        },
      ],
    },
    ## COUNTER_ROLLOVER_HANDLER
    {
      value: "0xF2",
      commandName: "counterRolloverHandler",
      description: "This call is fired when a counter exceeds its
                    threshold",
      responseArguments: [
        {
          type: "EmberCounterType",
          name: "type",
          description: "Type of Counter",
        },
      ],
    },
    ## DELAY_TEST
    {
      value: "0x9D",
      commandName: "delayTest",
      description: "Used to test that UART flow control is working
                    correctly.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "delay",
          description: "Data will not be read from the host for this
                        many milliseconds.",
        },
      ],
      responseArguments: [
      ],
    },
    ## GET_LIBRARY_STATUS
    {
      value: "0x01",
      commandName: "getLibraryStatus",
      description: "This retrieves the status of the passed library ID
                    to determine if it is compiled into the stack.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "libraryId",
          description: "The ID of the library being queried.",
        },
      ],
      responseArguments: [
        {
          type: "EmberLibraryStatus",
          name: "status",
          description: "The status of the library being queried.",
        },
      ],
    },
    ## GET_XNCP_INFO
    {
      value: "0x13",
      commandName: "getXncpInfo",
      description: "Allows the HOST to know whether the NCP is
                    running the XNCP library. If so, the response
                    contains also the manufacturer ID and the version
                    number of the XNCP application that is running on
                    the NCP.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the NCP is running the XNCP
                        library. EMBER_INVALID_CALL otherwise.",
        },
        {
          type: "uint16_t",
          name: "manufacturerId",
          description: "The manufactured ID the user has defined in
                        the XNCP application.",
        },
        {
          type: "uint16_t",
          name: "versionNumber",
          description: "The version number of the XNCP application.",
        },
      ],
    },
    ## CUSTOM_FRAME
    {
      value: "0x47",
      commandName: "customFrame",
      description: "Provides the customer a custom EZSP frame. On the
                    NCP, these frames are only handled if the XNCP
                    library is included. On the NCP side these frames
                    are handled in the
                    emberXNcpIncomingCustomEzspMessageCallback() callback
                    function.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "payloadLength",
          description: "The length of the custom frame payload.",
        },
        {
          type: "uint8_t[payloadLength]",
          name: "payload",
          description: "The payload of the custom frame.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The status returned by the custom command.",
        },
        {
          type: "uint8_t",
          name: "replyLength",
          description: "The length of the response.",
        },
        {
          type: "uint8_t[replyLength]",
          name: "reply",
          description: "The response.",
        },
      ],
    },
    ## CUSTOM_FRAME_HANDLER
    {
      value: "0x54",
      commandName: "customFrameHandler",
      description: "A callback indicating a custom EZSP message has
                    been received.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "payloadLength",
          description: "The length of the custom frame payload.",
        },
        {
          type: "uint8_t[payloadLength]",
          name: "payload",
          description: "The payload of the custom frame.",
        },
      ],
    },
    ## GET_EUI64
    {
      value: "0x26",
      commandName: "getEui64",
      description: "Returns the EUI64 ID of the local node.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The 64-bit ID.",
        },
      ],
    },
    ## GET_NODE_ID
    {
      value: "0x27",
      commandName: "getNodeId",
      description: "Returns the 16-bit node ID of the local node.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The 16-bit ID.",
        },
      ],
    },
    ## GET_PHY_INTERFACE_COUNT
    {
      value: "0xFC",
      commandName: "getPhyInterfaceCount",
      description: "Returns number of phy interfaces present.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "interfaceCount",
          description: "Value indicate how many phy interfaces present.",
        },
      ],
    },
  ],

}
# END Utilities Frames

################################################################################
- {
  section: Networking Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## SET_MANUFACTURER_CODE
    {
      value: "0x15",
      commandName: "setManufacturerCode",
      description: "Sets the manufacturer code to the specified value.
                    The manufacturer code is one of the fields of the
                    node descriptor.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "code",
          description: "The manufacturer code for the local node.",
        },
      ],
      responseArguments: [
      ],
    },
    ## SET_POWER_DESCRIPTOR
    {
      value: "0x16",
      commandName: "setPowerDescriptor",
      description: "Sets the power descriptor to the specified value.
                    The power descriptor is a dynamic value, therefore
                    you should call this function whenever the value
                    changes.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "descriptor",
          description: "The new power descriptor for the local node.",
        },
      ],
      responseArguments: [
      ],
    },
    ## NETWORK_INIT
    {
      value: "0x17",
      commandName: "networkInit",
      description: "Resume network operation after a reboot. The node
                    retains its original type. This should be called on
                    startup whether or not the node was previously part
                    of a network. EMBER_NOT_JOINED is returned if the
                    node is not part of a network. This command accepts
                    options to control the network initialization.",
      commandArguments: [
        {
          type: "EmberNetworkInitStruct",
          name: "networkInitStruct",
          description: "An EmberNetworkInitStruct containing the options
                        for initialization.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value that indicates one of the
                        following: successful initialization,
                        EMBER_NOT_JOINED if the node is not part of a
                        network, or the reason for failure.",
        },
      ],
    },
    ## NETWORK_STATE
    {
      value: "0x18",
      commandName: "networkState",
      description: "Returns a value indicating whether the node is
                    joining, joined to, or leaving a network.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberNetworkStatus",
          name: "status",
          description: "An EmberNetworkStatus value indicating the
                        current join status.",
        },
      ],
    },
    ## STACK_STATUS_HANDLER
    {
      value: "0x19",
      commandName: "stackStatusHandler",
      description: "A callback invoked when the status of the stack
                    changes. If the status parameter equals
                    EMBER_NETWORK_UP, then the <i>getNetworkParameters</i>
                    command can be called to obtain the new network
                    parameters. If any of the parameters are being
                    stored in nonvolatile memory by the Host, the
                    stored values should be updated.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "Stack status. One of the following:
                        EMBER_NETWORK_UP, EMBER_NETWORK_DOWN,
                        EMBER_JOIN_FAILED, EMBER_MOVE_FAILED",
        },
      ],
    },
    ## START_SCAN
    {
      value: "0x1A",
      commandName: "startScan",
      description: "This function will start a scan.",
      commandArguments: [
        {
          type: "EzspNetworkScanType",
          name: "scanType",
          description: "Indicates the type of scan to be performed.
                        Possible values are: EZSP_ENERGY_SCAN and
                        EZSP_ACTIVE_SCAN. For each type, the respective
                        callback for reporting results is:
                        energyScanResultHandler and networkFoundHandler. The
                        energy scan and active scan report errors and
                        completion via the scanCompleteHandler.",
        },
        {
          type: "uint32_t",
          name: "channelMask",
          description: "Bits set as 1 indicate that this particular
                        channel should be scanned. Bits set to 0
                        indicate that this particular channel should not
                        be scanned. For example, a channelMask value of
                        0x00000001 would indicate that only channel 0
                        should be scanned. Valid channels range from 11
                        to 26 inclusive. This translates to a channel
                        mask value of 0x07FFF800. As a convenience, a
                        value of 0 is reinterpreted as the mask for
                        the current channel.",
        },
        {
          type: "uint8_t",
          name: "duration",
          description: "Sets the exponent of the number of scan
                        periods, where a scan period is 960 symbols.
                        The scan will occur for ((2^duration) + 1) scan
                        periods.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS signals that the scan successfully
                        started. Possible error responses and their
                        meanings: EMBER_MAC_SCANNING, we are already
                        scanning; EMBER_MAC_JOINED_NETWORK, we are
                        currently joined to a network and cannot begin
                        a scan; EMBER_MAC_BAD_SCAN_DURATION, we have set
                        a duration value that is not 0..14 inclusive;
                        EMBER_MAC_INCORRECT_SCAN_TYPE, we have requested an
                        undefined scanning type;
                        EMBER_MAC_INVALID_CHANNEL_MASK, our channel mask
                        did not specify any valid channels.",
        },
      ],
    },
    ## ENERGY_SCAN_RESULT_HANDLER
    {
      value: "0x48",
      commandName: "energyScanResultHandler",
      description: "Reports the result of an energy scan for a single
                    channel. The scan is not complete until the
                    <i>scanCompleteHandler</i> callback is called.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The 802.15.4 channel number that was scanned.",
        },
        {
          type: "int8_t",
          name: "maxRssiValue",
          description: "The maximum RSSI value found on the channel.",
        },
      ],
    },
    ## NETWORK_FOUND_HANDLER
    {
      value: "0x1B",
      commandName: "networkFoundHandler",
      description: "Reports that a network was found as a result of
                    a prior call to startScan. Gives the network
                    parameters useful for deciding which network to
                    join.",
      responseArguments: [
        {
          type: "EmberZigbeeNetwork",
          name: "networkFound",
          description: "The parameters associated with the network
                        found.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that generated
                        this beacon.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during the reception.",
        },
      ],
    },
    ## SCAN_COMPLETE_HANDLER
    {
      value: "0x1C",
      commandName: "scanCompleteHandler",
      description: "Returns the status of the current scan of type
                    EZSP_ENERGY_SCAN or EZSP_ACTIVE_SCAN. EMBER_SUCCESS
                    signals that the scan has completed. Other error
                    conditions signify a failure to scan on the channel
                    specified.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The channel on which the current error
                        occurred. Undefined for the case of
                        EMBER_SUCCESS.",
        },
        {
          type: "EmberStatus",
          name: "status",
          description: "The error condition that occurred on the
                        current channel. Value will be EMBER_SUCCESS when
                        the scan has completed.",
        },
      ],
    },
    ## UNUSED_PAN_ID_FOUND_HANDLER
    {
      value: "0xD2",
      commandName: "unusedPanIdFoundHandler",
      description: "This function returns an unused panID and channel pair
                    found via the find unused panId scan procedure.",
      responseArguments: [
        {
          type: "EmberPanId",
          name: "panId",
          description: "The unused panID which has been found.",
        },
        {
          type: "uint8_t",
          name: "channel",
          description: "The channel that the unused panID was found on.",
        },
      ],
    },
    ## FIND_UNUSED_PAN_ID
    {
      value: "0xD3",
      commandName: "findUnusedPanId",
      description: "This function starts a series of scans which will return
                    an available panId.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "channelMask",
          description: "The channels that will be scanned for available panIds.",
        },
        {
          type: "uint8_t",
          name: "duration",
          description: "The duration of the procedure.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The error condition that occurred during the scan. Value
                        will be EMBER_SUCCESS if there are no errors."
        },
      ],
    },
    ## STOP_SCAN
    {
      value: "0x1D",
      commandName: "stopScan",
      description: "Terminates a scan in progress.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## FORM_NETWORK
    {
      value: "0x1E",
      commandName: "formNetwork",
      description: "Forms a new network by becoming the coordinator.",
      commandArguments: [
        {
          type: "EmberNetworkParameters",
          name: "parameters",
          description: "Specification of the new network.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## JOIN_NETWORK
    {
      value: "0x1F",
      commandName: "joinNetwork",
      description: "Causes the stack to associate with the network
                    using the specified network parameters. It can take
                    several seconds for the stack to associate with the
                    local network. Do not send messages until the
                    <i>stackStatusHandler</i> callback informs you that
                    the stack is up.",
      commandArguments: [
        {
          type: "EmberNodeType",
          name: "nodeType",
          description: "Specification of the role that this node will
                        have in the network. This role must not be
                        EMBER_COORDINATOR. To be a coordinator, use the
                        <i>formNetwork</i> command.",
        },
        {
          type: "EmberNetworkParameters",
          name: "parameters",
          description: "Specification of the network with which the
                        node should associate.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## LEAVE_NETWORK
    {
      value: "0x20",
      commandName: "leaveNetwork",
      description: "Causes the stack to leave the current network.
                    This generates a <i>stackStatusHandler</i> callback to
                    indicate that the network is down. The radio will
                    not be used until after sending a <i>formNetwork</i>
                    or <i>joinNetwork</i> command.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## FIND_AND_REJOIN_NETWORK
    {
      value: "0x21",
      commandName: "findAndRejoinNetwork",
      description: "The application may call this function when contact
                    with the network has been lost. The most common
                    usage case is when an end device can no longer
                    communicate with its parent and wishes to find a
                    new one. Another case is when a device has missed
                    a Network Key update and no longer has the current
                    Network Key. <p> The stack will call
                    <i>ezspStackStatusHandler</i> to indicate that the
                    network is down, then try to re-establish contact
                    with the network by performing an active scan,
                    choosing a network with matching extended pan id,
                    and sending a ZigBee network rejoin request. A
                    second call to the <i>ezspStackStatusHandler</i>
                    callback indicates either the success or the failure
                    of the attempt. The process takes approximately 150
                    milliseconds per channel to complete. <p>",
      commandArguments: [
        {
          type: "bool",
          name: "haveCurrentNetworkKey",
          description: "This parameter tells the stack whether to try
                        to use the current network key. If it has the
                        current network key it will perform a secure
                        rejoin (encrypted). If this fails the device
                        should try an unsecure rejoin. If the Trust
                        Center allows the rejoin then the current
                        Network Key will be sent encrypted using the
                        device's Link Key.",
        },
        {
          type: "uint32_t",
          name: "channelMask",
          description: "A mask indicating the channels to be scanned.
                        See <i>emberStartScan</i> for format details. A
                        value of 0 is reinterpreted as the mask for the
                        current channel.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## PERMIT_JOINING
    {
      value: "0x22",
      commandName: "permitJoining",
      description: "Tells the stack to allow other nodes to join the
                    network with this node as their parent. Joining is
                    initially disabled by default.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "duration",
          description: "A value of 0x00 disables joining. A value of
                        0xFF enables joining. Any other value enables
                        joining for that number of seconds.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## CHILD_JOIN_HANDLER
    {
      value: "0x23",
      commandName: "childJoinHandler",
      description: "Indicates that a child has joined or left.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the child of interest.",
        },
        {
          type: "bool",
          name: "joining",
          description: "True if the child is joining. False the child
                        is leaving.",
        },
        {
          type: "EmberNodeId",
          name: "childId",
          description: "The node ID of the child.",
        },
        {
          type: "EmberEUI64",
          name: "childEui64",
          description: "The EUI64 of the child.",
        },
        {
          type: "EmberNodeType",
          name: "childType",
          description: "The node type of the child.",
        },
      ],
    },
    ## ENERGY_SCAN_REQUEST
    {
      value: "0x9C",
      commandName: "energyScanRequest",
      description: "Sends a ZDO energy scan request. This request may
                    only be sent by the current network manager and
                    must be unicast, not broadcast. See ezsp-utils.h for
                    related macros emberSetNetworkManagerRequest() and
                    emberChangeChannelRequest().",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "target",
          description: "The network address of the node to perform the
                        scan.",
        },
        {
          type: "uint32_t",
          name: "scanChannels",
          description: "A mask of the channels to be scanned",
        },
        {
          type: "uint8_t",
          name: "scanDuration",
          description: "How long to scan on each channel. Allowed
                        values are 0..5, with the scan times as
                        specified by 802.15.4 (0 = 31ms, 1 = 46ms, 2
                        = 77ms, 3 = 138ms, 4 = 261ms, 5 = 507ms).",
        },
        {
          type: "uint16_t",
          name: "scanCount",
          description: "The number of scans to be performed on each
                        channel (1..8).",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_NETWORK_PARAMETERS
    {
      value: "0x28",
      commandName: "getNetworkParameters",
      description: "Returns the current network parameters.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberNodeType",
          name: "nodeType",
          description: "An EmberNodeType value indicating the current
                        node type.",
        },
        {
          type: "EmberNetworkParameters",
          name: "parameters",
          description: "The current network parameters.",
        },
      ],
    },
    ## GET_RADIO_PARAMETERS
    {
      value: "0xFD",
      commandName: "getRadioParameters",
      description: "Returns the current radio parameters based on phy index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "phyIndex",
          description: "Desired index of phy interface for radio
                        parameters.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberMultiPhyRadioParameters",
          name: "parameters",
          description: "The current radio parameters based on provided
                        phy index.",
        },
      ]
    },
    ## GET_PARENT_CHILD_PARAMETERS
    {
      value: "0x29",
      commandName: "getParentChildParameters",
      description: "Returns information about the children of the local
                    node and the parent of the local node.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "childCount",
          description: "The number of children the node currently has.",
        },
        {
          type: "EmberEUI64",
          name: "parentEui64",
          description: "The parent's EUI64. The value is undefined for
                        nodes without parents (coordinators and nodes
                        that are not joined to a network).",
        },
        {
          type: "EmberNodeId",
          name: "parentNodeId",
          description: "The parent's node ID. The value is undefined
                        for nodes without parents (coordinators and nodes
                        that are not joined to a network).",
        },
      ],
    },
    ## GET_CHILD_DATA
    {
      value: "0x4A",
      commandName: "getChildData",
      description: "Returns information about a child of the local
                    node.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the child of interest in the
                        child table. Possible indexes range from zero to
                        EMBER_CHILD_TABLE_SIZE.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if there is a child at
                        <i>index</i>. EMBER_NOT_JOINED if there is no
                        child at <i>index</i>.",
        },
        {
          type: "EmberChildData",
          name: "childData",
          description: "The data of the child.",
        },
      ],
    },

    ## GET_SOURCE_ROUTE_TABLE_CAPACITY
    {
        value: "0xC3",
        commandName: "getSourceRouteTableTotalSize",
        description: "Returns the source route table total size.",
        commandArguments: [
        ],
        responseArguments: [
            {
            type: "uint8_t",
            name: "sourceRouteTableTotalSize",
            description: "Total size of source route table.",
            },
        ],
    },

    ## GET_SOURCE_ROUTE_TABLE_FILLED_SIZE
    {
        value: "0xC2",
        commandName: "getSourceRouteTableFilledSize",
        description: "Returns the number of filled entries in source route table.",
        commandArguments: [
        ],
        responseArguments: [
            {
            type: "uint8_t",
            name: "sourceRouteTableFilledSize",
            description: "The number of filled entries in source route table.",
            },
        ],
    },

    ## GET_SOURCE_ROUTE_TABLE_ENTRY
    {

        value: "0xC1",

        commandName: "getSourceRouteTableEntry",

        description: "Returns information about a source route table entry",

        commandArguments: [

            {

            type: "uint8_t",

            name: "index",

            description: "The index of the entry of interest in the

            source route table. Possible indexes range from zero to

            SOURCE_ROUTE_TABLE_FILLED_SIZE.",

            },

        ],

        responseArguments: [

            {

            type: "EmberStatus",

            name: "status",

            description: "EMBER_SUCCESS if there is source route entry at

            <i>index</i>. EMBER_SOURCE_ROUTE_FAILURE if there is no

            source route at <i>index</i>.",

            },

            {

            type: "EmberNodeId",

            name: "destination",

            description: "The node ID of the destination in that entry.",

            },

            {

            type: "uint8_t",

            name: "closerIndex",

            description: "The closer node index for this source route table entry",

            },
        ],
    },


    ## GET_NEIGHBOR
    {
      value: "0x79",
      commandName: "getNeighbor",
      description: "Returns the neighbor table entry at the given
                    index. The number of active neighbors can be
                    obtained using the neighborCount command.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the neighbor of interest.
                        Neighbors are stored in ascending order by node
                        id, with all unused entries at the end of the
                        table.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_ERR_FATAL if the index is greater or
                        equal to the number of active neighbors, or if
                        the device is an end device. Returns
                        EMBER_SUCCESS otherwise.",
        },
        {
          type: "EmberNeighborTableEntry",
          name: "value",
          description: "The contents of the neighbor table entry.",
        },
      ],
    },
    ## SET_ROUTING_SHORTCUT_THRESHOLD
    {
      value: "0xD0",
      commandName: "setRoutingShortcutThreshold",
        description: "Sets the routing shortcut threshold to directly use a neighbor instead of performing routing.",
        commandArguments: [
          {
            type: "uint8_t",
            name: "costThresh",
            description: "The routing shortcut threshold to configure.",
          },
        ],
        responseArguments: [
          {
            type: "EmberStatus",
            name: "status",
            description: "An EmberStatus value indicating success or the
            reason for failure.",
          },
        ],
    },
    ## GET_ROUTING_SHORTCUT_THRESHOLD
    {
    value: "0xD1",
    commandName: "getRoutingShortcutThreshold",
    description: "Gets the routing shortcut threshold used to differentiate between directly using a neighbor vs. performing routing.",
    commandArguments: [
    ],
    responseArguments: [
    {
    type: "uint8_t",
    name: "routingShortcutThresh",
    description: "The routing shortcut threshold",
    },
    ],
    },

    ## NEIGHBOR_COUNT
    {
      value: "0x7A",
      commandName: "neighborCount",
      description: "Returns the number of active entries in the
                    neighbor table.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "value",
          description: "The number of active entries in the neighbor
                        table.",
        },
      ],
    },
    ## GET_ROUTE_TABLE_ENTRY
    {
      value: "0x7B",
      commandName: "getRouteTableEntry",
      description: "Returns the route table entry at the given index.
                    The route table size can be obtained using the
                    getConfigurationValue command.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the route table entry of
                        interest.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_ERR_FATAL if the index is out of range
                        or the device is an end device, and
                        EMBER_SUCCESS otherwise.",
        },
        {
          type: "EmberRouteTableEntry",
          name: "value",
          description: "The contents of the route table entry.",
        },
      ],
    },
    ## SET_RADIO_POWER
    {
      value: "0x99",
      commandName: "setRadioPower",
      description: "Sets the radio output power at which a node is
                    operating. Ember radios have discrete power settings.
                    For a list of available power settings, see the
                    technical specification for the RF communication
                    module in your Developer Kit. Note: Care should be
                    taken when using this API on a running network, as
                    it will directly impact the established link
                    qualities neighboring nodes have with the node on
                    which it is called. This can lead to disruption of
                    existing routes and erratic network behavior.",
      commandArguments: [
        {
          type: "int8_t",
          name: "power",
          description: "Desired radio output power, in dBm.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
      ],
    },
    ## SET_RADIO_CHANNEL
    {
      value: "0x9A",
      commandName: "setRadioChannel",
      description: "Sets the channel to use for sending and receiving
                    messages. For a list of available radio channels,
                    see the technical specification for the RF
                    communication module in your Developer Kit. Note:
                    Care should be taken when using this API, as all
                    devices on a network must use the same channel.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "Desired radio channel.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
      ],
    },
    ## SET_CONCENTRATOR
    {
      value: "0x10",
      commandName: "setConcentrator",
      description: "Enable/disable concentrator support.",
      commandArguments: [
        {
          type: "bool",
          name: "on",
          description: "If this bool is true the concentrator
                        support is enabled. Otherwise is disabled. If
                        this bool is false all the other arguments
                        are ignored.",
        },
        {
          type: "uint16_t",
          name: "concentratorType",
          description: "Must be either EMBER_HIGH_RAM_CONCENTRATOR or
                        EMBER_LOW_RAM_CONCENTRATOR. The former is used
                        when the caller has enough memory to store
                        source routes for the whole network. In that
                        case, remote nodes stop sending route records
                        once the concentrator has successfully received
                        one. The latter is used when the concentrator
                        has insufficient RAM to store all outbound
                        source routes. In that case, route records are
                        sent to the concentrator prior to every inbound
                        APS unicast.",
        },
        {
          type: "uint16_t",
          name: "minTime",
          description: "The minimum amount of time that must pass
                        between MTORR broadcasts.",
        },
        {
          type: "uint16_t",
          name: "maxTime",
          description: "The maximum amount of time that can pass
                        between MTORR broadcasts.",
        },
        {
          type: "uint8_t",
          name: "routeErrorThreshold",
          description: "The number of route errors that will trigger a
                        re-broadcast of the MTORR.",
        },
        {
          type: "uint8_t",
          name: "deliveryFailureThreshold",
          description: "The number of APS delivery failures that will
                        trigger a re-broadcast of the MTORR.",
        },
        {
          type: "uint8_t",
          name: "maxHops",
          description: "The maximum number of hops that the MTORR
                        broadcast will be allowed to have. A value of
                        0 will be converted to the EMBER_MAX_HOPS value
                        set by the stack.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## SET_BROKEN_ROUTE_ERROR_CODE
        {
          value: "0x11",
          commandName: "setBrokenRouteErrorCode",
          description: "Sets the error code that is sent back from a router with a broken route. ",
          commandArguments: [
            {
            type: "uint8_t",
            name: "errorCode",
            description: "Desired error code.",
            },
          ],
          responseArguments: [
          {
            type: "EmberStatus",
            name: "status",
            description: "An EmberStatus value indicating the success or
            failure of the command.",
          },
        ],
    },

    ## MULTI_PHY_START
    {
      value: "0xF8",
      commandName: "multiPhyStart",
      description: "This causes to initialize the desired radio interface other
                    than native and form a new network by becoming the coordinator
                    with same panId as native radio network.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "phyIndex",
          description: "Index of phy interface. The native phy index would
                        be always zero hence valid phy index starts from one.",
        },
        {
          type: "uint8_t",
          name: "page",
          description: "Desired radio channel page.",
        },
        {
          type: "uint8_t",
          name: "channel",
          description: "Desired radio channel.",
        },
        {
          type: "int8_t",
          name: "power",
          description: "Desired radio output power, in dBm.",
        },
        {
          type: "EmberMultiPhyNwkConfig",
          name: "bitmask",
          description: "Network configuration bitmask.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MULTI_PHY_STOP
    {
      value: "0xF9",
      commandName: "multiPhyStop",
      description: "This causes to bring down the radio interface other than native.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "phyIndex",
          description: "Index of phy interface. The native phy index would
                        be always zero hence valid phy index starts from one.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MULTI_PHY_SET_RADIO_POWER
    {
      value: "0xFA",
      commandName: "multiPhySetRadioPower",
      description: "Sets the radio output power for desired phy interface
                    at which a node is operating. Ember radios have discrete
                    power settings. For a list of available power settings,
                    see the technical specification for the RF communication
                    module in your Developer Kit. Note: Care should be
                    taken when using this api on a running network, as
                    it will directly impact the established link
                    qualities neighboring nodes have with the node on
                    which it is called. This can lead to disruption of
                    existing routes and erratic network behavior.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "phyIndex",
          description: "Index of phy interface. The native phy index would
                        be always zero hence valid phy index starts from one.",
        },
        {
          type: "int8_t",
          name: "power",
          description: "Desired radio output power, in dBm.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
      ],
    },
    ## SEND_LINK_POWER_DELTA_REQUEST
    {
      value: "0xF7",
      commandName: "sendLinkPowerDeltaRequest",
      description: "Send Link Power Delta Request from a child to its parent",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
          failure of sending the request.",
        },
      ],
    },

    ## MULTI_PHY_SET_RADIO_CHANNEL
    {
      value: "0xFB",
      commandName: "multiPhySetRadioChannel",
      description: "Sets the channel for desired phy interface to use
                    for sending and receiving messages. For a list of
                    available radio pages and channels, see the technical
                    specification for the RF communication module in your
                    Developer Kit. Note: Care should be taken when using
                    this API, as all devices on a network must use the same
                    page and channel.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "phyIndex",
          description: "Index of phy interface. The native phy index would
                        be always zero hence valid phy index starts from one.",
        },
        {
          type: "uint8_t",
          name: "page",
          description: "Desired radio channel page.",
        },
        {
          type: "uint8_t",
          name: "channel",
          description: "Desired radio channel.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
      ],
    },
    ## GET_DUTY_CYCLE_STATE
    {
      value: "0x35",
      commandName: "getDutyCycleState",
      description: "Obtains the current duty cycle state.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
        {
          type: "EmberDutyCycleState",
          name: "returnedState",
          description: "The current duty cycle state in effect.",
        },
      ],
    },
    ## SET_DUTY_CYCLE_LIMITS_IN_STACK
    {
      value: "0x40",
      commandName: "setDutyCycleLimitsInStack",
      description: "Set the current duty cycle limits configuration.
                    The Default limits set by stack if this call is
                    not made.",
      commandArguments: [
      {
          type: "EmberDutyCycleLimits",
          name: "limits",
          description: "The duty cycle limits configuration to utilize.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS  if the duty cycle limit configurations
                        set successfully, EMBER_BAD_ARGUMENT if set illegal
                        value such as setting only one of the limits to default
                        or violates constraints Susp > Crit > Limi,
                        EMBER_INVALID_CALL if device is operating on 2.4Ghz",
        },
      ],
    },
    ## GET_DUTY_CYCLE_LIMITS
    {
      value: "0x4B",
      commandName: "getDutyCycleLimits",
      description: "Obtains the current duty cycle limits that were previously
                    set by a call to emberSetDutyCycleLimitsInStack(), or
                    the defaults set by the stack if no set call was made.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating the success or
                        failure of the command.",
        },
        {
          type: "EmberDutyCycleLimits",
          name: "returnedLimits",
          description: "Return current duty cycle limits if returnedLimits
                        is not NULL",
        },
      ],
    },
    ## GET_CURRENT_DUTY_CYCLE
    {
      value: "0x4C",
      commandName: "getCurrentDutyCycle",
      description: "Returns the duty cycle of the stack's connected children
                    that are being monitored, up to maxDevices. It indicates the
                    amount of overall duty cycle they have consumed (up to the
                    suspend limit). The first entry is always the local stack's
                    nodeId, and thus the total aggregate duty cycle for the device.
                    The passed pointer arrayOfDeviceDutyCycles MUST have space
                    for maxDevices.",
      commandArguments: [
      {
          type: "uint8_t",
          name: "maxDevices",
          description: "Number of devices to retrieve consumed duty cycle.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS  if the duty cycles were read
                        successfully, EMBER_BAD_ARGUMENT maxDevices is
                        greater than EMBER_MAX_END_DEVICE_CHILDREN + 1.",
        },
        {
          type: "uint8_t[134]",
          name: "arrayOfDeviceDutyCycles",
          description: "Consumed duty cycles up to maxDevices.
                        When the number of children that are being
                        monitored is less than maxDevices, the EmberNodeId
                        element in the EmberPerDeviceDutyCycle will be 0xFFFF.",
        },
      ],
    },
    ## DUTY_CYCLE_HANDLER
    {
      value: "0x4D",
      commandName: "dutyCycleHandler",
      description: "Callback fires when the duty cycle state has changed",
      responseArguments: [
        {
          type: "uint8_t",
          name: "channelPage",
          description: "The channel page whose duty cycle state has changed.",
        },
        {
          type: "uint8_t",
          name: "channel",
          description: "The channel number whose duty cycle state has changed.",
        },
        {
          type: "EmberDutyCycleState",
          name: "state",
          description: "The current duty cycle state.",
        },
        {
          type: "uint8_t",
          name: "totalDevices",
          description: "The total number of connected end devices that are being
                        monitored for duty cycle.",
        },
        {
          type: "EmberPerDeviceDutyCycle",
          name: "arrayOfDeviceDutyCycles",
          description: "Consumed duty cycles of end devices that are being monitored.
                        The first entry always be the local stack's nodeId,
                        and thus the total aggregate duty cycle for the device.",
        },
      ],
    },
  ],

}
# END Networking Frames

################################################################################
- {
  section: Binding Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## CLEAR_BINDING_TABLE
    {
      value: "0x2A",
      commandName: "clearBindingTable",
      description: "Deletes all binding table entries.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## SET_BINDING
    {
      value: "0x2B",
      commandName: "setBinding",
      description: "Sets an entry in the binding table.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
        {
          type: "EmberBindingTableEntry",
          name: "value",
          description: "The contents of the binding entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_BINDING
    {
      value: "0x2C",
      commandName: "getBinding",
      description: "Gets an entry from the binding table.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberBindingTableEntry",
          name: "value",
          description: "The contents of the binding entry.",
        },
      ],
    },
    ## DELETE_BINDING
    {
      value: "0x2D",
      commandName: "deleteBinding",
      description: "Deletes a binding table entry.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## BINDING_IS_ACTIVE
    {
      value: "0x2E",
      commandName: "bindingIsActive",
      description: "Indicates whether any messages are currently being
                    sent using this binding table entry. Note that this
                    command does not indicate whether a binding is
                    clear. To determine whether a binding is clear,
                    check whether the type field of the
                    EmberBindingTableEntry has the value
                    EMBER_UNUSED_BINDING.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
      ],
      responseArguments: [
        {
          type: "bool",
          name: "active",
          description: "True if the binding table entry is active,
                        false otherwise.",
        },
      ],
    },
    ## GET_BINDING_REMOTE_NODE_ID
    {
      value: "0x2F",
      commandName: "getBindingRemoteNodeId",
      description: "Returns the node ID for the binding's destination,
                    if the ID is known. If a message is sent using
                    the binding and the destination's ID is not known,
                    the stack will discover the ID by broadcasting a
                    ZDO address request. The application can avoid the
                    need for this discovery by using
                    <i>setBindingRemoteNodeId</i> when it knows the
                    correct ID via some other means. The destination's
                    node ID is forgotten when the binding is changed,
                    when the local node reboots or, much more rarely,
                    when the destination node changes its ID in
                    response to an ID conflict.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The short ID of the destination node or
                        EMBER_NULL_NODE_ID if no destination is known.",
        },
      ],
    },
    ## SET_BINDING_REMOTE_NODE_ID
    {
      value: "0x30",
      commandName: "setBindingRemoteNodeId",
      description: "Set the node ID for the binding's destination. See
                    <i>getBindingRemoteNodeId</i> for a description.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a binding table entry.",
        },
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The short ID of the destination node.",
        },
      ],
      responseArguments: [
      ],
    },
    ## REMOTE_SET_BINDING_HANDLER
    {
      value: "0x31",
      commandName: "remoteSetBindingHandler",
      description: "The NCP used the external binding modification
                    policy to decide how to handle a remote set
                    binding request. The Host cannot change the current
                    decision, but it can change the policy for future
                    decisions using the <i>setPolicy</i> command.",
      responseArguments: [
        {
          type: "EmberBindingTableEntry",
          name: "entry",
          description: "The requested binding.",
        },
        {
          type: "uint8_t",
          name: "index",
          description: "The index at which the binding was added.",
        },
        {
          type: "EmberStatus",
          name: "policyDecision",
          description: "EMBER_SUCCESS if the binding was added to the
                        table and any other status if not.",
        },
      ],
    },
    ## REMOTE_DELETE_BINDING_HANDLER
    {
      value: "0x32",
      commandName: "remoteDeleteBindingHandler",
      description: "The NCP used the external binding modification
                    policy to decide how to handle a remote delete
                    binding request. The Host cannot change the current
                    decision, but it can change the policy for future
                    decisions using the <i>setPolicy</i> command.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the binding whose deletion was
                        requested.",
        },
        {
          type: "EmberStatus",
          name: "policyDecision",
          description: "EMBER_SUCCESS if the binding was removed from
                        the table and any other status if not.",
        },
      ],
    },
  ],

}
# END Binding Frames

################################################################################
- {
  section: Messaging Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## MAXIMUM_PAYLOAD_LENGTH
    {
      value: "0x33",
      commandName: "maximumPayloadLength",
      description: "Returns the maximum size of the payload. The size
                    depends on the security level in use.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "apsLength",
          description: "The maximum APS payload length.",
        },
      ],
    },
    ## SEND_UNICAST
    {
      value: "0x34",
      commandName: "sendUnicast",
      description: "Sends a unicast message as per the ZigBee
                    specification. The message will arrive at its
                    destination only if there is a known route to the
                    destination node. Setting the ENABLE_ROUTE_DISCOVERY
                    option will cause a route to be discovered if none
                    is known. Setting the FORCE_ROUTE_DISCOVERY option
                    will force route discovery. Routes to end-device
                    children of the local node are always known.
                    Setting the APS_RETRY option will cause the message
                    to be retransmitted until either a matching
                    acknowledgement is received or three transmissions
                    have been made. <b>Note:</b> Using the
                    FORCE_ROUTE_DISCOVERY option will cause the first
                    transmission to be consumed by a route request as
                    part of discovery, so the application payload of
                    this packet will not reach its destination on the
                    first attempt. If you want the packet to reach its
                    destination, the APS_RETRY option must be set so
                    that another attempt is made to transmit the
                    message with its application payload after the route
                    has been constructed. <b>Note:</b> When sending
                    fragmented messages, the stack will only assign a
                    new APS sequence number for the first fragment of
                    the message (i.e., EMBER_APS_OPTION_FRAGMENT is set
                    and the low-order byte of the groupId field in the
                    APS frame is zero). For all subsequent fragments of
                    the same message, the application must set the
                    sequence number field in the APS frame to the
                    sequence number assigned by the stack to the first
                    fragment.",
      commandArguments: [
        {
          type: "EmberOutgoingMessageType",
          name: "type",
          description: "Specifies the outgoing message type. Must be
                        one of EMBER_OUTGOING_DIRECT,
                        EMBER_OUTGOING_VIA_ADDRESS_TABLE, or
                        EMBER_OUTGOING_VIA_BINDING.",
        },
        {
          type: "EmberNodeId",
          name: "indexOrDestination",
          description: "Depending on the type of addressing used, this
                        is either the EmberNodeId of the destination, an
                        index into the address table, or an index into
                        the binding table.",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame which is to be added to the
                        message.",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "A value chosen by the Host. This value is
                        used in the <i>ezspMessageSentHandler</i> response
                        to refer to this message.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "Content of the message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "uint8_t",
          name: "sequence",
          description: "The sequence number that will be used when
                        this message is transmitted.",
        },
      ],
    },
    ## SEND_BROADCAST
    {
      value: "0x36",
      commandName: "sendBroadcast",
      description: "Sends a broadcast message as per the ZigBee
                    specification.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "destination",
          description: "The destination to which to send the broadcast.
                        This must be one of the three ZigBee broadcast
                        addresses.",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame for the message.",
        },
        {
          type: "uint8_t",
          name: "radius",
          description: "The message will be delivered to all nodes
                        within <i>radius</i> hops of the sender. A
                        radius of zero is converted to EMBER_MAX_HOPS.",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "A value chosen by the Host. This value is
                        used in the <i>ezspMessageSentHandler</i> response
                        to refer to this message.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The broadcast message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "uint8_t",
          name: "sequence",
          description: "The sequence number that will be used when
                        this message is transmitted.",
        },
      ],
    },
    ## PROXY_BROADCAST
    {
      value: "0x37",
      commandName: "proxyBroadcast",
      description: "Sends a proxied broadcast message as per the
                    ZigBee specification.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "source",
          description: "The source from which to send the broadcast.",
        },
        {
          type: "EmberNodeId",
          name: "destination",
          description: "The destination to which to send the broadcast.
                        This must be one of the three ZigBee broadcast
                        addresses.",
        },
        {
          type: "uint8_t",
          name: "nwkSequence",
          description: "The network sequence number for the broadcast.",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame for the message.",
        },
        {
          type: "uint8_t",
          name: "radius",
          description: "The message will be delivered to all nodes
                        within <i>radius</i> hops of the sender. A
                        radius of zero is converted to EMBER_MAX_HOPS.",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "A value chosen by the Host. This value is
                        used in the <i>ezspMessageSentHandler</i> response
                        to refer to this message.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The broadcast message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "uint8_t",
          name: "apsSequence",
          description: "The APS sequence number that will be used when
                        this message is transmitted.",
        },
      ],
    },
    ## SEND_MULTICAST
    {
      value: "0x38",
      commandName: "sendMulticast",
      description: "Sends a multicast message to all endpoints that
                    share a specific multicast ID and are within a
                    specified number of hops of the sender.",
      commandArguments: [
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame for the message. The multicast
                        will be sent to the groupId in this frame.",
        },
        {
          type: "uint8_t",
          name: "hops",
          description: "The message will be delivered to all nodes
                        within this number of hops of the sender. A
                        value of zero is converted to EMBER_MAX_HOPS.",
        },
        {
          type: "uint8_t",
          name: "nonmemberRadius",
          description: "The number of hops that the message will be
                        forwarded by devices that are not members of
                        the group. A value of 7 or greater is treated
                        as infinite.",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "A value chosen by the Host. This value is
                        used in the <i>ezspMessageSentHandler</i> response
                        to refer to this message.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The multicast message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value. For any result other than
                        EMBER_SUCCESS, the message will not be sent.
                        EMBER_SUCCESS - The message has been submitted
                        for transmission. EMBER_INVALID_BINDING_INDEX - The
                        bindingTableIndex refers to a non-multicast
                        binding. EMBER_NETWORK_DOWN - The node is not
                        part of a network. EMBER_MESSAGE_TOO_LONG - The
                        message is too large to fit in a MAC layer
                        frame. EMBER_NO_BUFFERS - The free packet buffer
                        pool is empty. EMBER_NETWORK_BUSY - Insufficient
                        resources available in Network or MAC layers to
                        send message.",
        },
        {
          type: "uint8_t",
          name: "sequence",
          description: "The sequence number that will be used when
                        this message is transmitted.",
        },
      ],
    },
    ## SEND_MULTICAST_WITH_ALIAS
    {
      value: "0x3A",
      commandName: "sendMulticastWithAlias",
      description: "Sends a multicast message to all endpoints that
                    share a specific multicast ID and are within a
                    specified number of hops of the sender.",
      commandArguments: [
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame for the message. The multicast
                        will be sent to the groupId in this frame.",
        },
        {
          type: "uint8_t",
          name: "hops",
          description: "The message will be delivered to all nodes
                        within this number of hops of the sender. A
                        value of zero is converted to EMBER_MAX_HOPS.",
        },
        {
          type: "uint8_t",
          name: "nonmemberRadius",
          description: "The number of hops that the message will be
                        forwarded by devices that are not members of
                        the group. A value of 7 or greater is treated
                        as infinite.",
        },
        {
          type: "uint16_t",
          name: "alias",
          description: "The alias source address",
        },
        {
          type: "uint8_t",
          name: "nwkSequence",
          description: "the alias sequence number",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "A value chosen by the Host. This value is
                        used in the <i>ezspMessageSentHandler</i> response
                        to refer to this message.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The multicast message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value. For any result other than
                        EMBER_SUCCESS, the message will not be sent.
                        EMBER_SUCCESS - The message has been submitted
                        for transmission. EMBER_INVALID_BINDING_INDEX - The
                        bindingTableIndex refers to a non-multicast
                        binding. EMBER_NETWORK_DOWN - The node is not
                        part of a network. EMBER_MESSAGE_TOO_LONG - The
                        message is too large to fit in a MAC layer
                        frame. EMBER_NO_BUFFERS - The free packet buffer
                        pool is empty. EMBER_NETWORK_BUSY - Insufficient
                        resources available in Network or MAC layers to
                        send message.",
        },
        {
          type: "uint8_t",
          name: "sequence",
          description: "The sequence number that will be used when
                        this message is transmitted.",
        },
      ],
    },
    ## SEND_REPLY
    {
      value: "0x39",
      commandName: "sendReply",
      description: "Sends a reply to a received unicast message. The
                    <i>incomingMessageHandler</i> callback for the unicast
                    being replied to supplies the values for all the
                    parameters except the reply itself.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "sender",
          description: "Value supplied by incoming unicast.",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "Value supplied by incoming unicast.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The reply message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value. EMBER_INVALID_CALL - The
                        EZSP_UNICAST_REPLIES_POLICY is set to
                        EZSP_HOST_WILL_NOT_SUPPLY_REPLY. This means the NCP
                        will automatically send an empty reply. The Host
                        must change the policy to
                        EZSP_HOST_WILL_SUPPLY_REPLY before it can supply
                        the reply. There is one exception to this rule:
                        In the case of responses to message fragments,
                        the host must call sendReply when a message
                        fragment is received. In this case, the policy
                        set on the NCP does not matter. The NCP
                        expects a sendReply call from the Host for
                        message fragments regardless of the current
                        policy settings. EMBER_NO_BUFFERS - Not enough
                        memory was available to send the reply.
                        EMBER_NETWORK_BUSY - Either no route or
                        insufficient resources available. EMBER_SUCCESS -
                        The reply was successfully queued for
                        transmission.",
        },
      ],
    },
    ## MESSAGE_SENT_HANDLER
    {
      value: "0x3F",
      commandName: "messageSentHandler",
      description: "A callback indicating the stack has completed
                    sending a message.",
      responseArguments: [
        {
          type: "EmberOutgoingMessageType",
          name: "type",
          description: "The type of message sent.",
        },
        {
          type: "uint16_t",
          name: "indexOrDestination",
          description: "The destination to which the message was sent,
                        for direct unicasts, or the address table or
                        binding index for other unicasts. The value is
                        unspecified for multicasts and broadcasts.",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame for the message.",
        },
        {
          type: "uint8_t",
          name: "messageTag",
          description: "The value supplied by the Host in the
                        <i>ezspSendUnicast</i>, <i>ezspSendBroadcast</i> or
                        <i>ezspSendMulticast</i> command.",
        },
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value of EMBER_SUCCESS if an ACK
                        was received from the destination or
                        EMBER_DELIVERY_FAILED if no ACK was received.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The unicast message supplied by the Host. The
                        message contents are only included here if the
                        decision for the messageContentsInCallback policy
                        is messageTagAndContentsInCallback.",
        },
      ],
    },
    ## SEND_MANY_TO_ONE_ROUTE_REQUEST
    {
      value: "0x41",
      commandName: "sendManyToOneRouteRequest",
      description: "Sends a route request packet that creates routes
                    from every node in the network back to this node.
                    This function should be called by an application
                    that wishes to communicate with many nodes, for
                    example, a gateway, central monitor, or controller.
                    A device using this function was referred to as an
                    'aggregator' in EmberZNet 2.x and earlier, and is
                    referred to as a 'concentrator' in the ZigBee
                    specification and EmberZNet 3. <p> This function
                    enables large scale networks, because the other
                    devices do not have to individually perform
                    bandwidth-intensive route discoveries. Instead, when a
                    remote node sends an APS unicast to a concentrator,
                    its network layer automatically delivers a special
                    route record packet first, which lists the network
                    ids of all the intermediate relays. The concentrator
                    can then use source routing to send outbound APS
                    unicasts. (A source routed message is one in which
                    the entire route is listed in the network layer
                    header.) This allows the concentrator to communicate
                    with thousands of devices without requiring large
                    route tables on neighboring nodes. <p> This function
                    is only available in ZigBee Pro (stack profile 2),
                    and cannot be called on end devices. Any router
                    can be a concentrator (not just the coordinator),
                    and there can be multiple concentrators on a
                    network. <p> Note that a concentrator does not
                    automatically obtain routes to all network nodes
                    after calling this function. Remote applications must
                    first initiate an inbound APS unicast. <p>
                    Many-to-one routes are not repaired automatically.
                    Instead, the concentrator application must call this
                    function to rediscover the routes as necessary, for
                    example, upon failure of a retried APS message. The
                    reason for this is that there is no scalable
                    one-size-fits-all route repair strategy. A common and
                    recommended strategy is for the concentrator
                    application to refresh the routes by calling this
                    function periodically.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "concentratorType",
          description: "Must be either EMBER_HIGH_RAM_CONCENTRATOR or
                        EMBER_LOW_RAM_CONCENTRATOR. The former is used
                        when the caller has enough memory to store
                        source routes for the whole network. In that
                        case, remote nodes stop sending route records
                        once the concentrator has successfully received
                        one. The latter is used when the concentrator
                        has insufficient RAM to store all outbound
                        source routes. In that case, route records are
                        sent to the concentrator prior to every inbound
                        APS unicast.",
        },
        {
          type: "uint8_t",
          name: "radius",
          description: "The maximum number of hops the route request
                        will be relayed. A radius of zero is converted
                        to EMBER_MAX_HOPS",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the route request was
                        successfully submitted to the transmit queue, and
                        EMBER_ERR_FATAL otherwise.",
        },
      ],
    },
    ## POLL_FOR_DATA
    {
      value: "0x42",
      commandName: "pollForData",
      description: "Periodically request any pending data from our
                    parent. Setting <i>interval</i> to 0 or <i>units</i>
                    to EMBER_EVENT_INACTIVE will generate a single poll.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "interval",
          description: "The time between polls. Note that the timer
                        clock is free running and is not synchronized
                        with this command. This means that the time
                        will be between <i>interval</i> and
                        (<i>interval</i> - 1). The maximum interval is
                        32767.",
        },
        {
          type: "EmberEventUnits",
          name: "units",
          description: "The units for <i>interval</i>.",
        },
        {
          type: "uint8_t",
          name: "failureLimit",
          description: "The number of poll failures that will be
                        tolerated before a <i>pollCompleteHandler</i>
                        callback is generated. A value of zero will
                        result in a callback for every poll. Any status
                        value apart from EMBER_SUCCESS and
                        EMBER_MAC_NO_DATA is counted as a failure.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of sending the first poll.",
        },
      ],
    },
    ## POLL_COMPLETE_HANDLER
    {
      value: "0x43",
      commandName: "pollCompleteHandler",
      description: "Indicates the result of a data poll to the parent
                    of the local node.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value: EMBER_SUCCESS - Data was
                        received in response to the poll.
                        EMBER_MAC_NO_DATA - No data was pending.
                        EMBER_DELIVERY_FAILED - The poll message could
                        not be sent. EMBER_MAC_NO_ACK_RECEIVED - The poll
                        message was sent but not acknowledged by the
                        parent.",
        },
      ],
    },
    ## POLL_HANDLER
    {
      value: "0x44",
      commandName: "pollHandler",
      description: "Indicates that the local node received a data poll
                    from a child.",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "childId",
          description: "The node ID of the child that is requesting
                        data.",
        },
      ],
    },
    ## INCOMING_SENDER_EUI64_HANDLER
    {
      value: "0x62",
      commandName: "incomingSenderEui64Handler",
      description: "A callback indicating a message has been received
                    containing the EUI64 of the sender. This callback
                    is called immediately before the
                    <i>incomingMessageHandler</i> callback. It is not
                    called if the incoming message did not contain the
                    EUI64 of the sender.",
      responseArguments: [
        {
          type: "EmberEUI64",
          name: "senderEui64",
          description: "The EUI64 of the sender",
        },
      ],
    },
    ## INCOMING_MESSAGE_HANDLER
    {
      value: "0x45",
      commandName: "incomingMessageHandler",
      description: "A callback indicating a message has been received.",
      responseArguments: [
        {
          type: "EmberIncomingMessageType",
          name: "type",
          description: "The type of the incoming message. One of the
                        following: EMBER_INCOMING_UNICAST,
                        EMBER_INCOMING_UNICAST_REPLY,
                        EMBER_INCOMING_MULTICAST,
                        EMBER_INCOMING_MULTICAST_LOOPBACK,
                        EMBER_INCOMING_BROADCAST,
                        EMBER_INCOMING_BROADCAST_LOOPBACK",
        },
        {
          type: "EmberApsFrame",
          name: "apsFrame",
          description: "The APS frame from the incoming message.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during the reception.",
        },
        {
          type: "EmberNodeId",
          name: "sender",
          description: "The sender of the message.",
        },
        {
          type: "uint8_t",
          name: "bindingIndex",
          description: "The index of a binding that matches the
                        message or 0xFF if there is no matching
                        binding.",
        },
        {
          type: "uint8_t",
          name: "addressIndex",
          description: "The index of the entry in the address table
                        that matches the sender of the message or 0xFF
                        if there is no matching entry.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The incoming message.",
        },
      ],
    },
    ## INCOMING_ROUTE_RECORD_HANDLER
    {
      value: "0x59",
      commandName: "incomingRouteRecordHandler",
      description: "Reports the arrival of a route record command
                    frame.",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "source",
          description: "The source of the route record.",
        },
        {
          type: "EmberEUI64",
          name: "sourceEui",
          description: "The EUI64 of the source.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the route record.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during the reception.",
        },
        {
          type: "uint8_t",
          name: "relayCount",
          description: "The number of relays in <i>relayList</i>.",
        },
        {
          type: "uint8_t[relayCount*2]",
          name: "relayList",
          description: "The route record. Each relay in the list is
                        an uint16_t node ID. The list is passed as uint8_t
                        * to avoid alignment problems.",
        },
      ],
    },
    ## CHANGE_SOURCE_ROUTE_HANDLER
    {
      value: "0xC4",
      commandName: "changeSourceRouteHandler",
      description: "Change the source route entry in a source route table",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "newChildId",
          description: "The source/neighbor for which the source route entry is changed",
        },
        {
          type: "EmberNodeId",
          name: "newParentId",
          description: "The parent of the source/neighbor for which the source route entry is changed",
        },
        {
          type: "bool",
          name: "ourChild",
          description: "Is the source our child?",
        },
      ],
    },
    ## SET_SOURCE_ROUTE
    {
      value: "0x5A",
      commandName: "setSourceRoute",
      description: "Supply a source route for the next outgoing
                    message.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "destination",
          description: "The destination of the source route.",
        },
        {
          type: "uint8_t",
          name: "relayCount",
          description: "The number of relays in <i>relayList</i>.",
        },
        {
          type: "uint16_t[relayCount]",
          name: "relayList",
          description: "The source route.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the source route was
                        successfully stored, and EMBER_NO_BUFFERS
                        otherwise.",
        },
      ],
    },
    ## INCOMING_MANY_TO_ONE_ROUTE_REQUEST_HANDLER
    {
      value: "0x7D",
      commandName: "incomingManyToOneRouteRequestHandler",
      description: "A callback indicating that a many-to-one route to
                    the concentrator with the given short and long id
                    is available for use.",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "source",
          description: "The short id of the concentrator.",
        },
        {
          type: "EmberEUI64",
          name: "longId",
          description: "The EUI64 of the concentrator.",
        },
        {
          type: "uint8_t",
          name: "cost",
          description: "The path cost to the concentrator. The cost
                        may decrease as additional route request packets
                        for this discovery arrive, but the callback is
                        made only once.",
        },
      ],
    },
    ## INCOMING_ROUTE_ERROR_HANDLER
    {
      value: "0x80",
      commandName: "incomingRouteErrorHandler",
      description: "A callback invoked when a route error message is
                    received. The error indicates that a problem routing
                    to or from the target node was encountered.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SOURCE_ROUTE_FAILURE or
                        EMBER_MANY_TO_ONE_ROUTE_FAILURE.",
        },
        {
          type: "EmberNodeId",
          name: "target",
          description: "The short id of the remote node.",
        },
      ],
    },
    ## ADDRESS_TABLE_ENTRY_IS_ACTIVE
    {
      value: "0x5B",
      commandName: "addressTableEntryIsActive",
      description: "Indicates whether any messages are currently being
                    sent using this address table entry. Note that this
                    function does not indicate whether the address table
                    entry is unused. To determine whether an address
                    table entry is unused, check the remote node ID.
                    The remote node ID will have the value
                    EMBER_TABLE_ENTRY_UNUSED_NODE_ID when the address table
                    entry is not in use.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of an address table entry.",
        },
      ],
      responseArguments: [
        {
          type: "bool",
          name: "active",
          description: "True if the address table entry is active,
                        false otherwise.",
        },
      ],
    },
    ## SET_ADDRESS_TABLE_REMOTE_EUI64
    {
      value: "0x5C",
      commandName: "setAddressTableRemoteEui64",
      description: "Sets the EUI64 of an address table entry. This
                    function will also check other address table
                    entries, the child table and the neighbor table to
                    see if the node ID for the given EUI64 is already
                    known. If known then this function will also set
                    node ID. If not known it will set the node ID to
                    EMBER_UNKNOWN_NODE_ID.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of an address table entry.",
        },
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The EUI64 to use for the address table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the EUI64 was successfully set,
                        and EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE otherwise.",
        },
      ],
    },
    ## SET_ADDRESS_TABLE_REMOTE_NODE_ID
    {
      value: "0x5D",
      commandName: "setAddressTableRemoteNodeId",
      description: "Sets the short ID of an address table entry.
                    Usually the application will not need to set the
                    short ID in the address table. Once the remote
                    EUI64 is set the stack is capable of figuring out
                    the short ID on its own. However, in cases where
                    the application does set the short ID, the
                    application must set the remote EUI64 prior to
                    setting the short ID.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of an address table entry.",
        },
        {
          type: "EmberNodeId",
          name: "id",
          description: "The short ID corresponding to the remote node
                        whose EUI64 is stored in the address table at
                        the given index or EMBER_TABLE_ENTRY_UNUSED_NODE_ID
                        which indicates that the entry stored in the
                        address table at the given index is not in
                        use.",
        },
      ],
      responseArguments: [
      ],
    },
    ## GET_ADDRESS_TABLE_REMOTE_EUI64
    {
      value: "0x5E",
      commandName: "getAddressTableRemoteEui64",
      description: "Gets the EUI64 of an address table entry.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of an address table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The EUI64 of the address table entry is copied
                        to this location.",
        },
      ],
    },
    ## GET_ADDRESS_TABLE_REMOTE_NODE_ID
    {
      value: "0x5F",
      commandName: "getAddressTableRemoteNodeId",
      description: "Gets the short ID of an address table entry.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of an address table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "One of the following: The short ID
                        corresponding to the remote node whose EUI64 is
                        stored in the address table at the given index.
                        EMBER_UNKNOWN_NODE_ID - Indicates that the EUI64
                        stored in the address table at the given index
                        is valid but the short ID is currently unknown.
                        EMBER_DISCOVERY_ACTIVE_NODE_ID - Indicates that the
                        EUI64 stored in the address table at the given
                        location is valid and network address discovery
                        is underway. EMBER_TABLE_ENTRY_UNUSED_NODE_ID -
                        Indicates that the entry stored in the address
                        table at the given index is not in use.",
        },
      ],
    },
    ## SET_EXTENDED_TIMEOUT
    {
      value: "0x7E",
      commandName: "setExtendedTimeout",
      description: "Tells the stack whether or not the normal interval
                    between retransmissions of a retried unicast message
                    should be increased by
                    EMBER_INDIRECT_TRANSMISSION_TIMEOUT. The interval needs
                    to be increased when sending to a sleepy node so
                    that the message is not retransmitted until the
                    destination has had time to wake up and poll its
                    parent. The stack will automatically extend the
                    timeout: - For our own sleepy children. - When an
                    address response is received from a parent on
                    behalf of its child. - When an indirect transaction
                    expiry route error is received. - When an end
                    device announcement is received from a sleepy node.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "remoteEui64",
          description: "The address of the node for which the timeout
                        is to be set.",
        },
        {
          type: "bool",
          name: "extendedTimeout",
          description: "true if the retry interval should be increased
                        by EMBER_INDIRECT_TRANSMISSION_TIMEOUT. false if
                        the normal retry interval should be used.",
        },
      ],
      responseArguments: [
      ],
    },
    ## GET_EXTENDED_TIMEOUT
    {
      value: "0x7F",
      commandName: "getExtendedTimeout",
      description: "Indicates whether or not the stack will extend the
                    normal interval between retransmissions of a retried
                    unicast message by EMBER_INDIRECT_TRANSMISSION_TIMEOUT.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "remoteEui64",
          description: "The address of the node for which the timeout
                        is to be returned.",
        },
      ],
      responseArguments: [
        {
          type: "bool",
          name: "extendedTimeout",
          description: "true if the retry interval will be increased
                        by EMBER_INDIRECT_TRANSMISSION_TIMEOUT and false if
                        the normal retry interval will be used.",
        },
      ],
    },
    ## REPLACE_ADDRESS_TABLE_ENTRY
    {
      value: "0x82",
      commandName: "replaceAddressTableEntry",
      description: "Replaces the EUI64, short ID and extended timeout
                    setting of an address table entry. The previous
                    EUI64, short ID and extended timeout setting are
                    returned.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "addressTableIndex",
          description: "The index of the address table entry that will
                        be modified.",
        },
        {
          type: "EmberEUI64",
          name: "newEui64",
          description: "The EUI64 to be written to the address table
                        entry.",
        },
        {
          type: "EmberNodeId",
          name: "newId",
          description: "One of the following: The short ID
                        corresponding to the new EUI64.
                        EMBER_UNKNOWN_NODE_ID if the new EUI64 is valid
                        but the short ID is unknown and should be
                        discovered by the stack.
                        EMBER_TABLE_ENTRY_UNUSED_NODE_ID if the address
                        table entry is now unused.",
        },
        {
          type: "bool",
          name: "newExtendedTimeout",
          description: "true if the retry interval should be increased
                        by EMBER_INDIRECT_TRANSMISSION_TIMEOUT. false if
                        the normal retry interval should be used.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the EUI64, short ID and
                        extended timeout setting were successfully
                        modified, and EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE
                        otherwise.",
        },
        {
          type: "EmberEUI64",
          name: "oldEui64",
          description: "The EUI64 of the address table entry before it
                        was modified.",
        },
        {
          type: "EmberNodeId",
          name: "oldId",
          description: "One of the following: The short ID
                        corresponding to the EUI64 before it was
                        modified. EMBER_UNKNOWN_NODE_ID if the short ID
                        was unknown. EMBER_DISCOVERY_ACTIVE_NODE_ID if
                        discovery of the short ID was underway.
                        EMBER_TABLE_ENTRY_UNUSED_NODE_ID if the address
                        table entry was unused.",
        },
        {
          type: "bool",
          name: "oldExtendedTimeout",
          description: "true if the retry interval was being increased
                        by EMBER_INDIRECT_TRANSMISSION_TIMEOUT. false if
                        the normal retry interval was being used.",
        },
      ],
    },
    ## LOOKUP_NODE_ID_BY_EUI64
    {
      value: "0x60",
      commandName: "lookupNodeIdByEui64",
      description: "Returns the node ID that corresponds to the
                    specified EUI64. The node ID is found by searching
                    through all stack tables for the specified EUI64.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The EUI64 of the node to look up.",
        },
      ],
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The short ID of the node or EMBER_NULL_NODE_ID
                        if the short ID is not known.",
        },
      ],
    },
    ## LOOKUP_EUI64_BY_NODE_ID
    {
      value: "0x61",
      commandName: "lookupEui64ByNodeId",
      description: "Returns the EUI64 that corresponds to the specified
                    node ID. The EUI64 is found by searching through
                    all stack tables for the specified node ID.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "nodeId",
          description: "The short ID of the node to look up.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the EUI64 was found,
                        EMBER_ERR_FATAL if the EUI64 is not known.",
        },
        {
          type: "EmberEUI64",
          name: "eui64",
          description: "The EUI64 of the node.",
        },
      ],
    },
    ## GET_MULTICAST_TABLE_ENTRY
    {
      value: "0x63",
      commandName: "getMulticastTableEntry",
      description: "Gets an entry from the multicast table.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a multicast table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberMulticastTableEntry",
          name: "value",
          description: "The contents of the multicast entry.",
        },
      ],
    },
    ## SET_MULTICAST_TABLE_ENTRY
    {
      value: "0x64",
      commandName: "setMulticastTableEntry",
      description: "Sets an entry in the multicast table.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of a multicast table entry",
        },
        {
          type: "EmberMulticastTableEntry",
          name: "value",
          description: "The contents of the multicast entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ID_CONFLICT_HANDLER
    {
      value: "0x7C",
      commandName: "idConflictHandler",
      description: "A callback invoked by the EmberZNet stack when an
                    id conflict is discovered, that is, two different
                    nodes in the network were found to be using the
                    same short id. The stack automatically removes the
                    conflicting short id from its internal tables
                    (address, binding, route, neighbor, and child
                    tables). The application should discontinue any other
                    use of the id.",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "id",
          description: "The short id for which a conflict was detected",
        },
      ],
    },
    ## WRITE_NODE_DATA
    {
      value: "0xFE",
      commandName: "writeNodeData",
      description: "Write the current node Id, PAN ID, or Node type to the tokens",
      commandArguments: [
        {
          type: "bool",
          name: "erase",
          description: "Erase the node type or not",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
          reason for failure.",
        },
      ],
    },
    ## SEND_RAW_MESSAGE
    {
      value: "0x96",
      commandName: "sendRawMessage",
      description: "Transmits the given message without modification.
                    The MAC header is assumed to be configured in the
                    message at the time this function is called.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The raw message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MAC_PASSTHROUGH_MESSAGE_HANDLER
    {
      value: "0x97",
      commandName: "macPassthroughMessageHandler",
      description: "A callback invoked by the EmberZNet stack when a
                    MAC passthrough message is received.",
      responseArguments: [
        {
          type: "EmberMacPassthroughType",
          name: "messageType",
          description: "The type of MAC passthrough message received.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during reception.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The raw message that was received.",
        },
      ],
    },
    ## MAC_FILTER_MATCH_MESSAGE_HANDLER
    {
      value: "0x46",
      commandName: "macFilterMatchMessageHandler",
      description: "A callback invoked by the EmberZNet stack when a
                    raw MAC message that has matched one of the
                    application's configured MAC filters.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "filterIndexMatch",
          description: "The index of the filter that was matched.",
        },
        {
          type: "EmberMacPassthroughType",
          name: "legacyPassthroughType",
          description: "The type of MAC passthrough message received.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during reception.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The raw message that was received.",
        },
      ],
    },
    ## RAW_TRANSMIT_COMPLETE_HANDLER
    {
      value: "0x98",
      commandName: "rawTransmitCompleteHandler",
      description: "A callback invoked by the EmberZNet stack when the
                    MAC has finished transmitting a raw message.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_SUCCESS if the transmission was successful,
                        or EMBER_DELIVERY_FAILED if not",
        },
      ],
    },
    ## SET_MAC_POLL_CCA_WAIT_TIME
    {
      value: "0xF4",
      commandName: "setMacPollCcaWaitTime",
      description: "This function is useful to sleepy end devices.
                    This function will set the retry interval
                    (in milliseconds) for mac data poll. This interval
                    is the time in milliseconds the device waits before
                    retrying a data poll when a MAC level data poll fails
                    for any reason.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "waitBeforeRetryIntervalMs",
          description: "Time in milliseconds the device waits before
                        retrying a data poll when a MAC level data
                        poll fails for any reason.",
        },
      ],
      responseArguments: [
      ],
    },
## SET_BEACON_CLASSIFICATION_PARAMS
{
value: "0xEF",
commandName: "setBeaconClassificationParams",
description: "Sets the priority masks and related variables for choosing the best beacon.",
commandArguments: [
],
responseArguments: [
{
type: "EmberStatus",
name: "status",
description: "The attempt to set the pramaters returns EMBER_SUCCESS",
},
{
type: "EmberBeaconClassificationParams",
name: "param",
description: "Gets the beacon prioritization related variable",
},
],
},
## GET_BEACON_CLASSIFICATION_PARAMS
{
value: "0xF3",
commandName: "getBeaconClassificationParams",
description: "Gets the priority masks and related variables for choosing the best beacon.",
commandArguments: [

],
responseArguments: [
{
type: "EmberStatus",
name: "status",
description: "The attempt to get the pramaters returns EMBER_SUCCESS",
},
{
type: "EmberBeaconClassificationParams",
name: "param",
description: "Gets the beacon prioritization related variable",
},
],
},
  ],

}
# END Messaging Frames

################################################################################
- {
  section: Security Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## SET_INITIAL_SECURITY_STATE
    {
      value: "0x68",
      commandName: "setInitialSecurityState",
      description: "Sets the security state that will be used by the
                    device when it forms or joins the network. This
                    call <b>should not</b> be used when restoring saved
                    network state via networkInit as this will result
                    in a loss of security data and will cause
                    communication problems when the device re-enters the
                    network.",
      commandArguments: [
        {
          type: "EmberInitialSecurityState",
          name: "state",
          description: "The security configuration to be set.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "success",
          description: "The success or failure code of the operation.",
        },
      ],
    },
    ## GET_CURRENT_SECURITY_STATE
    {
      value: "0x69",
      commandName: "getCurrentSecurityState",
      description: "Gets the current security state that is being used
                    by a device that is joined in the network.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure code of the operation.",
        },
        {
          type: "EmberCurrentSecurityState",
          name: "state",
          description: "The security configuration in use by the stack.",
        },
      ],
    },
    ## GET_KEY
    {
      value: "0x6a",
      commandName: "getKey",
      description: "Gets a Security Key based on the passed key type.",
      commandArguments: [
        {
          type: "EmberKeyType",
          name: "keyType",
          description: "",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure code of the operation.",
        },
        {
          type: "EmberKeyStruct",
          name: "keyStruct",
          description: "The structure containing the key and its
                        associated data.",
        },
      ],
    },
    ## SWITCH_NETWORK_KEY_HANDLER
    {
      value: "0x6e",
      commandName: "switchNetworkKeyHandler",
      description: "A callback to inform the application that the
                    Network Key has been updated and the node has been
                    switched over to use the new key. The actual key
                    being used is not passed up, but the sequence
                    number is.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "sequenceNumber",
          description: "The sequence number of the new network key.",
        },
      ],
    },
    ## GET_KEY_TABLE_ENTRY
    {
      value: "0x71",
      commandName: "getKeyTableEntry",
      description: "Retrieves the key table entry at the specified
                    index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the entry in the table to
                        retrieve.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_TABLE_ENTRY_ERASED if the index is an
                        erased key entry. EMBER_INDEX_OUT_OF_RANGE if the
                        passed index is not valid. EMBER_SUCCESS on
                        success.",
        },
        {
          type: "EmberKeyStruct",
          name: "keyStruct",
          description: "The results retrieved by the stack.",
        },
      ],
    },
    ## SET_KEY_TABLE_ENTRY
    {
      value: "0x72",
      commandName: "setKeyTableEntry",
      description: "Sets the key table entry at the specified index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index of the entry in the table to set.",
        },
        {
          type: "EmberEUI64",
          name: "address",
          description: "The address of the partner device that shares
                        the key",
        },
        {
          type: "bool",
          name: "linkKey",
          description: "This bool indicates whether the key is a
                        Link or a Master Key",
        },
        {
          type: "EmberKeyData",
          name: "keyData",
          description: "The actual key data associated with the table
                        entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_KEY_INVALID if the passed key data is
                        using one of the reserved key values.
                        EMBER_INDEX_OUT_OF_RANGE if passed index is not
                        valid. EMBER_SUCCESS on success.",
        },
      ],
    },
    ## FIND_KEY_TABLE_ENTRY
    {
      value: "0x75",
      commandName: "findKeyTableEntry",
      description: "This function searches through the Key Table and
                    tries to find the entry that matches the passed
                    search criteria.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "address",
          description: "The address to search for. Alternatively, all
                        zeros may be passed in to search for the first
                        empty entry.",
        },
        {
          type: "bool",
          name: "linkKey",
          description: "This indicates whether to search for an entry
                        that contains a link key or a master key. true
                        means to search for an entry with a Link Key.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "This indicates the index of the entry that
                        matches the search criteria. A value of 0xFF is
                        returned if not matching entry is found.",
        },
      ],
    },
    ## ADD_OR_UPDATE_KEY_TABLE_ENTRY
    {
      value: "0x66",
      commandName: "addOrUpdateKeyTableEntry",
      description: "This function updates an existing entry in the key
                    table or adds a new one. It first searches the
                    table for an existing entry that matches the passed
                    EUI64 address. If no entry is found, it searches
                    for the first free entry. If successful, it updates
                    the key data and resets the associated incoming
                    frame counter. If it fails to find an existing
                    entry and no free one exists, it returns a
                    failure.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "address",
          description: "The address of the partner device associated
                        with the Key.",
        },
        {
          type: "bool",
          name: "linkKey",
          description: "An indication of whether this is a Link Key
                        (true) or Master Key (false)",
        },
        {
          type: "EmberKeyData",
          name: "keyData",
          description: "The actual key data associated with the entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure error code of the
                        operation.",
        },
      ],
    },
    ## SEND_TRUST_CENTER_LINK_KEY
    {
      value: "0x67",
      commandName: "sendTrustCenterLinkKey",
      description: "This function sends an APS TransportKey command containing
                    the current trust center link key. The node to which the
                    command is sent is specified via the short and long address
                    arguments.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "destinationNodeId",
          description: "The short address of the node to which this command will
                        be sent",
        },
        {
          type: "EmberEUI64",
          name: "destinationEui64",
          description: "The long address of the node to which this command will
                        be sent",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success of failure of the
                        operation",
        },
      ],
    },
    ## ERASE_KEY_TABLE_ENTRY
    {
      value: "0x76",
      commandName: "eraseKeyTableEntry",
      description: "This function erases the data in the key table
                    entry at the specified index. If the index is
                    invalid, false is returned.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "This indicates the index of entry to erase.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure of the operation.",
        },
      ],
    },
    ## CLEAR_KEY_TABLE
    {
      value: "0xB1",
      commandName: "clearKeyTable",
      description: "This function clears the key table of the current
                    network.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure of the operation.",
        },
      ],
    },
    ## REQUEST_LINK_KEY
    {
      value: "0x14",
      commandName: "requestLinkKey",
      description: "A function to request a Link Key from the Trust
                    Center with another device on the Network
                    (which could be the Trust Center). A Link Key with
                    the Trust Center is possible but the requesting
                    device cannot be the Trust Center. Link Keys are
                    optional in ZigBee Standard Security and thus the
                    stack cannot know whether the other device supports
                    them. If EMBER_REQUEST_KEY_TIMEOUT is non-zero on the
                    Trust Center and the partner device is not the
                    Trust Center, both devices must request keys with
                    their partner device within the time period. The
                    Trust Center only supports one outstanding key
                    request at a time and therefore will ignore other
                    requests. If the timeout is zero then the Trust
                    Center will immediately respond and not wait for
                    the second request. The Trust Center will always
                    immediately respond to requests for a Link Key with
                    it. Sleepy devices should poll at a higher rate
                    until a response is received or the request times
                    out. The success or failure of the request is
                    returned via ezspZigbeeKeyEstablishmentHandler(...)",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "partner",
          description: "This is the IEEE address of the partner device
                        that will share the link key.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure of sending the request.
                        This is not the final result of the attempt.
                        ezspZigbeeKeyEstablishmentHandler(...) will return
                        that.",
        },
      ],
    },
    ## ZIGBEE_KEY_ESTABLISHMENT_HANDLER
    {
      value: "0x9B",
      commandName: "zigbeeKeyEstablishmentHandler",
      description: "This is a callback that indicates the success or
                    failure of an attempt to establish a key with a
                    partner device.",
      responseArguments: [
        {
          type: "EmberEUI64",
          name: "partner",
          description: "This is the IEEE address of the partner that
                        the device successfully established a key with.
                        This value is all zeros on a failure.",
        },
        {
          type: "EmberKeyStatus",
          name: "status",
          description: "This is the status indicating what was
                        established or why the key establishment failed.",
        },
      ],
    },
    ## ADD_TRANSIENT_LINK_KEY
    {
      value: "0xAF",
      commandName: "addTransientLinkKey",
      description: "This is a function to add a temporary link key for a
                    joining device. The key will get timed out after a defined
                    timeout period if the device does not update its link key
                    with the Trust Center.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "partner",
          description: "This is the IEEE address of the partner that
                        the device successfully established a key with.
                        This value is all zeros on a failure.",
        },
        {
          type: "EmberKeyData",
          name: "transientKey",
          description: "The transient key data for the joining device.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure of adding a transient key.",
        },
      ],
    },
    ## CLEAR_TRANSIENT_LINK_KEYS
    {
      value: "0x6B",
      commandName: "clearTransientLinkKeys",
      description: "Clear all of the transient link keys from RAM.",
      commandArguments: [
      ],
      responseArguments: [
      ],
    },
    ## GET_TRANSIENT_LINK_KEY
    {
      value: "0xCE",
      commandName: "getTransientLinkKey",
      description: "This is a function to get the transient link key structure
                    in the transient key table. The EUI of the passed in key
                    structure is searched and, if a match is found, the rest of
                    the key structure is filled in.",
      commandArguments: [
        {
          type: "EmberEUI64",
          name: "eui",
          description: "The IEEE address to look up the transient key for.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The success or failure of getting the transient key.",
        },
        {
          type: "EmberTransientKeyData",
          name: "transientKeyData",
          description: "The transient key structure that is filled in upon
                        success.",
        },
      ],
    }
  ],

}
# END Security Frames

################################################################################
- {
  section: Trust Center Frames,

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## TRUST_CENTER_JOIN_HANDLER
    {
      value: "0x24",
      commandName: "trustCenterJoinHandler",
      description: "The NCP used the trust center behavior policy to
                    decide whether to allow a new node to join the
                    network. The Host cannot change the current
                    decision, but it can change the policy for future
                    decisions using the <i>setPolicy</i> command.",
      responseArguments: [
        {
          type: "EmberNodeId",
          name: "newNodeId",
          description: "The Node Id of the node whose status changed",
        },
        {
          type: "EmberEUI64",
          name: "newNodeEui64",
          description: "The EUI64 of the node whose status changed.",
        },
        {
          type: "EmberDeviceUpdate",
          name: "status",
          description: "The status of the node: Secure Join/Rejoin,
                        Unsecure Join/Rejoin, Device left.",
        },
        {
          type: "EmberJoinDecision",
          name: "policyDecision",
          description: "An EmberJoinDecision reflecting the decision
                        made.",
        },
        {
          type: "EmberNodeId",
          name: "parentOfNewNodeId",
          description: "The parent of the node whose status has
                        changed.",
        },
      ],
    },
    ## BROADCAST_NEXT_NETWORK_KEY
    {
      value: "0x73",
      commandName: "broadcastNextNetworkKey",
      description: "This function broadcasts a new encryption key, but
                    does not tell the nodes in the network to start
                    using it. To tell nodes to switch to the new key,
                    use emberSendNetworkKeySwitch(). This is only valid
                    for the Trust Center/Coordinator. It is up to the
                    application to determine how quickly to send the
                    Switch Key after sending the alternate encryption
                    key.",
      commandArguments: [
        {
          type: "EmberKeyData",
          name: "key",
          description: "An optional pointer to a 16-byte encryption key
                        (EMBER_ENCRYPTION_KEY_SIZE). An all zero key may
                        be passed in, which will cause the stack to
                        randomly generate a new key.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EmberStatus value that indicates the success or
                        failure of the command.",
        },
      ],
    },
    ## BROADCAST_NETWORK_KEY_SWITCH
    {
      value: "0x74",
      commandName: "broadcastNetworkKeySwitch",
      description: "This function broadcasts a switch key message to
                    tell all nodes to change to the sequence number of
                    the previously sent Alternate Encryption Key.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EmberStatus value that indicates the success or
                        failure of the command.",
        },
      ],
    },
    ## BECOME_TRUST_CENTER
    {
      value: "0x77",
      commandName: "becomeTrustCenter",
      description: "This function causes a coordinator to become the
                    Trust Center when it is operating in a network
                    that is not using one. It will send out an
                    updated Network Key to all devices that will
                    indicate a transition of the network to now use a
                    Trust Center. The Trust Center should also switch
                    all devices to using this new network key with the
                    appropriate API.",
      commandArguments: [
        {
          type: "EmberKeyData",
          name: "newNetworkKey",
          description: "The key data for the Updated Network Key.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## AES_MMO_HASH
    {
      value: "0x6F",
      commandName: "aesMmoHash",
      description: "This routine processes the passed chunk of data
                    and updates the hash context based on it. If the
                    'finalize' parameter is not set, then the length of
                    the data passed in must be a multiple of 16. If
                    the 'finalize' parameter is set then the length can
                    be any value up 1-16, and the final hash value
                    will be calculated.",
      commandArguments: [
        {
          type: "EmberAesMmoHashContext",
          name: "context",
          description: "The hash context to update.",
        },
        {
          type: "bool",
          name: "finalize",
          description: "This indicates whether the final hash value
                        should be calculated",
        },
        {
          type: "uint8_t",
          name: "length",
          description: "The length of the data to hash.",
        },
        {
          type: "uint8_t[length]",
          name: "data",
          description: "The data to hash.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of the operation",
        },
        {
          type: "EmberAesMmoHashContext",
          name: "returnContext",
          description: "The updated hash context.",
        },
      ],
    },
    ## REMOVE_DEVICE
    {
      value: "0xA8",
      commandName: "removeDevice",
      description: "This command sends an APS remove device using APS
                    encryption to the destination indicating either to
                    remove itself from the network, or one of its
                    children.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "destShort",
          description: "The node ID of the device that will receive
                        the message",
        },
        {
          type: "EmberEUI64",
          name: "destLong",
          description: "The long address (EUI64) of the device that
                        will receive the message.",
        },
        {
          type: "EmberEUI64",
          name: "targetLong",
          description: "The long address (EUI64) of the device to be
                        removed.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success, or the
                        reason for failure",
        },
      ],
    },
    ## UNICAST_NWK_KEY_UPDATE
    {
      value: "0xA9",
      commandName: "unicastNwkKeyUpdate",
      description: "This command will send a unicast transport key
                    message with a new NWK key to the specified
                    device. APS encryption using the device's existing
                    link key will be used.",
      commandArguments: [
        {
          type: "EmberNodeId",
          name: "destShort",
          description: "The node ID of the device that will receive
                        the message",
        },
        {
          type: "EmberEUI64",
          name: "destLong",
          description: "The long address (EUI64) of the device that
                        will receive the message.",
        },
        {
          type: "EmberKeyData",
          name: "key",
          description: "The NWK key to send to the new device.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success, or the
                        reason for failure",
        },
      ],
    },
  ],

}
# END Trust Center Frames

################################################################################
- {
  section: Certificate Based Key Exchange (CBKE),

  ncpCpps: ~,

  typedefs: ~,

  enums: ~,

  frames: [
    ## GENERATE_CBKE_KEYS
    {
      value: "0xA4",
      commandName: "generateCbkeKeys",
      description: "This call starts the generation of the ECC
                    Ephemeral Public/Private key pair. When complete it
                    stores the private key. The results are returned
                    via ezspGenerateCbkeKeysHandler().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## GENERATE_CBKE_KEYS_HANDLER
    {
      value: "0x9E",
      commandName: "generateCbkeKeysHandler",
      description: "A callback by the Crypto Engine indicating that a
                    new ephemeral public/private key pair has been
                    generated. The public/private key pair is stored on
                    the NCP, but only the associated public key is
                    returned to the host. The node's associated
                    certificate is also returned.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of the CBKE operation.",
        },
        {
          type: "EmberPublicKeyData",
          name: "ephemeralPublicKey",
          description: "The generated ephemeral public key.",
        },
      ],
    },
    ## CALCULATE_SMACS
    {
      value: "0x9F",
      commandName: "calculateSmacs",
      description: "Calculates the SMAC verification keys for both the
                    initiator and responder roles of CBKE using the
                    passed parameters and the stored public/private key
                    pair previously generated with
                    ezspGenerateKeysRetrieveCert(). It also stores the
                    unverified link key data in temporary storage on
                    the NCP until the key establishment is complete.",
      commandArguments: [
        {
          type: "bool",
          name: "amInitiator",
          description: "The role of this device in the Key
                        Establishment protocol.",
        },
        {
          type: "EmberCertificateData",
          name: "partnerCertificate",
          description: "The key establishment partner's implicit
                        certificate.",
        },
        {
          type: "EmberPublicKeyData",
          name: "partnerEphemeralPublicKey",
          description: "The key establishment partner's ephemeral public
                        key",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## CALCULATE_SMACS_HANDLER
    {
      value: "0xA0",
      commandName: "calculateSmacsHandler",
      description: "A callback to indicate that the NCP has finished
                    calculating the Secure Message Authentication Codes
                    (SMAC) for both the initiator and responder. The
                    associated link key is kept in temporary storage
                    until the host tells the NCP to store or discard
                    the key via emberClearTemporaryDataMaybeStoreLinkKey().",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The Result of the CBKE operation.",
        },
        {
          type: "EmberSmacData",
          name: "initiatorSmac",
          description: "The calculated value of the initiator's SMAC",
        },
        {
          type: "EmberSmacData",
          name: "responderSmac",
          description: "The calculated value of the responder's SMAC",
        },
      ],
    },
    ## GENERATE_CBKE_KEYS283K1
    {
      value: "0xE8",
      commandName: "generateCbkeKeys283k1",
      description: "This call starts the generation of the ECC 283k1
                    curve Ephemeral Public/Private key pair. When
                    complete it stores the private key. The results are
                    returned via ezspGenerateCbkeKeysHandler283k1().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## GENERATE_CBKE_KEYS_HANDLER283K1
    {
      value: "0xE9",
      commandName: "generateCbkeKeysHandler283k1",
      description: "A callback by the Crypto Engine indicating that a
                    new 283k1 ephemeral public/private key pair has been
                    generated. The public/private key pair is stored on
                    the NCP, but only the associated public key is
                    returned to the host. The node's associated
                    certificate is also returned.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of the CBKE operation.",
        },
        {
          type: "EmberPublicKey283k1Data",
          name: "ephemeralPublicKey",
          description: "The generated ephemeral public key.",
        },
      ],
    },
    ## CALCULATE_SMACS283K1
    {
      value: "0xEA",
      commandName: "calculateSmacs283k1",
      description: "Calculates the SMAC verification keys for both the
                    initiator and responder roles of CBKE for the 283k1
                    ECC curve using the passed parameters and the
                    stored public/private key pair previously generated
                    with ezspGenerateKeysRetrieveCert283k1(). It also
                    stores the unverified link key data in temporary
                    storage on the NCP until the key establishment is
                    complete.",
      commandArguments: [
        {
          type: "bool",
          name: "amInitiator",
          description: "The role of this device in the Key
                        Establishment protocol.",
        },
        {
          type: "EmberCertificate283k1Data",
          name: "partnerCertificate",
          description: "The key establishment partner's implicit
                        certificate.",
        },
        {
          type: "EmberPublicKey283k1Data",
          name: "partnerEphemeralPublicKey",
          description: "The key establishment partner's ephemeral public
                        key",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## CALCULATE_SMACS_HANDLER283K1
    {
      value: "0xEB",
      commandName: "calculateSmacsHandler283k1",
      description: "A callback to indicate that the NCP has finished
                    calculating the Secure Message Authentication Codes
                    (SMAC) for both the initiator and responder for the
                    CBKE 283k1 Library. The associated link key is kept
                    in temporary storage until the host tells the NCP
                    to store or discard the key via
                    emberClearTemporaryDataMaybeStoreLinkKey().",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The Result of the CBKE operation.",
        },
        {
          type: "EmberSmacData",
          name: "initiatorSmac",
          description: "The calculated value of the initiator's SMAC",
        },
        {
          type: "EmberSmacData",
          name: "responderSmac",
          description: "The calculated value of the responder's SMAC",
        },
      ],
    },
    ## CLEAR_TEMPORARY_DATA_MAYBE_STORE_LINK_KEY
    {
      value: "0xA1",
      commandName: "clearTemporaryDataMaybeStoreLinkKey",
      description: "Clears the temporary data associated with CBKE and
                    the key establishment, most notably the ephemeral
                    public/private key pair. If storeLinKey is true it
                    moves the unverified link key stored in temporary
                    storage into the link key table. Otherwise it
                    discards the key.",
      commandArguments: [
        {
          type: "bool",
          name: "storeLinkKey",
          description: "A bool indicating whether to store (true) or
                        discard (false) the unverified link key derived
                        when ezspCalculateSmacs() was previously called.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## CLEAR_TEMPORARY_DATA_MAYBE_STORE_LINK_KEY283K1
    {
      value: "0xEE",
      commandName: "clearTemporaryDataMaybeStoreLinkKey283k1",
      description: "Clears the temporary data associated with CBKE and
                    the key establishment, most notably the ephemeral
                    public/private key pair. If storeLinKey is true it
                    moves the unverified link key stored in temporary
                    storage into the link key table. Otherwise it
                    discards the key.",
      commandArguments: [
        {
          type: "bool",
          name: "storeLinkKey",
          description: "A bool indicating whether to store (true) or
                        discard (false) the unverified link key derived
                        when ezspCalculateSmacs() was previously called.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## GET_CERTIFICATE
    {
      value: "0xA5",
      commandName: "getCertificate",
      description: "Retrieves the certificate installed on the NCP.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
        {
          type: "EmberCertificateData",
          name: "localCert",
          description: "The locally installed certificate.",
        },
      ],
    },
    ## GET_CERTIFICATE283K1
    {
      value: "0xEC",
      commandName: "getCertificate283k1",
      description: "Retrieves the 283k certificate installed on the
                    NCP.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
        {
          type: "EmberCertificate283k1Data",
          name: "localCert",
          description: "The locally installed certificate.",
        },
      ],
    },
    ## DSA_SIGN
    {
      value: "0xA6",
      commandName: "dsaSign",
      description: "LEGACY FUNCTION: This functionality has been
                    replaced by a single bit in the EmberApsFrame,
                    EMBER_APS_OPTION_DSA_SIGN. Devices wishing to send
                    signed messages should use that as it requires
                    fewer function calls and message buffering. The
                    dsaSignHandler response is still called when
                    EMBER_APS_OPTION_DSA_SIGN is used. However, this
                    function is still supported. This function begins
                    the process of signing the passed message contained
                    within the messageContents array. If no other ECC
                    operation is going on, it will immediately return
                    with EMBER_OPERATION_IN_PROGRESS to indicate the start
                    of ECC operation. It will delay a period of time
                    to let APS retries take place, but then it will
                    shut down the radio and consume the CPU processing
                    until the signing is complete. This may take up to
                    1 second. The signed message will be returned in
                    the dsaSignHandler response. Note that the last byte
                    of the messageContents passed to this function has
                    special significance. As the typical use case for
                    DSA signing is to sign the ZCL payload of a DRLC
                    Report Event Status message in SE 1.0, there is
                    often both a signed portion (ZCL payload) and an
                    unsigned portion (ZCL header). The last byte in the
                    content of messageToSign is therefore used as a
                    special indicator to signify how many bytes of
                    leading data in the array should be excluded from
                    consideration during the signing process. If the
                    signature needs to cover the entire array (all
                    bytes except last one), the caller should ensure
                    that the last byte of messageContents is 0x00. When
                    the signature operation is complete, this final byte
                    will be replaced by the signature type indicator
                    (0x01 for ECDSA signatures), and the actual
                    signature will be appended to the original contents
                    after this byte.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The message contents for which to create a
                        signature. Per above notes, this may include a
                        leading portion of data not included in the
                        signature, in which case the last byte of this
                        array should be set to the index of the first
                        byte to be considered for signing. Otherwise,
                        the last byte of messageContents should be 0x00
                        to indicate that a signature should occur across
                        the entire contents.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "EMBER_OPERATION_IN_PROGRESS if the stack has
                        queued up the operation for execution.
                        EMBER_INVALID_CALL if the operation can't be
                        performed in this context, possibly because
                        another ECC operation is pending.",
        },
      ],
    },
    ## DSA_SIGN_HANDLER
    {
      value: "0xA7",
      commandName: "dsaSignHandler",
      description: "The handler that returns the results of the
                    signing operation. On success, the signature will be
                    appended to the original message (including the
                    signature type indicator that replaced the startIndex
                    field for the signing) and both are returned via
                    this callback.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of the DSA signing operation.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The message and attached which includes the
                        original message and the appended signature.",
        },
      ],
    },
    ## DSA_VERIFY
    {
      value: "0xA3",
      commandName: "dsaVerify",
      description: "Verify that signature of the associated message
                    digest was signed by the private key of the
                    associated certificate.",
      commandArguments: [
        {
          type: "EmberMessageDigest",
          name: "digest",
          description: "The AES-MMO message digest of the signed data.
                        If dsaSign command was used to generate the
                        signature for this data, the final byte
                        (replaced by signature type of 0x01) in the
                        messageContents array passed to dsaSign is
                        included in the hash context used for the digest
                        calculation.",
        },
        {
          type: "EmberCertificateData",
          name: "signerCertificate",
          description: "The certificate of the signer. Note that the
                        signer's certificate and the verifier's
                        certificate must both be issued by the same
                        Certificate Authority, so they should share the
                        same CA Public Key.",
        },
        {
          type: "EmberSignatureData",
          name: "receivedSig",
          description: "The signature of the signed data.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## DSA_VERIFY_HANDLER
    {
      value: "0x78",
      commandName: "dsaVerifyHandler",
      description: "This callback is executed by the stack when the
                    DSA verification has completed and has a result. If
                    the result is EMBER_SUCCESS, the signature is valid.
                    If the result is EMBER_SIGNATURE_VERIFY_FAILURE then
                    the signature is invalid. If the result is anything
                    else then the signature verify operation failed and
                    the validity is unknown.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The result of the DSA verification operation.",
        },
      ],
    },
    ## DSA_VERIFY_283K1
    {
      value: "0xB0",
      commandName: "dsaVerify283k1",
      description: "Verify that signature of the associated message
                    digest was signed by the private key of the
                    associated certificate.",
      commandArguments: [
        {
          type: "EmberMessageDigest",
          name: "digest",
          description: "The AES-MMO message digest of the signed data.
                        If dsaSign command was used to generate the
                        signature for this data, the final byte
                        (replaced by signature type of 0x01) in the
                        messageContents array passed to dsaSign is
                        included in the hash context used for the digest
                        calculation.",
        },
        {
          type: "EmberCertificate283k1Data",
          name: "signerCertificate",
          description: "The certificate of the signer. Note that the
                        signer's certificate and the verifier's
                        certificate must both be issued by the same
                        Certificate Authority, so they should share the
                        same CA Public Key.",
        },
        {
          type: "EmberSignature283k1Data",
          name: "receivedSig",
          description: "The signature of the signed data.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## SET_PREINSTALLED_CBKE_DATA
    {
      value: "0xA2",
      commandName: "setPreinstalledCbkeData",
      description: "Sets the device's CA public key, local certificate,
                    and static private key on the NCP associated with
                    this node.",
      commandArguments: [
        {
          type: "EmberPublicKeyData",
          name: "caPublic",
          description: "The Certificate Authority's public key.",
        },
        {
          type: "EmberCertificateData",
          name: "myCert",
          description: "The node's new certificate signed by the CA.",
        },
        {
          type: "EmberPrivateKeyData",
          name: "myKey",
          description: "The node's new static private key.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
    ## SAVE_PREINSTALLED_CBKE_DATA283K1
    {
      value: "0xED",
      commandName: "savePreinstalledCbkeData283k1",
      description: "Sets the device's 283k1 curve CA public key, local
                    certificate, and static private key on the NCP
                    associated with this node.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "",
        },
      ],
    },
  ],

}
# END Certificate Based Key Exchange (CBKE)

################################################################################
- {
  section: Mfglib,

  ncpCpps: [
    "#ifndef EZSP_NO_MFGLIB",
    "#endif /* ndef EZSP_NO_MFGLIB */",
  ],

  typedefs: ~,

  enums: ~,

  frames: [
    ## MFGLIB_START
    {
      value: "0x83",
      commandName: "mfglibStart",
      description: "Activate use of mfglib test routines and enables
                    the radio receiver to report packets it receives to
                    the mfgLibRxHandler() callback. These packets will
                    not be passed up with a CRC failure. All other
                    mfglib functions will return an error until the
                    mfglibStart() has been called",
      commandArguments: [
        {
          type: "bool",
          name: "rxCallback",
          description: "true to generate a mfglibRxHandler callback when
                        a packet is received.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_END
    {
      value: "0x84",
      commandName: "mfglibEnd",
      description: "Deactivate use of mfglib test routines; restores
                    the hardware to the state it was in prior to
                    mfglibStart() and stops receiving packets started by
                    mfglibStart() at the same time.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_START_TONE
    {
      value: "0x85",
      commandName: "mfglibStartTone",
      description: "Starts transmitting an unmodulated tone on the
                    currently set channel and power level. Upon
                    successful return, the tone will be transmitting. To
                    stop transmitting tone, application must call
                    mfglibStopTone(), allowing it the flexibility to
                    determine its own criteria for tone duration (time,
                    event, etc.)",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_STOP_TONE
    {
      value: "0x86",
      commandName: "mfglibStopTone",
      description: "Stops transmitting tone started by mfglibStartTone().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_START_STREAM
    {
      value: "0x87",
      commandName: "mfglibStartStream",
      description: "Starts transmitting a random stream of characters.
                    This is so that the radio modulation can be
                    measured.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_STOP_STREAM
    {
      value: "0x88",
      commandName: "mfglibStopStream",
      description: "Stops transmitting a random stream of characters
                    started by mfglibStartStream().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_SEND_PACKET
    {
      value: "0x89",
      commandName: "mfglibSendPacket",
      description: "Sends a single packet consisting of the following
                    bytes: packetLength, packetContents[0], ... ,
                    packetContents[packetLength - 3], CRC[0], CRC[1]. The
                    total number of bytes sent is packetLength + 1.
                    The radio replaces the last two bytes of
                    packetContents[] with the 16-bit CRC for the packet.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "packetLength",
          description: "The length of the packetContents parameter in
                        bytes. Must be greater than 3 and less than
                        123.",
        },
        {
          type: "uint8_t[packetLength]",
          name: "packetContents",
          description: "The packet to send. The last two bytes will
                        be replaced with the 16-bit CRC.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_SET_CHANNEL
    {
      value: "0x8a",
      commandName: "mfglibSetChannel",
      description: "Sets the radio channel. Calibration occurs if this
                    is the first time the channel has been used.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The channel to switch to. Valid values are 11
                        to 26.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_GET_CHANNEL
    {
      value: "0x8b",
      commandName: "mfglibGetChannel",
      description: "Returns the current radio channel, as previously
                    set via mfglibSetChannel().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The current channel.",
        },
      ],
    },
    ## MFGLIB_SET_POWER
    {
      value: "0x8c",
      commandName: "mfglibSetPower",
      description: "First select the transmit power mode, and then
                    include a method for selecting the radio transmit
                    power. The valid power settings depend upon the
                    specific radio in use. Ember radios have discrete
                    power settings, and then requested power is rounded
                    to a valid power setting; the actual power output
                    is available to the caller via mfglibGetPower().",
      commandArguments: [
        {
          type: "uint16_t",
          name: "txPowerMode",
          description: "Power mode. Refer to txPowerModes in
                        stack/include/ember-types.h for possible values.",
        },
        {
          type: "int8_t",
          name: "power",
          description: "Power in units of dBm. Refer to radio data
                        sheet for valid range.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## MFGLIB_GET_POWER
    {
      value: "0x8d",
      commandName: "mfglibGetPower",
      description: "Returns the current radio power setting, as
                    previously set via mfglibSetPower().",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "int8_t",
          name: "power",
          description: "Power in units of dBm. Refer to radio data
                        sheet for valid range.",
        },
      ],
    },
    ## MFGLIB_RX_HANDLER
    {
      value: "0x8e",
      commandName: "mfglibRxHandler",
      description: "A callback indicating a packet with a valid CRC
                    has been received.",
      responseArguments: [
        {
          type: "uint8_t",
          name: "linkQuality",
          description: "The link quality observed during the reception",
        },
        {
          type: "int8_t",
          name: "rssi",
          description: "The energy level (in units of dBm) observed
                        during the reception.",
        },
        {
          type: "uint8_t",
          name: "packetLength",
          description: "The length of the packetContents parameter in
                        bytes. Will be greater than 3 and less than
                        123.",
        },
        {
          type: "uint8_t[packetLength]",
          name: "packetContents",
          description: "The received packet. The last two bytes are
                        the 16-bit CRC.",
        },
      ],
    },
  ],

}
# END Mfglib

################################################################################
- {
  section: Bootloader,

  ncpCpps: [
    "#ifndef EZSP_NO_BOOTLOADER",
    "#endif /* ndef EZSP_NO_BOOTLOADER */",
  ],

  typedefs: ~,

  enums: ~,

  frames: [
    ## LAUNCH_STANDALONE_BOOTLOADER
    {
      value: "0x8f",
      commandName: "launchStandaloneBootloader",
      description: "Quits the current application and launches the
                    standalone bootloader (if installed) The function
                    returns an error if the standalone bootloader is
                    not present",
      commandArguments: [
        {
          type: "uint8_t",
          name: "mode",
          description: "Controls the mode in which the standalone
                        bootloader will run. See the app. note for full
                        details. Options are:
                        STANDALONE_BOOTLOADER_NORMAL_MODE: Will listen for
                        an over-the-air image transfer on the current
                        channel with current power settings.
                        STANDALONE_BOOTLOADER_RECOVERY_MODE: Will listen for
                        an over-the-air image transfer on the default
                        channel with default power settings. Both modes
                        also allow an image transfer to begin with
                        XMODEM over the serial protocol's Bootloader
                        Frame.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## SEND_BOOTLOAD_MESSAGE
    {
      value: "0x90",
      commandName: "sendBootloadMessage",
      description: "Transmits the given bootload message to a
                    neighboring node using a specific 802.15.4 header
                    that allows the EmberZNet stack as well as the
                    bootloader to recognize the message, but will not
                    interfere with other ZigBee stacks.",
      commandArguments: [
        {
          type: "bool",
          name: "broadcast",
          description: "If true, the destination address and pan id
                        are both set to the broadcast address.",
        },
        {
          type: "EmberEUI64",
          name: "destEui64",
          description: "The EUI64 of the target node. Ignored if the
                        broadcast field is set to true.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The multicast message.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_STANDALONE_BOOTLOADER_VERSION_PLAT_MICRO_PHY
    {
      value: "0x91",
      commandName: "getStandaloneBootloaderVersionPlatMicroPhy",
      description: "Detects if the standalone bootloader is installed,
                    and if so returns the installed version. If not
                    return 0xffff. A returned version of 0x1234 would
                    indicate version 1.2 build 34. Also return the
                    node's version of PLAT, MICRO and PHY.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint16_t",
          name: "bootloader_version",
          description: "BOOTLOADER_INVALID_VERSION if the standalone
                        bootloader is not present, or the version of
                        the installed standalone bootloader.",
        },
        {
          type: "uint8_t",
          name: "nodePlat",
          description: "The value of PLAT on the node",
        },
        {
          type: "uint8_t",
          name: "nodeMicro",
          description: "The value of MICRO on the node",
        },
        {
          type: "uint8_t",
          name: "nodePhy",
          description: "The value of PHY on the node",
        },
      ],
    },
    ## INCOMING_BOOTLOAD_MESSAGE_HANDLER
    {
      value: "0x92",
      commandName: "incomingBootloadMessageHandler",
      description: "A callback invoked by the EmberZNet stack when a
                    bootload message is received.",
      responseArguments: [
        {
          type: "EmberEUI64",
          name: "longId",
          description: "The EUI64 of the sending node.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during the reception.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The bootload message that was sent.",
        },
      ],
    },
    ## BOOTLOAD_TRANSMIT_COMPLETE_HANDLER
    {
      value: "0x93",
      commandName: "bootloadTransmitCompleteHandler",
      description: "A callback invoked by the EmberZNet stack when the
                    MAC has finished transmitting a bootload message.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value of EMBER_SUCCESS if an ACK
                        was received from the destination or
                        EMBER_DELIVERY_FAILED if no ACK was received.",
        },
        {
          type: "uint8_t",
          name: "messageLength",
          description: "The length of the <i>messageContents</i>
                        parameter in bytes.",
        },
        {
          type: "uint8_t[messageLength]",
          name: "messageContents",
          description: "The message that was sent.",
        },
      ],
    },
    ## AES_ENCRYPT
    {
      value: "0x94",
      commandName: "aesEncrypt",
      description: "Perform AES encryption on plaintext using key.",
      commandArguments: [
        {
          type: "uint8_t[16]",
          name: "plaintext",
          description: "16 bytes of plaintext.",
        },
        {
          type: "uint8_t[16]",
          name: "key",
          description: "The 16 byte encryption key to use.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t[16]",
          name: "ciphertext",
          description: "16 bytes of ciphertext.",
        },
      ],
    },
    ## OVERRIDE_CURRENT_CHANNEL
    {
      value: "0x95",
      commandName: "overrideCurrentChannel",
      description: "A bootloader method for selecting the radio
                    channel. This routine only works for sending and
                    receiving bootload packets. Does not correctly do
                    ZigBee stack changes. NOTE: this API is not safe to call on
                    multi-network devices and it will return failure when so.
                    Use of the ember/ezspSetRadioChannel APIs are multi-network
                    safe and are recommended instead.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "channel",
          description: "The channel to switch to. Valid values are 11
                        to 26.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
  ],

}
# END Bootloader

################################################################################
- {
  section: ZLL,

  ncpCpps: [
    "#ifndef EZSP_NO_ZLL",
    "#endif /* ifndef EZSP_NO_ZLL */",
  ],

  typedefs: ~,

  enums: ~,

  frames: [
    ## ZLL_NETWORK_OPS
    {
      value: "0xB2",
      commandName: "zllNetworkOps",
      description: "A consolidation of ZLL network operations with
                    similar signatures; specifically, forming and joining
                    networks or touch-linking.",
      commandArguments: [
        {
          type: "EmberZllNetwork",
          name: "networkInfo",
          description: "Information about the network.",
        },
        {
          type: "EzspZllNetworkOperation",
          name: "op",
          description: "Operation indicator.",
        },
        {
          type: "int8_t",
          name: "radioTxPower",
          description: "Radio transmission power.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ZLL_SET_INITIAL_SECURITY_STATE
    {
      value: "0xB3",
      commandName: "zllSetInitialSecurityState",
      description: "This call will cause the device to setup the
                    security information used in its network. It must
                    be called prior to forming, starting, or joining a
                    network.",
      commandArguments: [
        {
          type: "EmberKeyData",
          name: "networkKey",
          description: "ZLL Network key.",
        },
        {
          type: "EmberZllInitialSecurityState",
          name: "securityState",
          description: "Initial security state of the network.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ZLL_SET_SECURITY_STATE_WITHOUT_KEY
    {
      value: "0xCF",
      commandName: "zllSetSecurityStateWithoutKey",
      description: "This call will update ZLL security token information. Unlike
                    emberZllSetInitialSecurityState, this can be called while a network is
                    already established.",
      commandArguments: [
        {
          type: "EmberZllInitialSecurityState",
          name: "securityState",
          description: "Security state of the network.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ZLL_START_SCAN
    {
      value: "0xB4",
      commandName: "zllStartScan",
      description: "This call will initiate a ZLL network scan on all
                    the specified channels.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "channelMask",
          description: "The range of channels to scan.",
        },
        {
          type: "int8_t",
          name: "radioPowerForScan",
          description: "The radio output power used for the scan
                        requests.",
        },
        {
          type: "EmberNodeType",
          name: "nodeType",
          description: "The node type of the local device.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ZLL_SET_RX_ON_WHEN_IDLE
    {
      value: "0xB5",
      commandName: "zllSetRxOnWhenIdle",
      description: "This call will change the mode of the radio so
                    that the receiver is on for a specified amount of
                    time when the device is idle.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "durationMs",
          description: "The duration in milliseconds to leave the radio
                        on.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## ZLL_NETWORK_FOUND_HANDLER
    {
      value: "0xB6",
      commandName: "zllNetworkFoundHandler",
      description: "This call is fired when a ZLL network scan finds
                    a ZLL network.",
      responseArguments: [
        {
          type: "EmberZllNetwork",
          name: "networkInfo",
          description: "Information about the network.",
        },
        {
          type: "bool",
          name: "isDeviceInfoNull",
          description: "Used to interpret deviceInfo field.",
        },
        {
          type: "EmberZllDeviceInfoRecord",
          name: "deviceInfo",
          description: "Device specific information.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during reception.",
        },
      ],
    },
    ## ZLL_SCAN_COMPLETE_HANDLER
    {
      value: "0xB7",
      commandName: "zllScanCompleteHandler",
      description: "This call is fired when a ZLL network scan is
                    complete.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "Status of the operation.",
        },
      ],
    },
    ## ZLL_ADDRESS_ASSIGNMENT_HANDLER
    {
      value: "0xB8",
      commandName: "zllAddressAssignmentHandler",
      description: "This call is fired when network and group
                    addresses are assigned to a remote mode in a
                    network start or network join request.",
      responseArguments: [
        {
          type: "EmberZllAddressAssignment",
          name: "addressInfo",
          description: "Address assignment information.",
        },
        {
          type: "uint8_t",
          name: "lastHopLqi",
          description: "The link quality from the node that last
                        relayed the message.",
        },
        {
          type: "int8_t",
          name: "lastHopRssi",
          description: "The energy level (in units of dBm) observed
                        during reception.",
        },
      ],
    },
    ## SET_LOGICAL_AND_RADIO_CHANNEL
    {
      value: "0xB9",
      commandName: "setLogicalAndRadioChannel",
      description: "This call sets the radio channel in the stack and
                    propagates the information to the hardware.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "radioChannel",
          description: "The radio channel to be set.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ## GET_LOGICAL_CHANNEL
    {
      value: "0xBA",
      commandName: "getLogicalChannel",
      description: "Get the logical channel from the ZLL stack.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "logicalChannel",
          description: "The logical channel.",
        },
      ],
    },
    ## ZLL_TOUCH_LINK_TARGET_HANDLER
    {
      value: "0xBB",
      commandName: "zllTouchLinkTargetHandler",
      description: "This call is fired when the device is a target
                    of a touch link.",
      responseArguments: [
        {
          type: "EmberZllNetwork",
          name: "networkInfo",
          description: "Information about the network.",
        },
      ],
    },
    ## ZLL_GET_TOKENS
    {
      value: "0xBC",
      commandName: "zllGetTokens",
      description: "Get the ZLL tokens.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EmberTokTypeStackZllData",
          name: "data",
          description: "Data token return value.",
        },
        {
          type: "EmberTokTypeStackZllSecurity",
          name: "security",
          description: "Security token return value.",
        },
      ],
    },
    ## ZLL_SET_DATA_TOKEN
    {
      value: "0xBD",
      commandName: "zllSetDataToken",
      description: "Set the ZLL data token.",
      commandArguments: [
        {
          type: "EmberTokTypeStackZllData",
          name: "data",
          description: "Data token to be set.",
        },
      ],
      responseArguments: [
      ],
    },
    ## ZLL_SET_NON_ZLL_NETWORK
    {
      value: "0xBF",
      commandName: "zllSetNonZllNetwork",
      description: "Set the ZLL data token bitmask to reflect the ZLL
                    network state.",
      commandArguments: [
      ],
      responseArguments: [
      ],
    },
    ## IS_ZLL_NETWORK
    {
      value: "0xBE",
      commandName: "isZllNetwork",
      description: "Is this a ZLL network?",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "bool",
          name: "isZllNetwork",
          description: "ZLL network?",
        },
      ],
    },
    ## ZLL_SET_RADIO_IDLE_MODE
    {
      value: "0xD4",
      commandName: "zllSetRadioIdleMode",
      description: "This call sets the radio's default idle power mode.",
      commandArguments: [
        {
          type: "EmberRadioPowerMode",
          name: "mode",
          description: "The power mode to be set.",
        },
      ],
      responseArguments: [
      ],
    },
    ## SET_ZLL_NODE_TYPE
    {
      value: "0xD5",
      commandName: "setZllNodeType",
      description: "This call sets the default node type for a factory new ZLL device.",
      commandArguments: [
        {
          type: "EmberNodeType",
          name: "nodeType",
          description: "The node type to be set.",
        },
      ],
      responseArguments: [
      ],
    },
    ## SET_ZLL_ADDITIONAL_STATE
    {
      value: "0xD6",
      commandName: "setZllAdditionalState",
      description: "This call sets additional capability bits in the ZLL state.",
      commandArguments: [
        {
          type: "uint16_t",
          name: "state",
          description: "A mask with the bits to be set or cleared.",
        },
      ],
      responseArguments: [
      ],
    },
    ## ZLL_OPERATION_IN_PROGRESS
    {
      value: "0xD7",
      commandName: "zllOperationInProgress",
      description: "Is there a ZLL (Touchlink) operation in progress?",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "bool",
          name: "zllOperationInProgress",
          description: "ZLL operation in progress?",
        },
      ],
    },
    ## ZLL_RX_ON_WHEN_IDLE_GET_ACTIVE
    {
      value: "0xD8",
      commandName: "zllRxOnWhenIdleGetActive",
      description: "Is the ZLL radio on when idle mode is active?",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "bool",
          name: "zllRxOnWhenIdleGetActive",
          description: "ZLL radio on when idle mode is active?",
        },
      ],
    },
    ## EZSP_GET_ZLL_PRIMARY_CHANNEL_MASK
    {
      value: "0xD9",
      commandName: "getZllPrimaryChannelMask",
      description: "Get the primary ZLL (touchlink) channel mask.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint32_t",
          name: "zllPrimaryChannelMask",
          description: "The primary ZLL channel mask",
        },
      ],
    },
    ## EZSP_GET_ZLL_SECONDARY_CHANNEL_MASK
    {
      value: "0xDA",
      commandName: "getZllSecondaryChannelMask",
      description: "Get the secondary ZLL (touchlink) channel mask.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "uint32_t",
          name: "zllSecondaryChannelMask",
          description: "The secondary ZLL channel mask",
        },
      ],
    },
    ## EZSP_SET_ZLL_PRIMARY_CHANNEL_MASK
    {
      value: "0xDB",
      commandName: "setZllPrimaryChannelMask",
      description: "Set the primary ZLL (touchlink) channel mask",
      commandArguments: [
        {
          type: "uint32_t",
          name: "zllPrimaryChannelMask",
          description: "The primary ZLL channel mask",
        },
      ],
      responseArguments: [
      ],
    },
    ## EZSP_SET_ZLL_SECONDARY_CHANNEL_MASK
    {
      value: "0xDC",
      commandName: "setZllSecondaryChannelMask",
      description: "Set the secondary ZLL (touchlink) channel mask.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "zllSecondaryChannelMask",
          description: "The secondary ZLL channel mask",
        },
      ],
      responseArguments: [
      ],
    },
    ## EZSP_ZLL_CLEAR_TOKENS
    {
      value: "0x25",
      commandName: "zllClearTokens",
      description: "Clear ZLL stack tokens.",
      commandArguments: [
      ],
      responseArguments: [
      ],
    }
  ],

}
# END ZLL

# WWAH
- {
section: WWAH,


ncpCpps: [
    "#ifndef EZSP_NO_WWAH",
    "#endif /* ndef EZSP_NO_WWAH */",
  ],

typedefs: ~,

enums: ~,

frames: [
  ## SET_PARENT_CLASSIFICATION_ENABLED
  {
    value: "0xE7",
    commandName: "setParentClassificationEnabled",
    description: "Sets whether to use parent classification when processing
                  beacons during a join or rejoin. Parent classification
                  considers whether a received beacon indicates trust center
                  connectivity and long uptime on the network",
    commandArguments: [
      {
        type: "bool",
        name: "enabled",
        description: "Enable or disable parent classification",
      },
    ],
    responseArguments: [
    ],
  },
  ## GET_PARENT_CLASSIFICATION_ENABLED
  {
    value: "0xF0",
    commandName: "getParentClassificationEnabled",
    description: "Gets whether to use parent classification when processing
                  beacons during a join or rejoin. Parent classification
                  considers whether a received beacon indicates trust center
                  connectivity and long uptime on the network",
    commandArguments: [
    ],
    responseArguments: [
      {
        type: "bool",
        name: "enabled",
        description: "Enable or disable parent classification",
      },
    ],
  },
    ## SET_LONG_UP_TIME
        {
        value: "0xE3",
        commandName: "setLongUpTime",
        description: "sets the device uptime to be long or short",
        commandArguments: [
                {
                type: "bool",
                name: "hasLongUpTime",
                description: "if the uptime is long or not",
                },
            ],
        responseArguments: [
            ],
        },
    ## SET_HUB_CONNECTIVITY
        {
            value: "0xE4",
            commandName: "setHubConnectivity",
            description: "sets the hub connectivity to be true or false",
            commandArguments: [
            {
            type: "bool",
            name: "connected",
            description: "if the hub is connected or not",
            },
        ],
        responseArguments: [
            ],
        },
    ## IS_UP_TIME_LONG
        {
           value: "0xE5",
            commandName: "isUpTimeLong",
            description: "checks if the device uptime is long or short",
            commandArguments: [
            ],
            responseArguments: [
                {
                type: "bool",
                name: "hasLongUpTime",
                description: "if the uptime is long or not",
                },
            ],
        },
    ## IS_HUB_CONNECTED
        {
            value: "0xE6",
            commandName: "isHubConnected",
            description: "checks if the hub is connected or not",
            commandArguments: [
            ],
            responseArguments: [
                {
                type: "bool",
                name: "isHubConnected",
                description: "if the hub is connected or not",
                },
            ],
        },
    ],

}
# END WWAH


#GREEN-POWER
- {
  section: Green Power,

  ncpCpps: [
    "#ifndef EZSP_NO_GREEN_POWER",
    "#endif /* ndef EZSP_NO_GREEN_POWER */",
  ],

  typedefs: [
    {
      name: "EmberGpAddress",
      description: "A GP address structure.",
      definition: [
        {
          type: "EmberEUI64",
          name: "gpdIeeeAddress",
          description: "The GPD's EUI64.",
        },
        {
          type: "uint32_t",
          name: "sourceId",
          description: "The GPD's source ID.",
        },
        {
          type: "uint8_t",
          name: "applicationId",
          description: "The GPD Application ID.",
        },
        {
          type: "uint8_t",
          name: "endpoint",
          description: "The GPD endpoint.",
        },
      ],
    },
    {
      name: "EmberGpSinkListEntry",
      description: "A sink list entry.",
      definition: [
        {
          type: "uint8_t",
          name: "type",
          description: "The sink list type.",
        },
        {
          type: "EmberEUI64",
          name: "sinkEUI",
          description: "The EUI64 of the target sink.",
        },
        {
          type: "EmberNodeId",
          name: "sinkNodeId",
          description: "The short address of the target sink.",
        },
      ],
    },

    {
      name: "EmberGpSecurityLevel",
      description: "The security level of the GPD.",
      definition: "uint8_t",
    },
    {
      name: "EmberGpKeyType",
      description: "The type of security key to use for the GPD.",
      definition: "uint8_t",
    },
    {
      name: "EmberGpProxyTableEntryStatus",
      description: "The proxy table entry status",
      definition: "uint8_t",
    },
    {
      name: "EmberGpSecurityFrameCounter",
      description: "The security frame counter",
      definition: "uint32_t",
    },
    {
      name: "EmberGpProxyTableEntry",
      description: "The internal representation of a proxy table entry.",
      definition: [
      {
          type: "EmberKeyData",
          name: "securityLinkKey",
          description: "The link key to be used to secure this
                        pairing link.",
      },
      {
        type: "EmberGpProxyTableEntryStatus",
        name: "status",
        description: "Internal status of the proxy table entry.",
      },
      {
        type: "uint32_t",
        name: "options",
        description: "The tunneling options (this contains both options and
                      extendedOptions from the spec).",
      },
      {
        type: "EmberGpAddress",
        name: "gpd",
        description: "The addressing info of the GPD.",
      },
      {
        type: "EmberNodeId",
        name: "assignedAlias",
        description: "The assigned alias for the GPD.",
      },
      {
        type: "uint8_t",
        name: "securityOptions",
        description: "The security options field.",
      },
      {
        type: "EmberGpSecurityFrameCounter",
        name: "gpdSecurityFrameCounter",
        description: "The security frame counter of the GPD.",
      },
      {
        type: "EmberKeyData",
        name: "gpdKey",
        description: "The key to use for GPD.",
      },
      {
        type: "EmberGpSinkListEntry",
        name: "sinkList[GP_SINK_LIST_ENTRIES]",
        description: "The list of sinks (hardcoded to 2 which is the spec
                      minimum).",
      },
      {
        type: "uint8_t",
        name: "groupcastRadius",
        description: "The groupcast radius.",
      },
      {
        type: "uint8_t",
        name: "searchCounter",
        description: "The search counter.",
      }
      ]
    },
    {
      name: "EmberGpSinkTableEntryStatus",
      description: "The sink table entry status",
      definition: "uint8_t",
    },
    {
      name: "EmberGpSinkTableEntry",
      description: "The internal representation of a sink table entry.",
      definition: [
      {
        type: "EmberGpSinkTableEntryStatus",
        name: "status",
        description: "Internal status of the sink table entry.",
      },
      {
        type: "uint32_t",
        name: "options",
        description: "The tunneling options (this contains both options and
                      extendedOptions from the spec).",
      },
      {
        type: "EmberGpAddress",
        name: "gpd",
        description: "The addressing info of the GPD.",
      },
      {
        type: "uint8_t",
        name: "deviceId",
        description: "The device id for the GPD.",
      },      
      {
        type: "EmberGpSinkListEntry",
        name: "sinkList[GP_SINK_LIST_ENTRIES]",
        description: "The list of sinks (hardcoded to 2 which is the spec
                      minimum).",
      },
      {
        type: "EmberNodeId",
        name: "assignedAlias",
        description: "The assigned alias for the GPD.",
      },
      {
        type: "uint8_t",
        name: "groupcastRadius",
        description: "The groupcast radius.",
      },
      {
        type: "uint8_t",
        name: "securityOptions",
        description: "The security options field.",
      },
      {
        type: "EmberGpSecurityFrameCounter",
        name: "gpdSecurityFrameCounter",
        description: "The security frame counter of the GPD.",
      },
      {
        type: "EmberKeyData",
        name: "gpdKey",
        description: "The key to use for GPD.",
      },
      ]
    },
  ],

  enums: ~,

  frames: [
    ##Proxyset
    {
      value: "0xC9",
      commandName: "gpProxyTableProcessGpPairing",
      description: "Update the GP Proxy table based on a GP pairing.",
      commandArguments: [
        {
          type: "uint32_t",
          name: "options",
          description: "The options field of the GP Pairing command.",
        },
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "The target GPD.",
        },
        {
          type: "uint8_t",
          name: "commMode",
          description: "The communication mode of the GP Sink.",
        },
        {
          type: "uint16_t",
          name: "sinkNetworkAddress",
          description: "The network address of the GP Sink.",
        },
        {
          type: "uint16_t",
          name: "sinkGroupId",
          description: "The group ID of the GP Sink.",
        },
        {
          type: "uint16_t",
          name: "assignedAlias",
          description: "The alias assigned to the GPD.",
        },
        {
          type: "uint8_t[8]",
          name: "sinkIeeeAddress",
          description: "The IEEE address of the GP Sink.",
        },
        {
          type: "EmberKeyData",
          name: "gpdKey",
          description: "The key to use for the target GPD.",
        },
        {
          type: "uint32_t",
          name: "gpdSecurityFrameCounter",
          description: "The GPD security frame counter.",
        },
        {
          type: "uint8_t",
          name: "forwardingRadius",
          description: "The forwarding radius.",
        },
      ],
      responseArguments: [
        {
          type: "bool",
          name: "gpPairingAdded",
          description: "Whether a GP Pairing has been created or not.",
        },
      ],
    },
    ## DGP_SEND
    {
      value: "0xC6",
      commandName: "dGpSend",
      description: "Adds/removes an entry from the GP Tx Queue.",
      commandArguments: [
        {
          type: "bool",
          name: "action",
          description: "The action to perform on the GP TX queue
                        (true to add, false to remove).",
        },
        {
          type: "bool",
          name: "useCca",
          description: "Whether to use ClearChannelAssessment when
                        transmitting the GPDF.",
        },
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "The Address of the destination GPD.",
        },
        {
          type: "uint8_t",
          name: "gpdCommandId",
          description: "The GPD command ID to send.",
        },
        {
          type: "uint8_t",
          name: "gpdAsduLength",
          description: "The length of the GP command payload.",
        },
        {
          type: "uint8_t[gpdAsduLength]",
          name: "gpdAsdu",
          description: "The GP command payload.",
        },
        {
          type: "uint8_t",
          name: "gpepHandle",
          description: "The handle to refer to the GPDF.",
        },
        {
          type: "uint16_t",
          name: "gpTxQueueEntryLifetimeMs",
          description: "How long to keep the GPDF in the TX Queue.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },

    ##GPEP_SENT_HANDLER
    {
      value: "0xC7",
      commandName: "dGpSentHandler",
      description: "A callback to the GP endpoint to indicate the
                    result of the GPDF transmission.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "uint8_t",
          name: "gpepHandle",
          description: "The handle of the GPDF.",
        },
      ],
    },



    ## GP_EP_INCOMING_MESSAGE
    {
      value: "0xC5",
      commandName: "gpepIncomingMessageHandler",
      description: "A callback invoked by the ZigBee GP stack when
                    a GPDF is received.",
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "The status of the GPDF receive.",
        },
        {
          type: "uint8_t",
          name: "gpdLink",
          description: "The gpdLink value of the received GPDF.",
        },
        {
          type: "uint8_t",
          name: "sequenceNumber",
          description: "The GPDF sequence number.",
        },
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "The address of the source GPD.",
        },
        {
          type: "EmberGpSecurityLevel",
          name: "gpdfSecurityLevel",
          description: "The security level of the received GPDF.",
        },
        {
          type: "EmberGpKeyType",
          name: "gpdfSecurityKeyType",
          description: "The securityKeyType used to decrypt/authenticate
                        the incoming GPDF.",
        },
        {
          type: "bool",
          name: "autoCommissioning",
          description: "Whether the incoming GPDF had the auto-commissioning
                        bit set.",
        },
        {
          type: "bool",
          name: "rxAfterTx",
          description: "Whether the incoming GPDF had the rxAfterTx
                        bit set.",
        },
        {
          type: "uint32_t",
          name: "gpdSecurityFrameCounter",
          description: "The security frame counter of the incoming GDPF.",
        },
        {
          type: "uint8_t",
          name: "gpdCommandId",
          description: "The gpdCommandId of the incoming GPDF.",
        },
        {
          type: "uint32_t",
          name: "mic",
          description: "The received MIC of the GPDF.",
        },
        {
          type: "uint8_t",
          name: "proxyTableIndex",
          description: "The proxy table index of the corresponding proxy 
                        table entry to the incoming GPDF.",
        },
        {
          type: "uint8_t",
          name: "gpdCommandPayloadLength",
          description: "The length of the GPD command payload.",
        },
        {
          type: "uint8_t[gpdCommandPayloadLength]",
          name: "gpdCommandPayload",
          description: "The GPD command payload.",
        },
      ],
    },
    ## GP_GET_PROXY_TABLE_ENTRY
    {
      value: "0xC8",
      commandName: "gpProxyTableGetEntry",
      description: "Retrieves the proxy table entry stored at the
                    passed index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "proxyIndex",
          description: "The index of the requested proxy table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberGpProxyTableEntry",
          name: "entry",
          description: "An EmberGpProxyTableEntry struct containing a
                        copy of the requested proxy entry.",
        },
      ],
    },
    {
      value: "0xC0",
      commandName: "gpProxyTableLookup",
      description: "Finds the index of the passed address in the gp table.",
      commandArguments: [
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "The address to search for",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index, or 0xFF for not found",
        },
      ],
    },
    ## GP_SINK_TABLE_GET_ENTRY
    {
      value: "0xDD",
      commandName: "gpSinkTableGetEntry",
      description: "Retrieves the sink table entry stored at the
                    passed index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "sinkIndex",
          description: "The index of the requested sink table entry.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "EmberGpSinkTableEntry",
          name: "entry",
          description: "An EmberGpSinkTableEntry struct containing a
                        copy of the requested sink entry.",
        },
      ],
    },
    ##GP_SINK_TABLE_LOOKUP
    {
      value: "0xDE",
      commandName: "gpSinkTableLookup",
      description: "Finds the index of the passed address in the gp table.",
      commandArguments: [
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "The address to search for.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "The index, or 0xFF for not found",
        },
      ],
    },
    ## GP_SINK_TABLE_SET_ENTRY
    {
      value: "0xDF",
      commandName: "gpSinkTableSetEntry",
      description: "Retrieves the sink table entry stored at the
                    passed index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "sinkIndex",
          description: "The index of the requested sink table entry.",
        },
        {
          type: "EmberGpSinkTableEntry",
          name: "entry",
          description: "An EmberGpSinkTableEntry struct containing a
                        copy of the sink entry to be updated.",
        },
      ],
      responseArguments: [
        {
          type: "EmberStatus",
          name: "status",
          description: "An EmberStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    # 
    {
      value: "0xE0",
      commandName: "gpSinkTableRemoveEntry",
      description: "Removes the sink table entry stored at the
                    passed index.",
      commandArguments: [
        {
          type: "uint8_t",
          name: "sinkIndex",
          description: "The index of the requested sink table entry.",
        },
      ],
      responseArguments: [
      ],
    },
    {
      value: "0xE1",
      commandName: "gpSinkTableFindOrAllocateEntry",
      description: "Finds or allocates a sink entry",
      commandArguments: [
        {
          type: "EmberGpAddress",
          name: "addr",
          description: "An EmberGpAddress struct containing a
                        copy of the gpd address to be found.",
        },
      ],
      responseArguments: [
        {
          type: "uint8_t",
          name: "index",
          description: "An index of found or allocated sink or 0xFF if failed.",
        },
      ],
    },
    ##GP_CLEAR_SINK_TABLE
    {
      value: "0xE2",
      commandName: "gpSinkTableClearAll",
      description: "Clear the entire sink table",
      commandArguments: [
      ],
      responseArguments: [
      ],
    },
    {
      value: "0x70",
      commandName: "gpSinkTableInit",
      description: "Iniitialises Sink Table",
      commandArguments: [
      ],
      responseArguments: [
      ],
    },
  ],
} 
# END GREEN-POWER

#SECURE-EZSP
- {
  section: Secure EZSP,

  ncpCpps: ~,

  typedefs: [
    {
      name: "SecureEzspRandomNumber",
      description: "Randomly generated 128-bit number. Both NCP and Host
                    contribute this number to create the Session ID, which is
                    used in the nonce.",
      definition: [
        {
          type: "uint8_t[16]",
          name: "contents",
          description: "The random number data.",
        },
      ]
    },
    {
      name: "SecureEzspSessionId",
      description: "Generated 64-bit Session ID, using random numbers from
                    Host and NCP. It is generated at each reboot (during
                    negotiation phase). Having both sides contribute to the
                    value prevents one side from choosing a number that might
                    have been previously used (either because of a bug or by
                    malicious intent).",
      definition: [
        {
          type: "uint8_t[8]",
          name: "contents",
          description: "The Session ID data.",
        },
      ]
    },
    {
      name: "SecureEzspSecurityType",
      description: "Security type of the Secure EZSP Protocol.
                    ::SECURE_EZSP_SECURITY_TYPE_TEMPORARY sets up
                    temporary security, which can be reset through
                    ::ezspResetToFactoryDefaults().
                    ::SECURE_EZSP_SECURITY_TYPE_PERMANENT sets up permanent
                    security, which cannot be reset.
                    Only temporary security option is currently supported.",
      definition: "uint32_t"
    },
    {
      name: "SecureEzspSecurityLevel",
      description: "Security level of the Secure EZSP Protocol.
                    Only ::SECURE_EZSP_SECURITY_LEVEL_ENC_MIC_32 is currently
                    supported.",
      definition: "uint8_t"
    },
  ],

  enums: ~,

  frames: [
    ##setSecurityKey
    {
      value: "0xCA",
      commandName: "setSecurityKey",
      description: "Set the Security Key of the Secure EZSP Protocol.",
      commandArguments: [
        {
          type: "EmberKeyData",
          name: "key",
          description: "The key to use for the Secure EZSP Protocol.",
        },
        {
          type: "SecureEzspSecurityType",
          name: "securityType",
          description: "The security type to be used for the Secure EZSP
                        Protocol.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "An EzspStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ##SetSecurityParameters
    {
      value: "0xCB",
      commandName: "setSecurityParameters",
      description: "Set the Host-side Security Parameters of the Secure EZSP
                    Protocol.",
      commandArguments: [
        {
          type: "SecureEzspSecurityLevel",
          name: "securityLevel",
          description: "The security level to be used for the Secure EZSP
                        communication.",
        },
        {
          type: "SecureEzspRandomNumber",
          name: "hostRandomNumber",
          description: "The Host-side random number to be used for Session ID
                        generation.",
        },
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "An EzspStatus value indicating success or the
                        reason for failure.",
        },
        {
          type: "SecureEzspRandomNumber",
          name: "returnNcpRandomNumber",
          description: "The NCP-side random number to be used for Session ID
                        generation.",
        },
      ],
    },
    ##ResetToFactoryDefaults
    {
      value: "0xCC",
      commandName: "resetToFactoryDefaults",
      description: "Resets security key and security parameters of the Secure
                    EZSP protocol. Node leaves the network before doing so
                    for security reasons.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "An EzspStatus value indicating success or the
                        reason for failure.",
        },
      ],
    },
    ##GetSecurityKeyStatus
    {
      value: "0xCD",
      commandName: "getSecurityKeyStatus",
      description: "Get the security key status on the NCP: whether the security
                    key is set or not and what the security type is.",
      commandArguments: [
      ],
      responseArguments: [
        {
          type: "EzspStatus",
          name: "status",
          description: "An EzspStatus value indicating whether the security key
                        is set or not.",
        },
        {
          type: "SecureEzspSecurityType",
          name: "returnSecurityType",
          description: "The security type set at NCP for the Secure EZSP 
                        Protocol.",
        },
      ],
    },
  ],

}
# END SECURE-EZSP
