/// <summary> /// Sets the power state of the provided IPowerState given that the /// specified BTCmd will be executed next. A null BTCmd indicates that /// there are no more pending BTCmds to be executed from any connection. /// </summary> /// <param name="ips"> /// The IPowerState /// </param> /// <param name="conn"> /// The BTConnection for which the BTCmd is being executed. /// </param> /// <param name="cmd"> /// The next BTCmd to be executed, or null if there are no pending BTCmds. /// </param> public void ApplyPolicy(IPowerState ips, BTConnection conn, BTConnection.BTCmd cmd) { lock (this) { if (null != cmd) { // Dispose of the Timer if it's active, then PARK the chip if (null != m_powerOffTimer) { m_powerOffTimer.Dispose(); m_powerOffTimer = null; } PowerState state = PowerState.Park; while (!ips.SetPowerState(ref state)) { Thread.Sleep(1); } } else { // Then set a Timer that will turn the chip OFF if no new commands in the specified timeout if (null == conn || !conn.Connected) { if (null == m_powerOffTimer) { m_powerOffTimer = new Timer(PowerOffTimerFired, ips, c_powerOffTimeout, Timeout.Infinite); } } } } }
/// <summary> /// The event handler for the power off Timer firing event. /// </summary> /// <param name="sender"> /// The sending object (i.e. the Timer). /// </param> /// <param name="eargs"> /// The event arguments. /// </param> public void PowerOffTimerFired(object state) { IPowerState ips = (IPowerState)state; lock (this) { if (null != m_powerOffTimer) { m_powerOffTimer.Dispose(); m_powerOffTimer = null; PowerState ps = PowerState.Off; while (!ips.SetPowerState(ref ps)) { Thread.Sleep(1); } } } }