// Cluster: Messaging, server EmberAfStatus emberAfMessagingClusterServerCommandParse(EmberAfClusterCommand *cmd) { boolean wasHandled = FALSE; if (!cmd->mfgSpecific) { switch (cmd->commandId) { case ZCL_GET_LAST_MESSAGE_COMMAND_ID: { // Command is fixed length: 0 wasHandled = emberAfMessagingClusterGetLastMessageCallback(); break; } case ZCL_MESSAGE_CONFIRMATION_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int32u messageId; // Ver.: always int32u confirmationTime; // Ver.: always int8u messageConfirmationControl; // Ver.: since se-1.2a-14-0256-03 int8u* messageResponse; // Ver.: since se-1.2a-14-0256-03 // Command is not a fixed length if (cmd->bufLen < payloadOffset + 4) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; messageId = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 4; if (cmd->bufLen < payloadOffset + 4) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; confirmationTime = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 4; if ( ( cmd->bufLen < payloadOffset + 1)) { // Argument is not always present: // - it is present only in versions higher than: se-1.2a-14-0256-03 messageConfirmationControl = 0xFF; } else { messageConfirmationControl = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 1; } if ( ( cmd->bufLen < payloadOffset + emberAfStringLength(cmd->buffer + payloadOffset) + 1)) { // Argument is not always present: // - it is present only in versions higher than: se-1.2a-14-0256-03 messageResponse = NULL; } else { messageResponse = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); } wasHandled = emberAfMessagingClusterMessageConfirmationCallback(messageId, confirmationTime, messageConfirmationControl, messageResponse); break; } } } return status(wasHandled, cmd->mfgSpecific); }
// Cluster: Scenes, server EmberAfStatus emberAfScenesClusterServerCommandParse(EmberAfClusterCommand *cmd) { boolean wasHandled = FALSE; if (!cmd->mfgSpecific) { switch (cmd->commandId) { case ZCL_ADD_SCENE_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u sceneId; // Ver.: always int16u transitionTime; // Ver.: always int8u* sceneName; // Ver.: always int8u* extensionFieldSets; // Ver.: always // Command is not a fixed length if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; if (cmd->bufLen < payloadOffset + 1) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 1; if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; if (cmd->bufLen < payloadOffset + emberAfStringLength(cmd->buffer + payloadOffset) + 1) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; sceneName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += emberAfStringLength(cmd->buffer + payloadOffset) + 1; extensionFieldSets = cmd->buffer + payloadOffset; wasHandled = emberAfScenesClusterAddSceneCallback(groupId, sceneId, transitionTime, sceneName, extensionFieldSets); break; } case ZCL_VIEW_SCENE_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u sceneId; // Ver.: always // Command is fixed length: 3 if (cmd->bufLen < payloadOffset + 3) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterViewSceneCallback(groupId, sceneId); break; } case ZCL_REMOVE_SCENE_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u sceneId; // Ver.: always // Command is fixed length: 3 if (cmd->bufLen < payloadOffset + 3) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterRemoveSceneCallback(groupId, sceneId); break; } case ZCL_REMOVE_ALL_SCENES_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always // Command is fixed length: 2 if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterRemoveAllScenesCallback(groupId); break; } case ZCL_STORE_SCENE_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u sceneId; // Ver.: always // Command is fixed length: 3 if (cmd->bufLen < payloadOffset + 3) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterStoreSceneCallback(groupId, sceneId); break; } case ZCL_RECALL_SCENE_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u sceneId; // Ver.: always // Command is fixed length: 3 if (cmd->bufLen < payloadOffset + 3) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; sceneId = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterRecallSceneCallback(groupId, sceneId); break; } case ZCL_GET_SCENE_MEMBERSHIP_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always // Command is fixed length: 2 if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfScenesClusterGetSceneMembershipCallback( groupId); break; } } } return status(wasHandled, cmd->mfgSpecific); }
// Cluster: Groups, server EmberAfStatus emberAfGroupsClusterServerCommandParse(EmberAfClusterCommand *cmd) { boolean wasHandled = FALSE; if (!cmd->mfgSpecific) { switch (cmd->commandId) { case ZCL_ADD_GROUP_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u* groupName; // Ver.: always // Command is not a fixed length if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; if (cmd->bufLen < payloadOffset + emberAfStringLength(cmd->buffer + payloadOffset) + 1) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfGroupsClusterAddGroupCallback(groupId, groupName); break; } case ZCL_VIEW_GROUP_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always // Command is fixed length: 2 if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfGroupsClusterViewGroupCallback(groupId); break; } case ZCL_GET_GROUP_MEMBERSHIP_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int8u groupCount; // Ver.: always int8u* groupList; // Ver.: always // Command is fixed length: 1 if (cmd->bufLen < payloadOffset + 1) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupCount = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 1; groupList = cmd->buffer + payloadOffset; wasHandled = emberAfGroupsClusterGetGroupMembershipCallback( groupCount, groupList); break; } case ZCL_REMOVE_GROUP_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always // Command is fixed length: 2 if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfGroupsClusterRemoveGroupCallback(groupId); break; } case ZCL_REMOVE_ALL_GROUPS_COMMAND_ID: { // Command is fixed length: 0 wasHandled = emberAfGroupsClusterRemoveAllGroupsCallback(); break; } case ZCL_ADD_GROUP_IF_IDENTIFYING_COMMAND_ID: { int16u payloadOffset = cmd->payloadStartIndex; int16u groupId; // Ver.: always int8u* groupName; // Ver.: always // Command is not a fixed length if (cmd->bufLen < payloadOffset + 2) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupId = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen); payloadOffset += 2; if (cmd->bufLen < payloadOffset + emberAfStringLength(cmd->buffer + payloadOffset) + 1) return EMBER_ZCL_STATUS_MALFORMED_COMMAND; groupName = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen); wasHandled = emberAfGroupsClusterAddGroupIfIdentifyingCallback( groupId, groupName); break; } } } return status(wasHandled, cmd->mfgSpecific); }