📄 leddim.c
字号:
/******************************** LEDDIM.C ********************************
* #######
* ## ##
* # ## #### ##### ##### ## ## #####
* ## ## ## ## ## ## ## ## ##
* ## # ###### ## ## #### ## ## ####
* ## ## ## ## ## ## ##### ##
* ####### #### ## ## ##### ## #####
* #####
* Z-Wave, the wireless language.
*
* Copyright (c) 2001
* Zensys A/S
* Denmark
*
* All Rights Reserved
*
* This source file is subject to the terms and conditions of the
* Zensys Software License Agreement which restricts the manner
* in which it may be used.
*
*---------------------------------------------------------------------------
* Copyright Zensys A/S, 2001
*
* Description: Slave application for evaluation kit LED dimmer
*
* Author: Peter Shorty
*
* Last Changed By: $Author: heh $
* Revision: $Revision: 1.163 $
* Last Changed: $Date: 2007/03/21 10:34:05 $
*
****************************************************************************/
/****************************************************************************/
/* INCLUDE FILES */
/****************************************************************************/
#include <ZW_slave_api.h>
#include <ZW_pindefs.h>
#include <ZW_evaldefs.h>
#include <ZW_debug_api.h>
#include <LEDdim.h>
#include <eeprom.h>
#include <slave_learn.h>
#include <one_button.h>
#include <ZW_uart_api.h>
/****************************************************************************/
/* PRIVATE TYPES and DEFINITIONS */
/****************************************************************************/
#define LED_DIM_VERSION 2
#define LED_DIM_REVISION 52
/* SetLightLevel() command defines */
enum
{
CURRENT_LEVEL = 0,
TOGGLE,
ON,
OFF,
LEVEL
};
/* SetLightLevel level defines */
#define LEVEL_DONTCARE 0 /* Level is don't care - the command says it all */
/* Poll function button state defines */
#define POLLIDLE 0
#define POLLDIMPROTECT 1 /* Wait some time will button pressed before dimming */
#define POLLCHILDHANDLING 2 /* We're in child protect mode */
#define POLLLEARNMODE 3 /* We're dimming and in learnmode */
/* Debounce count on button press detection. How many times must we see button */
#if defined(ZW020x) || defined(ZW030x)
#define DEBOUNCECOUNT 100
#else
#define DEBOUNCECOUNT 15
#endif
/* Timer repeat define */
#define FOREVER TIMER_FOREVER
#define ONE_SHOT TIMER_ONE_TIME
/* DIM direction defines */
#define DIM_TOGGLE 0xFF
/* DIM defines */
#define LEVEL_MAX 99 /* Maximum light level */
#define LEVEL_MIN 1 /* Minimum light level */
#if defined(ZW010x) || defined(ZW020x) || defined(ZW030x)
#define DIM_SPEED 3 /* DIM timer routine inc/dec with this value */
#endif /* defined(ZW010x) || defined(ZW020x) */
#define DIM_TIMER_FREQ 10 /* DIM timer routine is called every 100ms */
#define DIM_DIRECTION_DOWN 0
#define DIM_DIRECTION_UP 1
/* Define for setting the time which button must be pressed before starting DIM */
/* and when in childprotect mode its the max time between button presses */
#define DIM_PROTECT 50 /* 1/2 second */
#define CHILD_PROTECT 50 /* max 500ms between button presses */
#define CHILD_PROTECT_COUNT 3 /* number of button press before toggle */
/* when in childprotect mode */
#define LIGHTIDLE 0x00
#define LIGHTTOGGLE 0x01
#define LIGHTDIM 0x02
#define LIGHTNOP 0x04
#ifdef APPL_PROD_TEST
/* Productiontest pin definition */
#ifdef ZW010x
#ifdef SFF
/* IO10 pin now input */
#define SET_PRODUCTIONTEST_PIN PIN_IN(IO10, 0)
#define IN_PRODUCTIONTEST (!PIN_GET(IO10))
#else
/* IO10 pin now input */
#define SET_PRODUCTIONTEST_PIN PIN_IN(ZEROXpin, 0)
#define IN_PRODUCTIONTEST PIN_GET(ZEROXpin)
#endif /* SFF */
#endif /* ZW010x */
#ifdef ZW020x
/* SSNJ pin now input */
#define SET_PRODUCTIONTEST_PIN PIN_IN(SSN, 0)
#define IN_PRODUCTIONTEST (!PIN_GET(SSN))
#endif /* ZW020x */
#ifdef ZW030x
/* SSNJ pin now input */
#define SET_PRODUCTIONTEST_PIN PIN_IN(SSN, 0)
#define IN_PRODUCTIONTEST (!PIN_GET(SSN))
#endif /* ZW030x */
#endif /* APPL_PROD_TEST */
/****************************************************************************/
/* PRIVATE DATA */
/****************************************************************************/
/* node status */
volatile t_nodeStatus dimmerNodeStatus;
/* A list of the known command classes. Except the basic class which allways */
/* should be supported. Used when node info is send */
t_nodeInfo nodeInfo = {COMMAND_CLASS_SWITCH_MULTILEVEL,
COMMAND_CLASS_SWITCH_ALL,
COMMAND_CLASS_MANUFACTURER_SPECIFIC,
COMMAND_CLASS_VERSION,
#if defined(ZW010x) || defined(ZW020x) || defined(ZW030x)
COMMAND_CLASS_PROTECTION,
COMMAND_CLASS_POWERLEVEL};
#else
COMMAND_CLASS_PROTECTION};
#endif
BYTE timerDimHandle = 0;
BYTE timerPollHandle = 0;
BYTE pollState = POLLIDLE;
BYTE pollDimProtect = FALSE;
BYTE toggleDone = 0;
BYTE buttonPress = 0;
ZW_APPLICATION_TX_BUFFER txBuf;
BYTE ignoreAllOnOff = SWITCH_ALL_ENABLE_ON_OFF; /* Default we do allow ALL ON/OFF */
/* commands to be executed */
/* ignoreAllOnOff = SWITCH_ALL_EXCLUDE_ON_OFF - Ignore CMD_ALL_ON/CMD_ALL_OFF */
/* ignoreAllOnOff = SWITCH_ALL_EXCLUDE_ONLY_ON - Ignore CMD_ALL_ON */
/* ignoreAllOnOff = SWITCH_ALL_EXCLUDE_ONLY_OFF - Ignore CMD_ALL_OFF */
/* ignoreAllOnOff = SWITCH_ALL_ENABLE_ON_OFF - Accept CMD_ALL_ON/CMD_ALL_OFF */
BYTE protected_On_Off = PROTECTION_OFF; /* 0 means not protected and 1 child protected */
BYTE txOption;
#if defined(ZW010x) || defined(ZW020x) || defined(ZW030x)
BYTE timerPowerLevelHandle = 0;
BYTE timerPowerLevelSec = 0;
IBYTE testNodeID = ZW_TEST_NOT_A_NODEID;
IBYTE testSourceNodeID;
IBYTE testPowerLevel;
IWORD testFrameCount;
IWORD testFrameSuccessCount;
IBYTE testState = 0;
IBYTE currentPower = normalPower;
#endif
#ifdef DEBUG_STRESS
#define DEBUG_STRESS_TIMEOUT_START 250
#define DEBUG_STRESS_TIMEOUT 30
BOOL debugStress = 0;
BYTE debugStressHandle = 0;
BYTE currentStressValue = 0;
#endif
/****************************************************************************/
/* EXPORTED DATA */
/****************************************************************************/
/****************************************************************************/
/* PRIVATE FUNCTIONS */
/****************************************************************************/
static void DIMStop(BYTE saveInE2PROM);
#ifdef DEBUG_STRESS
void
SendBasicSet( void )
{
if (!debugStressHandle)
{
debugStressHandle = ZW_TIMER_START(SendBasicSet, DEBUG_STRESS_TIMEOUT, ONE_SHOT);
}
else
{
debugStressHandle = 0;
txBuf.ZW_BasicSetFrame.cmdClass = COMMAND_CLASS_BASIC;
txBuf.ZW_BasicSetFrame.cmd = BASIC_SET;
txBuf.ZW_BasicSetFrame.value = currentStressValue;
if (currentStressValue == 10)
{
currentStressValue = 50;
}
else
{
if (currentStressValue == 50)
{
currentStressValue = 0;
}
else
{
currentStressValue = 10;
}
}
ZW_SEND_DATA(2, (BYTE *)&txBuf, sizeof(txBuf.ZW_BasicSetFrame), (TRANSMIT_OPTION_ACK), SendBasicSet);
}
}
#endif
/*============================= LEDallON ===============================
** Turn all LED ON
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
LEDallON ( void ) /* IN Nothing */
{
LED_ON(1);
LED_ON(2);
LED_ON(3);
#if (!defined(ZW020x) && !defined(ZW030x))
LED_ON(4);
#endif
}
/*============================= LEDallOFF ==============================
** Turn all LED OFF
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
LEDallOFF( void ) /* IN Nothing */
{
LED_OFF(1);
LED_OFF(2);
LED_OFF(3);
#if (!defined(ZW020x) && !defined(ZW030x))
LED_OFF(4);
#endif
}
/*============================== LEDUpdate ==============================
** Update LEDs according to current level
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
LEDUpdate( void ) /* IN Nothing */
{
if (dimmerNodeStatus.status & M_DS_ON_OFF)
{
BYTE n;
#if defined(ZW010x) || defined(ZW020x) || defined(ZW030x)
n = dimmerNodeStatus.level / (100 / 4);
#endif /* defined(ZW010x) || defined(ZW020x) */
switch (n)
{
#if defined(ZW010x) || defined(ZW020x) || defined(ZW030x)
case 0:
LED_ON(1);
LED_OFF(2);
LED_OFF(3);
#if (!defined(ZW020x) && !defined(ZW030x))
LED_OFF(4);
#endif
break;
case 1:
LED_ON(1);
LED_ON(2);
LED_OFF(3);
#if (!defined(ZW020x) && !defined(ZW030x))
LED_OFF(4);
#endif
break;
case 2:
LED_ON(1);
LED_ON(2);
LED_ON(3);
#if (!defined(ZW020x) && !defined(ZW030x))
LED_OFF(4);
#endif
break;
default:
LEDallON();
break;
#endif /* defined(ZW010x) || defined(ZW020x) */
}
}
else
{
LEDallOFF();
}
}
/*=========================== ValidateLevel =============================
** Validate current level value
**
** Side effects
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
ValidateLevel( void ) /* IN Nothing */
{
if (dimmerNodeStatus.level > LEVEL_MAX)
{
dimmerNodeStatus.level = LEVEL_MAX;
}
else
{
if (dimmerNodeStatus.level < LEVEL_MIN)
{
dimmerNodeStatus.level = LEVEL_MIN;
}
}
}
/*============================ TimerChangeLevel =========================
** Change level
**
** Side effects
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
TimerChangeLevel( void ) /* IN Nothing */
{
if (dimmerNodeStatus.status & M_DS_CHANGING_DIM) /* Are we still DIMming? */
{
if ((dimmerNodeStatus.status & M_DS_UP_DOWN) == 0) /* Dim UP - more light */
{
if (dimmerNodeStatus.level < LEVEL_MAX)
{
dimmerNodeStatus.level += DIM_SPEED;
if (dimmerNodeStatus.level >= LEVEL_MAX)
{
if (dimmerNodeStatus.status & M_DS_ROLLOVER)
{
dimmerNodeStatus.status ^= M_DS_UP_DOWN;
}
}
}
else
{
if (dimmerNodeStatus.status & M_DS_ROLLOVER)
{
dimmerNodeStatus.status ^= M_DS_UP_DOWN;
}
}
}
else /* Dim DOWN - less light */
{
if (dimmerNodeStatus.level > LEVEL_MIN)
{
dimmerNodeStatus.level -= DIM_SPEED;
if (dimmerNodeStatus.level <= LEVEL_MIN)
{
if (dimmerNodeStatus.status & M_DS_ROLLOVER)
{
dimmerNodeStatus.status ^= M_DS_UP_DOWN;
}
}
}
else
{
if (dimmerNodeStatus.status & M_DS_ROLLOVER)
{
dimmerNodeStatus.status ^= M_DS_UP_DOWN;
}
}
}
LEDUpdate(); /* Update LEDs */
}
}
/*=========================== TimerPollCancel ============================
** Function description
** cancels timer, if still valid, used in CHILD_PROTECT
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
TimerPollCancel( void ) /*IN Nothing */
{
if (timerPollHandle)
{
ZW_TIMER_CANCEL(timerPollHandle);
timerPollHandle = 0;
}
}
/*=========================== TimerDimCancel =============================
** Function description
** cancels timer, if still valid, used in DIM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -