From 38510169a8ce05942cbdf05ea9d28a242d9f527a Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 19 Jan 2023 00:59:42 -0500 Subject: [PATCH] Remove non-namespaced command ids. (#24511) Those fail to compile when two clusters have a command with the same name, which is preventing us from aligning XML to the spec. --- examples/chef/common/stubs.cpp | 1 - examples/chef/esp32/main/main.cpp | 1 - .../ameba/main/CHIPDeviceManager.cpp | 1 - .../thermostat/silabs/efr32/src/AppTask.cpp | 1 - .../include/level-control/LevelControl.cpp | 4 +- .../door-lock-server-callback.cpp | 1 - .../group-key-mgmt-server.cpp | 1 - .../clusters/groups-server/groups-server.cpp | 1 - .../ias-zone-client/ias-zone-client.cpp | 4 +- .../ias-zone-server/ias-zone-server.cpp | 12 +- .../identify-server/identify-server.cpp | 1 - .../clusters/scenes-client/scenes-client.cpp | 7 +- src/app/clusters/scenes/scenes.cpp | 23 +- .../thermostat-server/thermostat-server.cpp | 1 - ...at-user-interface-configuration-server.cpp | 1 - .../window-covering-server.cpp | 1 - src/app/common/templates/templates.json | 5 - src/app/util/util.cpp | 1 - .../templates/app/cluster-id.zapt | 13 - .../templates/app/command-id.zapt | 19 - .../app-common/zap-generated/command-id.h | 363 ------------------ 21 files changed, 27 insertions(+), 435 deletions(-) delete mode 100644 src/app/zap-templates/templates/app/cluster-id.zapt delete mode 100644 src/app/zap-templates/templates/app/command-id.zapt delete mode 100644 zzz_generated/app-common/app-common/zap-generated/command-id.h diff --git a/examples/chef/common/stubs.cpp b/examples/chef/common/stubs.cpp index e9e7438449c160..f0339ff76f14b1 100644 --- a/examples/chef/common/stubs.cpp +++ b/examples/chef/common/stubs.cpp @@ -2,7 +2,6 @@ #include #include #include -#include // Include door lock callbacks only when the server is enabled #ifdef EMBER_AF_PLUGIN_DOOR_LOCK_SERVER diff --git a/examples/chef/esp32/main/main.cpp b/examples/chef/esp32/main/main.cpp index 225815f8043b70..bd8ec2660100f4 100644 --- a/examples/chef/esp32/main/main.cpp +++ b/examples/chef/esp32/main/main.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include diff --git a/examples/lighting-app/ameba/main/CHIPDeviceManager.cpp b/examples/lighting-app/ameba/main/CHIPDeviceManager.cpp index 951b4033e33077..abc4968054bb76 100644 --- a/examples/lighting-app/ameba/main/CHIPDeviceManager.cpp +++ b/examples/lighting-app/ameba/main/CHIPDeviceManager.cpp @@ -35,7 +35,6 @@ #include #include -#include #include #include #include diff --git a/examples/thermostat/silabs/efr32/src/AppTask.cpp b/examples/thermostat/silabs/efr32/src/AppTask.cpp index 40418341d8b697..ec6fa525d6db32 100644 --- a/examples/thermostat/silabs/efr32/src/AppTask.cpp +++ b/examples/thermostat/silabs/efr32/src/AppTask.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include diff --git a/examples/tv-app/linux/include/level-control/LevelControl.cpp b/examples/tv-app/linux/include/level-control/LevelControl.cpp index 3147396e008b53..dd919ca342f46b 100644 --- a/examples/tv-app/linux/include/level-control/LevelControl.cpp +++ b/examples/tv-app/linux/include/level-control/LevelControl.cpp @@ -21,8 +21,8 @@ #include #include #include -#include #include +#include using namespace chip; using namespace chip::app::Clusters; @@ -128,7 +128,7 @@ bool emberAfLevelControlClusterStepCallback(uint8_t stepMode, uint8_t stepSize, BitMask optionMask, BitMask optionOverride) { - stepHandler(ZCL_STEP_COMMAND_ID, stepMode, stepSize, transitionTime, optionMask, optionOverride); + stepHandler(LevelControl::Commands::Step : Id, stepMode, stepSize, transitionTime, optionMask, optionOverride); return true; } diff --git a/src/app/clusters/door-lock-server/door-lock-server-callback.cpp b/src/app/clusters/door-lock-server/door-lock-server-callback.cpp index 4e3b6e37193a07..0259f6100516b4 100644 --- a/src/app/clusters/door-lock-server/door-lock-server-callback.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server-callback.cpp @@ -24,7 +24,6 @@ #include "door-lock-server.h" #include #include -#include #include #include #include diff --git a/src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp b/src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp index 6d35ea2512a1bd..fa6e46e8f40fdb 100644 --- a/src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp +++ b/src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/clusters/groups-server/groups-server.cpp b/src/app/clusters/groups-server/groups-server.cpp index 815687605193f4..92788177cee06d 100644 --- a/src/app/clusters/groups-server/groups-server.cpp +++ b/src/app/clusters/groups-server/groups-server.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/clusters/ias-zone-client/ias-zone-client.cpp b/src/app/clusters/ias-zone-client/ias-zone-client.cpp index 7619a983986fb6..11f1b6de3fd0cc 100644 --- a/src/app/clusters/ias-zone-client/ias-zone-client.cpp +++ b/src/app/clusters/ias-zone-client/ias-zone-client.cpp @@ -17,10 +17,12 @@ #include "ias-zone-client.h" #include +#include #include #include using namespace chip; +using namespace chip::app::Clusters::IasZone::Commands; //----------------------------------------------------------------------------- // Globals @@ -282,7 +284,7 @@ bool emberAfIasZoneClusterZoneEnrollRequestCallback(app::CommandHandler * comman setServerZoneId(serverIndex, zoneId); } emberAfFillExternalBuffer((ZCL_CLUSTER_SPECIFIC_COMMAND | ZCL_FRAME_CONTROL_CLIENT_TO_SERVER), app::Clusters::IasZone::Id, - ZCL_ZONE_ENROLL_RESPONSE_COMMAND_ID, "uu", responseCode, zoneId); + ZoneEnrollResponse::Id, "uu", responseCode, zoneId); // Need to send this command with our source EUI because the server will // check our EUI64 against his CIE Address to see if we're his CIE. emberAfGetCommandApsFrame()->options |= EMBER_APS_OPTION_SOURCE_EUI64; diff --git a/src/app/clusters/ias-zone-server/ias-zone-server.cpp b/src/app/clusters/ias-zone-server/ias-zone-server.cpp index 3b08d92d45d977..e64f0f00fe5f45 100644 --- a/src/app/clusters/ias-zone-server/ias-zone-server.cpp +++ b/src/app/clusters/ias-zone-server/ias-zone-server.cpp @@ -21,8 +21,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -34,6 +34,7 @@ using namespace chip; using namespace chip::app::Clusters; using namespace chip::app::Clusters::IasZone; +using namespace chip::app::Clusters::IasZone::Commands; #define UNDEFINED_ZONE_ID 0xFF #define DELAY_TIMER_MS (1 * MILLISECOND_TICKS_PER_SECOND) @@ -171,8 +172,7 @@ static void enrollWithClient(EndpointId endpoint) { EmberStatus status; emberAfFillExternalBuffer((ZCL_CLUSTER_SPECIFIC_COMMAND | ZCL_FRAME_CONTROL_SERVER_TO_CLIENT), IasZone::Id, - ZCL_ZONE_ENROLL_REQUEST_COMMAND_ID, "vv", EMBER_AF_PLUGIN_IAS_ZONE_SERVER_ZONE_TYPE, - EMBER_AF_MANUFACTURER_CODE); + ZoneEnrollRequest::Id, "vv", EMBER_AF_PLUGIN_IAS_ZONE_SERVER_ZONE_TYPE, EMBER_AF_MANUFACTURER_CODE); status = sendToClient(endpoint); if (status == EMBER_SUCCESS) { @@ -354,8 +354,8 @@ static EmberStatus sendZoneUpdate(uint16_t zoneStatus, uint16_t timeSinceStatusO return EMBER_INVALID_CALL; } emberAfFillExternalBuffer((ZCL_CLUSTER_SPECIFIC_COMMAND | ZCL_FRAME_CONTROL_SERVER_TO_CLIENT), IasZone::Id, - ZCL_ZONE_STATUS_CHANGE_NOTIFICATION_COMMAND_ID, "vuuv", zoneStatus, - 0 /*extended status, must be zero per spec*/, emberAfPluginIasZoneServerGetZoneId(endpoint), + ZoneStatusChangeNotification::Id, "vuuv", zoneStatus, 0 /*extended status, must be zero per spec*/, + emberAfPluginIasZoneServerGetZoneId(endpoint), timeSinceStatusOccurredQs /* called "delay" in the spec */); status = sendToClient(endpoint); @@ -728,7 +728,7 @@ void emberAfIasZoneClusterServerMessageSentCallback(const MessageSendDestination } commandId = message[IAS_ZONE_SERVER_PAYLOAD_COMMAND_IDX]; - if (commandId != ZCL_ZONE_STATUS_CHANGE_NOTIFICATION_COMMAND_ID) + if (commandId != ZoneStatusChangeNotification::Id) { return; } diff --git a/src/app/clusters/identify-server/identify-server.cpp b/src/app/clusters/identify-server/identify-server.cpp index 5d749c951a7a85..5dfe3a0aeba3bf 100644 --- a/src/app/clusters/identify-server/identify-server.cpp +++ b/src/app/clusters/identify-server/identify-server.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/clusters/scenes-client/scenes-client.cpp b/src/app/clusters/scenes-client/scenes-client.cpp index 2c1b69e4777c43..de4c8954d9b0b1 100644 --- a/src/app/clusters/scenes-client/scenes-client.cpp +++ b/src/app/clusters/scenes-client/scenes-client.cpp @@ -19,9 +19,10 @@ #include #include -#include +#include using namespace chip; +using namespace chip::app::Clusters::Scenes::Commands; bool emberAfScenesClusterAddSceneResponseCallback(app::CommandHandler * commandObj, uint8_t status, GroupId groupId, uint8_t sceneId) @@ -85,7 +86,7 @@ bool emberAfScenesClusterGetSceneMembershipResponseCallback(app::CommandHandler bool emberAfPluginScenesClientParseAddSceneResponse(const EmberAfClusterCommand * cmd, uint8_t status, GroupId groupId, uint8_t sceneId) { - bool enhanced = (cmd->commandId == ZCL_ENHANCED_ADD_SCENE_COMMAND_ID); + bool enhanced = (cmd->commandId == EnhancedAddScene::Id); emberAfScenesClusterPrintln("RX: %pAddSceneResponse 0x%x, 0x%2x, 0x%x", (enhanced ? "Enhanced" : ""), status, groupId, sceneId); emberAfSendDefaultResponse(cmd, EMBER_ZCL_STATUS_SUCCESS); return true; @@ -95,7 +96,7 @@ bool emberAfPluginScenesClientParseViewSceneResponse(const EmberAfClusterCommand uint8_t sceneId, uint16_t transitionTime, const uint8_t * sceneName, const uint8_t * extensionFieldSets) { - bool enhanced = (cmd->commandId == ZCL_ENHANCED_VIEW_SCENE_COMMAND_ID); + bool enhanced = (cmd->commandId == EnhancedViewScene::Id); emberAfScenesClusterPrint("RX: %pViewSceneResponse 0x%x, 0x%2x, 0x%x", (enhanced ? "Enhanced" : ""), status, groupId, sceneId); diff --git a/src/app/clusters/scenes/scenes.cpp b/src/app/clusters/scenes/scenes.cpp index ed039229b4e57a..b17e12c8fbc92d 100644 --- a/src/app/clusters/scenes/scenes.cpp +++ b/src/app/clusters/scenes/scenes.cpp @@ -20,8 +20,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -37,6 +37,7 @@ using namespace chip; using namespace chip::app::Clusters; using namespace chip::app::Clusters::Scenes; +using namespace chip::app::Clusters::Scenes::Commands; uint8_t emberAfPluginScenesServerEntriesInUse = 0; #if !defined(EMBER_AF_PLUGIN_SCENES_USE_TOKENS) || defined(EZSP_HOST) @@ -260,7 +261,7 @@ bool emberAfScenesClusterRemoveSceneCallback(app::CommandHandler * commandObj, c if (emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST || emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST_REPLY) { { - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_REMOVE_SCENE_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, RemoveSceneResponse::Id }; TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); VerifyOrExit((writer = commandObj->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -312,7 +313,7 @@ bool emberAfScenesClusterRemoveAllScenesCallback(app::CommandHandler * commandOb if (emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST || emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST_REPLY) { { - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, RemoveAllScenesResponse::Id }; TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); VerifyOrExit((writer = commandObj->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -346,7 +347,7 @@ bool emberAfScenesClusterStoreSceneCallback(app::CommandHandler * commandObj, co if (emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST || emberAfCurrentCommand()->type == EMBER_INCOMING_UNICAST_REPLY) { { - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_STORE_SCENE_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, StoreSceneResponse::Id }; TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); VerifyOrExit((writer = commandObj->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -441,7 +442,7 @@ bool emberAfScenesClusterGetSceneMembershipCallback(app::CommandHandler * comman } { - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, GetSceneMembershipResponse::Id }; TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); VerifyOrExit((writer = commandObj->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -724,7 +725,7 @@ bool emberAfPluginScenesServerParseAddScene( CHIP_ERROR err = CHIP_NO_ERROR; EmberAfSceneTableEntry entry; EmberAfStatus status; - bool enhanced = (cmd->commandId == ZCL_ENHANCED_ADD_SCENE_COMMAND_ID); + bool enhanced = (cmd->commandId == EnhancedAddScene::Id); auto fabricIndex = commandObj->GetAccessingFabricIndex(); EndpointId endpoint = cmd->apsFrame->destinationEndpoint; uint8_t i, index = EMBER_AF_SCENE_TABLE_NULL_INDEX; @@ -1033,10 +1034,10 @@ bool emberAfPluginScenesServerParseAddScene( return true; } { - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_ADD_SCENE_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, AddSceneResponse::Id }; if (enhanced) { - path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_ENHANCED_ADD_SCENE_RESPONSE_COMMAND_ID }; + path = { emberAfCurrentEndpoint(), Scenes::Id, EnhancedAddSceneResponse::Id }; } TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); @@ -1061,7 +1062,7 @@ bool emberAfPluginScenesServerParseViewScene(app::CommandHandler * commandObj, c CHIP_ERROR err = CHIP_NO_ERROR; EmberAfSceneTableEntry entry = {}; EmberAfStatus status = EMBER_ZCL_STATUS_NOT_FOUND; - bool enhanced = (cmd->commandId == ZCL_ENHANCED_VIEW_SCENE_COMMAND_ID); + bool enhanced = (cmd->commandId == EnhancedViewScene::Id); FabricIndex fabricIndex = commandObj->GetAccessingFabricIndex(); EndpointId endpoint = cmd->apsFrame->destinationEndpoint; @@ -1089,10 +1090,10 @@ bool emberAfPluginScenesServerParseViewScene(app::CommandHandler * commandObj, c // The status, group id, and scene id are always included in the response, but // the transition time, name, and extension fields are only included if the // scene was found. - app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_VIEW_SCENE_RESPONSE_COMMAND_ID }; + app::ConcreteCommandPath path = { emberAfCurrentEndpoint(), Scenes::Id, ViewSceneResponse::Id }; if (enhanced) { - path = { emberAfCurrentEndpoint(), Scenes::Id, ZCL_ENHANCED_VIEW_SCENE_RESPONSE_COMMAND_ID }; + path = { emberAfCurrentEndpoint(), Scenes::Id, EnhancedViewSceneResponse::Id }; } TLV::TLVWriter * writer = nullptr; SuccessOrExit(err = commandObj->PrepareCommand(path)); diff --git a/src/app/clusters/thermostat-server/thermostat-server.cpp b/src/app/clusters/thermostat-server/thermostat-server.cpp index fdb65b21c33fe0..96da514d59b1c2 100644 --- a/src/app/clusters/thermostat-server/thermostat-server.cpp +++ b/src/app/clusters/thermostat-server/thermostat-server.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/clusters/thermostat-user-interface-configuration-server/thermostat-user-interface-configuration-server.cpp b/src/app/clusters/thermostat-user-interface-configuration-server/thermostat-user-interface-configuration-server.cpp index b737888cc3e73d..957990dbac4a86 100644 --- a/src/app/clusters/thermostat-user-interface-configuration-server/thermostat-user-interface-configuration-server.cpp +++ b/src/app/clusters/thermostat-user-interface-configuration-server/thermostat-user-interface-configuration-server.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/clusters/window-covering-server/window-covering-server.cpp b/src/app/clusters/window-covering-server/window-covering-server.cpp index 5955a6bb24ed12..8b3358ff897e28 100644 --- a/src/app/clusters/window-covering-server/window-covering-server.cpp +++ b/src/app/clusters/window-covering-server/window-covering-server.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/common/templates/templates.json b/src/app/common/templates/templates.json index a4081365ebb99a..af56353de4c8c1 100644 --- a/src/app/common/templates/templates.json +++ b/src/app/common/templates/templates.json @@ -62,11 +62,6 @@ "name": "ZCL callback header", "output": "callback.h" }, - { - "path": "../../zap-templates/templates/app/command-id.zapt", - "name": "ZCL command-id header", - "output": "command-id.h" - }, { "path": "../../zap-templates/templates/app/enums.zapt", "name": "ZCL enums header", diff --git a/src/app/util/util.cpp b/src/app/util/util.cpp index 155b07e0a360ab..dbac3013de8419 100644 --- a/src/app/util/util.cpp +++ b/src/app/util/util.cpp @@ -18,7 +18,6 @@ #include "app/util/common.h" #include #include -#include #include #include #include diff --git a/src/app/zap-templates/templates/app/cluster-id.zapt b/src/app/zap-templates/templates/app/cluster-id.zapt deleted file mode 100644 index 96805fa4ea7c3e..00000000000000 --- a/src/app/zap-templates/templates/app/cluster-id.zapt +++ /dev/null @@ -1,13 +0,0 @@ -{{> header}} - -// Prevent multiple inclusion -#pragma once - -#include - -{{#zcl_clusters}} - -// Definitions for cluster: {{label}} -static constexpr chip::ClusterId ZCL_{{asDelimitedMacro define}}_ID = {{asHex code 4}}; - -{{/zcl_clusters}} diff --git a/src/app/zap-templates/templates/app/command-id.zapt b/src/app/zap-templates/templates/app/command-id.zapt deleted file mode 100644 index 9b6045feeac130..00000000000000 --- a/src/app/zap-templates/templates/app/command-id.zapt +++ /dev/null @@ -1,19 +0,0 @@ -{{> header}} - -// Prevent multiple inclusion -#pragma once - -// Global, non-cluster-specific commands -{{#zcl_global_commands}} -#define ZCL_{{asDelimitedMacro label}}_COMMAND_ID ({{asHex code 2}}) -{{/zcl_global_commands}} - -{{#zcl_clusters}} - -{{#zcl_commands}} -{{#first}} -// Commands for cluster: {{parent.label}} -{{/first}} -#define ZCL_{{asDelimitedMacro label}}_COMMAND_ID ({{asHex code 2}}) -{{/zcl_commands}} -{{/zcl_clusters}} diff --git a/zzz_generated/app-common/app-common/zap-generated/command-id.h b/zzz_generated/app-common/app-common/zap-generated/command-id.h deleted file mode 100644 index 5c02c7c6f6ab24..00000000000000 --- a/zzz_generated/app-common/app-common/zap-generated/command-id.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * - * Copyright (c) 2022 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// THIS FILE IS GENERATED BY ZAP - -// Prevent multiple inclusion -#pragma once - -// Global, non-cluster-specific commands -#define ZCL_READ_ATTRIBUTES_COMMAND_ID (0x00) -#define ZCL_READ_ATTRIBUTES_RESPONSE_COMMAND_ID (0x01) -#define ZCL_WRITE_ATTRIBUTES_COMMAND_ID (0x02) -#define ZCL_WRITE_ATTRIBUTES_UNDIVIDED_COMMAND_ID (0x03) -#define ZCL_WRITE_ATTRIBUTES_RESPONSE_COMMAND_ID (0x04) -#define ZCL_WRITE_ATTRIBUTES_NO_RESPONSE_COMMAND_ID (0x05) -#define ZCL_DEFAULT_RESPONSE_COMMAND_ID (0x0B) -#define ZCL_READ_ATTRIBUTES_STRUCTURED_COMMAND_ID (0x0E) -#define ZCL_WRITE_ATTRIBUTES_STRUCTURED_COMMAND_ID (0x0F) -#define ZCL_WRITE_ATTRIBUTES_STRUCTURED_RESPONSE_COMMAND_ID (0x10) - -// Commands for cluster: Identify -#define ZCL_IDENTIFY_COMMAND_ID (0x00) -#define ZCL_TRIGGER_EFFECT_COMMAND_ID (0x40) - -// Commands for cluster: Groups -#define ZCL_ADD_GROUP_COMMAND_ID (0x00) -#define ZCL_ADD_GROUP_RESPONSE_COMMAND_ID (0x00) -#define ZCL_VIEW_GROUP_COMMAND_ID (0x01) -#define ZCL_VIEW_GROUP_RESPONSE_COMMAND_ID (0x01) -#define ZCL_GET_GROUP_MEMBERSHIP_COMMAND_ID (0x02) -#define ZCL_GET_GROUP_MEMBERSHIP_RESPONSE_COMMAND_ID (0x02) -#define ZCL_REMOVE_GROUP_COMMAND_ID (0x03) -#define ZCL_REMOVE_GROUP_RESPONSE_COMMAND_ID (0x03) -#define ZCL_REMOVE_ALL_GROUPS_COMMAND_ID (0x04) -#define ZCL_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID (0x05) - -// Commands for cluster: Scenes -#define ZCL_ADD_SCENE_COMMAND_ID (0x00) -#define ZCL_ADD_SCENE_RESPONSE_COMMAND_ID (0x00) -#define ZCL_VIEW_SCENE_COMMAND_ID (0x01) -#define ZCL_VIEW_SCENE_RESPONSE_COMMAND_ID (0x01) -#define ZCL_REMOVE_SCENE_COMMAND_ID (0x02) -#define ZCL_REMOVE_SCENE_RESPONSE_COMMAND_ID (0x02) -#define ZCL_REMOVE_ALL_SCENES_COMMAND_ID (0x03) -#define ZCL_REMOVE_ALL_SCENES_RESPONSE_COMMAND_ID (0x03) -#define ZCL_STORE_SCENE_COMMAND_ID (0x04) -#define ZCL_STORE_SCENE_RESPONSE_COMMAND_ID (0x04) -#define ZCL_RECALL_SCENE_COMMAND_ID (0x05) -#define ZCL_GET_SCENE_MEMBERSHIP_COMMAND_ID (0x06) -#define ZCL_GET_SCENE_MEMBERSHIP_RESPONSE_COMMAND_ID (0x06) -#define ZCL_ENHANCED_ADD_SCENE_COMMAND_ID (0x40) -#define ZCL_ENHANCED_ADD_SCENE_RESPONSE_COMMAND_ID (0x40) -#define ZCL_ENHANCED_VIEW_SCENE_COMMAND_ID (0x41) -#define ZCL_ENHANCED_VIEW_SCENE_RESPONSE_COMMAND_ID (0x41) -#define ZCL_COPY_SCENE_COMMAND_ID (0x42) -#define ZCL_COPY_SCENE_RESPONSE_COMMAND_ID (0x42) - -// Commands for cluster: On/Off -#define ZCL_OFF_COMMAND_ID (0x00) -#define ZCL_ON_COMMAND_ID (0x01) -#define ZCL_TOGGLE_COMMAND_ID (0x02) -#define ZCL_OFF_WITH_EFFECT_COMMAND_ID (0x40) -#define ZCL_ON_WITH_RECALL_GLOBAL_SCENE_COMMAND_ID (0x41) -#define ZCL_ON_WITH_TIMED_OFF_COMMAND_ID (0x42) - -// Commands for cluster: Level Control -#define ZCL_MOVE_TO_LEVEL_COMMAND_ID (0x00) -#define ZCL_MOVE_COMMAND_ID (0x01) -#define ZCL_STEP_COMMAND_ID (0x02) -#define ZCL_STOP_COMMAND_ID (0x03) -#define ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID (0x04) -#define ZCL_MOVE_WITH_ON_OFF_COMMAND_ID (0x05) -#define ZCL_STEP_WITH_ON_OFF_COMMAND_ID (0x06) -#define ZCL_STOP_WITH_ON_OFF_COMMAND_ID (0x07) -#define ZCL_MOVE_TO_CLOSEST_FREQUENCY_COMMAND_ID (0x08) - -// Commands for cluster: Actions -#define ZCL_INSTANT_ACTION_COMMAND_ID (0x00) -#define ZCL_INSTANT_ACTION_WITH_TRANSITION_COMMAND_ID (0x01) -#define ZCL_START_ACTION_COMMAND_ID (0x02) -#define ZCL_START_ACTION_WITH_DURATION_COMMAND_ID (0x03) -#define ZCL_STOP_ACTION_COMMAND_ID (0x04) -#define ZCL_PAUSE_ACTION_COMMAND_ID (0x05) -#define ZCL_PAUSE_ACTION_WITH_DURATION_COMMAND_ID (0x06) -#define ZCL_RESUME_ACTION_COMMAND_ID (0x07) -#define ZCL_ENABLE_ACTION_COMMAND_ID (0x08) -#define ZCL_ENABLE_ACTION_WITH_DURATION_COMMAND_ID (0x09) -#define ZCL_DISABLE_ACTION_COMMAND_ID (0x0A) -#define ZCL_DISABLE_ACTION_WITH_DURATION_COMMAND_ID (0x0B) - -// Commands for cluster: Basic Information -#define ZCL_MFG_SPECIFIC_PING_COMMAND_ID (0x00) - -// Commands for cluster: OTA Software Update Provider -#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) -#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x01) -#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x02) -#define ZCL_APPLY_UPDATE_RESPONSE_COMMAND_ID (0x03) -#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x04) - -// Commands for cluster: OTA Software Update Requestor -#define ZCL_ANNOUNCE_OTA_PROVIDER_COMMAND_ID (0x00) - -// Commands for cluster: General Commissioning -#define ZCL_ARM_FAIL_SAFE_COMMAND_ID (0x00) -#define ZCL_ARM_FAIL_SAFE_RESPONSE_COMMAND_ID (0x01) -#define ZCL_SET_REGULATORY_CONFIG_COMMAND_ID (0x02) -#define ZCL_SET_REGULATORY_CONFIG_RESPONSE_COMMAND_ID (0x03) -#define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x04) -#define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x05) - -// Commands for cluster: Network Commissioning -#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00) -#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01) -#define ZCL_ADD_OR_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x02) -#define ZCL_ADD_OR_UPDATE_THREAD_NETWORK_COMMAND_ID (0x03) -#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x04) -#define ZCL_NETWORK_CONFIG_RESPONSE_COMMAND_ID (0x05) -#define ZCL_CONNECT_NETWORK_COMMAND_ID (0x06) -#define ZCL_CONNECT_NETWORK_RESPONSE_COMMAND_ID (0x07) -#define ZCL_REORDER_NETWORK_COMMAND_ID (0x08) - -// Commands for cluster: Diagnostic Logs -#define ZCL_RETRIEVE_LOGS_REQUEST_COMMAND_ID (0x00) -#define ZCL_RETRIEVE_LOGS_RESPONSE_COMMAND_ID (0x01) - -// Commands for cluster: General Diagnostics -#define ZCL_TEST_EVENT_TRIGGER_COMMAND_ID (0x00) - -// Commands for cluster: Software Diagnostics -#define ZCL_RESET_WATERMARKS_COMMAND_ID (0x00) - -// Commands for cluster: Thread Network Diagnostics -#define ZCL_RESET_COUNTS_COMMAND_ID (0x00) - -// Commands for cluster: WiFi Network Diagnostics -#define ZCL_RESET_COUNTS_COMMAND_ID (0x00) - -// Commands for cluster: Ethernet Network Diagnostics -#define ZCL_RESET_COUNTS_COMMAND_ID (0x00) - -// Commands for cluster: Time Synchronization -#define ZCL_SET_UTC_TIME_COMMAND_ID (0x00) - -// Commands for cluster: Administrator Commissioning -#define ZCL_OPEN_COMMISSIONING_WINDOW_COMMAND_ID (0x00) -#define ZCL_OPEN_BASIC_COMMISSIONING_WINDOW_COMMAND_ID (0x01) -#define ZCL_REVOKE_COMMISSIONING_COMMAND_ID (0x02) - -// Commands for cluster: Operational Credentials -#define ZCL_ATTESTATION_REQUEST_COMMAND_ID (0x00) -#define ZCL_ATTESTATION_RESPONSE_COMMAND_ID (0x01) -#define ZCL_CERTIFICATE_CHAIN_REQUEST_COMMAND_ID (0x02) -#define ZCL_CERTIFICATE_CHAIN_RESPONSE_COMMAND_ID (0x03) -#define ZCL_CSR_REQUEST_COMMAND_ID (0x04) -#define ZCL_CSR_RESPONSE_COMMAND_ID (0x05) -#define ZCL_ADD_NOC_COMMAND_ID (0x06) -#define ZCL_UPDATE_NOC_COMMAND_ID (0x07) -#define ZCL_NOC_RESPONSE_COMMAND_ID (0x08) -#define ZCL_UPDATE_FABRIC_LABEL_COMMAND_ID (0x09) -#define ZCL_REMOVE_FABRIC_COMMAND_ID (0x0A) -#define ZCL_ADD_TRUSTED_ROOT_CERTIFICATE_COMMAND_ID (0x0B) - -// Commands for cluster: Group Key Management -#define ZCL_KEY_SET_WRITE_COMMAND_ID (0x00) -#define ZCL_KEY_SET_READ_COMMAND_ID (0x01) -#define ZCL_KEY_SET_READ_RESPONSE_COMMAND_ID (0x02) -#define ZCL_KEY_SET_REMOVE_COMMAND_ID (0x03) -#define ZCL_KEY_SET_READ_ALL_INDICES_COMMAND_ID (0x04) -#define ZCL_KEY_SET_READ_ALL_INDICES_RESPONSE_COMMAND_ID (0x05) - -// Commands for cluster: Mode Select -#define ZCL_CHANGE_TO_MODE_COMMAND_ID (0x00) - -// Commands for cluster: Door Lock -#define ZCL_LOCK_DOOR_COMMAND_ID (0x00) -#define ZCL_UNLOCK_DOOR_COMMAND_ID (0x01) -#define ZCL_UNLOCK_WITH_TIMEOUT_COMMAND_ID (0x03) -#define ZCL_SET_WEEK_DAY_SCHEDULE_COMMAND_ID (0x0B) -#define ZCL_GET_WEEK_DAY_SCHEDULE_COMMAND_ID (0x0C) -#define ZCL_GET_WEEK_DAY_SCHEDULE_RESPONSE_COMMAND_ID (0x0C) -#define ZCL_CLEAR_WEEK_DAY_SCHEDULE_COMMAND_ID (0x0D) -#define ZCL_SET_YEAR_DAY_SCHEDULE_COMMAND_ID (0x0E) -#define ZCL_GET_YEAR_DAY_SCHEDULE_COMMAND_ID (0x0F) -#define ZCL_GET_YEAR_DAY_SCHEDULE_RESPONSE_COMMAND_ID (0x0F) -#define ZCL_CLEAR_YEAR_DAY_SCHEDULE_COMMAND_ID (0x10) -#define ZCL_SET_HOLIDAY_SCHEDULE_COMMAND_ID (0x11) -#define ZCL_GET_HOLIDAY_SCHEDULE_COMMAND_ID (0x12) -#define ZCL_GET_HOLIDAY_SCHEDULE_RESPONSE_COMMAND_ID (0x12) -#define ZCL_CLEAR_HOLIDAY_SCHEDULE_COMMAND_ID (0x13) -#define ZCL_SET_USER_COMMAND_ID (0x1A) -#define ZCL_GET_USER_COMMAND_ID (0x1B) -#define ZCL_GET_USER_RESPONSE_COMMAND_ID (0x1C) -#define ZCL_CLEAR_USER_COMMAND_ID (0x1D) -#define ZCL_SET_CREDENTIAL_COMMAND_ID (0x22) -#define ZCL_SET_CREDENTIAL_RESPONSE_COMMAND_ID (0x23) -#define ZCL_GET_CREDENTIAL_STATUS_COMMAND_ID (0x24) -#define ZCL_GET_CREDENTIAL_STATUS_RESPONSE_COMMAND_ID (0x25) -#define ZCL_CLEAR_CREDENTIAL_COMMAND_ID (0x26) - -// Commands for cluster: Window Covering -#define ZCL_UP_OR_OPEN_COMMAND_ID (0x00) -#define ZCL_DOWN_OR_CLOSE_COMMAND_ID (0x01) -#define ZCL_STOP_MOTION_COMMAND_ID (0x02) -#define ZCL_GO_TO_LIFT_VALUE_COMMAND_ID (0x04) -#define ZCL_GO_TO_LIFT_PERCENTAGE_COMMAND_ID (0x05) -#define ZCL_GO_TO_TILT_VALUE_COMMAND_ID (0x07) -#define ZCL_GO_TO_TILT_PERCENTAGE_COMMAND_ID (0x08) - -// Commands for cluster: Barrier Control -#define ZCL_BARRIER_CONTROL_GO_TO_PERCENT_COMMAND_ID (0x00) -#define ZCL_BARRIER_CONTROL_STOP_COMMAND_ID (0x01) - -// Commands for cluster: Thermostat -#define ZCL_SETPOINT_RAISE_LOWER_COMMAND_ID (0x00) -#define ZCL_GET_WEEKLY_SCHEDULE_RESPONSE_COMMAND_ID (0x00) -#define ZCL_SET_WEEKLY_SCHEDULE_COMMAND_ID (0x01) -#define ZCL_GET_WEEKLY_SCHEDULE_COMMAND_ID (0x02) -#define ZCL_CLEAR_WEEKLY_SCHEDULE_COMMAND_ID (0x03) - -// Commands for cluster: Color Control -#define ZCL_MOVE_TO_HUE_COMMAND_ID (0x00) -#define ZCL_MOVE_HUE_COMMAND_ID (0x01) -#define ZCL_STEP_HUE_COMMAND_ID (0x02) -#define ZCL_MOVE_TO_SATURATION_COMMAND_ID (0x03) -#define ZCL_MOVE_SATURATION_COMMAND_ID (0x04) -#define ZCL_STEP_SATURATION_COMMAND_ID (0x05) -#define ZCL_MOVE_TO_HUE_AND_SATURATION_COMMAND_ID (0x06) -#define ZCL_MOVE_TO_COLOR_COMMAND_ID (0x07) -#define ZCL_MOVE_COLOR_COMMAND_ID (0x08) -#define ZCL_STEP_COLOR_COMMAND_ID (0x09) -#define ZCL_MOVE_TO_COLOR_TEMPERATURE_COMMAND_ID (0x0A) -#define ZCL_ENHANCED_MOVE_TO_HUE_COMMAND_ID (0x40) -#define ZCL_ENHANCED_MOVE_HUE_COMMAND_ID (0x41) -#define ZCL_ENHANCED_STEP_HUE_COMMAND_ID (0x42) -#define ZCL_ENHANCED_MOVE_TO_HUE_AND_SATURATION_COMMAND_ID (0x43) -#define ZCL_COLOR_LOOP_SET_COMMAND_ID (0x44) -#define ZCL_STOP_MOVE_STEP_COMMAND_ID (0x47) -#define ZCL_MOVE_COLOR_TEMPERATURE_COMMAND_ID (0x4B) -#define ZCL_STEP_COLOR_TEMPERATURE_COMMAND_ID (0x4C) - -// Commands for cluster: Channel -#define ZCL_CHANGE_CHANNEL_COMMAND_ID (0x00) -#define ZCL_CHANGE_CHANNEL_RESPONSE_COMMAND_ID (0x01) -#define ZCL_CHANGE_CHANNEL_BY_NUMBER_COMMAND_ID (0x02) -#define ZCL_SKIP_CHANNEL_COMMAND_ID (0x03) - -// Commands for cluster: Target Navigator -#define ZCL_NAVIGATE_TARGET_COMMAND_ID (0x00) -#define ZCL_NAVIGATE_TARGET_RESPONSE_COMMAND_ID (0x01) - -// Commands for cluster: Media Playback -#define ZCL_PLAY_COMMAND_ID (0x00) -#define ZCL_PAUSE_COMMAND_ID (0x01) -#define ZCL_STOP_PLAYBACK_COMMAND_ID (0x02) -#define ZCL_START_OVER_COMMAND_ID (0x03) -#define ZCL_PREVIOUS_COMMAND_ID (0x04) -#define ZCL_NEXT_COMMAND_ID (0x05) -#define ZCL_REWIND_COMMAND_ID (0x06) -#define ZCL_FAST_FORWARD_COMMAND_ID (0x07) -#define ZCL_SKIP_FORWARD_COMMAND_ID (0x08) -#define ZCL_SKIP_BACKWARD_COMMAND_ID (0x09) -#define ZCL_PLAYBACK_RESPONSE_COMMAND_ID (0x0A) -#define ZCL_SEEK_COMMAND_ID (0x0B) - -// Commands for cluster: Media Input -#define ZCL_SELECT_INPUT_COMMAND_ID (0x00) -#define ZCL_SHOW_INPUT_STATUS_COMMAND_ID (0x01) -#define ZCL_HIDE_INPUT_STATUS_COMMAND_ID (0x02) -#define ZCL_RENAME_INPUT_COMMAND_ID (0x03) - -// Commands for cluster: Low Power -#define ZCL_SLEEP_COMMAND_ID (0x00) - -// Commands for cluster: Keypad Input -#define ZCL_SEND_KEY_COMMAND_ID (0x00) -#define ZCL_SEND_KEY_RESPONSE_COMMAND_ID (0x01) - -// Commands for cluster: Content Launcher -#define ZCL_LAUNCH_CONTENT_COMMAND_ID (0x00) -#define ZCL_LAUNCH_URL_COMMAND_ID (0x01) -#define ZCL_LAUNCH_RESPONSE_COMMAND_ID (0x02) - -// Commands for cluster: Audio Output -#define ZCL_SELECT_OUTPUT_COMMAND_ID (0x00) -#define ZCL_RENAME_OUTPUT_COMMAND_ID (0x01) - -// Commands for cluster: Application Launcher -#define ZCL_LAUNCH_APP_COMMAND_ID (0x00) -#define ZCL_STOP_APP_COMMAND_ID (0x01) -#define ZCL_HIDE_APP_COMMAND_ID (0x02) -#define ZCL_LAUNCHER_RESPONSE_COMMAND_ID (0x03) - -// Commands for cluster: Account Login -#define ZCL_GET_SETUP_PIN_COMMAND_ID (0x00) -#define ZCL_GET_SETUP_PIN_RESPONSE_COMMAND_ID (0x01) -#define ZCL_LOGIN_COMMAND_ID (0x02) -#define ZCL_LOGOUT_COMMAND_ID (0x03) - -// Commands for cluster: Electrical Measurement -#define ZCL_GET_PROFILE_INFO_RESPONSE_COMMAND_COMMAND_ID (0x00) -#define ZCL_GET_PROFILE_INFO_COMMAND_COMMAND_ID (0x00) -#define ZCL_GET_MEASUREMENT_PROFILE_RESPONSE_COMMAND_COMMAND_ID (0x01) -#define ZCL_GET_MEASUREMENT_PROFILE_COMMAND_COMMAND_ID (0x01) - -// Commands for cluster: Client Monitoring -#define ZCL_REGISTER_CLIENT_MONITORING_COMMAND_ID (0x00) -#define ZCL_UNREGISTER_CLIENT_MONITORING_COMMAND_ID (0x01) -#define ZCL_STAY_AWAKE_REQUEST_COMMAND_ID (0x02) - -// Commands for cluster: Unit Testing -#define ZCL_TEST_COMMAND_ID (0x00) -#define ZCL_TEST_SPECIFIC_RESPONSE_COMMAND_ID (0x00) -#define ZCL_TEST_NOT_HANDLED_COMMAND_ID (0x01) -#define ZCL_TEST_ADD_ARGUMENTS_RESPONSE_COMMAND_ID (0x01) -#define ZCL_TEST_SPECIFIC_COMMAND_ID (0x02) -#define ZCL_TEST_SIMPLE_ARGUMENT_RESPONSE_COMMAND_ID (0x02) -#define ZCL_TEST_UNKNOWN_COMMAND_COMMAND_ID (0x03) -#define ZCL_TEST_STRUCT_ARRAY_ARGUMENT_RESPONSE_COMMAND_ID (0x03) -#define ZCL_TEST_ADD_ARGUMENTS_COMMAND_ID (0x04) -#define ZCL_TEST_LIST_INT8_U_REVERSE_RESPONSE_COMMAND_ID (0x04) -#define ZCL_TEST_SIMPLE_ARGUMENT_REQUEST_COMMAND_ID (0x05) -#define ZCL_TEST_ENUMS_RESPONSE_COMMAND_ID (0x05) -#define ZCL_TEST_STRUCT_ARRAY_ARGUMENT_REQUEST_COMMAND_ID (0x06) -#define ZCL_TEST_NULLABLE_OPTIONAL_RESPONSE_COMMAND_ID (0x06) -#define ZCL_TEST_STRUCT_ARGUMENT_REQUEST_COMMAND_ID (0x07) -#define ZCL_TEST_COMPLEX_NULLABLE_OPTIONAL_RESPONSE_COMMAND_ID (0x07) -#define ZCL_TEST_NESTED_STRUCT_ARGUMENT_REQUEST_COMMAND_ID (0x08) -#define ZCL_BOOLEAN_RESPONSE_COMMAND_ID (0x08) -#define ZCL_TEST_LIST_STRUCT_ARGUMENT_REQUEST_COMMAND_ID (0x09) -#define ZCL_SIMPLE_STRUCT_RESPONSE_COMMAND_ID (0x09) -#define ZCL_TEST_LIST_INT8_U_ARGUMENT_REQUEST_COMMAND_ID (0x0A) -#define ZCL_TEST_EMIT_TEST_EVENT_RESPONSE_COMMAND_ID (0x0A) -#define ZCL_TEST_NESTED_STRUCT_LIST_ARGUMENT_REQUEST_COMMAND_ID (0x0B) -#define ZCL_TEST_EMIT_TEST_FABRIC_SCOPED_EVENT_RESPONSE_COMMAND_ID (0x0B) -#define ZCL_TEST_LIST_NESTED_STRUCT_LIST_ARGUMENT_REQUEST_COMMAND_ID (0x0C) -#define ZCL_TEST_LIST_INT8_U_REVERSE_REQUEST_COMMAND_ID (0x0D) -#define ZCL_TEST_ENUMS_REQUEST_COMMAND_ID (0x0E) -#define ZCL_TEST_NULLABLE_OPTIONAL_REQUEST_COMMAND_ID (0x0F) -#define ZCL_TEST_COMPLEX_NULLABLE_OPTIONAL_REQUEST_COMMAND_ID (0x10) -#define ZCL_SIMPLE_STRUCT_ECHO_REQUEST_COMMAND_ID (0x11) -#define ZCL_TIMED_INVOKE_REQUEST_COMMAND_ID (0x12) -#define ZCL_TEST_SIMPLE_OPTIONAL_ARGUMENT_REQUEST_COMMAND_ID (0x13) -#define ZCL_TEST_EMIT_TEST_EVENT_REQUEST_COMMAND_ID (0x14) -#define ZCL_TEST_EMIT_TEST_FABRIC_SCOPED_EVENT_REQUEST_COMMAND_ID (0x15) - -// Commands for cluster: Fault Injection -#define ZCL_FAIL_AT_FAULT_COMMAND_ID (0x00) -#define ZCL_FAIL_RANDOMLY_AT_FAULT_COMMAND_ID (0x01)