/********************************************************************* * @fn zclSampleTemperatureSensor_HandleKeys * * @brief Handles all key events for this device. * * @param shift - true if in shift/alt. * @param keys - bit field for key events. Valid entries: * HAL_KEY_SW_5 * HAL_KEY_SW_4 * HAL_KEY_SW_3 * HAL_KEY_SW_2 * HAL_KEY_SW_1 * * @return none */ static void zclSampleTemperatureSensor_HandleKeys( byte shift, byte keys ) { if ( keys & HAL_KEY_SW_1 ) { // increase temperature giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; if ( zclSampleTemperatureSensor_MeasuredValue < zclSampleTemperatureSensor_MaxMeasuredValue ) { zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MeasuredValue + 100; // considering using whole number value } else if ( zclSampleTemperatureSensor_MeasuredValue >= zclSampleTemperatureSensor_MaxMeasuredValue ) { zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MaxMeasuredValue; } // Send temperature information zclSampleTemperatureSensor_SendTemp(); } if ( keys & HAL_KEY_SW_2 ) { if ( ( giTemperatureSensorScreenMode == TEMPSENSE_MAINMODE ) || ( giTemperatureSensorScreenMode == TEMPSENSE_HELPMODE ) ) { giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; #ifdef ZCL_EZMODE zclEZMode_InvokeData_t ezModeData; static uint16 clusterIDs[] = { ZCL_CLUSTER_ID_MS_TEMPERATURE_MEASUREMENT }; // only bind on the Temperature Measurement cluster // Invoke EZ-Mode ezModeData.endpoint = SAMPLETEMPERATURESENSOR_ENDPOINT; // endpoint on which to invoke EZ-Mode if ( ( zclSampleTemperatureSensor_NwkState == DEV_ZB_COORD ) || ( zclSampleTemperatureSensor_NwkState == DEV_ROUTER ) || ( zclSampleTemperatureSensor_NwkState == DEV_END_DEVICE ) ) { ezModeData.onNetwork = TRUE; // node is already on the network } else { ezModeData.onNetwork = FALSE; // node is not yet on the network } ezModeData.initiator = TRUE; // Temperature Sensor is an initiator ezModeData.numActiveInClusters = 1; ezModeData.pActiveInClusterIDs = clusterIDs; ezModeData.numActiveOutClusters = 0; // active output cluster ezModeData.pActiveOutClusterIDs = NULL; zcl_InvokeEZMode( &ezModeData ); #ifdef LCD_SUPPORTED HalLcdWriteString( "EZMode", HAL_LCD_LINE_2 ); #endif // NOT ZCL_EZMODE, Use EndDeviceBind #else { zAddrType_t dstAddr; dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = 0; // Coordinator makes the EDB match // Initiate an End Device Bind Request, this bind request will // only use a cluster list that is important to binding. HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF ); ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(), SAMPLETEMPERATURESENSOR_ENDPOINT, ZCL_HA_PROFILE_ID, 0, NULL, ZCLSAMPLETEMPERATURESENSOR_BINDINGLIST, bindingOutClusters, FALSE ); } #endif // ZCL_EZMODE } } if ( keys & HAL_KEY_SW_3 ) { giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; // decrease the temperature if ( zclSampleTemperatureSensor_MeasuredValue > zclSampleTemperatureSensor_MinMeasuredValue ) { zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MeasuredValue - 100; // considering using whole number value } else if ( zclSampleTemperatureSensor_MeasuredValue >= zclSampleTemperatureSensor_MinMeasuredValue ) { zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MinMeasuredValue; } // Send temperature information zclSampleTemperatureSensor_SendTemp(); } if ( keys & HAL_KEY_SW_4 ) { giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; if ( ( zclSampleTemperatureSensor_NwkState == DEV_ZB_COORD ) || ( zclSampleTemperatureSensor_NwkState == DEV_ROUTER ) ) { // toggle permit join gPermitDuration = gPermitDuration ? 0 : 0xff; NLME_PermitJoiningRequest( gPermitDuration ); } } if ( shift && ( keys & HAL_KEY_SW_5 ) ) { zclSampleTemperatureSensor_BasicResetCB(); } else if ( keys & HAL_KEY_SW_5 ) { if ( giTemperatureSensorScreenMode == TEMPSENSE_MAINMODE ) { giTemperatureSensorScreenMode = TEMPSENSE_HELPMODE; } else if ( giTemperatureSensorScreenMode == TEMPSENSE_HELPMODE ) { #ifdef LCD_SUPPORTED HalLcdWriteString( (char *)sClearLine, HAL_LCD_LINE_2 ); #endif giTemperatureSensorScreenMode = TEMPSENSE_MAINMODE; } } // update display zclSampleTemperatureSensor_LcdDisplayUpdate(); }
/********************************************************************* * @fn zclSampleSw_HandleKeys * * @brief Handles all key events for this device. * * @param shift - true if in shift/alt. * @param keys - bit field for key events. Valid entries: * HAL_KEY_SW_5 * HAL_KEY_SW_4 * HAL_KEY_SW_2 * HAL_KEY_SW_1 * * @return none */ static void zclSampleSw_HandleKeys( byte shift, byte keys ) { // toggle remote light if ( keys & HAL_KEY_SW_1 ) { giSwScreenMode = SW_MAINMODE; // remove help screen if there // Using this as the "Light Switch" #ifdef ZCL_ON_OFF zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, FALSE, 0 ); #endif #ifdef LCD_SUPPORTED HalLcdWriteString( (char *)sCmdSent, HAL_LCD_LINE_2 ); // clear message on screen after 3 seconds osal_start_timerEx( zclSampleSw_TaskID, SAMPLESW_MAIN_SCREEN_EVT, 3000 ); #endif } // invoke EZ-Mode if ( keys & HAL_KEY_SW_2 ) { giSwScreenMode = SW_MAINMODE; // remove help screen if there #ifdef ZCL_EZMODE { zclEZMode_InvokeData_t ezModeData; static uint16 clusterIDs[] = { ZCL_CLUSTER_ID_GEN_ON_OFF }; // only bind on the on/off cluster // Invoke EZ-Mode ezModeData.endpoint = SAMPLESW_ENDPOINT; // endpoint on which to invoke EZ-Mode if ( (zclSampleSw_NwkState == DEV_ZB_COORD) || (zclSampleSw_NwkState == DEV_ROUTER) || (zclSampleSw_NwkState == DEV_END_DEVICE) ) { ezModeData.onNetwork = TRUE; // node is already on the network } else { ezModeData.onNetwork = FALSE; // node is not yet on the network } ezModeData.initiator = TRUE; // OnOffSwitch is an initiator ezModeData.numActiveOutClusters = 1; // active output cluster ezModeData.pActiveOutClusterIDs = clusterIDs; ezModeData.numActiveInClusters = 0; // no active input clusters ezModeData.pActiveInClusterIDs = NULL; zcl_InvokeEZMode( &ezModeData ); #ifdef LCD_SUPPORTED HalLcdWriteString( "EZMode", HAL_LCD_LINE_2 ); #endif } #else // NOT ZCL_EZMODE // bind to remote light zAddrType_t dstAddr; HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF ); // Initiate an End Device Bind Request, this bind request will // only use a cluster list that is important to binding. dstAddr.addrMode = afAddr16Bit; dstAddr.addr.shortAddr = 0; // Coordinator makes the match ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(), SAMPLESW_ENDPOINT, ZCL_HA_PROFILE_ID, 0, NULL, // No incoming clusters to bind ZCLSAMPLESW_BINDINGLIST, bindingOutClusters, TRUE ); #endif // ZCL_EZMODE } // toggle permit join if ( keys & HAL_KEY_SW_4 ) { giSwScreenMode = SW_MAINMODE; // remove help screen if there if ( ( zclSampleSw_NwkState == DEV_ZB_COORD ) || ( zclSampleSw_NwkState == DEV_ROUTER ) ) { zAddrType_t tmpAddr; tmpAddr.addrMode = Addr16Bit; tmpAddr.addr.shortAddr = NLME_GetShortAddr(); // toggle permit join gPermitDuration = gPermitDuration ? 0 : 0xff; // Trust Center significance is always true ZDP_MgmtPermitJoinReq( &tmpAddr, gPermitDuration, TRUE, FALSE ); } } if ( shift && ( keys & HAL_KEY_SW_5 ) ) { zclSampleSw_BasicResetCB(); } else if ( keys & HAL_KEY_SW_5 ) { giSwScreenMode = giSwScreenMode ? SW_MAINMODE : SW_HELPMODE; #ifdef LCD_SUPPORTED HalLcdWriteString( (char *)sClearLine, HAL_LCD_LINE_2 ); #endif } // update the display zclSampleSw_LcdDisplayUpdate(); }