/* * Led.h * * Created: 03.11.2013 17:11:58 * Author: BlubbFish */ #ifndef STRIPE_H_ #define STRIPE_H_ #include "hardware/pin.hpp" template class Stripe { public: Stripe() { this->init(); } void color(uint8_t r, uint8_t g, uint8_t b) { this->sp(0, r); //ROT this->sp(1, g); //GRÜN this->sp(2, b); //BLAU } void setcolor(uint8_t mask) { (mask & (1<<0)) ? this->sp(2, 0xFF) : this->sp(2, 0x00); //Blau (mask & (1<<1)) ? this->sp(1, 0xFF) : this->sp(1, 0x00); //Grün (mask & (1<<2)) ? this->sp(0, 0xFF) : this->sp(0, 0x00); //Rot } static const uint8_t BLACK = 0; static const uint8_t BLUE = 1; static const uint8_t GREEN = 2; static const uint8_t CYAN = 3; static const uint8_t RED = 4; static const uint8_t MAGENTA = 5; static const uint8_t YELLOW = 6; static const uint8_t WHITE = 7; void off() { this->timerOff(); stripered::make_low(); stripegreen::make_low(); stripeblue::make_low(); } void on() { this->timerOn(); } void lower() { if(OCR0B >= 5) { OCR0B = OCR0B - 5; } else { OCR0B = 0; } if(OCR2B >= 5) { OCR2B = OCR2B - 5; } else { OCR2B = 0; } if(OCR2A >= 5) { OCR2A = OCR2A - 5; } else { OCR2A = 0; } } void higher() { if(OCR0B <= 250) { OCR0B = OCR0B + 5; } else { OCR0B = 0; } if(OCR2B <= 250) { OCR2B = OCR2B + 5; } else { OCR2B = 0; } if(OCR2A <= 250) { OCR2A = OCR2A + 5; } else { OCR2A = 0; } } void fadeto(uint8_t red, uint8_t green, uint8_t blue, uint8_t time) { this->setfadecolor(0, red, green, blue, time); this->fade(1); } void fade(uint8_t num) { if(num <= max_map_size && num >= 0) { this->fade_zylk = num; } else { this->fade_zylk = 0; } this->_l = 0; } void setfadecolor(uint8_t index, uint8_t red, uint8_t green, uint8_t blue, uint8_t time) { this->fademap[0][index] = red; this->fademap[1][index] = green; this->fademap[2][index] = blue; this->fademap[3][index] = time; } uint8_t gp(uint8_t i) { switch(i) { case 0: return OCR0B; //ROT case 1: return OCR2B; //GRÜN case 2: return OCR2A; //BLAU } return 0; } void interrupt() { if(this->fade_zylk > 0) { if(this->fadesteps[0] == 0 && this->fadesteps[1] == 0 && this->fadesteps[2] == 0) { this->_l = (this->_l + 1 < this->fade_zylk) ? this->_l + 1 : 0; for(uint8_t i = 0; i<3; i++) { //0=red,1=green,2=blue this->fadesteps[i] = (this->fademap[i][this->_l]-this->gp(i))/this->fademap[3][this->_l]; this->virtualcolor[i] = this->gp(i); } } else { for(uint8_t i = 0; i<3; i++) { //0=red,1=green,2=blue if((this->fadesteps[i] > 0 && (this->virtualcolor[i] + this->fadesteps[i]) <= this->fademap[i][this->_l]) || (this->fadesteps[i] < 0 && (this->virtualcolor[i] + this->fadesteps[i]) >= this->fademap[i][this->_l])) { this->virtualcolor[i] = this->virtualcolor[i] + this->fadesteps[i]; this->sp(i, this->virtualcolor[i]); } else { this->sp(i, this->fademap[i][this->_l]); this->fadesteps[i] = 0; } } } } } private: static const uint8_t max_map_size = 6; uint8_t fade_zylk; uint8_t fademap[4][max_map_size]; float fadesteps[3]; float virtualcolor[3]; uint8_t _l; void init() { stripered::make_output(); stripegreen::make_output(); stripeblue::make_output(); this->fade_zylk = 0; this->_l = 0; this->initTimer(); this->color(0, 0, 0); } void sp(uint8_t i, uint8_t c) { switch(i) { case 0: OCR0B = c; break; //ROT case 1: OCR2B = c; break; //GRÜN case 2: OCR2A = c; break; //BLAU } } void timerOff() { // OC0B output: Disconnected // OC2A output: Disconnected // OC2B output: Disconnected TCCR0A &= ~(1<timerOn(); } const typedef avrlib::pin stripered; const typedef avrlib::pin stripegreen; const typedef avrlib::pin stripeblue; }; #endif /* STRIPE_H_ */