⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leddim.c

📁 无线遥控调光器
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************  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 + -