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

📄 leddim.c

📁 用keil C 写的读写CS5460及校准的程式
💻 C
📖 第 1 页 / 共 5 页
字号:
  {
    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 + -