Example #1
0
// 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);
}