#include "rgbled.h" RgbLed::RgbLed( Pwm8b* pwmA, Pwm8b* pwmB ): _pwmA(pwmA), _pwmB(pwmB) {} void RgbLed::setSolidColor( const uint8_t r, const uint8_t g, const uint8_t b) { _pattern=0; _pwmA->setDutyA(g); _pwmA->setDutyB(r); _pwmB->setDutyB(b); r+b+g == 0 ? off() : on(); } void RgbLed::setPreset( const uint8_t preset) { switch (preset) { //whites case 1: setSolidColor( 160,255,80 ); //neutral white break; case 2: setSolidColor( 200,255,20 ); //Warm white break; case 3: setSolidColor( 180,255,140 ); //cold white break; //reds case 4: setSolidColor( 255,0,0 ); //red break; case 5: setSolidColor( 255,60,10 ); //ruby break; case 6: setSolidColor( 255,30,30 ); //pink break; case 7: setSolidColor( 255,155,0 ); //orange break; //greens case 8: setSolidColor( 0,255,0 ); //green break; case 9: setSolidColor( 55,255,10 ); //poison break; case 10: setSolidColor( 0,255,0 ); //green break; case 11: setSolidColor( 8,80,7 ); //mint break; //blues case 12: setSolidColor( 0,0,255 ); //blue break; case 13: setSolidColor( 50,255,255 ); //sky break; case 14: setSolidColor( 10,80,150 ); //ocean break; case 15: setSolidColor( 0,255,220 ); //turqouse break; //strange yellow color color case 16: setSolidColor( 200,255,0 ); break; default: setSolidColor( 255,055,20 ); } } void RgbLed::setPattern(const uint8_t id) { _pattern=id; if( id != 0 ) { on(); _stroke = false; _counter = 0; } } void RgbLed::on() { _pwmA->on(); _pwmB->on(); } void RgbLed::off() { _pwmA->off(); _pwmB->off(); } void RgbLed::patternStep() { if(_pattern == 1) { if(!_stroke)_counter++; else _counter --; if(_counter == 255) _stroke = true; else if(_counter == 0) _stroke = false; _pwmA->setDutyB(_counter); _pwmA->setDutyA(255-_counter); _pwmB->setDutyB(_counter-64); } else if(_pattern == 2) { if(!_stroke)_counter++; else _counter --; if(_counter == 255 << 1) _stroke = true; else if(_counter == 0) _stroke = false; _pwmA->setDutyB(_counter >> 1); _pwmA->setDutyA(0); _pwmB->setDutyB(0); } else if(_pattern == 3) { if(!_stroke)_counter++; else _counter --; if(_counter == 255 << 8) _stroke = true; else if(_counter == 0) _stroke = false; _pwmA->setDutyB(_counter >> 6); _pwmA->setDutyA(_counter >> 8); _pwmB->setDutyB(_counter >> 3); } } void RgbLed::logic() { patternStep(); } uint8_t RgbLed::getR() { return OCR0A; } uint8_t RgbLed::getB() { return OCR0B; } uint8_t RgbLed::getG() { return OCR2B; }