#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; _targetR = r; _targetG = g; _targetB = b; } 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 ) { _pwmA->setDutyB(0); _pwmA->setDutyA(0); _pwmB->setDutyB(0); on(); _stroke = false; _counter = 0; } } void RgbLed::on() { _powerd = true; _pwmA->on(); _pwmB->on(); } void RgbLed::off() { _powerd = false; _pwmA->off(); _pwmB->off(); } void RgbLed::setFade(bool fade) { _fade=fade; } 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) //Alarm! { 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 == (uint8_t) 255 << 8) _stroke = true; else if(_counter == 0) _stroke = false; _pwmA->setDutyB(_counter >> 6); _pwmA->setDutyA(_counter >> 8); _pwmB->setDutyB(_counter >> 3); } else if(_pattern == 4) { ( _counter < 8192 ) ? _pwmA->setDutyB(_counter >> 6) : _pwmA->setDutyB( 128 + (_counter >> 11)); if( _counter > 1024 ) ( 8192 < _counter && _counter < 16384 ) ? _pwmA->setDutyA((_counter-8192) >> 6) : _pwmA->setDutyA( 128 + (_counter >> 9 )); if( _counter > 8192 ) _pwmB->setDutyB(_counter >> 9); if(_counter<65530) _counter++; else _pwmB->setDutyB(140); _delay_ms(18); } } void RgbLed::logic() { patternStep(); if(_pattern == 0 && _fade) { _counter++; if( uint8_t(_counter << _fadeSpeed) == 0) { if( getR() != _targetR) { _pwmA->setDutyB(getR() - sgn(getR() - _targetR)); } if( getG() != _targetG) { _pwmA->setDutyA(getG() - sgn(getG() - _targetG)); } if( getB() != _targetB) { _pwmB->setDutyB(getB() - sgn(getB() - _targetB)); } } } else if(_pattern == 0) { _pwmA->setDutyA(_targetG); _pwmA->setDutyB(_targetR); _pwmB->setDutyB(_targetB); } } uint8_t RgbLed::getR() { return _pwmA->getValueB(); } uint8_t RgbLed::getB() { return _pwmB->getValueB(); } uint8_t RgbLed::getG() { return _pwmA->getValueA(); }