// Copyright 2011 Peter Kvitek
//
// Author: Peter Kvitek (pete@kvitek.com)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see .
//
// -----------------------------------------------------------------------------
//
// Single pin LED device, sink or source current. Also a flashing LED device: 
// being set to on LED stays lit for specified about of tick cycles.
#ifndef AVRLIB_DEVICES_LED_H_
#define AVRLIB_DEVICES_LED_H_
#include 
#include "avrlib/gpio.h"
namespace avrlib {
enum LedMode {
  LED_SINK_CURRENT,
  LED_SOURCE_CURRENT,
};
template
class Led {
 public:
  static void Init() {
    LedPort::set_mode(DIGITAL_OUTPUT);
    Off();
  }
  static inline void On(bool on) {
    if (on) {
      On();
    } else
      Off();
  }
  static inline void On() {
    if (led_mode == LED_SINK_CURRENT) {
      LedPort::Low();
    } else
      LedPort::High();
  }
  static inline void Off() {
    if (led_mode == LED_SINK_CURRENT) {
      LedPort::High();
    } else
      LedPort::Low();
  }
};
template
class FlashLed {
 public:
  FlashLed() { }
  static void Init() {
    LedT::Init();
    on_count_ = 0;
  }
  static inline void On() {
    LedT::On();
    on_count_ = on_count;
  }
  static inline void Off() {
    LedT::Off();
    on_count_ = 0;
  }
  static inline void Tick() {
    if (on_count_) {
      if (--on_count_ == 0) {
        LedT::Off();
      }
    }
  }
 private:
  static volatile uint8_t on_count_;
  DISALLOW_COPY_AND_ASSIGN(FlashLed);
};
// Static variables created for each instance
template
  volatile uint8_t FlashLed::on_count_ = 0;
}  // namespace avrlib
#endif   // AVRLIB_DEVICES_LED_H_