Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*****************************************************************************
- *
- * MODULE: Window Covering Cluster
- *
- * COMPONENT: WindowCoveringCommandHandler.c
- *
- * AUTHOR: Vesa 'ISO-B' Ylikyl?
- * DESCRIPTION: Message event handler functions
- *
- * $HeadURL: $
- *
- * $Revision: 1 $
- *
- * $LastChangedBy: isob $
- *
- * $LastChangedDate: 2019-01-19 12:00:00 +0200 (Sat, 19 Jan 2018) $
- *
- * $Id: WindowCoveringCommandHandler.c 1 2019-01-19 10:00:00Z isob $
- *
- ****************************************************************************/
- /****************************************************************************/
- /*** Include files ***/
- /****************************************************************************/
- #include <jendefs.h>
- #include <string.h>
- #include "zcl.h"
- #include "zcl_customcommand.h"
- #include "WindowCovering.h"
- #include "WindowCovering_internal.h"
- #include "zcl_options.h"
- #include "dbg.h"
- #ifdef DEBUG_CLD_WINDOWCOVERING
- #define TRACE_WINDOWCOVERING TRUE
- #else
- #define TRACE_WINDOWCOVERING FALSE
- #endif
- /****************************************************************************/
- /*** Macro Definitions ***/
- /****************************************************************************/
- // 2019.6.1 TrungTQ DEL
- // #if defined(CLD_WINDOWCOVERING) && !defined(WINDOWCOVERING_CLIENT)
- // #error You Must Have WINDOWCOVERING_CLIENT defined in zcl_options.h
- // #endif
- // #ifdef WINDOWCOVERING_SERVER
- // #error ZiGate does not support Window Covering Server Cluster
- // #endif
- // We will support WINDOWCOVERING_SERVER
- // 2019.6.1 TrungTQ END
- /****************************************************************************/
- /*** Type Definitions ***/
- /****************************************************************************/
- /****************************************************************************/
- /*** Local Function Prototypes ***/
- /****************************************************************************/
- // 2019.06.06 TrungTQ ADD
- #ifdef WINDOWCOVERING_SERVER
- PRIVATE teZCL_Status eCLD_WindowCoveringHandleOpenCloseStopRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- );
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
- PRIVATE teZCL_Status eCLD_WindowCoveringHandleGotoValueRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- );
- #endif /* */
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
- PRIVATE teZCL_Status eCLD_WindowCoveringHandleGotoPercentageRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- );
- #endif /* */
- #endif /* WINDOWCOVERING_SERVER */
- // 2019.06.06 TrungTQ END
- /****************************************************************************/
- /*** Exported Variables ***/
- /****************************************************************************/
- /****************************************************************************/
- /*** Local Variables ***/
- /****************************************************************************/
- /****************************************************************************/
- /*** Public Functions ***/
- /****************************************************************************/
- /****************************************************************************
- **
- ** NAME: eCLD_WindowCoveringCommandHandler
- **
- ** DESCRIPTION:
- ** Handles Message Cluster custom commands
- **
- ** PARAMETERS: Name Usage
- ** ZPS_tsAfEvent *pZPSevent Zigbee stack event structure
- ** tsZCL_EndPointDefinition *psEndPointDefinition EP structure
- ** tsZCL_ClusterInstance *psClusterInstance Cluster structure
- **
- ** RETURN:
- ** teZCL_Status
- **
- ****************************************************************************/
- PUBLIC teZCL_Status eCLD_WindowCoveringCommandHandler(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance
- ) {
- teZCL_Status eStatus = E_ZCL_SUCCESS;
- tsZCL_HeaderParams sZCL_HeaderParams;
- tsCLD_WindowCoveringCustomDataStructure *psCommon;
- /* Get pointer to custom data structure */
- psCommon = (tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
- // further error checking can only be done once we have interrogated the ZCL payload
- u16ZCL_ReadCommandHeader(pZPSevent->uEvent.sApsDataIndEvent.hAPduInst,
- &sZCL_HeaderParams);
- // get EP mutex
- #ifndef COOPERATIVE
- eZCL_GetMutex(psEndPointDefinition);
- #endif /* COOPERATIVE */
- /* fill in callback event structure */
- eZCL_SetCustomCallBackEvent(
- &psCommon->sCustomCallBackEvent,
- pZPSevent,
- sZCL_HeaderParams.u8TransactionSequenceNumber,
- psEndPointDefinition->u8EndPointNumber);
- /* Fill in message */
- psCommon->sCallBackMessage.u8CommandId = sZCL_HeaderParams.u8CommandIdentifier;
- // 2019.6.1 TrungTQ ADD
- #ifdef WINDOWCOVERING_SERVER
- if (psClusterInstance->bIsServer) {
- switch (sZCL_HeaderParams.u8CommandIdentifier) {
- case E_CLD_WINDOWCOVERING_CMD_UP_OPEN:
- case E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE:
- case E_CLD_WINDOWCOVERING_CMD_STOP:
- eStatus = eCLD_WindowCoveringHandleOpenCloseStopRequest(
- pZPSevent,
- psEndPointDefinition,
- psClusterInstance,
- sZCL_HeaderParams.u8CommandIdentifier);
- break;
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
- case E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE:
- case E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_VALUE:
- eStatus = eCLD_WindowCoveringHandleGotoValueRequest(
- pZPSevent,
- psEndPointDefinition,
- psClusterInstance,
- sZCL_HeaderParams.u8CommandIdentifier);
- break;
- #endif /* */
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
- case E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE:
- case E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_PERCENTAGE:
- eStatus = eCLD_WindowCoveringHandleGotoPercentageRequest(
- pZPSevent,
- psEndPointDefinition,
- psClusterInstance,
- sZCL_HeaderParams.u8CommandIdentifier);
- break;
- #endif /* */
- default:
- #ifndef COOPERATIVE
- eZCL_ReleaseMutex(psEndPointDefinition);
- #endif
- return (E_ZCL_ERR_CUSTOM_COMMAND_HANDLER_NULL_OR_RETURNED_ERROR);
- }
- }
- // 2019.6.1 TrungTQ END
- // 2019.06.01 TrungTQ DEL
- // return (E_ZCL_ERR_CUSTOM_COMMAND_HANDLER_NULL_OR_RETURNED_ERROR);
- // 2019.06.01 TrungTQ END
- // unlock
- #ifndef COOPERATIVE
- eZCL_ReleaseMutex(psEndPointDefinition);
- #endif /* COOPERATIVE */
- // 2019.06.06 TrungTQ ADD
- if ((eStatus == E_ZCL_SUCCESS) && !(sZCL_HeaderParams.bDisableDefaultResponse)) {
- eZCL_SendDefaultResponse(pZPSevent, E_ZCL_CMDS_SUCCESS);
- }
- // 2019.06.06 TrungTQ END
- #endif /* WINDOWCOVERING_SERVER */
- // delete the i/p buffer on return
- return (eStatus);
- }
- /****************************************************************************/
- /*** Private Functions ***/
- /****************************************************************************/
- #ifdef WINDOWCOVERING_SERVER
- teZCL_Status eCLD_WindowCoveringHandleOpenCloseStopRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- ) {
- teZCL_Status eStatus;
- uint8 u8TransactionSequenceNumber;
- tsCLD_WindowCoveringCustomDataStructure *psCommon =(tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
- tsCLD_WindowCoveringCallBackMessage sWindowCoveringCallBackMessage;
- eStatus = eCLD_WindowCoveringCommandOpenCLoseStopRequestReceive(
- pZPSevent,
- &u8TransactionSequenceNumber);
- if (E_ZCL_SUCCESS != eStatus) {
- return eStatus;
- }
- /* Fill callback Event */
- psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&sWindowCoveringCallBackMessage;
- psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
- /* Fill message */
- sWindowCoveringCallBackMessage.u8CommandId = u8CommandIdentifier;
- /* Fill in transition details */
- psCommon->sTransition.eTransition =
- (E_CLD_WINDOWCOVERING_CMD_UP_OPEN == u8CommandIdentifier) ? E_CLD_WINDOWCOVERING_TRANSITION_UP_OPEN :
- (E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE == u8CommandIdentifier) ? E_CLD_WINDOWCOVERING_TRANSITION_DOWN_CLOSE :
- (E_CLD_WINDOWCOVERING_TRANSITION_STOP == u8CommandIdentifier) ? E_CLD_WINDOWCOVERING_TRANSITION_STOP :
- E_CLD_WINDOWCOVERING_TRANSITION_NONE;
- psCommon->sTransition.u8TargetPositionPercentage =
- (E_CLD_WINDOWCOVERING_CMD_UP_OPEN == u8CommandIdentifier) ? CLD_WINDOWCOVERING_POSITION_PERCENTAGE_MAX :
- (E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE == u8CommandIdentifier) ? CLD_WINDOWCOVERING_POSITION_PERCENTAGE_MIN : 0xFF;
- /* call callback */
- psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
- return (E_ZCL_SUCCESS);
- }
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
- teZCL_Status eCLD_WindowCoveringHandleGotoValueRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- ) {
- teZCL_Status eStatus;
- uint8 u8TransactionSequenceNumber;
- tsCLD_WindowCovering_GoToValueRequestPayload sPayload = { 0 };
- tsCLD_WindowCovering *psSharedStruct = (tsCLD_WindowCovering *)psClusterInstance->pvEndPointSharedStructPtr;
- tsCLD_WindowCoveringCustomDataStructure *psCommon =(tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
- tsCLD_WindowCoveringCallBackMessage sWindowCoveringCallBackMessage;
- eStatus = eCLD_WindowCoveringHandleGotoPercentageRequestReceive(
- pZPSevent,
- &u8TransactionSequenceNumber,
- &sPayload);
- if (E_ZCL_SUCCESS != eStatus) {
- return eStatus;
- }
- #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM
- if (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE == u8CommandIdentifier) {
- if ((sPayload.u16Value > psSharedStruct->u16InstalledOpenLimitLiftCm) ||
- (sPayload.u16Value < psSharedStruct->u16InstalledClosedLimitLiftCm)) {
- return (E_ZCL_ERR_INVALID_VALUE);
- }
- }
- #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM */
- #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE
- if (E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_VALUE == u8CommandIdentifier) {
- if ((sPayload.u16Value < psSharedStruct->u16InstalledOpenLimitTiltDegree) ||
- (sPayload.u16Value > psSharedStruct->u16InstalledClosedLimitTiltDegree)) {
- return (E_ZCL_ERR_INVALID_VALUE);
- }
- }
- #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE */
- /* Fill callback Event */
- psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&(psCommon->sCallBackMessage);
- psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
- /* Fill message */
- psCommon->sCallBackMessage.u8CommandId = u8CommandIdentifier;
- psCommon->sCallBackMessage.uMessage.psGoToPercentageRequestPayload = &sPayload;
- /* Fill in transition details */
- psCommon->sTransition.eTransition = (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE == u8CommandIdentifier) ?
- E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_LIFT_VALUE : E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_TILT_VALUE;
- psCommon->sTransition.i16TargetPositionPercentage = sPayload.u16Value;
- /* call callback */
- psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
- return (E_ZCL_SUCCESS);
- }
- #endif /* */
- #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
- (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
- teZCL_Status eCLD_WindowCoveringHandleGotoPercentageRequest(
- ZPS_tsAfEvent *pZPSevent,
- tsZCL_EndPointDefinition *psEndPointDefinition,
- tsZCL_ClusterInstance *psClusterInstance,
- uint8 u8CommandIdentifier
- ) {
- teZCL_Status eStatus;
- uint8 u8TransactionSequenceNumber;
- tsCLD_WindowCoveringCustomDataStructure *psCommon;
- tsCLD_WindowCovering_GoToPercentageRequestPayload sPayload = { 0 };
- /* Get pointer to custom data structure */
- psCommon = (tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
- eStatus = eCLD_WindowCoveringHandleGotoPercentageRequestReceive(
- pZPSevent,
- &u8TransactionSequenceNumber,
- &sPayload);
- DBG_vPrintf(TRUE, "WINDOW-CoVERING: Status = %d Percentage = %d\n", eStatus, sPayload.u8Percentage);
- if (E_ZCL_SUCCESS != eStatus) {
- return eStatus;
- }
- #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE
- if (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE == u8CommandIdentifier) {
- if ((sPayload.u8Percentage < CLD_WINDOWCOVERING_POSITION_LIFT_PERCENTAGE_MIN) ||
- (sPayload.u8Percentage > CLD_WINDOWCOVERING_POSITION_LIFT_PERCENTAGE_MAX)) {
- return (E_ZCL_ERR_INVALID_VALUE);
- }
- }
- #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE */
- #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE
- if (E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_PERCENTAGE == u8CommandIdentifier) {
- if ((sPayload.u8Percentage < CLD_WINDOWCOVERING_POSITION_TILT_PERCENTAGE_MIN) ||
- (sPayload.u8Percentage > CLD_WINDOWCOVERING_POSITION_TILT_PERCENTAGE_MAX)) {
- return (E_ZCL_ERR_INVALID_VALUE);
- }
- }
- #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE */
- /* Fill callback Event */
- psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
- psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&(psCommon->sCallBackMessage);
- psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
- /* Fill message */
- psCommon->sCallBackMessage.u8CommandId = u8CommandIdentifier;
- /* Fill in transition details */
- psCommon->sTransition.eTransition = (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE == u8CommandIdentifier) ?
- E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_LIFT_PERCENTAGE : E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_TILT_PERCENTAGE;
- psCommon->sTransition.u8TargetPositionPercentage = sPayload.u8Percentage;
- /* Message data for callback */
- psCommon->sCallBackMessage.uMessage.psGoToPercentageRequestPayload = &sPayload;
- /* call callback */
- psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
- return (E_ZCL_SUCCESS);
- }
- #endif /* */
- #endif /* WINDOWCOVERING_SERVER */
- /****************************************************************************/
- /*** END OF FILE ***/
- /****************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement