Advertisement
tranthudo

WindowCoveringCommandHandler.c

Jul 2nd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.91 KB | None | 0 0
  1. /*****************************************************************************
  2.  *
  3.  * MODULE:             Window Covering Cluster
  4.  *
  5.  * COMPONENT:          WindowCoveringCommandHandler.c
  6.  *
  7.  * AUTHOR:             Vesa 'ISO-B' Ylikyl?
  8.  * DESCRIPTION:        Message event handler functions
  9.  *
  10.  * $HeadURL:  $
  11.  *
  12.  * $Revision: 1 $
  13.  *
  14.  * $LastChangedBy: isob $
  15.  *
  16.  * $LastChangedDate: 2019-01-19 12:00:00 +0200 (Sat, 19 Jan 2018) $
  17.  *
  18.  * $Id: WindowCoveringCommandHandler.c 1 2019-01-19 10:00:00Z isob $
  19.  *
  20.  ****************************************************************************/
  21.  
  22. /****************************************************************************/
  23. /***        Include files                                                 ***/
  24. /****************************************************************************/
  25.  
  26. #include <jendefs.h>
  27. #include <string.h>
  28.  
  29. #include "zcl.h"
  30. #include "zcl_customcommand.h"
  31.  
  32. #include "WindowCovering.h"
  33. #include "WindowCovering_internal.h"
  34.  
  35. #include "zcl_options.h"
  36.  
  37. #include "dbg.h"
  38. #ifdef DEBUG_CLD_WINDOWCOVERING
  39. #define TRACE_WINDOWCOVERING TRUE
  40. #else
  41. #define TRACE_WINDOWCOVERING FALSE
  42. #endif
  43.  
  44. /****************************************************************************/
  45. /***        Macro Definitions                                             ***/
  46. /****************************************************************************/
  47.  
  48. // 2019.6.1 TrungTQ DEL
  49. // #if defined(CLD_WINDOWCOVERING) && !defined(WINDOWCOVERING_CLIENT)
  50. // #error You Must Have WINDOWCOVERING_CLIENT defined in zcl_options.h
  51. // #endif
  52.  
  53. // #ifdef WINDOWCOVERING_SERVER
  54. // #error ZiGate does not support Window Covering Server Cluster
  55. // #endif
  56. // We will support WINDOWCOVERING_SERVER
  57. // 2019.6.1 TrungTQ END
  58.  
  59. /****************************************************************************/
  60. /***        Type Definitions                                              ***/
  61. /****************************************************************************/
  62.  
  63. /****************************************************************************/
  64. /***        Local Function Prototypes                                     ***/
  65. /****************************************************************************/
  66. // 2019.06.06 TrungTQ ADD
  67. #ifdef WINDOWCOVERING_SERVER
  68.  
  69. PRIVATE teZCL_Status eCLD_WindowCoveringHandleOpenCloseStopRequest(
  70.     ZPS_tsAfEvent               *pZPSevent,
  71.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  72.     tsZCL_ClusterInstance       *psClusterInstance,
  73.     uint8                       u8CommandIdentifier
  74. );
  75.  
  76. #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
  77.     (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
  78. PRIVATE teZCL_Status eCLD_WindowCoveringHandleGotoValueRequest(
  79.     ZPS_tsAfEvent               *pZPSevent,
  80.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  81.     tsZCL_ClusterInstance       *psClusterInstance,
  82.     uint8                       u8CommandIdentifier
  83. );
  84. #endif /*  */
  85.  
  86. #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
  87.     (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
  88. PRIVATE teZCL_Status eCLD_WindowCoveringHandleGotoPercentageRequest(
  89.     ZPS_tsAfEvent               *pZPSevent,
  90.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  91.     tsZCL_ClusterInstance       *psClusterInstance,
  92.     uint8                       u8CommandIdentifier
  93. );
  94. #endif /*  */
  95.  
  96. #endif /* WINDOWCOVERING_SERVER */
  97. // 2019.06.06 TrungTQ END
  98.  
  99. /****************************************************************************/
  100. /***        Exported Variables                                            ***/
  101. /****************************************************************************/
  102.  
  103. /****************************************************************************/
  104. /***        Local Variables                                               ***/
  105. /****************************************************************************/
  106.  
  107. /****************************************************************************/
  108. /***        Public Functions                                              ***/
  109. /****************************************************************************/
  110.  
  111. /****************************************************************************
  112.  **
  113.  ** NAME:       eCLD_WindowCoveringCommandHandler
  114.  **
  115.  ** DESCRIPTION:
  116.  ** Handles Message Cluster custom commands
  117.  **
  118.  ** PARAMETERS:               Name                      Usage
  119.  ** ZPS_tsAfEvent            *pZPSevent                 Zigbee stack event structure
  120.  ** tsZCL_EndPointDefinition *psEndPointDefinition      EP structure
  121.  ** tsZCL_ClusterInstance    *psClusterInstance         Cluster structure
  122.  **
  123.  ** RETURN:
  124.  ** teZCL_Status
  125.  **
  126.  ****************************************************************************/
  127.  
  128. PUBLIC  teZCL_Status eCLD_WindowCoveringCommandHandler(
  129.     ZPS_tsAfEvent               *pZPSevent,
  130.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  131.     tsZCL_ClusterInstance       *psClusterInstance
  132. ) {
  133.     teZCL_Status eStatus = E_ZCL_SUCCESS;
  134.     tsZCL_HeaderParams sZCL_HeaderParams;
  135.     tsCLD_WindowCoveringCustomDataStructure *psCommon;
  136.  
  137.     /* Get pointer to custom data structure */
  138.     psCommon = (tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
  139.  
  140.     // further error checking can only be done once we have interrogated the ZCL payload
  141.     u16ZCL_ReadCommandHeader(pZPSevent->uEvent.sApsDataIndEvent.hAPduInst,
  142.                              &sZCL_HeaderParams);
  143.  
  144.     // get EP mutex
  145.     #ifndef COOPERATIVE
  146.         eZCL_GetMutex(psEndPointDefinition);
  147.     #endif /* COOPERATIVE */
  148.  
  149.     /* fill in callback event structure */
  150.     eZCL_SetCustomCallBackEvent(
  151.                     &psCommon->sCustomCallBackEvent,
  152.                     pZPSevent,
  153.                     sZCL_HeaderParams.u8TransactionSequenceNumber,
  154.                     psEndPointDefinition->u8EndPointNumber);
  155.  
  156.     /* Fill in message */
  157.     psCommon->sCallBackMessage.u8CommandId = sZCL_HeaderParams.u8CommandIdentifier;
  158.  
  159. // 2019.6.1 TrungTQ ADD
  160. #ifdef WINDOWCOVERING_SERVER
  161.  
  162.     if (psClusterInstance->bIsServer) {
  163.         switch (sZCL_HeaderParams.u8CommandIdentifier) {
  164.         case E_CLD_WINDOWCOVERING_CMD_UP_OPEN:
  165.         case E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE:
  166.         case E_CLD_WINDOWCOVERING_CMD_STOP:
  167.             eStatus = eCLD_WindowCoveringHandleOpenCloseStopRequest(
  168.                                     pZPSevent,
  169.                                     psEndPointDefinition,
  170.                                     psClusterInstance,
  171.                                     sZCL_HeaderParams.u8CommandIdentifier);
  172.             break;
  173.  
  174.         #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
  175.             (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
  176.         case E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE:
  177.         case E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_VALUE:
  178.             eStatus = eCLD_WindowCoveringHandleGotoValueRequest(
  179.                                     pZPSevent,
  180.                                     psEndPointDefinition,
  181.                                     psClusterInstance,
  182.                                     sZCL_HeaderParams.u8CommandIdentifier);
  183.             break;
  184.         #endif /*  */
  185.  
  186.         #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
  187.             (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
  188.         case E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE:
  189.         case E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_PERCENTAGE:
  190.             eStatus = eCLD_WindowCoveringHandleGotoPercentageRequest(
  191.                                     pZPSevent,
  192.                                     psEndPointDefinition,
  193.                                     psClusterInstance,
  194.                                     sZCL_HeaderParams.u8CommandIdentifier);
  195.             break;
  196.         #endif /*  */
  197.  
  198.         default:
  199.             #ifndef COOPERATIVE
  200.                 eZCL_ReleaseMutex(psEndPointDefinition);
  201.             #endif
  202.  
  203.             return (E_ZCL_ERR_CUSTOM_COMMAND_HANDLER_NULL_OR_RETURNED_ERROR);
  204.         }
  205.     }
  206.     // 2019.6.1 TrungTQ END
  207.  
  208.     // 2019.06.01 TrungTQ DEL
  209.     // return (E_ZCL_ERR_CUSTOM_COMMAND_HANDLER_NULL_OR_RETURNED_ERROR);
  210.     // 2019.06.01 TrungTQ END
  211.  
  212.     // unlock
  213.     #ifndef COOPERATIVE
  214.         eZCL_ReleaseMutex(psEndPointDefinition);
  215.     #endif /* COOPERATIVE */
  216.  
  217.     // 2019.06.06 TrungTQ ADD
  218.     if ((eStatus == E_ZCL_SUCCESS) && !(sZCL_HeaderParams.bDisableDefaultResponse)) {
  219.         eZCL_SendDefaultResponse(pZPSevent, E_ZCL_CMDS_SUCCESS);
  220.     }
  221.     // 2019.06.06 TrungTQ END
  222.  
  223. #endif /* WINDOWCOVERING_SERVER */
  224.  
  225.     // delete the i/p buffer on return
  226.     return (eStatus);
  227. }
  228.  
  229. /****************************************************************************/
  230. /***        Private Functions                                             ***/
  231. /****************************************************************************/
  232. #ifdef WINDOWCOVERING_SERVER
  233.  
  234. teZCL_Status eCLD_WindowCoveringHandleOpenCloseStopRequest(
  235.     ZPS_tsAfEvent               *pZPSevent,
  236.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  237.     tsZCL_ClusterInstance       *psClusterInstance,
  238.     uint8                       u8CommandIdentifier
  239. ) {
  240.     teZCL_Status eStatus;
  241.     uint8 u8TransactionSequenceNumber;
  242.     tsCLD_WindowCoveringCustomDataStructure *psCommon =(tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
  243.     tsCLD_WindowCoveringCallBackMessage sWindowCoveringCallBackMessage;
  244.  
  245.     eStatus = eCLD_WindowCoveringCommandOpenCLoseStopRequestReceive(
  246.                                 pZPSevent,
  247.                                 &u8TransactionSequenceNumber);
  248.  
  249.     if (E_ZCL_SUCCESS != eStatus) {
  250.         return eStatus;
  251.     }
  252.  
  253.     /* Fill callback Event */
  254.     psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
  255.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
  256.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&sWindowCoveringCallBackMessage;
  257.     psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
  258.  
  259.     /* Fill message */
  260.     sWindowCoveringCallBackMessage.u8CommandId = u8CommandIdentifier;
  261.  
  262.     /* Fill in transition details */
  263.     psCommon->sTransition.eTransition =
  264.             (E_CLD_WINDOWCOVERING_CMD_UP_OPEN == u8CommandIdentifier)     ? E_CLD_WINDOWCOVERING_TRANSITION_UP_OPEN :
  265.             (E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE == u8CommandIdentifier)  ? E_CLD_WINDOWCOVERING_TRANSITION_DOWN_CLOSE :
  266.             (E_CLD_WINDOWCOVERING_TRANSITION_STOP == u8CommandIdentifier) ? E_CLD_WINDOWCOVERING_TRANSITION_STOP :
  267.                                                                             E_CLD_WINDOWCOVERING_TRANSITION_NONE;
  268.     psCommon->sTransition.u8TargetPositionPercentage =
  269.             (E_CLD_WINDOWCOVERING_CMD_UP_OPEN    == u8CommandIdentifier) ? CLD_WINDOWCOVERING_POSITION_PERCENTAGE_MAX :
  270.             (E_CLD_WINDOWCOVERING_CMD_DOWN_CLOSE == u8CommandIdentifier) ? CLD_WINDOWCOVERING_POSITION_PERCENTAGE_MIN : 0xFF;
  271.  
  272.     /* call callback */
  273.     psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
  274.  
  275.     return (E_ZCL_SUCCESS);
  276. }
  277.  
  278. #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM) || \
  279.     (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE)
  280. teZCL_Status eCLD_WindowCoveringHandleGotoValueRequest(
  281.     ZPS_tsAfEvent               *pZPSevent,
  282.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  283.     tsZCL_ClusterInstance       *psClusterInstance,
  284.     uint8                       u8CommandIdentifier
  285. ) {
  286.     teZCL_Status eStatus;
  287.     uint8 u8TransactionSequenceNumber;
  288.     tsCLD_WindowCovering_GoToValueRequestPayload sPayload = { 0 };
  289.     tsCLD_WindowCovering *psSharedStruct = (tsCLD_WindowCovering *)psClusterInstance->pvEndPointSharedStructPtr;
  290.     tsCLD_WindowCoveringCustomDataStructure *psCommon =(tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
  291.     tsCLD_WindowCoveringCallBackMessage sWindowCoveringCallBackMessage;
  292.  
  293.     eStatus = eCLD_WindowCoveringHandleGotoPercentageRequestReceive(
  294.                                 pZPSevent,
  295.                                 &u8TransactionSequenceNumber,
  296.                                 &sPayload);
  297.  
  298.     if (E_ZCL_SUCCESS != eStatus) {
  299.         return eStatus;
  300.     }
  301.  
  302.     #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM
  303.     if (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE == u8CommandIdentifier) {
  304.         if ((sPayload.u16Value > psSharedStruct->u16InstalledOpenLimitLiftCm) ||
  305.             (sPayload.u16Value < psSharedStruct->u16InstalledClosedLimitLiftCm)) {
  306.             return (E_ZCL_ERR_INVALID_VALUE);
  307.         }
  308.     }
  309.     #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_CM */
  310.  
  311.     #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE
  312.     if (E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_VALUE == u8CommandIdentifier) {
  313.         if ((sPayload.u16Value < psSharedStruct->u16InstalledOpenLimitTiltDegree) ||
  314.             (sPayload.u16Value > psSharedStruct->u16InstalledClosedLimitTiltDegree)) {
  315.             return (E_ZCL_ERR_INVALID_VALUE);
  316.         }
  317.     }
  318.     #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_DEGREE */
  319.  
  320.     /* Fill callback Event */
  321.     psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
  322.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
  323.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&(psCommon->sCallBackMessage);
  324.     psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
  325.  
  326.     /* Fill message */
  327.     psCommon->sCallBackMessage.u8CommandId = u8CommandIdentifier;
  328.     psCommon->sCallBackMessage.uMessage.psGoToPercentageRequestPayload = &sPayload;
  329.  
  330.     /* Fill in transition details */
  331.     psCommon->sTransition.eTransition = (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_VALUE == u8CommandIdentifier) ?
  332.             E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_LIFT_VALUE : E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_TILT_VALUE;
  333.     psCommon->sTransition.i16TargetPositionPercentage = sPayload.u16Value;
  334.  
  335.     /* call callback */
  336.     psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
  337.  
  338.     return (E_ZCL_SUCCESS);
  339.  
  340. }
  341.  
  342. #endif /*  */
  343.  
  344. #if (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE) || \
  345.     (defined CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE)
  346. teZCL_Status eCLD_WindowCoveringHandleGotoPercentageRequest(
  347.     ZPS_tsAfEvent               *pZPSevent,
  348.     tsZCL_EndPointDefinition    *psEndPointDefinition,
  349.     tsZCL_ClusterInstance       *psClusterInstance,
  350.     uint8                       u8CommandIdentifier
  351. ) {
  352.     teZCL_Status eStatus;
  353.     uint8 u8TransactionSequenceNumber;
  354.     tsCLD_WindowCoveringCustomDataStructure *psCommon;
  355.     tsCLD_WindowCovering_GoToPercentageRequestPayload sPayload = { 0 };
  356.  
  357.     /* Get pointer to custom data structure */
  358.     psCommon = (tsCLD_WindowCoveringCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;
  359.  
  360.     eStatus = eCLD_WindowCoveringHandleGotoPercentageRequestReceive(
  361.                                 pZPSevent,
  362.                                 &u8TransactionSequenceNumber,
  363.                                 &sPayload);
  364.  
  365.     DBG_vPrintf(TRUE, "WINDOW-CoVERING: Status = %d Percentage = %d\n", eStatus, sPayload.u8Percentage);
  366.  
  367.     if (E_ZCL_SUCCESS != eStatus) {
  368.         return eStatus;
  369.     }
  370.  
  371.     #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE
  372.     if (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE == u8CommandIdentifier) {
  373.         if ((sPayload.u8Percentage < CLD_WINDOWCOVERING_POSITION_LIFT_PERCENTAGE_MIN) ||
  374.             (sPayload.u8Percentage > CLD_WINDOWCOVERING_POSITION_LIFT_PERCENTAGE_MAX)) {
  375.             return (E_ZCL_ERR_INVALID_VALUE);
  376.         }
  377.     }
  378.     #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE */
  379.  
  380.     #ifdef CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_TILT_PERCENTAGE
  381.     if (E_CLD_WINDOWCOVERING_CMD_GO_TO_TILT_PERCENTAGE == u8CommandIdentifier) {
  382.         if ((sPayload.u8Percentage < CLD_WINDOWCOVERING_POSITION_TILT_PERCENTAGE_MIN) ||
  383.             (sPayload.u8Percentage > CLD_WINDOWCOVERING_POSITION_TILT_PERCENTAGE_MAX)) {
  384.             return (E_ZCL_ERR_INVALID_VALUE);
  385.         }
  386.     }
  387.     #endif /* CLD_WINDOWCOVERING_ATTR_ID_CURRENT_POSITION_LIFT_PERCENTAGE */
  388.  
  389.     /* Fill callback Event */
  390.     psCommon->sCustomCallBackEvent.eEventType = E_ZCL_CBET_CLUSTER_CUSTOM;
  391.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.u16ClusterId = psClusterInstance->psClusterDefinition->u16ClusterEnum;
  392.     psCommon->sCustomCallBackEvent.uMessage.sClusterCustomMessage.pvCustomData = (void*)&(psCommon->sCallBackMessage);
  393.     psCommon->sCustomCallBackEvent.psClusterInstance = psClusterInstance;
  394.  
  395.     /* Fill message */
  396.     psCommon->sCallBackMessage.u8CommandId = u8CommandIdentifier;
  397.  
  398.     /* Fill in transition details */
  399.     psCommon->sTransition.eTransition = (E_CLD_WINDOWCOVERING_CMD_GO_TO_LIFT_PERCENTAGE == u8CommandIdentifier) ?
  400.             E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_LIFT_PERCENTAGE : E_CLD_WINDOWCOVERING_TRANSITION_GO_TO_TILT_PERCENTAGE;
  401.     psCommon->sTransition.u8TargetPositionPercentage = sPayload.u8Percentage;
  402.  
  403.     /* Message data for callback */
  404.     psCommon->sCallBackMessage.uMessage.psGoToPercentageRequestPayload = &sPayload;
  405.  
  406.     /* call callback */
  407.     psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
  408.  
  409.     return (E_ZCL_SUCCESS);
  410. }
  411. #endif /*  */
  412.  
  413. #endif /* WINDOWCOVERING_SERVER */
  414.  
  415. /****************************************************************************/
  416. /***        END OF FILE                                                   ***/
  417. /****************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement