-
Notifications
You must be signed in to change notification settings - Fork 84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Codegen instability and non-determinism #342
Labels
high priority
Tag that shows this as higher priority as other issues.
matter
Important to Matter SDK
V1.0
Comments
Some steps to reproduce for the most recent example:
|
Here's my steps to reproduce:
Resulting diff (files):
Diff: diff --git a/zzz_generated/lighting-app/zap-generated/CHIPClusters.cpp b/zzz_generated/lighting-app/zap-generated/CHIPClusters.cpp
index ba1cdf93c..cff1f4823 100644
--- a/zzz_generated/lighting-app/zap-generated/CHIPClusters.cpp
+++ b/zzz_generated/lighting-app/zap-generated/CHIPClusters.cpp
@@ -187,6 +187,246 @@ exit:
// OtaSoftwareUpdateProvider Cluster Attributes
// OnOff Cluster Commands
+CHIP_ERROR OnOffCluster::Off(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::Off::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ // Command takes no arguments.
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
+CHIP_ERROR OnOffCluster::OffWithEffect(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
+ uint8_t effectId, uint8_t effectVariant)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::OffWithEffect::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ VerifyOrExit((writer = sender->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
+ // effectId: onOffEffectIdentifier
+ SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), effectId));
+ // effectVariant: onOffDelayedAllOffEffectVariant
+ SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), effectVariant));
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
+CHIP_ERROR OnOffCluster::On(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::On::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ // Command takes no arguments.
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
+CHIP_ERROR OnOffCluster::OnWithRecallGlobalScene(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::OnWithRecallGlobalScene::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ // Command takes no arguments.
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
+CHIP_ERROR OnOffCluster::OnWithTimedOff(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
+ uint8_t onOffControl, uint16_t onTime, uint16_t offWaitTime)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::OnWithTimedOff::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ VerifyOrExit((writer = sender->GetCommandDataIBTLVWriter()) != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
+ // onOffControl: onOffControl
+ SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), onOffControl));
+ // onTime: int16u
+ SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), onTime));
+ // offWaitTime: int16u
+ SuccessOrExit(err = writer->Put(TLV::ContextTag(argSeqNumber++), offWaitTime));
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
+CHIP_ERROR OnOffCluster::Toggle(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ TLV::TLVWriter * writer = nullptr;
+ uint8_t argSeqNumber = 0;
+
+ // Used when encoding non-empty command. Suppress error message when encoding empty commands.
+ (void) writer;
+ (void) argSeqNumber;
+
+ VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
+
+ app::CommandPathParams cmdParams = { mEndpoint, /* group id */ 0, mClusterId, OnOff::Commands::Toggle::Id,
+ (app::CommandPathFlags::kEndpointIdValid) };
+
+ CommandSenderHandle sender(
+ Platform::New<app::CommandSender>(mDevice->GetInteractionModelDelegate(), mDevice->GetExchangeManager()));
+
+ VerifyOrReturnError(sender != nullptr, CHIP_ERROR_NO_MEMORY);
+
+ SuccessOrExit(err = sender->PrepareCommand(cmdParams));
+
+ // Command takes no arguments.
+
+ SuccessOrExit(err = sender->FinishCommand());
+
+ // #6308: This is a temporary solution before we fully support IM on application side and should be replaced by IMDelegate.
+ mDevice->AddIMResponseHandler(sender.get(), onSuccessCallback, onFailureCallback);
+
+ SuccessOrExit(err = mDevice->SendCommands(sender.get()));
+
+ // We have successfully sent the command, and the callback handler will be responsible to free the object, release the object
+ // now.
+ sender.release();
+exit:
+ return err;
+}
+
// OnOff Cluster Attributes
CHIP_ERROR OnOffCluster::SubscribeAttributeOnOff(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
uint16_t minInterval, uint16_t maxInterval)
diff --git a/zzz_generated/lighting-app/zap-generated/CHIPClusters.h b/zzz_generated/lighting-app/zap-generated/CHIPClusters.h
index 08c9d3509..4698783a1 100644
--- a/zzz_generated/lighting-app/zap-generated/CHIPClusters.h
+++ b/zzz_generated/lighting-app/zap-generated/CHIPClusters.h
@@ -57,6 +57,16 @@ public:
OnOffCluster() : ClusterBase(app::Clusters::OnOff::Id) {}
~OnOffCluster() {}
+ // Cluster Commands
+ CHIP_ERROR Off(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback);
+ CHIP_ERROR OffWithEffect(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback, uint8_t effectId,
+ uint8_t effectVariant);
+ CHIP_ERROR On(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback);
+ CHIP_ERROR OnWithRecallGlobalScene(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback);
+ CHIP_ERROR OnWithTimedOff(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
+ uint8_t onOffControl, uint16_t onTime, uint16_t offWaitTime);
+ CHIP_ERROR Toggle(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback);
+
// Cluster Attributes
CHIP_ERROR SubscribeAttributeOnOff(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
uint16_t minInterval, uint16_t maxInterval);
@@ -80,6 +90,8 @@ public:
CHIP_ERROR SubscribeAttributeClusterRevision(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback,
uint16_t minInterval, uint16_t maxInterval);
CHIP_ERROR ReportAttributeClusterRevision(Callback::Cancelable * onReportCallback);
+
+private:
};
} // namespace Controller
diff --git a/zzz_generated/lighting-app/zap-generated/IMClusterCommandHandler.cpp b/zzz_generated/lighting-app/zap-generated/IMClusterCommandHandler.cpp
index 6e9b21e99..08bede60e 100644
--- a/zzz_generated/lighting-app/zap-generated/IMClusterCommandHandler.cpp
+++ b/zzz_generated/lighting-app/zap-generated/IMClusterCommandHandler.cpp
@@ -904,82 +904,7 @@ namespace OnOff {
void DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, TLV::TLVReader & aDataTlv)
{
- // 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.
- // The following variables are used for all commands to save code size.
- CHIP_ERROR TLVError = CHIP_NO_ERROR;
- bool wasHandled = false;
- {
- switch (aCommandPath.mCommandId)
- {
- case Commands::Off::Id: {
- Commands::Off::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterOffCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- case Commands::OffWithEffect::Id: {
- Commands::OffWithEffect::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterOffWithEffectCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- case Commands::On::Id: {
- Commands::On::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterOnCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- case Commands::OnWithRecallGlobalScene::Id: {
- Commands::OnWithRecallGlobalScene::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterOnWithRecallGlobalSceneCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- case Commands::OnWithTimedOff::Id: {
- Commands::OnWithTimedOff::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterOnWithTimedOffCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- case Commands::Toggle::Id: {
- Commands::Toggle::DecodableType commandData;
- TLVError = DataModel::Decode(aDataTlv, commandData);
- if (TLVError == CHIP_NO_ERROR)
- {
- wasHandled = emberAfOnOffClusterToggleCallback(apCommandObj, aCommandPath, commandData);
- }
- break;
- }
- default: {
- // Unrecognized command ID, error status will apply.
- ReportCommandUnsupported(apCommandObj, aCommandPath);
- return;
- }
- }
- }
-
- if (CHIP_NO_ERROR != TLVError || !wasHandled)
- {
- apCommandObj->AddStatus(aCommandPath, Protocols::InteractionModel::Status::InvalidCommand);
- ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format());
- }
+ ReportCommandUnsupported(apCommandObj, aCommandPath);
}
} // namespace OnOff |
brdandu
added a commit
to brdandu/zap
that referenced
this issue
Jan 24, 2022
brdandu
added a commit
to brdandu/zap
that referenced
this issue
Jan 24, 2022
Resolved in project-chip/connectedhomeip#14708 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
high priority
Tag that shows this as higher priority as other issues.
matter
Important to Matter SDK
V1.0
Once and for all, weed out all non-determinism from zap.
Observations so far:
The text was updated successfully, but these errors were encountered: