From d0ca835df250a9bc51808eb442d04660c4495691 Mon Sep 17 00:00:00 2001 From: IMback Date: Tue, 23 May 2017 10:18:45 +0200 Subject: [PATCH] add rgbled.cpp .h --- rgbled.cpp | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++ rgbled.h | 32 ++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 rgbled.cpp create mode 100644 rgbled.h diff --git a/rgbled.cpp b/rgbled.cpp new file mode 100644 index 0000000..db149d1 --- /dev/null +++ b/rgbled.cpp @@ -0,0 +1,150 @@ +#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; +} diff --git a/rgbled.h b/rgbled.h new file mode 100644 index 0000000..4e22ff6 --- /dev/null +++ b/rgbled.h @@ -0,0 +1,32 @@ +#include "pwm.h" + +class RgbLed +{ +private: + Pwm8b* _pwmA; + Pwm8b* _pwmB; + + uint8_t _pattern = 0; + + uint16_t _counter = 0; + bool _stroke = false; + + + void patternStep(); + +public: + RgbLed( Pwm8b* pwmA, Pwm8b* pwmB ); + + void setSolidColor( const uint8_t r, const uint8_t g, const uint8_t b); + void setPattern(const uint8_t id); + void setPreset( const uint8_t preset); + + void on(); + void off(); + + void logic(); + uint8_t getR(); + uint8_t getB(); + uint8_t getG(); + +};