📄 leddim.c
字号:
{
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
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
TimerDimCancel( void ) /*IN Nothing */
{
if (timerDimHandle)
{
ZW_TIMER_CANCEL(timerDimHandle);
timerDimHandle = 0;
}
}
/*========================= TimerPollDimProtect =========================
** DIM_PROTECT time has past
**
** Side effects :
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
TimerPollDimProtect( void ) /* IN Nothing */
{
pollDimProtect = TRUE;
}
/*=============================== DIMStart ==============================
** Start DIMming
**
** Side effects:
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
DIMStart(
BYTE level, /* IN starting DIM level */
BYTE dimBits) /* IN DIMming config bits */
{
/* are we dimming allready ? */
if (dimmerNodeStatus.status & M_DS_CHANGING_DIM)
{
DIMStop(FALSE);
}
dimmerNodeStatus.level = level;
ValidateLevel();
dimmerNodeStatus.status |= M_DS_ON_OFF; /* Now ON */
/* Save new status in EEPROM */
ZW_MEM_PUT_BYTE(EEOFFSET_STATUS, dimmerNodeStatus.status);
if (dimBits == DIM_TOGGLE)
{
dimmerNodeStatus.status ^= M_DS_UP_DOWN; /* Toggle DIM direction */
dimmerNodeStatus.status |= M_DS_ROLLOVER; /* Make sure its set */
}
else
{
dimmerNodeStatus.status &= ~(M_DS_UP_DOWN | M_DS_ROLLOVER);
dimmerNodeStatus.status |= dimBits & (M_DS_UP_DOWN | M_DS_ROLLOVER);
}
dimmerNodeStatus.status |= M_DS_CHANGING_DIM; /* Indicate DIMming... */
TimerDimCancel(); /* Cancel timer if needed... */
/* Allocate timer for calling TimerChangeLevel every DIM_TIMER_FREQ, forever */
timerDimHandle = ZW_TIMER_START(TimerChangeLevel, DIM_TIMER_FREQ, FOREVER);
}
/*=============================== DIMStop ==============================
** Stop DIMming
**
** Side effects:
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
DIMStop(
BYTE saveInE2PROM) /* IN Should the current level be saved in EEPROM */
{
TimerDimCancel(); /* Cancel timer if needed... */
dimmerNodeStatus.status &= ~(M_DS_CHANGING_DIM); /* STOP DIMming */
ValidateLevel();
if (saveInE2PROM)
{
ZW_MEM_PUT_BYTE(EEOFFSET_LEVEL, dimmerNodeStatus.level); /* Save the last value */
// ZW_MEM_PUT_BYTE(EEOFFSET_STATUS, dimmerNodeStatus.status);
User_WakeupNotification();
}
}
void User_NULL()
{
}
void User_WakeupNotification()
{
txBuf.ZW_WakeUpNotificationFrame.cmdClass = COMMAND_CLASS_WAKE_UP;
txBuf.ZW_WakeUpNotificationFrame.cmd = WAKE_UP_NOTIFICATION;
ZW_SendData((NODE_BROADCAST ),(BYTE *)&txBuf, sizeof(ZW_WAKE_UP_NOTIFICATION_FRAME),0, User_NULL);
}
/*============================= SetLightLevel ============================
** Set the light level to:
**
** CURRENT_LEVEL - The current light level stored in eeprom
** LEVEL - Use parameter bLevel as light level
** TOGGLE - Toggle the light level
** ON - Full on
** OFF - Off
**
**--------------------------------------------------------------------------*/
static void /*RET Nothing */
SetLightLevel(
BYTE bAction, /* IN Action to be done */
BYTE bLevel) /* IN Lightlevel to set */
{
if (dimmerNodeStatus.status & M_DS_CHANGING_DIM) /* If we're dimming */
{
DIMStop(FALSE); /* then STOP that */
}
switch (bAction)
{
case TOGGLE:
if ((dimmerNodeStatus.status & M_DS_ON_OFF) == 0) /* Is switch OFF ? */
{
dimmerNodeStatus.status |= M_DS_ON_OFF;
LEDUpdate();
}
else
{
dimmerNodeStatus.status &= ~(M_DS_ON_OFF);
LEDallOFF(); /* Just do it! */
}
break;
case LEVEL:
if (bLevel == SWITCHED_ON)
{
dimmerNodeStatus.level = LEVEL_MAX;
dimmerNodeStatus.status |= M_DS_ON_OFF;
ZW_MEM_PUT_BYTE(EEOFFSET_LEVEL, dimmerNodeStatus.level);
LEDallON(); /* Just do it! */
}
else if (bLevel == SWITCHED_OFF)
{
dimmerNodeStatus.status &= ~(M_DS_ON_OFF);
LEDallOFF(); /* Just do it! */
}
else
{
dimmerNodeStatus.level = bLevel;
dimmerNodeStatus.status |= M_DS_ON_OFF;
ZW_MEM_PUT_BYTE(EEOFFSET_LEVEL, dimmerNodeStatus.level);
LEDUpdate();
}
break;
case CURRENT_LEVEL:
dimmerNodeStatus.status |= M_DS_ON_OFF;
LEDUpdate();
break;
case ON:
dimmerNodeStatus.level = LEVEL_MAX;
dimmerNodeStatus.status |= M_DS_ON_OFF;
ZW_MEM_PUT_BYTE(EEOFFSET_LEVEL, dimmerNodeStatus.level);
LEDallON(); /* Just do it! */
break;
case OFF:
dimmerNodeStatus.status &= ~(M_DS_ON_OFF);
LEDallOFF(); /* Just do it! */
break;
}
/* Save new status in EEPROM */
ZW_MEM_PUT_BYTE(EEOFFSET_STATUS, dimmerNodeStatus.status);
}
/*============================= ApplicationPoll =========================
** Application poll function for LED dimmer
**
** Side effects:
**
**--------------------------------------------------------------------------*/
void /*RET Nothing */
ApplicationPoll( void ) /* IN Nothing */
{
BYTE lastAction = OneButtonLastAction();
ZW_DEBUG_CMD_POLL();
// if (bNWIStartup)
// {
// StartLearnModeNow(ZW_SET_LEARN_MODE_NWI);
// bNWIStartup = FALSE;
// pollState = POLLLEARNMODE;
// }
switch (pollState)
{
case POLLIDLE:
if (lastAction==BUTTON_WAS_PRESSED)
{
SetLightLevel(TOGGLE, LEVEL_DONTCARE);
TimerPollCancel(); /* Cancel timer if needed... */
StartLearnModeNow(ZW_SET_LEARN_MODE_CLASSIC);
}
break;
case POLLDIMMING:
if (lastAction==BUTTON_WAS_RELEASED)
{
DIMStop(TRUE);
toggleDone = LIGHTIDLE;
pollState = POLLIDLE;
}
break;
case POLLLEARNMODE:
/* Just wait... */
if (lastAction==BUTTON_WAS_PRESSED)
{
/* Stop learn mode */
TimerPollCancel(); /* Cancel timer if needed... */
StartLearnModeNow(FALSE);
pollState = POLLIDLE;
}
break;
}
}
/*============================== SendReport ==============================
**
** Function: SendReport
**
** Sends a report frame to source node.
**
** Side effects: None
**
**--------------------------------------------------------------------------*/
void /*RET Nothing */
SendReport(
BYTE sourceNode, /* IN Source node - to whom report is to be send */
BYTE classcmd, /* IN Command class, which the report belongs to */
BYTE reportparam) /* IN paramter to include in report frame */
{
txBuf.ZW_BasicReportFrame.cmdClass = classcmd;
/* Report command definition - BASIC/ALL/PROTECTION/MULTI report use the same value ;-) */
txBuf.ZW_BasicReportFrame.cmd = BASIC_REPORT;
txBuf.ZW_BasicReportFrame.value = reportparam;
/* Size of Report (BASIC/ALL/PROTECTION/MULTI GET response) frame are equal for BASIC/ALL/PROTECTION/MULTI */
ZW_SEND_DATA(sourceNode, (BYTE *)&txBuf, sizeof(txBuf.ZW_BasicReportFrame), txOption, NULL);
}
#if defined(ZW020x) || defined(ZW030x)
/*=========================== SendTestReport ============================
** Send current Powerlevel test results
**
** This is an application function example
**
**--------------------------------------------------------------------------*/
void
SendTestReport( void )
{
txBuf.ZW_PowerlevelTestNodeReportFrame.cmdClass = COMMAND_CLASS_POWERLEVEL;
txBuf.ZW_PowerlevelTestNodeReportFrame.cmd = POWERLEVEL_TEST_NODE_REPORT;
txBuf.ZW_PowerlevelTestNodeReportFrame.testNodeid = testNodeID;
txBuf.ZW_PowerlevelTestNodeReportFrame.statusOfOperation = testState;
txBuf.ZW_PowerlevelTestNodeReportFrame.testFrameCount1 = (BYTE)(*((BYTE*)&testFrameSuccessCount));
txBuf.ZW_PowerlevelTestNodeReportFrame.testFrameCount2 = (BYTE)*(&testFrameSuccessCount);
/* Send Report - we do not care if it gets there or not - if needed report can be requested again */
ZW_SEND_DATA(testSourceNodeID, (BYTE *)&txBuf, sizeof(txBuf.ZW_PowerlevelTestNodeReportFrame), txOption, NULL);
}
/*============================= SendTestDone ============================
** Test frame has been transmitted to DUT and the result is noted for
** later reporting. If not finished then another Test frame is transmitted.
** If all test frames has been transmitted then the test is stopped
** and the final result is reported to the PowerlevelTest initiator.
**
** This is an application function example
**
**--------------------------------------------------------------------------*/
void
SendTestDone(
BYTE bStatus)
{
if (bStatus == TRANSMIT_COMPLETE_OK)
{
testFrameSuccessCount++;
}
if (testFrameCount && (--testFrameCount))
{
ZW_SEND_TEST_FRAME(testNodeID, testPowerLevel, SendTestDone);
}
else
{
if (testFrameSuccessCount)
{
testState = ZW_TEST_SUCCES;
}
else
{
testState = ZW_TEST_FAILED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -