From 11cbbf33018b87d61a5c5ee37236b386121e8898 Mon Sep 17 00:00:00 2001 From: Trevor Holbrook Date: Thu, 15 Apr 2021 17:33:29 -0700 Subject: [PATCH] New Clusters: OTA Server and OTA Client (#5745) * hand-edited files for OTA Client+Server Clusters - XML Cluster definitions - add ota-server directory and ember callback stubs - add ota XML files to zcl.json * generated files: OTA Client+Server Clusters --- .../all-clusters-common/BUILD.gn | 1 + .../all-clusters-common/all-clusters-app.zap | 185 ++++++++ .../gen/IMClusterCommandHandler.cpp | 400 ++++++++++++++++++ .../all-clusters-common/gen/attribute-id.h | 14 + .../gen/call-command-handler.cpp | 140 ++++++ .../all-clusters-common/gen/callback-stub.cpp | 16 + .../all-clusters-common/gen/callback.h | 192 +++++++++ .../gen/client-command-macro.h | 93 ++++ .../all-clusters-common/gen/cluster-id.h | 6 + .../all-clusters-common/gen/command-id.h | 10 + .../all-clusters-common/gen/endpoint_config.h | 79 ++-- .../all-clusters-common/gen/enums.h | 33 ++ .../all-clusters-common/gen/gen_config.h | 12 + .../all-clusters-common/gen/print-cluster.h | 14 + .../esp32/main/CMakeLists.txt | 1 + .../all-clusters-app/esp32/main/component.mk | 1 + .../bridge-common/gen/attribute-id.h | 14 + .../bridge-common/gen/client-command-macro.h | 93 ++++ .../bridge-app/bridge-common/gen/cluster-id.h | 6 + .../bridge-app/bridge-common/gen/command-id.h | 10 + examples/bridge-app/bridge-common/gen/enums.h | 33 ++ .../bridge-common/gen/print-cluster.h | 14 + examples/chip-tool/gen/attribute-id.h | 14 + examples/chip-tool/gen/client-command-macro.h | 93 ++++ examples/chip-tool/gen/cluster-id.h | 6 + examples/chip-tool/gen/command-id.h | 10 + examples/chip-tool/gen/enums.h | 33 ++ examples/chip-tool/gen/print-cluster.h | 14 + .../lighting-common/gen/attribute-id.h | 14 + .../gen/client-command-macro.h | 93 ++++ .../lighting-common/gen/cluster-id.h | 6 + .../lighting-common/gen/command-id.h | 10 + .../lighting-app/lighting-common/gen/enums.h | 33 ++ .../lighting-common/gen/print-cluster.h | 14 + .../lock-app/lock-common/gen/attribute-id.h | 14 + .../lock-common/gen/client-command-macro.h | 93 ++++ .../lock-app/lock-common/gen/cluster-id.h | 6 + .../lock-app/lock-common/gen/command-id.h | 10 + examples/lock-app/lock-common/gen/enums.h | 33 ++ .../lock-app/lock-common/gen/print-cluster.h | 14 + .../esp32/main/gen/attribute-id.h | 14 + .../esp32/main/gen/client-command-macro.h | 93 ++++ .../esp32/main/gen/cluster-id.h | 6 + .../esp32/main/gen/command-id.h | 10 + .../esp32/main/gen/enums.h | 33 ++ .../esp32/main/gen/print-cluster.h | 14 + examples/tv-app/tv-common/gen/attribute-id.h | 14 + .../tv-common/gen/client-command-macro.h | 93 ++++ examples/tv-app/tv-common/gen/cluster-id.h | 6 + examples/tv-app/tv-common/gen/command-id.h | 10 + .../tv-app/tv-common/gen/endpoint_config.h | 74 ++-- examples/tv-app/tv-common/gen/enums.h | 33 ++ examples/tv-app/tv-common/gen/print-cluster.h | 14 + examples/window-app/common/gen/attribute-id.h | 14 + .../common/gen/client-command-macro.h | 93 ++++ examples/window-app/common/gen/cluster-id.h | 6 + examples/window-app/common/gen/command-id.h | 10 + examples/window-app/common/gen/enums.h | 33 ++ .../window-app/common/gen/print-cluster.h | 14 + src/app/clusters/ota-server/ota-server.cpp | 82 ++++ src/app/zap-templates/zcl/chip-ota.xml | 104 +++++ src/app/zap-templates/zcl/zcl.json | 3 +- src/controller/python/gen/attribute-id.h | 14 + .../python/gen/client-command-macro.h | 93 ++++ src/controller/python/gen/cluster-id.h | 6 + src/controller/python/gen/command-id.h | 10 + src/controller/python/gen/enums.h | 33 ++ src/controller/python/gen/print-cluster.h | 14 + src/darwin/Framework/CHIP/gen/attribute-id.h | 14 + .../Framework/CHIP/gen/client-command-macro.h | 93 ++++ src/darwin/Framework/CHIP/gen/cluster-id.h | 6 + src/darwin/Framework/CHIP/gen/command-id.h | 10 + src/darwin/Framework/CHIP/gen/enums.h | 33 ++ src/darwin/Framework/CHIP/gen/print-cluster.h | 14 + 74 files changed, 2921 insertions(+), 69 deletions(-) create mode 100644 src/app/clusters/ota-server/ota-server.cpp create mode 100644 src/app/zap-templates/zcl/chip-ota.xml diff --git a/examples/all-clusters-app/all-clusters-common/BUILD.gn b/examples/all-clusters-app/all-clusters-common/BUILD.gn index c3d3ed724bac41..a558a827710c88 100644 --- a/examples/all-clusters-app/all-clusters-common/BUILD.gn +++ b/examples/all-clusters-app/all-clusters-common/BUILD.gn @@ -39,6 +39,7 @@ chip_data_model("all-clusters-common") { "media-playback-server", "network-commissioning", "on-off-server", + "ota-server", "scenes", "target-navigator-server", "temperature-measurement-server", diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap index 22a885cf38ebc6..f6dba40432cc2a 100644 --- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap +++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap @@ -1098,6 +1098,191 @@ } ] }, + { + "name": "OTA Software Update Server", + "code": 41, + "mfgCode": null, + "define": "OTA_SERVER_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "QueryImage", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ApplyUpdateRequest", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "NotifyUpdateApplied", + "code": 2, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "OTA Software Update Server", + "code": 41, + "mfgCode": null, + "define": "OTA_SERVER_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "QueryImageResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "ApplyUpdateRequestResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "OTA Software Update Client", + "code": 42, + "mfgCode": null, + "define": "OTA_CLIENT_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [], + "attributes": [ + { + "name": "default ota server", + "code": 0, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "update possible", + "code": 1, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "true", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "OTA Software Update Client", + "code": 42, + "mfgCode": null, + "define": "OTA_CLIENT_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AnnounceOtaServer", + "code": 0, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, { "name": "General Commissioning", "code": 48, diff --git a/examples/all-clusters-app/all-clusters-common/gen/IMClusterCommandHandler.cpp b/examples/all-clusters-app/all-clusters-common/gen/IMClusterCommandHandler.cpp index 11076ed84e8b63..5397b7a22e3589 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/IMClusterCommandHandler.cpp +++ b/examples/all-clusters-app/all-clusters-common/gen/IMClusterCommandHandler.cpp @@ -6578,6 +6578,403 @@ void DispatchServerCommand(app::Command * apCommandObj, CommandId aCommandId, En } // namespace NetworkCommissioning +namespace OtaSoftwareUpdateServer { + +void DispatchServerCommand(app::Command * apCommandObj, CommandId aCommandId, EndpointId aEndpointId, TLV::TLVReader & aDataTlv) +{ + { + switch (aCommandId) + { + case ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID: { + // We are using TLVUnpackError and TLVError here since both of them can be CHIP_END_OF_TLV + // When TLVError is CHIP_END_OF_TLV, it means we have iterated all of the items, which is not a real error. + // Any error value TLVUnpackError means we have received an illegal value. + CHIP_ERROR TLVError = CHIP_NO_ERROR; + CHIP_ERROR TLVUnpackError = CHIP_NO_ERROR; + chip::ByteSpan updateToken; + bool updateTokenExists = false; + uint32_t newVersion; + bool newVersionExists = false; + uint32_t validArgumentCount = 0; + + while ((TLVError = aDataTlv.Next()) == CHIP_NO_ERROR) + { + switch (TLV::TagNumFromTag(aDataTlv.GetTag())) + { + case 0: + if (updateTokenExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + { + const uint8_t * data = nullptr; + TLVUnpackError = aDataTlv.GetDataPtr(data); + updateToken = chip::ByteSpan(data, aDataTlv.GetLength()); + } + if (CHIP_NO_ERROR == TLVUnpackError) + { + updateTokenExists = true; + validArgumentCount++; + } + break; + case 1: + if (newVersionExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(newVersion); + if (CHIP_NO_ERROR == TLVUnpackError) + { + newVersionExists = true; + validArgumentCount++; + } + break; + default: + // Unsupported tag, ignore it. + ChipLogProgress(Zcl, "Unknown TLV tag during processing."); + break; + } + if (TLVUnpackError != CHIP_NO_ERROR) + { + ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32, + TLV::TagNumFromTag(aDataTlv.GetTag()), TLVUnpackError); + break; + } + } + + if (CHIP_END_OF_TLV == TLVError) + { + // CHIP_END_OF_TLV means we have iterated all items in the structure, which is not a real error. + TLVError = CHIP_NO_ERROR; + } + else + { + ChipLogProgress(Zcl, "Failed to decode TLV data: %" PRId32, TLVError); + } + + // TODO(#5590) We should encode a response of status code for invalid TLV. + if (CHIP_NO_ERROR == TLVError && CHIP_NO_ERROR == TLVUnpackError && 2 == validArgumentCount) + { + // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks. + emberAfOtaSoftwareUpdateServerClusterApplyUpdateRequestCallback(updateToken, newVersion); + } + else + { + apCommandObj->AddStatusCode(nullptr, Protocols::SecureChannel::GeneralStatusCode::kBadRequest, + Protocols::SecureChannel::Id, Protocols::SecureChannel::kProtocolCodeGeneralFailure); + ChipLogProgress( + Zcl, "Failed to dispatch command, %d/%" PRIu32 " arguments parsed, TLVError=%" PRIu32 ", UnpackError=%" PRIu32, + 2, validArgumentCount, TLVError, TLVUnpackError); + } + break; + } + case ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID: { + // We are using TLVUnpackError and TLVError here since both of them can be CHIP_END_OF_TLV + // When TLVError is CHIP_END_OF_TLV, it means we have iterated all of the items, which is not a real error. + // Any error value TLVUnpackError means we have received an illegal value. + CHIP_ERROR TLVError = CHIP_NO_ERROR; + CHIP_ERROR TLVUnpackError = CHIP_NO_ERROR; + chip::ByteSpan updateToken; + bool updateTokenExists = false; + uint32_t currentVersion; + bool currentVersionExists = false; + uint32_t validArgumentCount = 0; + + while ((TLVError = aDataTlv.Next()) == CHIP_NO_ERROR) + { + switch (TLV::TagNumFromTag(aDataTlv.GetTag())) + { + case 0: + if (updateTokenExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + { + const uint8_t * data = nullptr; + TLVUnpackError = aDataTlv.GetDataPtr(data); + updateToken = chip::ByteSpan(data, aDataTlv.GetLength()); + } + if (CHIP_NO_ERROR == TLVUnpackError) + { + updateTokenExists = true; + validArgumentCount++; + } + break; + case 1: + if (currentVersionExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(currentVersion); + if (CHIP_NO_ERROR == TLVUnpackError) + { + currentVersionExists = true; + validArgumentCount++; + } + break; + default: + // Unsupported tag, ignore it. + ChipLogProgress(Zcl, "Unknown TLV tag during processing."); + break; + } + if (TLVUnpackError != CHIP_NO_ERROR) + { + ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32, + TLV::TagNumFromTag(aDataTlv.GetTag()), TLVUnpackError); + break; + } + } + + if (CHIP_END_OF_TLV == TLVError) + { + // CHIP_END_OF_TLV means we have iterated all items in the structure, which is not a real error. + TLVError = CHIP_NO_ERROR; + } + else + { + ChipLogProgress(Zcl, "Failed to decode TLV data: %" PRId32, TLVError); + } + + // TODO(#5590) We should encode a response of status code for invalid TLV. + if (CHIP_NO_ERROR == TLVError && CHIP_NO_ERROR == TLVUnpackError && 2 == validArgumentCount) + { + // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks. + emberAfOtaSoftwareUpdateServerClusterNotifyUpdateAppliedCallback(updateToken, currentVersion); + } + else + { + apCommandObj->AddStatusCode(nullptr, Protocols::SecureChannel::GeneralStatusCode::kBadRequest, + Protocols::SecureChannel::Id, Protocols::SecureChannel::kProtocolCodeGeneralFailure); + ChipLogProgress( + Zcl, "Failed to dispatch command, %d/%" PRIu32 " arguments parsed, TLVError=%" PRIu32 ", UnpackError=%" PRIu32, + 2, validArgumentCount, TLVError, TLVUnpackError); + } + break; + } + case ZCL_QUERY_IMAGE_COMMAND_ID: { + // We are using TLVUnpackError and TLVError here since both of them can be CHIP_END_OF_TLV + // When TLVError is CHIP_END_OF_TLV, it means we have iterated all of the items, which is not a real error. + // Any error value TLVUnpackError means we have received an illegal value. + CHIP_ERROR TLVError = CHIP_NO_ERROR; + CHIP_ERROR TLVUnpackError = CHIP_NO_ERROR; + uint16_t vendorId; + bool vendorIdExists = false; + uint16_t productId; + bool productIdExists = false; + uint16_t imageType; + bool imageTypeExists = false; + uint16_t hardwareVersion; + bool hardwareVersionExists = false; + uint32_t currentVersion; + bool currentVersionExists = false; + /* TYPE WARNING: array array defaults to */ uint8_t * protocolsSupported; + bool protocolsSupportedExists = false; + const uint8_t * location; + bool locationExists = false; + uint8_t clientCanConsent; + bool clientCanConsentExists = false; + chip::ByteSpan metadataForServer; + bool metadataForServerExists = false; + uint32_t validArgumentCount = 0; + + while ((TLVError = aDataTlv.Next()) == CHIP_NO_ERROR) + { + switch (TLV::TagNumFromTag(aDataTlv.GetTag())) + { + case 0: + if (vendorIdExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(vendorId); + if (CHIP_NO_ERROR == TLVUnpackError) + { + vendorIdExists = true; + validArgumentCount++; + } + break; + case 1: + if (productIdExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(productId); + if (CHIP_NO_ERROR == TLVUnpackError) + { + productIdExists = true; + validArgumentCount++; + } + break; + case 2: + if (imageTypeExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(imageType); + if (CHIP_NO_ERROR == TLVUnpackError) + { + imageTypeExists = true; + validArgumentCount++; + } + break; + case 3: + if (hardwareVersionExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(hardwareVersion); + if (CHIP_NO_ERROR == TLVUnpackError) + { + hardwareVersionExists = true; + validArgumentCount++; + } + break; + case 4: + if (currentVersionExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(currentVersion); + if (CHIP_NO_ERROR == TLVUnpackError) + { + currentVersionExists = true; + validArgumentCount++; + } + break; + case 5: + if (protocolsSupportedExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + // Just for compatibility, we will add array type support in IM later. + TLVUnpackError = aDataTlv.GetDataPtr(const_cast(protocolsSupported)); + if (CHIP_NO_ERROR == TLVUnpackError) + { + protocolsSupportedExists = true; + validArgumentCount++; + } + break; + case 6: + if (locationExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + // TODO(#5542): The cluster handlers should accept a ByteSpan for all string types. + TLVUnpackError = aDataTlv.GetDataPtr(location); + if (CHIP_NO_ERROR == TLVUnpackError) + { + locationExists = true; + validArgumentCount++; + } + break; + case 7: + if (clientCanConsentExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + TLVUnpackError = aDataTlv.Get(clientCanConsent); + if (CHIP_NO_ERROR == TLVUnpackError) + { + clientCanConsentExists = true; + validArgumentCount++; + } + break; + case 8: + if (metadataForServerExists) + { + ChipLogProgress(Zcl, "Duplicate TLV tag %" PRIx32, TLV::TagNumFromTag(aDataTlv.GetTag())); + TLVUnpackError = CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_ELEMENT; + break; + } + { + const uint8_t * data = nullptr; + TLVUnpackError = aDataTlv.GetDataPtr(data); + metadataForServer = chip::ByteSpan(data, aDataTlv.GetLength()); + } + if (CHIP_NO_ERROR == TLVUnpackError) + { + metadataForServerExists = true; + validArgumentCount++; + } + break; + default: + // Unsupported tag, ignore it. + ChipLogProgress(Zcl, "Unknown TLV tag during processing."); + break; + } + if (TLVUnpackError != CHIP_NO_ERROR) + { + ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32, + TLV::TagNumFromTag(aDataTlv.GetTag()), TLVUnpackError); + break; + } + } + + if (CHIP_END_OF_TLV == TLVError) + { + // CHIP_END_OF_TLV means we have iterated all items in the structure, which is not a real error. + TLVError = CHIP_NO_ERROR; + } + else + { + ChipLogProgress(Zcl, "Failed to decode TLV data: %" PRId32, TLVError); + } + + // TODO(#5590) We should encode a response of status code for invalid TLV. + if (CHIP_NO_ERROR == TLVError && CHIP_NO_ERROR == TLVUnpackError && 9 == validArgumentCount) + { + // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks. + emberAfOtaSoftwareUpdateServerClusterQueryImageCallback( + vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, + const_cast(location), clientCanConsent, metadataForServer); + } + else + { + apCommandObj->AddStatusCode(nullptr, Protocols::SecureChannel::GeneralStatusCode::kBadRequest, + Protocols::SecureChannel::Id, Protocols::SecureChannel::kProtocolCodeGeneralFailure); + ChipLogProgress( + Zcl, "Failed to dispatch command, %d/%" PRIu32 " arguments parsed, TLVError=%" PRIu32 ", UnpackError=%" PRIu32, + 9, validArgumentCount, TLVError, TLVUnpackError); + } + break; + } + default: { + // Unrecognized command ID, error status will apply. + apCommandObj->AddStatusCode(nullptr, Protocols::SecureChannel::GeneralStatusCode::kNotFound, + Protocols::SecureChannel::Id, Protocols::SecureChannel::kProtocolCodeGeneralFailure); + ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, aCommandId, ZCL_OTA_SERVER_CLUSTER_ID); + break; + } + } + } +} + +} // namespace OtaSoftwareUpdateServer + namespace OnOff { void DispatchServerCommand(app::Command * apCommandObj, CommandId aCommandId, EndpointId aEndpointId, TLV::TLVReader & aDataTlv) @@ -7298,6 +7695,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID: clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader); break; + case ZCL_OTA_SERVER_CLUSTER_ID: + clusters::OtaSoftwareUpdateServer::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader); + break; case ZCL_ON_OFF_CLUSTER_ID: clusters::OnOff::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader); break; diff --git a/examples/all-clusters-app/all-clusters-common/gen/attribute-id.h b/examples/all-clusters-app/all-clusters-common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/attribute-id.h +++ b/examples/all-clusters-app/all-clusters-common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/all-clusters-app/all-clusters-common/gen/call-command-handler.cpp b/examples/all-clusters-app/all-clusters-common/gen/call-command-handler.cpp index bbd24100a77b64..e770d208a66eb8 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/call-command-handler.cpp +++ b/examples/all-clusters-app/all-clusters-common/gen/call-command-handler.cpp @@ -43,6 +43,8 @@ EmberAfStatus emberAfIdentifyClusterServerCommandParse(EmberAfClusterCommand * c EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd); EmberAfStatus emberAfLowPowerClusterServerCommandParse(EmberAfClusterCommand * cmd); EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfOtaSoftwareUpdateClientClusterServerCommandParse(EmberAfClusterCommand * cmd); +EmberAfStatus emberAfOtaSoftwareUpdateServerClusterServerCommandParse(EmberAfClusterCommand * cmd); EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd); EmberAfStatus emberAfScenesClusterServerCommandParse(EmberAfClusterCommand * cmd); EmberAfStatus emberAfTemperatureMeasurementClusterServerCommandParse(EmberAfClusterCommand * cmd); @@ -135,6 +137,13 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd) case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID: result = emberAfNetworkCommissioningClusterServerCommandParse(cmd); break; + case ZCL_OTA_CLIENT_CLUSTER_ID: + // No commands are enabled for cluster OTA Software Update Client + result = status(false, true, cmd->mfgSpecific); + break; + case ZCL_OTA_SERVER_CLUSTER_ID: + result = emberAfOtaSoftwareUpdateServerClusterServerCommandParse(cmd); + break; case ZCL_ON_OFF_CLUSTER_ID: result = emberAfOnOffClusterServerCommandParse(cmd); break; @@ -2112,6 +2121,137 @@ EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfCluste } return status(wasHandled, true, cmd->mfgSpecific); } +EmberAfStatus emberAfOtaSoftwareUpdateServerClusterServerCommandParse(EmberAfClusterCommand * cmd) +{ + bool wasHandled = false; + + if (!cmd->mfgSpecific) + { + switch (cmd->commandId) + { + case ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID: { + uint16_t payloadOffset = cmd->payloadStartIndex; + chip::ByteSpan updateToken; + uint32_t newVersion; + + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + { + uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + updateToken = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); + } + payloadOffset = static_cast(payloadOffset + updateToken.size() + 1u); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + newVersion = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + + wasHandled = emberAfOtaSoftwareUpdateServerClusterApplyUpdateRequestCallback(updateToken, newVersion); + break; + } + case ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID: { + uint16_t payloadOffset = cmd->payloadStartIndex; + chip::ByteSpan updateToken; + uint32_t currentVersion; + + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + { + uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + updateToken = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); + } + payloadOffset = static_cast(payloadOffset + updateToken.size() + 1u); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + currentVersion = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + + wasHandled = emberAfOtaSoftwareUpdateServerClusterNotifyUpdateAppliedCallback(updateToken, currentVersion); + break; + } + case ZCL_QUERY_IMAGE_COMMAND_ID: { + uint16_t payloadOffset = cmd->payloadStartIndex; + uint16_t vendorId; + uint16_t productId; + uint16_t imageType; + uint16_t hardwareVersion; + uint32_t currentVersion; + /* TYPE WARNING: array array defaults to */ uint8_t * protocolsSupported; + uint8_t * location; + uint8_t clientCanConsent; + chip::ByteSpan metadataForServer; + + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + vendorId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + productId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + imageType = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 2) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + hardwareVersion = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 2); + if (cmd->bufLen < payloadOffset + 4) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + currentVersion = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 4); + protocolsSupported = cmd->buffer + payloadOffset; + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + location = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + emberAfStringLength(location) + 1u); + if (cmd->bufLen < payloadOffset + 1) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + clientCanConsent = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); + payloadOffset = static_cast(payloadOffset + 1); + if (cmd->bufLen < payloadOffset + 1u) + { + return EMBER_ZCL_STATUS_MALFORMED_COMMAND; + } + { + uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); + metadataForServer = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData)); + } + + wasHandled = emberAfOtaSoftwareUpdateServerClusterQueryImageCallback(vendorId, productId, imageType, hardwareVersion, + currentVersion, protocolsSupported, location, + clientCanConsent, metadataForServer); + break; + } + default: { + // Unrecognized command ID, error status will apply. + break; + } + } + } + return status(wasHandled, true, cmd->mfgSpecific); +} EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd) { bool wasHandled = false; diff --git a/examples/all-clusters-app/all-clusters-common/gen/callback-stub.cpp b/examples/all-clusters-app/all-clusters-common/gen/callback-stub.cpp index 460d90ebd20be1..43b9839b90a5da 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/callback-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/gen/callback-stub.cpp @@ -74,6 +74,12 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID: emberAfNetworkCommissioningClusterInitCallback(endpoint); break; + case ZCL_OTA_CLIENT_CLUSTER_ID: + emberAfOtaSoftwareUpdateClientClusterInitCallback(endpoint); + break; + case ZCL_OTA_SERVER_CLUSTER_ID: + emberAfOtaSoftwareUpdateServerClusterInitCallback(endpoint); + break; case ZCL_ON_OFF_CLUSTER_ID: emberAfOnOffClusterInitCallback(endpoint); break; @@ -167,6 +173,16 @@ void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(Endpoi // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfOtaSoftwareUpdateClientClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfOtaSoftwareUpdateServerClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfOnOffClusterInitCallback(EndpointId endpoint) { // To prevent warning diff --git a/examples/all-clusters-app/all-clusters-common/gen/callback.h b/examples/all-clusters-app/all-clusters-common/gen/callback.h index 743a981dab7c11..7f40d32d98e574 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/callback.h +++ b/examples/all-clusters-app/all-clusters-common/gen/callback.h @@ -159,6 +159,22 @@ void emberAfLowPowerClusterInitCallback(chip::EndpointId endpoint); */ void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint); +/** @brief OTA Software Update Client Cluster Init + * + * Cluster Init + * + * @param endpoint Endpoint that is being initialized + */ +void emberAfOtaSoftwareUpdateClientClusterInitCallback(chip::EndpointId endpoint); + +/** @brief OTA Software Update Server Cluster Init + * + * Cluster Init + * + * @param endpoint Endpoint that is being initialized + */ +void emberAfOtaSoftwareUpdateServerClusterInitCallback(chip::EndpointId endpoint); + /** @brief On/off Cluster Init * * Cluster Init @@ -1246,6 +1262,148 @@ EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallbac */ void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint); +// +// OTA Software Update Client Cluster server +// + +/** @brief OTA Software Update Client Cluster Server Init + * + * Server Init + * + * @param endpoint Endpoint that is being initialized + */ +void emberAfOtaSoftwareUpdateClientClusterServerInitCallback(chip::EndpointId endpoint); + +/** @brief OTA Software Update Client Cluster Server Attribute Changed + * + * Server Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute that changed + */ +void emberAfOtaSoftwareUpdateClientClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId); + +/** @brief OTA Software Update Client Cluster Server Manufacturer Specific Attribute Changed + * + * Server Manufacturer Specific Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute that changed + * @param manufacturerCode Manufacturer Code of the attribute that changed + */ +void emberAfOtaSoftwareUpdateClientClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint, + chip::AttributeId attributeId, + uint16_t manufacturerCode); + +/** @brief OTA Software Update Client Cluster Server Message Sent + * + * Server Message Sent + * + * @param type The type of message sent + * @param indexOrDestination The destination or address to which the message was sent + * @param apsFrame The APS frame for the message + * @param msgLen The length of the message + * @param message The message that was sent + * @param status The status of the sent message + */ +void emberAfOtaSoftwareUpdateClientClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination, + EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message, + EmberStatus status); + +/** @brief OTA Software Update Client Cluster Server Pre Attribute Changed + * + * server Pre Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute to be changed + * @param attributeType Attribute type + * @param size Attribute size + * @param value Attribute value + */ +EmberAfStatus emberAfOtaSoftwareUpdateClientClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint, + chip::AttributeId attributeId, + EmberAfAttributeType attributeType, + uint8_t size, uint8_t * value); + +/** @brief OTA Software Update Client Cluster Server Tick + * + * server Tick + * + * @param endpoint Endpoint that is being served + */ +void emberAfOtaSoftwareUpdateClientClusterServerTickCallback(chip::EndpointId endpoint); + +// +// OTA Software Update Server Cluster server +// + +/** @brief OTA Software Update Server Cluster Server Init + * + * Server Init + * + * @param endpoint Endpoint that is being initialized + */ +void emberAfOtaSoftwareUpdateServerClusterServerInitCallback(chip::EndpointId endpoint); + +/** @brief OTA Software Update Server Cluster Server Attribute Changed + * + * Server Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute that changed + */ +void emberAfOtaSoftwareUpdateServerClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId); + +/** @brief OTA Software Update Server Cluster Server Manufacturer Specific Attribute Changed + * + * Server Manufacturer Specific Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute that changed + * @param manufacturerCode Manufacturer Code of the attribute that changed + */ +void emberAfOtaSoftwareUpdateServerClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint, + chip::AttributeId attributeId, + uint16_t manufacturerCode); + +/** @brief OTA Software Update Server Cluster Server Message Sent + * + * Server Message Sent + * + * @param type The type of message sent + * @param indexOrDestination The destination or address to which the message was sent + * @param apsFrame The APS frame for the message + * @param msgLen The length of the message + * @param message The message that was sent + * @param status The status of the sent message + */ +void emberAfOtaSoftwareUpdateServerClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination, + EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message, + EmberStatus status); + +/** @brief OTA Software Update Server Cluster Server Pre Attribute Changed + * + * server Pre Attribute Changed + * + * @param endpoint Endpoint that is being initialized + * @param attributeId Attribute to be changed + * @param attributeType Attribute type + * @param size Attribute size + * @param value Attribute value + */ +EmberAfStatus emberAfOtaSoftwareUpdateServerClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint, + chip::AttributeId attributeId, + EmberAfAttributeType attributeType, + uint8_t size, uint8_t * value); + +/** @brief OTA Software Update Server Cluster Server Tick + * + * server Tick + * + * @param endpoint Endpoint that is being served + */ +void emberAfOtaSoftwareUpdateServerClusterServerTickCallback(chip::EndpointId endpoint); + // // On/off Cluster server // @@ -2170,6 +2328,40 @@ bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(chip::ByteSpa bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(chip::ByteSpan ssid, chip::ByteSpan credentials, uint64_t breadcrumb, uint32_t timeoutMs); +/** + * @brief OTA Software Update Server Cluster ApplyUpdateRequest Command callback + * @param updateToken + * @param newVersion + */ + +bool emberAfOtaSoftwareUpdateServerClusterApplyUpdateRequestCallback(chip::ByteSpan updateToken, uint32_t newVersion); + +/** + * @brief OTA Software Update Server Cluster NotifyUpdateApplied Command callback + * @param updateToken + * @param currentVersion + */ + +bool emberAfOtaSoftwareUpdateServerClusterNotifyUpdateAppliedCallback(chip::ByteSpan updateToken, uint32_t currentVersion); + +/** + * @brief OTA Software Update Server Cluster QueryImage Command callback + * @param vendorId + * @param productId + * @param imageType + * @param hardwareVersion + * @param currentVersion + * @param protocolsSupported + * @param location + * @param clientCanConsent + * @param metadataForServer + */ + +bool emberAfOtaSoftwareUpdateServerClusterQueryImageCallback( + uint16_t vendorId, uint16_t productId, uint16_t imageType, uint16_t hardwareVersion, uint32_t currentVersion, + /* TYPE WARNING: array array defaults to */ uint8_t * protocolsSupported, uint8_t * location, uint8_t clientCanConsent, + chip::ByteSpan metadataForServer); + /** * @brief On/off Cluster Off Command callback */ diff --git a/examples/all-clusters-app/all-clusters-common/gen/client-command-macro.h b/examples/all-clusters-app/all-clusters-common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/client-command-macro.h +++ b/examples/all-clusters-app/all-clusters-common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/all-clusters-app/all-clusters-common/gen/cluster-id.h b/examples/all-clusters-app/all-clusters-common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/cluster-id.h +++ b/examples/all-clusters-app/all-clusters-common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/all-clusters-app/all-clusters-common/gen/command-id.h b/examples/all-clusters-app/all-clusters-common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/command-id.h +++ b/examples/all-clusters-app/all-clusters-common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/all-clusters-app/all-clusters-common/gen/endpoint_config.h b/examples/all-clusters-app/all-clusters-common/gen/endpoint_config.h index 1022437bd334df..17329438b76b0b 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/endpoint_config.h +++ b/examples/all-clusters-app/all-clusters-common/gen/endpoint_config.h @@ -447,7 +447,7 @@ #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask // This is an array of EmberAfAttributeMetadata structures. -#define GENERATED_ATTRIBUTE_COUNT 138 +#define GENERATED_ATTRIBUTE_COUNT 140 #define GENERATED_ATTRIBUTES \ { \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* Identify (server): cluster revision */ \ @@ -465,11 +465,11 @@ { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(3) }, /* Level Control (server): cluster revision */ \ { 0x0000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* Level Control (server): current level */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Descriptor (server): cluster revision */ \ { 0x0000, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(0) }, /* Descriptor (server): device list */ \ { 0x0001, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(254) }, /* Descriptor (server): server list */ \ { 0x0002, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(508) }, /* Descriptor (server): client list */ \ { 0x0003, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(762) }, /* Descriptor (server): parts list */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Descriptor (server): cluster revision */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(SINGLETON), \ ZAP_SIMPLE_DEFAULT(3) }, /* Basic (server): cluster revision */ \ { 0x0000, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(SINGLETON), \ @@ -491,12 +491,16 @@ { 0x0009, ZAP_TYPE(INT32U), 4, ZAP_ATTRIBUTE_MASK(SINGLETON), \ ZAP_LONG_DEFAULTS_INDEX(1192) }, /* Basic (server): SoftwareVersion */ \ { 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), \ - ZAP_LONG_DEFAULTS_INDEX(1196) }, /* Basic (server): SoftwareVersionString */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* General Commissioning (server): cluster revision */ \ + ZAP_LONG_DEFAULTS_INDEX(1196) }, /* Basic (server): SoftwareVersionString */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, \ + ZAP_SIMPLE_DEFAULT(0x0001) }, /* OTA Software Update Server (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, \ + ZAP_SIMPLE_DEFAULT(0x0001) }, /* OTA Software Update Client (server): cluster revision */ \ { 0x0000, ZAP_TYPE(OCTET_STRING), 8, 0, \ ZAP_LONG_DEFAULTS_INDEX(1260) }, /* General Commissioning (server): FabricId */ \ { 0x0001, ZAP_TYPE(INT64U), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), \ ZAP_LONG_DEFAULTS_INDEX(1268) }, /* General Commissioning (server): Breadcrumb */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* General Commissioning (server): cluster revision */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Network Commissioning (server): cluster revision */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(3) }, /* Door Lock (server): cluster revision */ \ { 0x0000, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(2) }, /* Door Lock (server): lock state */ \ @@ -594,25 +598,25 @@ { 0x0001, ZAP_TYPE(ENUM16), 2, 0, ZAP_EMPTY_DEFAULT() }, /* IAS Zone (server): zone type */ \ { 0x0002, ZAP_TYPE(BITMAP16), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* IAS Zone (server): zone status */ \ { 0x0010, ZAP_TYPE(IEEE_ADDRESS), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), \ - ZAP_LONG_DEFAULTS_INDEX(1530) }, /* IAS Zone (server): IAS CIE address */ \ - { 0x0011, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xff) }, /* IAS Zone (server): Zone ID */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ + ZAP_LONG_DEFAULTS_INDEX(1530) }, /* IAS Zone (server): IAS CIE address */ \ + { 0x0011, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xff) }, /* IAS Zone (server): Zone ID */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ { 0x0000, ZAP_TYPE(CHAR_STRING), 32, 0, ZAP_LONG_DEFAULTS_INDEX(1538) }, /* Application Basic (server): vendor name */ \ { 0x0001, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): vendor id */ \ { 0x0002, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(1570) }, /* Application Basic (server): application name */ \ - { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + ZAP_LONG_DEFAULTS_INDEX(1570) }, /* Application Basic (server): application name */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ + { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ ZAP_LONG_DEFAULTS_INDEX(1602) }, /* Application Basic (server): application id */ \ { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Binding (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Group Key Management (server): cluster revision */ \ { 0x0000, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(1634) }, /* Group Key Management (server): groups */ \ { 0x0001, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(1888) }, /* Group Key Management (server): group keys */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Group Key Management (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ + { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(SINGLETON), \ ZAP_SIMPLE_DEFAULT(3) }, /* Basic (server): cluster revision */ \ { 0x0000, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(SINGLETON), \ @@ -674,7 +678,7 @@ }; #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask -#define GENERATED_CLUSTER_COUNT 21 +#define GENERATED_CLUSTER_COUNT 23 #define GENERATED_CLUSTERS \ { \ { 0x0003, \ @@ -717,59 +721,65 @@ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \ chipFuncArrayBasicServer }, /* Endpoint: 1, Cluster: Basic (server) */ \ { \ - 0x0030, ZAP_ATTRIBUTE_INDEX(31), 3, 18, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0029, ZAP_ATTRIBUTE_INDEX(31), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ + }, /* Endpoint: 1, Cluster: OTA Software Update Server (server) */ \ + { \ + 0x002A, ZAP_ATTRIBUTE_INDEX(32), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ + }, /* Endpoint: 1, Cluster: OTA Software Update Client (server) */ \ + { \ + 0x0030, ZAP_ATTRIBUTE_INDEX(33), 3, 18, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: General Commissioning (server) */ \ { \ - 0x0031, ZAP_ATTRIBUTE_INDEX(34), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0031, ZAP_ATTRIBUTE_INDEX(36), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Network Commissioning (server) */ \ { 0x0101, \ - ZAP_ATTRIBUTE_INDEX(35), \ + ZAP_ATTRIBUTE_INDEX(37), \ 4, \ 5, \ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION), \ chipFuncArrayDoorLockServer }, /* Endpoint: 1, Cluster: Door Lock (server) */ \ { \ - 0x0103, ZAP_ATTRIBUTE_INDEX(39), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0103, ZAP_ATTRIBUTE_INDEX(41), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Barrier Control (server) */ \ { \ - 0x0201, ZAP_ATTRIBUTE_INDEX(44), 6, 10, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0201, ZAP_ATTRIBUTE_INDEX(46), 6, 10, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Thermostat (server) */ \ { 0x0300, \ - ZAP_ATTRIBUTE_INDEX(50), \ + ZAP_ATTRIBUTE_INDEX(52), \ 51, \ 336, \ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \ chipFuncArrayColorControlServer }, /* Endpoint: 1, Cluster: Color Control (server) */ \ { \ - 0x0402, ZAP_ATTRIBUTE_INDEX(101), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0402, ZAP_ATTRIBUTE_INDEX(103), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Temperature Measurement (server) */ \ { 0x0500, \ - ZAP_ATTRIBUTE_INDEX(105), \ + ZAP_ATTRIBUTE_INDEX(107), \ 6, \ 16, \ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION) | \ ZAP_CLUSTER_MASK(MESSAGE_SENT_FUNCTION), \ chipFuncArrayIasZoneServer }, /* Endpoint: 1, Cluster: IAS Zone (server) */ \ { \ - 0x0508, ZAP_ATTRIBUTE_INDEX(111), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x0508, ZAP_ATTRIBUTE_INDEX(113), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Low Power (server) */ \ { \ - 0x050D, ZAP_ATTRIBUTE_INDEX(112), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0x050D, ZAP_ATTRIBUTE_INDEX(114), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Application Basic (server) */ \ { \ - 0xF000, ZAP_ATTRIBUTE_INDEX(120), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0xF000, ZAP_ATTRIBUTE_INDEX(122), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Binding (server) */ \ { \ - 0xF004, ZAP_ATTRIBUTE_INDEX(121), 3, 510, ZAP_CLUSTER_MASK(SERVER), NULL \ + 0xF004, ZAP_ATTRIBUTE_INDEX(123), 3, 510, ZAP_CLUSTER_MASK(SERVER), NULL \ }, /* Endpoint: 1, Cluster: Group Key Management (server) */ \ { 0x0006, \ - ZAP_ATTRIBUTE_INDEX(124), \ + ZAP_ATTRIBUTE_INDEX(126), \ 2, \ 3, \ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \ chipFuncArrayOnOffServer }, /* Endpoint: 2, Cluster: On/off (server) */ \ { 0x0028, \ - ZAP_ATTRIBUTE_INDEX(126), \ + ZAP_ATTRIBUTE_INDEX(128), \ 12, \ 254, \ ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \ @@ -781,7 +791,7 @@ // This is an array of EmberAfEndpointType structures. #define GENERATED_ENDPOINT_TYPES \ { \ - { ZAP_CLUSTER_INDEX(0), 19, 2314 }, { ZAP_CLUSTER_INDEX(19), 2, 257 }, \ + { ZAP_CLUSTER_INDEX(0), 21, 2318 }, { ZAP_CLUSTER_INDEX(21), 2, 257 }, \ } // Largest attribute size is needed for various buffers @@ -791,7 +801,7 @@ #define ATTRIBUTE_SINGLETONS_SIZE (508) // Total size of attribute storage -#define ATTRIBUTE_MAX_SIZE (2571) +#define ATTRIBUTE_MAX_SIZE (2575) // Number of fixed endpoints #define FIXED_ENDPOINT_COUNT (2) @@ -835,7 +845,7 @@ // Array of EmberAfCommandMetadata structs. #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask -#define EMBER_AF_GENERATED_COMMAND_COUNT (124) +#define EMBER_AF_GENERATED_COMMAND_COUNT (130) #define GENERATED_COMMANDS \ { \ { 0x0003, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Identify (server): Identify */ \ @@ -885,6 +895,13 @@ { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */ \ { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */ \ { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */ \ + { 0x0029, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* OTA Software Update Server (server): QueryImage */ \ + { 0x0029, 0x01, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* OTA Software Update Server (server): ApplyUpdateRequest */ \ + { 0x0029, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* OTA Software Update Server (server): NotifyUpdateApplied */ \ + { 0x0029, 0x03, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* OTA Software Update Server (server): QueryImageResponse */ \ + { 0x0029, 0x04, \ + ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* OTA Software Update Server (server): ApplyUpdateRequestResponse */ \ + { 0x002A, 0x00, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* OTA Software Update Client (server): AnnounceOtaServer */ \ { 0x0030, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* General Commissioning (server): SetFabric */ \ { 0x0030, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* General Commissioning (server): SetFabricResponse */ \ { 0x0030, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* General Commissioning (server): ArmFailSafe */ \ diff --git a/examples/all-clusters-app/all-clusters-common/gen/enums.h b/examples/all-clusters-app/all-clusters-common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/enums.h +++ b/examples/all-clusters-app/all-clusters-common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/all-clusters-app/all-clusters-common/gen/gen_config.h b/examples/all-clusters-app/all-clusters-common/gen/gen_config.h index ff8386f5ab6043..0d3022f6f7b0e4 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/gen_config.h +++ b/examples/all-clusters-app/all-clusters-common/gen/gen_config.h @@ -44,6 +44,8 @@ #define EMBER_AF_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define EMBER_AF_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define EMBER_AF_OTA_CLIENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define EMBER_AF_OTA_SERVER_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (2) #define EMBER_AF_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define EMBER_AF_TEMP_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) @@ -136,6 +138,16 @@ #define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER #define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING +// Use this macro to check if the server side of the OTA Software Update Client cluster is included +#define ZCL_USING_OTA_CLIENT_CLUSTER_SERVER +#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_CLIENT_SERVER +#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_CLIENT + +// Use this macro to check if the server side of the OTA Software Update Server cluster is included +#define ZCL_USING_OTA_SERVER_CLUSTER_SERVER +#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_SERVER_SERVER +#define EMBER_AF_PLUGIN_OTA_SOFTWARE_UPDATE_SERVER + // Use this macro to check if the server side of the On/off cluster is included #define ZCL_USING_ON_OFF_CLUSTER_SERVER #define EMBER_AF_PLUGIN_ON_OFF_SERVER diff --git a/examples/all-clusters-app/all-clusters-common/gen/print-cluster.h b/examples/all-clusters-app/all-clusters-common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/all-clusters-app/all-clusters-common/gen/print-cluster.h +++ b/examples/all-clusters-app/all-clusters-common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/all-clusters-app/esp32/main/CMakeLists.txt b/examples/all-clusters-app/esp32/main/CMakeLists.txt index 063e69d6de5aa5..8288c00c4377ac 100644 --- a/examples/all-clusters-app/esp32/main/CMakeLists.txt +++ b/examples/all-clusters-app/esp32/main/CMakeLists.txt @@ -42,6 +42,7 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/content-launch-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/low-power-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/media-playback-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ota-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/temperature-measurement-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/scenes" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/basic" diff --git a/examples/all-clusters-app/esp32/main/component.mk b/examples/all-clusters-app/esp32/main/component.mk index cd199c5bb78c40..ce2a427201b781 100644 --- a/examples/all-clusters-app/esp32/main/component.mk +++ b/examples/all-clusters-app/esp32/main/component.mk @@ -44,6 +44,7 @@ COMPONENT_SRCDIRS := ../third_party/connectedhomeip/src/app/clusters/media-playback-server \ ../third_party/connectedhomeip/src/app/clusters/media-input-server \ ../third_party/connectedhomeip/src/app/clusters/network-commissioning \ + ../third_party/connectedhomeip/src/app/clusters/ota-server \ ../third_party/connectedhomeip/src/app/clusters/target-navigator-server \ ../third_party/connectedhomeip/src/app/clusters/temperature-measurement-server \ ../third_party/connectedhomeip/src/app/clusters/tv-channel-server \ diff --git a/examples/bridge-app/bridge-common/gen/attribute-id.h b/examples/bridge-app/bridge-common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/bridge-app/bridge-common/gen/attribute-id.h +++ b/examples/bridge-app/bridge-common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/bridge-app/bridge-common/gen/client-command-macro.h b/examples/bridge-app/bridge-common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/bridge-app/bridge-common/gen/client-command-macro.h +++ b/examples/bridge-app/bridge-common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/bridge-app/bridge-common/gen/cluster-id.h b/examples/bridge-app/bridge-common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/bridge-app/bridge-common/gen/cluster-id.h +++ b/examples/bridge-app/bridge-common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/bridge-app/bridge-common/gen/command-id.h b/examples/bridge-app/bridge-common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/bridge-app/bridge-common/gen/command-id.h +++ b/examples/bridge-app/bridge-common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/bridge-app/bridge-common/gen/enums.h b/examples/bridge-app/bridge-common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/bridge-app/bridge-common/gen/enums.h +++ b/examples/bridge-app/bridge-common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/bridge-app/bridge-common/gen/print-cluster.h b/examples/bridge-app/bridge-common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/bridge-app/bridge-common/gen/print-cluster.h +++ b/examples/bridge-app/bridge-common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/chip-tool/gen/attribute-id.h b/examples/chip-tool/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/chip-tool/gen/attribute-id.h +++ b/examples/chip-tool/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/chip-tool/gen/client-command-macro.h b/examples/chip-tool/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/chip-tool/gen/client-command-macro.h +++ b/examples/chip-tool/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/chip-tool/gen/cluster-id.h b/examples/chip-tool/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/chip-tool/gen/cluster-id.h +++ b/examples/chip-tool/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/chip-tool/gen/command-id.h b/examples/chip-tool/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/chip-tool/gen/command-id.h +++ b/examples/chip-tool/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/chip-tool/gen/enums.h b/examples/chip-tool/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/chip-tool/gen/enums.h +++ b/examples/chip-tool/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/chip-tool/gen/print-cluster.h b/examples/chip-tool/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/chip-tool/gen/print-cluster.h +++ b/examples/chip-tool/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/lighting-app/lighting-common/gen/attribute-id.h b/examples/lighting-app/lighting-common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/lighting-app/lighting-common/gen/attribute-id.h +++ b/examples/lighting-app/lighting-common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/lighting-app/lighting-common/gen/client-command-macro.h b/examples/lighting-app/lighting-common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/lighting-app/lighting-common/gen/client-command-macro.h +++ b/examples/lighting-app/lighting-common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/lighting-app/lighting-common/gen/cluster-id.h b/examples/lighting-app/lighting-common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/lighting-app/lighting-common/gen/cluster-id.h +++ b/examples/lighting-app/lighting-common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/lighting-app/lighting-common/gen/command-id.h b/examples/lighting-app/lighting-common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/lighting-app/lighting-common/gen/command-id.h +++ b/examples/lighting-app/lighting-common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/lighting-app/lighting-common/gen/enums.h b/examples/lighting-app/lighting-common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/lighting-app/lighting-common/gen/enums.h +++ b/examples/lighting-app/lighting-common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/lighting-app/lighting-common/gen/print-cluster.h b/examples/lighting-app/lighting-common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/lighting-app/lighting-common/gen/print-cluster.h +++ b/examples/lighting-app/lighting-common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/lock-app/lock-common/gen/attribute-id.h b/examples/lock-app/lock-common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/lock-app/lock-common/gen/attribute-id.h +++ b/examples/lock-app/lock-common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/lock-app/lock-common/gen/client-command-macro.h b/examples/lock-app/lock-common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/lock-app/lock-common/gen/client-command-macro.h +++ b/examples/lock-app/lock-common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/lock-app/lock-common/gen/cluster-id.h b/examples/lock-app/lock-common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/lock-app/lock-common/gen/cluster-id.h +++ b/examples/lock-app/lock-common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/lock-app/lock-common/gen/command-id.h b/examples/lock-app/lock-common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/lock-app/lock-common/gen/command-id.h +++ b/examples/lock-app/lock-common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/lock-app/lock-common/gen/enums.h b/examples/lock-app/lock-common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/lock-app/lock-common/gen/enums.h +++ b/examples/lock-app/lock-common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/lock-app/lock-common/gen/print-cluster.h b/examples/lock-app/lock-common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/lock-app/lock-common/gen/print-cluster.h +++ b/examples/lock-app/lock-common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/temperature-measurement-app/esp32/main/gen/attribute-id.h b/examples/temperature-measurement-app/esp32/main/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/attribute-id.h +++ b/examples/temperature-measurement-app/esp32/main/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/temperature-measurement-app/esp32/main/gen/client-command-macro.h b/examples/temperature-measurement-app/esp32/main/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/client-command-macro.h +++ b/examples/temperature-measurement-app/esp32/main/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/temperature-measurement-app/esp32/main/gen/cluster-id.h b/examples/temperature-measurement-app/esp32/main/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/cluster-id.h +++ b/examples/temperature-measurement-app/esp32/main/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/temperature-measurement-app/esp32/main/gen/command-id.h b/examples/temperature-measurement-app/esp32/main/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/command-id.h +++ b/examples/temperature-measurement-app/esp32/main/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/temperature-measurement-app/esp32/main/gen/enums.h b/examples/temperature-measurement-app/esp32/main/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/enums.h +++ b/examples/temperature-measurement-app/esp32/main/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/temperature-measurement-app/esp32/main/gen/print-cluster.h b/examples/temperature-measurement-app/esp32/main/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/temperature-measurement-app/esp32/main/gen/print-cluster.h +++ b/examples/temperature-measurement-app/esp32/main/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/tv-app/tv-common/gen/attribute-id.h b/examples/tv-app/tv-common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/tv-app/tv-common/gen/attribute-id.h +++ b/examples/tv-app/tv-common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/tv-app/tv-common/gen/client-command-macro.h b/examples/tv-app/tv-common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/tv-app/tv-common/gen/client-command-macro.h +++ b/examples/tv-app/tv-common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/tv-app/tv-common/gen/cluster-id.h b/examples/tv-app/tv-common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/tv-app/tv-common/gen/cluster-id.h +++ b/examples/tv-app/tv-common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/tv-app/tv-common/gen/command-id.h b/examples/tv-app/tv-common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/tv-app/tv-common/gen/command-id.h +++ b/examples/tv-app/tv-common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/tv-app/tv-common/gen/endpoint_config.h b/examples/tv-app/tv-common/gen/endpoint_config.h index 4deef9baef51f0..6c62cfe51f0873 100644 --- a/examples/tv-app/tv-common/gen/endpoint_config.h +++ b/examples/tv-app/tv-common/gen/endpoint_config.h @@ -334,44 +334,44 @@ #define GENERATED_ATTRIBUTE_COUNT 149 #define GENERATED_ATTRIBUTES \ { \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Media Playback (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Media Playback (server): current state */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Content Launch (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(3) }, /* Level Control (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* Level Control (server): current level */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Content Launch (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ + { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ + { 0x0000, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Media Playback (server): current state */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Media Playback (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Content Launch (server): cluster revision */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(2) }, /* On/off (server): cluster revision */ \ + { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* On/off (server): on/off */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(3) }, /* Level Control (server): cluster revision */ \ + { 0x0000, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0x00) }, /* Level Control (server): current level */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Content Launch (server): cluster revision */ \ { 0x0000, ZAP_TYPE(CHAR_STRING), 32, 0, ZAP_LONG_DEFAULTS_INDEX(0) }, /* Application Basic (server): vendor name */ \ { 0x0001, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): vendor id */ \ { 0x0002, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(32) }, /* Application Basic (server): application name */ \ - { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ - { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(64) }, /* Application Basic (server): application id */ \ - { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ - { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ + ZAP_LONG_DEFAULTS_INDEX(32) }, /* Application Basic (server): application name */ \ + { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ + { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ + ZAP_LONG_DEFAULTS_INDEX(64) }, /* Application Basic (server): application id */ \ + { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ + { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ { 0x0000, ZAP_TYPE(CHAR_STRING), 32, 0, ZAP_LONG_DEFAULTS_INDEX(96) }, /* Application Basic (server): vendor name */ \ { 0x0001, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): vendor id */ \ { 0x0002, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(128) }, /* Application Basic (server): application name */ \ - { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + ZAP_LONG_DEFAULTS_INDEX(128) }, /* Application Basic (server): application name */ \ + { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ ZAP_LONG_DEFAULTS_INDEX(160) }, /* Application Basic (server): application id */ \ { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Content Launch (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ { 0x0000, ZAP_TYPE(CHAR_STRING), 32, 0, ZAP_LONG_DEFAULTS_INDEX(192) }, /* Application Basic (server): vendor name */ \ { 0x0001, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): vendor id */ \ { 0x0002, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(224) }, /* Application Basic (server): application name */ \ - { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + ZAP_LONG_DEFAULTS_INDEX(224) }, /* Application Basic (server): application name */ \ + { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ ZAP_LONG_DEFAULTS_INDEX(256) }, /* Application Basic (server): application id */ \ { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ @@ -412,11 +412,11 @@ { 0x0009, ZAP_TYPE(INT32U), 4, ZAP_ATTRIBUTE_MASK(SINGLETON), \ ZAP_LONG_DEFAULTS_INDEX(464) }, /* Basic (server): SoftwareVersion */ \ { 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), \ - ZAP_LONG_DEFAULTS_INDEX(468) }, /* Basic (server): SoftwareVersionString */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* General Commissioning (server): cluster revision */ \ + ZAP_LONG_DEFAULTS_INDEX(468) }, /* Basic (server): SoftwareVersionString */ \ { 0x0000, ZAP_TYPE(OCTET_STRING), 8, 0, ZAP_LONG_DEFAULTS_INDEX(532) }, /* General Commissioning (server): FabricId */ \ { 0x0001, ZAP_TYPE(INT64U), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), \ ZAP_LONG_DEFAULTS_INDEX(540) }, /* General Commissioning (server): Breadcrumb */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* General Commissioning (server): cluster revision */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Network Commissioning (server): cluster revision */ \ { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(3) }, /* Door Lock (server): cluster revision */ \ { 0x0000, ZAP_TYPE(ENUM8), 1, 0, ZAP_EMPTY_DEFAULT() }, /* Door Lock (server): lock state */ \ @@ -504,23 +504,23 @@ { 0x0001, ZAP_TYPE(ENUM16), 2, 0, ZAP_EMPTY_DEFAULT() }, /* IAS Zone (server): zone type */ \ { 0x0002, ZAP_TYPE(BITMAP16), 2, 0, ZAP_SIMPLE_DEFAULT(0x0000) }, /* IAS Zone (server): zone status */ \ { 0x0010, ZAP_TYPE(IEEE_ADDRESS), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), \ - ZAP_LONG_DEFAULTS_INDEX(802) }, /* IAS Zone (server): IAS CIE address */ \ - { 0x0011, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xff) }, /* IAS Zone (server): Zone ID */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ + ZAP_LONG_DEFAULTS_INDEX(802) }, /* IAS Zone (server): IAS CIE address */ \ + { 0x0011, ZAP_TYPE(INT8U), 1, 0, ZAP_SIMPLE_DEFAULT(0xff) }, /* IAS Zone (server): Zone ID */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Low Power (server): cluster revision */ \ { 0x0000, ZAP_TYPE(CHAR_STRING), 32, 0, ZAP_LONG_DEFAULTS_INDEX(810) }, /* Application Basic (server): vendor name */ \ { 0x0001, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): vendor id */ \ { 0x0002, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(842) }, /* Application Basic (server): application name */ \ - { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + ZAP_LONG_DEFAULTS_INDEX(842) }, /* Application Basic (server): application name */ \ + { 0x0003, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): product id */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Application Basic (server): cluster revision */ \ { 0x0005, ZAP_TYPE(CHAR_STRING), 32, 0, \ - ZAP_LONG_DEFAULTS_INDEX(874) }, /* Application Basic (server): application id */ \ - { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ - { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Binding (server): cluster revision */ \ - { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Group Key Management (server): cluster revision */ \ - { 0x0000, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(906) }, /* Group Key Management (server): groups */ \ + ZAP_LONG_DEFAULTS_INDEX(874) }, /* Application Basic (server): application id */ \ + { 0x0006, ZAP_TYPE(INT16U), 2, 0, ZAP_EMPTY_DEFAULT() }, /* Application Basic (server): catalog vendor id */ \ + { 0x0007, ZAP_TYPE(ENUM8), 1, 0, ZAP_SIMPLE_DEFAULT(0x01) }, /* Application Basic (server): application satus */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Binding (server): cluster revision */ \ + { 0x0000, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(906) }, /* Group Key Management (server): groups */ \ { 0x0001, ZAP_TYPE(ARRAY), 254, 0, ZAP_LONG_DEFAULTS_INDEX(1160) }, /* Group Key Management (server): group keys */ \ + { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, ZAP_SIMPLE_DEFAULT(0x0001) }, /* Group Key Management (server): cluster revision */ \ } // This is an array of EmberAfCluster structures. diff --git a/examples/tv-app/tv-common/gen/enums.h b/examples/tv-app/tv-common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/tv-app/tv-common/gen/enums.h +++ b/examples/tv-app/tv-common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/tv-app/tv-common/gen/print-cluster.h b/examples/tv-app/tv-common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/tv-app/tv-common/gen/print-cluster.h +++ b/examples/tv-app/tv-common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/examples/window-app/common/gen/attribute-id.h b/examples/window-app/common/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/examples/window-app/common/gen/attribute-id.h +++ b/examples/window-app/common/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/examples/window-app/common/gen/client-command-macro.h b/examples/window-app/common/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/examples/window-app/common/gen/client-command-macro.h +++ b/examples/window-app/common/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/examples/window-app/common/gen/cluster-id.h b/examples/window-app/common/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/examples/window-app/common/gen/cluster-id.h +++ b/examples/window-app/common/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/examples/window-app/common/gen/command-id.h b/examples/window-app/common/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/examples/window-app/common/gen/command-id.h +++ b/examples/window-app/common/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/examples/window-app/common/gen/enums.h b/examples/window-app/common/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/examples/window-app/common/gen/enums.h +++ b/examples/window-app/common/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/examples/window-app/common/gen/print-cluster.h b/examples/window-app/common/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/examples/window-app/common/gen/print-cluster.h +++ b/examples/window-app/common/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/src/app/clusters/ota-server/ota-server.cpp b/src/app/clusters/ota-server/ota-server.cpp new file mode 100644 index 00000000000000..38c9d43fa8c8ce --- /dev/null +++ b/src/app/clusters/ota-server/ota-server.cpp @@ -0,0 +1,82 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace chip; + +// TODO: all callbacks need implementations + +/** + * @brief OTA Software Update Server Cluster ApplyUpdateRequest Command callback + * + * @param updateToken Identifier for the Software Image to be applied. Should be 32 octets long. + * @param newVersion The SoftwareVersion value of the new Software Image that the client is ready to apply. + */ + +bool emberAfOtaSoftwareUpdateServerClusterApplyUpdateRequestCallback(chip::ByteSpan updateToken, uint32_t newVersion) +{ + return false; +} + +/** + * @brief OTA Software Update Server Cluster NotifyUpdateApplied Command callback + * + * @param updateToken Identifier for the Software Image that was applied. Should be 32 octets long. + * @param currentVersion The current SoftwareVersion value. Should match the SoftwarVersion attribute in the + * OTA Client's Basic Information Cluster. + */ + +bool emberAfOtaSoftwareUpdateServerClusterNotifyUpdateAppliedCallback(chip::ByteSpan updateToken, uint32_t currentVersion) +{ + return false; +} + +/** + * @brief OTA Software Update Server Cluster QueryImage Command callback + * + * @param vendorId The Vendor ID applying to the OTA Client’s Node. Should match the value in the Basic Information Cluster. + * @param productId The Product ID applying to the OTA Client’s Node. Should match the value in the Basic Information Cluster. + * @param imageType A Vendor-specific numerical value that may help an OTA Server select the correct payload. + * @param hardwareVersion The OTA Client’s hardware version. Should match the HardwareVersion attribute of the Client's Basic + * Information Cluster. + * @param currentVersion The current version running on the OTA Client. Should match the SoftwareVersion attribute of the Client's + * Basic Information Cluster. + * @param protocolsSupported A list of OTADownloadProtocol enum values indicating download protocols supported by the OTA Client + * (max length 8 entries). + * @param location Optional, 2 chars. If present, it should match the Location value in the Client's Basic Information Cluster. + * @param clientCanConsent Optional. May be set by an OTA Client which is capable of obtaining user consent for OTA application. + * @param metadataForServer Optional, max 512 octets. A TLV-encoded Vendor-specific payload. + */ + +bool emberAfOtaSoftwareUpdateServerClusterQueryImageCallback( + uint16_t vendorId, uint16_t productId, uint16_t imageType, uint16_t hardwareVersion, uint32_t currentVersion, + /* TYPE WARNING: array array defaults to */ uint8_t * protocolsSupported, uint8_t * location, uint8_t clientCanConsent, + chip::ByteSpan metadataForServer) +{ + return false; +} diff --git a/src/app/zap-templates/zcl/chip-ota.xml b/src/app/zap-templates/zcl/chip-ota.xml new file mode 100644 index 00000000000000..f7b784d8fd8fe9 --- /dev/null +++ b/src/app/zap-templates/zcl/chip-ota.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + OTA Software Update Server + CHIP + + 0x0029 + OTA_SERVER_CLUSTER + true + true + + Determine availability of a new Software Image + + + + + + + + + + + + Determine next action to take for a new Software Image + + + + + Notify OTA Server that an update was applied + + + + + Response to QueryImage command + + + + + + + + + + Reponse to ApplyUpdateRequest command + + + + + + + + + + + OTA Software Update Client + CHIP + TODO + 0x002a + OTA_CLIENT_CLUSTER + true + true + default ota server + update possible + + Notify OTA Server that an update was applied + + + + + + + diff --git a/src/app/zap-templates/zcl/zcl.json b/src/app/zap-templates/zcl/zcl.json index fc2e28e7899a1e..dc1d5539b5a308 100644 --- a/src/app/zap-templates/zcl/zcl.json +++ b/src/app/zap-templates/zcl/zcl.json @@ -44,7 +44,8 @@ "wwah-silabs.xml", "wwah-silabs-devices.xml", "sample-extensions.xml", - "commissioning.xml" + "commissioning.xml", + "chip-ota.xml" ], "manufacturersXml": "../../../../third_party/zap/repo/zcl-builtin/shared/manufacturers.xml", "options": { diff --git a/src/controller/python/gen/attribute-id.h b/src/controller/python/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/src/controller/python/gen/attribute-id.h +++ b/src/controller/python/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/src/controller/python/gen/client-command-macro.h b/src/controller/python/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/src/controller/python/gen/client-command-macro.h +++ b/src/controller/python/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/src/controller/python/gen/cluster-id.h b/src/controller/python/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/src/controller/python/gen/cluster-id.h +++ b/src/controller/python/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/src/controller/python/gen/command-id.h b/src/controller/python/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/src/controller/python/gen/command-id.h +++ b/src/controller/python/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/src/controller/python/gen/enums.h b/src/controller/python/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/src/controller/python/gen/enums.h +++ b/src/controller/python/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/src/controller/python/gen/print-cluster.h b/src/controller/python/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/src/controller/python/gen/print-cluster.h +++ b/src/controller/python/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \ diff --git a/src/darwin/Framework/CHIP/gen/attribute-id.h b/src/darwin/Framework/CHIP/gen/attribute-id.h index 2b45ff436b89eb..61c5325d18e631 100644 --- a/src/darwin/Framework/CHIP/gen/attribute-id.h +++ b/src/darwin/Framework/CHIP/gen/attribute-id.h @@ -393,6 +393,20 @@ #define ZCL_SERIAL_NUMBER_ATTRIBUTE_ID (0x000F) #define ZCL_LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID (0x0010) +// Attribute ids for cluster: OTA Software Update Server + +// Client attributes + +// Server attributes + +// Attribute ids for cluster: OTA Software Update Client + +// Client attributes +#define ZCL_DEFAULT_OTA_SERVER_ATTRIBUTE_ID (0x0000) +#define ZCL_UPDATE_POSSIBLE_ATTRIBUTE_ID (0x0001) + +// Server attributes + // Attribute ids for cluster: General Commissioning // Client attributes diff --git a/src/darwin/Framework/CHIP/gen/client-command-macro.h b/src/darwin/Framework/CHIP/gen/client-command-macro.h index e74766c68362e2..deb068044bed0e 100644 --- a/src/darwin/Framework/CHIP/gen/client-command-macro.h +++ b/src/darwin/Framework/CHIP/gen/client-command-macro.h @@ -1813,6 +1813,99 @@ \ ZCL_LEAVE_COMMAND_ID, "", ); +/** @brief Command description for QueryImage + * + * Command: QueryImage + * @param vendorId INT16U + * @param productId INT16U + * @param imageType INT16U + * @param hardwareVersion INT16U + * @param currentVersion INT32U + * @param protocolsSupported OTADownloadProtocol [] + * @param protocolsSupportedLen int + * @param location CHAR_STRING + * @param clientCanConsent BOOLEAN + * @param metadataForServer OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImage(vendorId, productId, imageType, hardwareVersion, currentVersion, protocolsSupported, \ + protocolsSupportedLen, location, clientCanConsent, metadataForServer) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_COMMAND_ID, "uuuuubuuu", vendorId, productId, imageType, hardwareVersion, \ + currentVersion, protocolsSupported, protocolsSupportedLen, location, clientCanConsent, \ + metadataForServer); + +/** @brief Command description for ApplyUpdateRequest + * + * Command: ApplyUpdateRequest + * @param updateToken OCTET_STRING + * @param newVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequest(updateToken, newVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID, "uu", updateToken, newVersion); + +/** @brief Command description for NotifyUpdateApplied + * + * Command: NotifyUpdateApplied + * @param updateToken OCTET_STRING + * @param currentVersion INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterNotifyUpdateApplied(updateToken, currentVersion) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID, "uu", updateToken, currentVersion); + +/** @brief Command description for QueryImageResponse + * + * Command: QueryImageResponse + * @param status OTAQueryStatus + * @param delayedActionTime INT32U + * @param imageURI CHAR_STRING + * @param softwareVersion INT32U + * @param updateToken OCTET_STRING + * @param userConsentNeeded BOOLEAN + * @param metadataForClient OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterQueryImageResponse(status, delayedActionTime, imageURI, softwareVersion, updateToken, \ + userConsentNeeded, metadataForClient) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID, "uuuuuuu", status, delayedActionTime, imageURI, \ + softwareVersion, updateToken, userConsentNeeded, metadataForClient); + +/** @brief Command description for ApplyUpdateRequestResponse + * + * Command: ApplyUpdateRequestResponse + * @param action OTAApplyUpdateAction + * @param delayedActionTime INT32U + */ +#define emberAfFillCommandOTA \ + Software Update ServerClusterApplyUpdateRequestResponse(action, delayedActionTime) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID, "uu", action, delayedActionTime); + +/** @brief Command description for AnnounceOtaServer + * + * Command: AnnounceOtaServer + * @param serverLocation OCTET_STRING + * @param vendorId INT16U + * @param announcementReason OTAAnnouncementReason + * @param metadataForNode OCTET_STRING + */ +#define emberAfFillCommandOTA \ + Software Update ClientClusterAnnounceOtaServer(serverLocation, vendorId, announcementReason, metadataForNode) \ + emberAfFillExternalBuffer(mask, \ + \ + ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID, "uuuu", serverLocation, vendorId, announcementReason, \ + metadataForNode); + /** @brief Command description for SetFabric * * Command: SetFabric diff --git a/src/darwin/Framework/CHIP/gen/cluster-id.h b/src/darwin/Framework/CHIP/gen/cluster-id.h index f98f199f5a522a..b1be293f6b967b 100644 --- a/src/darwin/Framework/CHIP/gen/cluster-id.h +++ b/src/darwin/Framework/CHIP/gen/cluster-id.h @@ -86,6 +86,12 @@ // Definitions for cluster: Basic #define ZCL_BASIC_CLUSTER_ID (0x0028) +// Definitions for cluster: OTA Software Update Server +#define ZCL_OTA_SERVER_CLUSTER_ID (0x0029) + +// Definitions for cluster: OTA Software Update Client +#define ZCL_OTA_CLIENT_CLUSTER_ID (0x002A) + // Definitions for cluster: General Commissioning #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030) diff --git a/src/darwin/Framework/CHIP/gen/command-id.h b/src/darwin/Framework/CHIP/gen/command-id.h index 6df1947fa80ac6..fae33f41f8d3a2 100644 --- a/src/darwin/Framework/CHIP/gen/command-id.h +++ b/src/darwin/Framework/CHIP/gen/command-id.h @@ -228,6 +228,16 @@ #define ZCL_SHUT_DOWN_COMMAND_ID (0x01) #define ZCL_LEAVE_COMMAND_ID (0x02) +// Commands for cluster: OTA Software Update Server +#define ZCL_QUERY_IMAGE_COMMAND_ID (0x00) +#define ZCL_APPLY_UPDATE_REQUEST_COMMAND_ID (0x01) +#define ZCL_NOTIFY_UPDATE_APPLIED_COMMAND_ID (0x02) +#define ZCL_QUERY_IMAGE_RESPONSE_COMMAND_ID (0x03) +#define ZCL_APPLY_UPDATE_REQUEST_RESPONSE_COMMAND_ID (0x04) + +// Commands for cluster: OTA Software Update Client +#define ZCL_ANNOUNCE_OTA_SERVER_COMMAND_ID (0x00) + // Commands for cluster: General Commissioning #define ZCL_SET_FABRIC_COMMAND_ID (0x00) #define ZCL_SET_FABRIC_RESPONSE_COMMAND_ID (0x01) diff --git a/src/darwin/Framework/CHIP/gen/enums.h b/src/darwin/Framework/CHIP/gen/enums.h index 94e3a5ce1e1c6e..87f10470fba2a3 100644 --- a/src/darwin/Framework/CHIP/gen/enums.h +++ b/src/darwin/Framework/CHIP/gen/enums.h @@ -2007,6 +2007,39 @@ typedef enum EMBER_ZCL_NOTIFICATION_SCHEME_PREDEFINED_NOTIFICATION_SCHEME_B = 2, } EmberAfNotificationScheme; +// Enum for OTAAnnouncementReason +typedef enum +{ + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_SIMPLE_ANNOUNCEMENT = 0, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_UPDATE_AVAILABLE = 1, + EMBER_ZCL_OTA_ANNOUNCEMENT_REASON_CRITICAL_UPDATE_AVAILABLE = 2, +} EmberAfOTAAnnouncementReason; + +// Enum for OTAApplyUpdateAction +typedef enum +{ + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_PROCEED = 0, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_AWAIT_NEXT_ACTION = 1, + EMBER_ZCL_OTA_APPLY_UPDATE_ACTION_DISCONTINUE = 2, +} EmberAfOTAApplyUpdateAction; + +// Enum for OTADownloadProtocol +typedef enum +{ + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_SYNCHRONOUS = 0, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_BDX_ASYNCHRONOUS = 1, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_HTTPS = 2, + EMBER_ZCL_OTA_DOWNLOAD_PROTOCOL_VENDOR_SPECIFIC = 3, +} EmberAfOTADownloadProtocol; + +// Enum for OTAQueryStatus +typedef enum +{ + EMBER_ZCL_OTA_QUERY_STATUS_UPDATE_AVAILABLE = 0, + EMBER_ZCL_OTA_QUERY_STATUS_BUSY = 1, + EMBER_ZCL_OTA_QUERY_STATUS_NOT_AVAILABLE = 2, +} EmberAfOTAQueryStatus; + // Enum for OccupancySensorType typedef enum { diff --git a/src/darwin/Framework/CHIP/gen/print-cluster.h b/src/darwin/Framework/CHIP/gen/print-cluster.h index dd27c7093aa488..49b2c3179b108b 100644 --- a/src/darwin/Framework/CHIP/gen/print-cluster.h +++ b/src/darwin/Framework/CHIP/gen/print-cluster.h @@ -156,6 +156,18 @@ #define CHIP_PRINTCLUSTER_BASIC_CLUSTER #endif +#if defined(ZCL_USING_OTA_SERVER_CLUSTER_SERVER) || defined(ZCL_USING_OTA_SERVER_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER { ZCL_OTA_SERVER_CLUSTER_ID, 41, "OTA Software Update Server" }, +#else +#define CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER +#endif + +#if defined(ZCL_USING_OTA_CLIENT_CLUSTER_SERVER) || defined(ZCL_USING_OTA_CLIENT_CLUSTER_CLIENT) +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER { ZCL_OTA_CLIENT_CLUSTER_ID, 42, "OTA Software Update Client" }, +#else +#define CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER +#endif + #if defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_GENERAL_COMMISSIONING_CLUSTER_CLIENT) #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER { ZCL_GENERAL_COMMISSIONING_CLUSTER_ID, 48, "General Commissioning" }, #else @@ -872,6 +884,8 @@ CHIP_PRINTCLUSTER_GREEN_POWER_CLUSTER \ CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER \ CHIP_PRINTCLUSTER_BASIC_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_SERVER_CLUSTER \ + CHIP_PRINTCLUSTER_OTA_CLIENT_CLUSTER \ CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER \ CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER \