/************************************************************************************************** * @fn macSleep * * @brief Puts radio into the selected sleep mode. * * @param sleepState - selected sleep level, see #defines in .h file * * @return TRUE if radio was successfully put into selected sleep mode. * FALSE if it was not safe for radio to go to sleep. ************************************************************************************************** */ uint8 macSleep(uint8 sleepState) { MAC_ASSERT(macSleepState == MAC_SLEEP_STATE_AWAKE); /* radio must be awake to put it to sleep */ MAC_ASSERT(macRxFilter == RX_FILTER_OFF); /* do not sleep when scanning or in promiscuous mode */ MAC_ASSERT(!HAL_INTERRUPTS_ARE_ENABLED()); /* interrupts should be disabled to call this function */ /* check to see if anything would prevent sleep */ if (macRxActive || macTxActive || macRxEnableFlags) { /* sleep is not allowed */ return(FALSE); } /* put MAC timer to sleep */ MAC_RADIO_TIMER_SLEEP(); /* update sleep state variable */ macSleepState = sleepState; /* put radio in selected sleep mode */ if (sleepState == MAC_SLEEP_STATE_OSC_OFF) { MAC_RADIO_TURN_OFF_OSC(); } else { MAC_ASSERT(sleepState == MAC_SLEEP_STATE_CHIP_OFF); MAC_RADIO_TURN_OFF_VREG(); } /* radio successfully put to sleep */ return(TRUE); }
/************************************************************************************************** * @fn macSleep * * @brief Puts radio into the selected sleep mode. * * @param sleepState - selected sleep level, see #defines in .h file * * @return TRUE if radio was successfully put into selected sleep mode. * FALSE if it was not safe for radio to go to sleep. ************************************************************************************************** */ uint8 macSleep(uint8 sleepState) { halIntState_t s; /* disable interrupts until macSleepState can be set */ HAL_ENTER_CRITICAL_SECTION(s); /* assert checks */ MAC_ASSERT(macSleepState == MAC_SLEEP_STATE_AWAKE); /* radio must be awake to put it to sleep */ MAC_ASSERT(macRxFilter == RX_FILTER_OFF); /* do not sleep when scanning or in promiscuous mode */ /* if either RX or TX is active or any RX enable flags are set, it's not OK to sleep */ if (macRxActive || macRxOutgoingAckFlag || macTxActive || macRxEnableFlags) { HAL_EXIT_CRITICAL_SECTION(s); return(FALSE); } /* turn off the receiver */ macRxOff(); /* update sleep state variable */ macSleepState = sleepState; /* macSleepState is now set, re-enable interrupts */ HAL_EXIT_CRITICAL_SECTION(s); /* put MAC timer to sleep */ MAC_RADIO_TIMER_SLEEP(); /* put radio in selected sleep mode */ if (sleepState == MAC_SLEEP_STATE_OSC_OFF) { MAC_RADIO_TURN_OFF_OSC(); } else { MAC_ASSERT(sleepState == MAC_SLEEP_STATE_RADIO_OFF); /* unknown sleep state */ MAC_RADIO_TURN_OFF_POWER(); } /* radio successfully entered sleep mode */ return(TRUE); }