实例介绍
【实例截图】
【核心代码】
tsZLO_ColourTemperatureLightDevice sLight;
tsIdentifyWhite sIdEffect;
tsCLD_ZllDeviceTable sDeviceTable = { ZLO_NUMBER_DEVICES,
{
{ 0,
HA_PROFILE_ID,
ZLO_COLOUR_TEMPERATURE_LIGHT_DEVICE_ID,
COLORTEMPERATURELIGHT_LIGHT_ENDPOINT,
APPLICATION_DEVICE_VERSION,
0,
0}
}
};
/* define the default reports */
tsReports asDefaultReports[ZLO_NUMBER_OF_REPORTS] =
{
{GENERAL_CLUSTER_ID_ONOFF, {0, E_ZCL_BOOL, E_CLD_ONOFF_ATTR_ID_ONOFF, ZLO_MIN_REPORT_INTERVAL,ZLO_MAX_REPORT_INTERVAL,0,{0}}},
{GENERAL_CLUSTER_ID_LEVEL_CONTROL, {0, E_ZCL_UINT8, E_CLD_LEVELCONTROL_ATTR_ID_CURRENT_LEVEL, ZLO_MIN_REPORT_INTERVAL,ZLO_MAX_REPORT_INTERVAL,0,{10}}},
{LIGHTING_CLUSTER_ID_COLOUR_CONTROL, {0, E_ZCL_UINT16, E_CLD_COLOURCONTROL_ATTR_COLOUR_TEMPERATURE_MIRED, ZLO_MIN_REPORT_INTERVAL,ZLO_MAX_REPORT_INTERVAL,0,{10}}}
};
/*
* If overriding the ZLL Master Key in the appilation,
* define BDB_APPLICATION_DEFINED_TL_MASTER_KEY in bdb_options.h
* otherwize the key defined in BDB\Source\touchlink\bdb_tl_common.c will be used.
*/
#ifdef BDB_APPLICATION_DEFINED_TL_MASTER_KEY
PUBLIC tsReg128 sTLMasterKey = {0x11223344, 0x55667788, 0x99aabbcc, 0xddeeff00 };
#endif
/****************************************************************************/
/*** Local Variables ***/
/****************************************************************************/
PRIVATE bool bAllowInterPanEp(uint8 u8Ep, uint16 u16ProfileId);
/****************************************************************************/
/*** Exported Functions ***/
/****************************************************************************/
/****************************************************************************
*
* NAME: eApp_ZLO_RegisterEndpoint
*
* DESCRIPTION:
* Register ZLO endpoints
*
* PARAMETER
* Type Name Description
* tfpZCL_ZCLCallBackFunction fptr Pointer to ZCL Callback function
* t
*
* RETURNS:
* teZCL_Status
*
****************************************************************************/
PUBLIC teZCL_Status eApp_ZLO_RegisterEndpoint(tfpZCL_ZCLCallBackFunction fptr)
{
zps_vSetIgnoreProfileCheck();
ZPS_vAplZdoRegisterInterPanFilter( bAllowInterPanEp);
return eZLO_RegisterColourTemperatureLightEndPoint(COLORTEMPERATURELIGHT_LIGHT_ENDPOINT,
fptr,
&sLight);
}
/****************************************************************************
*
* NAME: bAllowInterPanEp
*
* DESCRIPTION: Allows the application to decide which end point receive
* inter pan messages
*
*
* PARAMETER: the end point receiving the inter pan
*
* RETURNS: void
*
****************************************************************************/
PRIVATE bool bAllowInterPanEp(uint8 u8Ep, uint16 u16ProfileId) {
if ( (u8Ep == COLORTEMPERATURELIGHT_LIGHT_ENDPOINT) &&
( u16ProfileId == ZLL_PROFILE_ID))
{
return TRUE;
}
return FALSE;
}
#if(!defined DR1221) && (!defined DR1221_Dimic)
/****************************************************************************
*
* NAME: vApp_eCLD_ColourControl_GetRGB
*
* DESCRIPTION:
* To get RGB value
*
* PARAMETER
* Type Name Descirption
* uint8 * pu8Red Pointer to Red in RGB value
* uint8 * pu8Green Pointer to Green in RGB value
* uint8 * pu8Blue Pointer to Blue in RGB value
*
* RETURNS:
* void
*
****************************************************************************/
PUBLIC void vApp_eCLD_ColourControl_GetRGB(uint8 *pu8Red,uint8 *pu8Green,uint8 *pu8Blue)
{
eCLD_ColourControl_GetRGB( COLORTEMPERATURELIGHT_LIGHT_ENDPOINT,
pu8Red,
pu8Green,
pu8Blue);
}
#endif
/****************************************************************************
*
* NAME: vAPP_ZCL_DeviceSpecific_Init
*
* DESCRIPTION:
* ZLO Device Specific initialization
*
* PARAMETER: void
*
* RETURNS: void
*
****************************************************************************/
PUBLIC void vAPP_ZCL_DeviceSpecific_Init(void)
{
/* Initialise the strings in Basic */
uint8 au8PCode[CLD_BAS_PCODE_SIZE] = BAS_PCODE_STRING;
memcpy(sLight.sBasicServerCluster.au8ManufacturerName, BAS_MANUF_NAME_STRING, CLD_BAS_MANUF_NAME_SIZE);
memcpy(sLight.sBasicServerCluster.au8ModelIdentifier, BAS_MODEL_ID_STRING, CLD_BAS_MODEL_ID_SIZE);
memcpy(sLight.sBasicServerCluster.au8DateCode, BAS_DATE_STRING, CLD_BAS_DATE_SIZE);
memcpy(sLight.sBasicServerCluster.au8SWBuildID, BAS_SW_BUILD_STRING, CLD_BAS_SW_BUILD_SIZE);
memcpy(sLight.sBasicServerCluster.au8ProductURL, BAS_URL_STRING, CLD_BAS_URL_SIZE);
memcpy(sLight.sBasicServerCluster.au8ProductCode, au8PCode, CLD_BAS_PCODE_SIZE);
sIdEffect.u8Effect = E_CLD_IDENTIFY_EFFECT_STOP_EFFECT;
sIdEffect.u8Tick = 0;
/* Set the initial value to 4000 Kelvin */
sLight.sColourControlServerCluster.u16ColourTemperatureMired = (1E6/4000);
#if (defined DR1221) || (defined DR1221_Dimic) || (defined OM15045)
{
uint16 u16PhyMax;
uint16 u16PhyMin;
DriverBulb_vGetColourTempPhyMinMax(&u16PhyMin,&u16PhyMax);
sLight.sColourControlServerCluster.u16ColourTemperatureMiredPhyMin = u16PhyMin;
sLight.sColourControlServerCluster.u16ColourTemperatureMiredPhyMax = u16PhyMax;
}
#endif
}
/****************************************************************************
*
* NAME: app_u8GetDeviceEndpoint
*
* DESCRIPTION:
* Return the application endpoint
*
* PARAMETER: void
*
* RETURNS: uint8
*
****************************************************************************/
PUBLIC uint8 app_u8GetDeviceEndpoint( void)
{
return COLORTEMPERATURELIGHT_LIGHT_ENDPOINT;
}
/****************************************************************************
*
* NAME: vUpdateBulbFromZCL
*
* DESCRIPTION:
* Copys the ZCL bulb state to the bulb driver
*
* RETURNS:
* void
*
****************************************************************************/
PUBLIC void vApp_ZCL_ResetDeviceStructure(void)
{
memset(&sLight,0,sizeof(tsZLO_ColourTemperatureLightDevice));
}
/****************************************************************************
*
* NAME: vUpdateBulbFromZCL
*
* DESCRIPTION:
* Copys the ZCL bulb state to the bulb driver
*
* RETURNS:
* void
*
****************************************************************************/
PUBLIC void vUpdateBulbFromZCL(bool_t bResetInterpolation)
{
#if (defined OM15081)
uint8 u8Red, u8Green, u8Blue;
vApp_eCLD_ColourControl_GetRGB(&u8Red, &u8Green, &u8Blue);
if (bResetInterpolation)
{
vLI_SetCurrentValues(sLight.sLevelControlServerCluster.u8CurrentLevel,
u8Red, u8Green, u8Blue, 4000);
}
#if TRACE_LIGHT_TASK
DBG_vPrintf(TRACE_LIGHT_TASK, "\nR %d G %d B %d L %d ",
u8Red, u8Green, u8Blue, sLight.sLevelControlServerCluster.u8CurrentLevel);
DBG_vPrintf(TRACE_LIGHT_TASK, "X %d Y %d ",
sLight.sColourControlServerCluster.u16CurrentX,
sLight.sColourControlServerCluster.u16CurrentY);
DBG_vPrintf(TRACE_LIGHT_TASK, "T %dK ",
1000000 / sLight.sColourControlServerCluster.u16ColourTemperatureMired);
DBG_vPrintf(TRACE_LIGHT_TASK, "M %d On %d OnTime %d OffTime %d",
sLight.sColourControlServerCluster.u8ColourMode,
sLight.sOnOffServerCluster.bOnOff,
sLight.sOnOffServerCluster.u16OnTime,
sLight.sOnOffServerCluster.u16OffWaitTime);
#endif
vRGBLight_SetLevels(sLight.sOnOffServerCluster.bOnOff,
sLight.sLevelControlServerCluster.u8CurrentLevel,
u8Red,
u8Green,
u8Blue);
#elif (defined CCTW_HW)
/* controllable colour temperature tunable white (CCT TW) bulbs */
DBG_vPrintf(TRACE_LIGHT_TASK,"\nCU:On %d, L:%d T:%dK",sLight.sOnOffServerCluster.bOnOff,
sLight.sLevelControlServerCluster.u8CurrentLevel,
(1000000 / sLight.sColourControlServerCluster.u16ColourTemperatureMired));
if (bResetInterpolation)
{
vLI_SetCurrentValues(sLight.sLevelControlServerCluster.u8CurrentLevel,
0, 0, 0, (1E6/sLight.sColourControlServerCluster.u16ColourTemperatureMired) );
}
vTunableWhiteLightSetLevels(sLight.sOnOffServerCluster.bOnOff,
sLight.sLevelControlServerCluster.u8CurrentLevel,
sLight.sColourControlServerCluster.u16ColourTemperatureMired);
#endif
u8StateChangeTick = BULB_SAVE_DELAY_SEC;
}
/****************************************************************************
*
* NAME: APP_vHandleIdentify
*
* DESCRIPTION:
* ZLO Device Specific identify
*
* PARAMETER: the identify time
*
* RETURNS: void
*
****************************************************************************/
PUBLIC void APP_vHandleIdentify(uint16 u16Time)
{
static bool bActive = FALSE;
#if (defined OM15081)
uint8 u8Red, u8Green, u8Blue;
vApp_eCLD_ColourControl_GetRGB(&u8Red, &u8Green, &u8Blue);
#endif
if (sIdEffect.u8Effect < E_CLD_IDENTIFY_EFFECT_STOP_EFFECT) {
/* do nothing */
}
else if (u16Time == 0)
{
/*
* Restore to off/off state
*/
#if (defined CCTW_HW) /* Restore the CCT TW bulb to pre-identify state */
vTunableWhiteLightSetLevels(sLight.sOnOffServerCluster.bOnOff,
sLight.sLevelControlServerCluster.u8CurrentLevel,
sLight.sColourControlServerCluster.u16ColourTemperatureMired);
#else /* Restore CCT RGB bulb to pre-identify State */
vRGBLight_SetLevels(sLight.sOnOffServerCluster.bOnOff,
sLight.sLevelControlServerCluster.u8CurrentLevel,
u8Red,
u8Green,
u8Blue);
#endif
bActive = FALSE;
}
else
{
/* Set the Identify levels */
if (!bActive) {
bActive = TRUE;
sIdEffect.u8Level = 250;
sIdEffect.u8Count = 5;
#if (defined CCTW_HW) /* Restore the CCT TW bulb to pre-identify state */
vTunableWhiteLightSetLevels(TRUE,
CLD_LEVELCONTROL_MAX_LEVEL,
sLight.sColourControlServerCluster.u16ColourTemperatureMired);
#else /* Restore CCT RGB bulb to pre-identify State */
vRGBLight_SetLevels(TRUE,
CLD_LEVELCONTROL_MAX_LEVEL,
u8Red,
u8Green,
u8Blue);
#endif
}
}
}
/****************************************************************************
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论