216 lines
4.1 KiB
C++
216 lines
4.1 KiB
C++
#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 = applyCal(r, calRed);
|
|
_targetG = applyCal(g, calGreen);
|
|
_targetB = applyCal(b, calBlue);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
uint8_t RgbLed::applyCal(uint16_t value, const uint16_t* cal)
|
|
{
|
|
uint16_t calValue;
|
|
if(value < 128) calValue = cal[0] + ((cal[1] - cal[0])*((uint32_t)value))/128;
|
|
else calValue = cal[1] + ((cal[2] - cal[1])*((uint32_t)(value-128)))/128;
|
|
return (value*calValue)/1000;
|
|
}
|
|
|
|
//unfinished
|
|
void RgbLed::adjustHeadroom(uint8_t& r, uint8_t& g, uint8_t& b, const uint8_t lumina)
|
|
{
|
|
uint8_t postCalLumina = ((uint16_t)r+g+b)/3;
|
|
while(postCalLumina < lumina && r < 255 && g < 255 && b < 255)
|
|
{
|
|
if(r > 255) break;
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|