// 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_