From 1e73f4d49f52bd3b00c725876bac9011670cea09 Mon Sep 17 00:00:00 2001 From: starcalc Date: Tue, 28 Feb 2017 22:56:04 +0100 Subject: [PATCH] NeoPatterns added, font extracted --- pixelprojektor/NeoPatterns.cpp | 293 +++++++++++++++++++++++++++++++++ pixelprojektor/NeoPatterns.h | 59 +++++++ pixelprojektor/font.h | 150 +++++++++++++++++ 3 files changed, 502 insertions(+) create mode 100644 pixelprojektor/NeoPatterns.cpp create mode 100644 pixelprojektor/NeoPatterns.h create mode 100644 pixelprojektor/font.h diff --git a/pixelprojektor/NeoPatterns.cpp b/pixelprojektor/NeoPatterns.cpp new file mode 100644 index 0000000..91cea44 --- /dev/null +++ b/pixelprojektor/NeoPatterns.cpp @@ -0,0 +1,293 @@ +#include "NeoPatterns.h" + +NeoPatterns::NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)()) : + Adafruit_NeoPixel(pixels, pin, type) +{ + OnComplete = callback; +} + +void NeoPatterns::Update(){ + if((millis() - lastUpdate) > Interval) // time to update + { + lastUpdate = millis(); + switch(ActivePattern) + { + case RAINBOW_CYCLE: + RainbowCycleUpdate(); + break; + case THEATER_CHASE: + TheaterChaseUpdate(); + break; + case COLOR_WIPE: + ColorWipeUpdate(); + break; + case SCANNER: + ScannerUpdate(); + break; + case FADE: + FadeUpdate(); + break; + case RANDOM_FADE: + RandomFadeUpdate(); + break; + case NONE: + break; + default: + break; + } + } +} + +void NeoPatterns::Increment() +{ + if (Direction == FORWARD) + { + Index++; + if (Index >= TotalSteps) + { + Index = 0; + if (OnComplete != NULL) + { + OnComplete(); // call the comlpetion callback + } + } + } + else // Direction == REVERSE + { + --Index; + if (Index <= 0) + { + Index = TotalSteps-1; + if (OnComplete != NULL) + { + OnComplete(); // call the comlpetion callback + } + } + } +} + +void NeoPatterns::Reverse(){ + if (Direction == FORWARD) + { + Direction = REVERSE; + Index = TotalSteps-1; + } + else + { + Direction = FORWARD; + Index = 0; + } +} + +void NeoPatterns::None(){ + if(ActivePattern != NONE) { + clear(); + show(); + } + ActivePattern = NONE; +} + +void NeoPatterns::RainbowCycle(uint8_t interval, direction dir){ + ActivePattern = RAINBOW_CYCLE; + Interval = interval; + TotalSteps = 255; + Index = 0; + Direction = dir; +} + +void NeoPatterns::RainbowCycleUpdate() +{ + for(int i=0; i< numPixels(); i++) + { + setPixelColor(i, Wheel(((i * 256 / numPixels()) + Index) & 255)); + } + show(); + Increment(); +} + +void NeoPatterns::TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir){ + ActivePattern = THEATER_CHASE; + Interval = interval; + TotalSteps = numPixels(); + Color1 = color1; + Color2 = color2; + Index = 0; + Direction = dir; +} +void NeoPatterns::TheaterChaseUpdate(){ + for(int i=0; i< numPixels(); i++) + { + if ((i + Index) % 3 == 0) + { + setPixelColor(i, Color1); + } + else + { + setPixelColor(i, Color2); + } + } + show(); + Increment(); +} + +void NeoPatterns::ColorWipe(uint32_t color, uint8_t interval, direction dir) +{ + ActivePattern = COLOR_WIPE; + Interval = interval; + TotalSteps = numPixels(); + Color1 = color; + Index = 0; + Direction = dir; +} + +// Update the Color Wipe Pattern +void NeoPatterns::ColorWipeUpdate() +{ + setPixelColor(Index, Color1); + show(); + Increment(); +} + +// Initialize for a SCANNNER +void NeoPatterns::Scanner(uint32_t color1, uint8_t interval, bool colorful) +{ + ActivePattern = SCANNER; + Interval = interval; + TotalSteps = (numPixels() - 1) * 2; + Color1 = color1; + Index = 0; + wPos = 0; + this->colorful = colorful; +} + +// Update the Scanner Pattern +void NeoPatterns::ScannerUpdate() +{ + if(colorful) { + Color1 = Wheel(wPos); + if(wPos >= 255) { + wPos =0; + } + else { + wPos++; + } + } + for (int i = 0; i < numPixels(); i++) + { + if (i == Index) // Scan Pixel to the right + { + setPixelColor(i, Color1); + } + else if (i == TotalSteps - Index) // Scan Pixel to the left + { + setPixelColor(i, Color1); + } + else // Fading tail + { + setPixelColor(i, DimColor(getPixelColor(i))); + } + } + show(); + Increment(); + +} + +void NeoPatterns::Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir) +{ + ActivePattern = FADE; + Interval = interval; + TotalSteps = steps; + Color1 = color1; + Color2 = color2; + Index = 0; + Direction = dir; +} + +// Update the Fade Pattern +void NeoPatterns::FadeUpdate() +{ + // Calculate linear interpolation between Color1 and Color2 + // Optimise order of operations to minimize truncation error + uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / TotalSteps; + uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps; + uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps; + + ColorSet(Color(red, green, blue)); + show(); + Increment(); +} + +void NeoPatterns::RandomFade(uint8_t interval ){ + ActivePattern = RANDOM_FADE; + Interval = interval; + TotalSteps = 255; + Index = 0; +} +void NeoPatterns::RandomFadeUpdate(){ + ColorSet(Wheel(Index)); + Increment(); +} + +void NeoPatterns::SetColor1(uint32_t color){ + Color1 = color; +} +void NeoPatterns::SetColor2(uint32_t color){ + Color2 = color; +} + +// Calculate 50% dimmed version of a color (used by ScannerUpdate) +uint32_t NeoPatterns::DimColor(uint32_t color) +{ + // Shift R, G and B components one bit to the right + uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1); + return dimColor; +} + +// Set all pixels to a color (synchronously) +void NeoPatterns::ColorSet(uint32_t color) +{ + for (int i = 0; i < numPixels(); i++) + { + setPixelColor(i, color); + } + show(); +} + +// Returns the Red component of a 32-bit color +uint8_t NeoPatterns::Red(uint32_t color) +{ + return (color >> 16) & 0xFF; +} + +// Returns the Green component of a 32-bit color +uint8_t NeoPatterns::Green(uint32_t color) +{ + return (color >> 8) & 0xFF; +} + +// Returns the Blue component of a 32-bit color +uint8_t NeoPatterns::Blue(uint32_t color) +{ + return color & 0xFF; +} + +// Input a value 0 to 255 to get a color value. +// The colours are a transition r - g - b - back to r. +uint32_t NeoPatterns::Wheel(byte WheelPos) +{ + WheelPos = 255 - WheelPos; + if(WheelPos < 85) + { + return Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + else if(WheelPos < 170) + { + WheelPos -= 85; + return Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + else + { + WheelPos -= 170; + return Color(WheelPos * 3, 255 - WheelPos * 3, 0); + } +} diff --git a/pixelprojektor/NeoPatterns.h b/pixelprojektor/NeoPatterns.h new file mode 100644 index 0000000..68e470b --- /dev/null +++ b/pixelprojektor/NeoPatterns.h @@ -0,0 +1,59 @@ +#include + +// Pattern types supported: +enum pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, RANDOM_FADE }; +// Patern directions supported: +enum direction { FORWARD, REVERSE }; + +class NeoPatterns : public Adafruit_NeoPixel +{ +public: +NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)()); + +void Update(); + +void Reverse(); +void None(); +void RainbowCycle(uint8_t interval, direction dir = FORWARD); +void RainbowCycleUpdate(); +void TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD); +void TheaterChaseUpdate(); +void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD); +void ColorWipeUpdate(); +void Scanner(uint32_t color1, uint8_t interval = 40,bool colorful = false); +void ScannerUpdate(); +void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD); +void FadeUpdate(); +void RandomFade(uint8_t interval = 100); +void RandomFadeUpdate(); + +void SetColor1(uint32_t color); +void SetColor2(uint32_t color); +//Utilities +void ColorSet(uint32_t color); +uint8_t Red(uint32_t color); +uint8_t Green(uint32_t color); +uint8_t Blue(uint32_t color); +uint32_t Wheel(byte WheelPos); + +private: + +// Member Variables: +pattern ActivePattern; // which pattern is running +direction Direction; // direction to run the pattern + +unsigned long Interval; // milliseconds between updates +unsigned long lastUpdate; // last update of position + +uint32_t Color1, Color2; // What colors are in use +uint16_t TotalSteps; // total number of steps in the pattern +uint16_t Index; // current step within the pattern + +byte wPos; +bool colorful; + +uint32_t DimColor(uint32_t color); +void Increment(); +void (*OnComplete)(); // Callback on completion of pattern + +}; diff --git a/pixelprojektor/font.h b/pixelprojektor/font.h new file mode 100644 index 0000000..9b2094c --- /dev/null +++ b/pixelprojektor/font.h @@ -0,0 +1,150 @@ + +/* the values in this array are a 8x8 bitmap font for ascii characters */ +static uint64_t font[128] = { + /************************************************************************ + font.c + Copyright (C) Lisa Milne 2014 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see + ************************************************************************/ + 0x7E7E7E7E7E7E0000, /* NUL */ + 0x7E7E7E7E7E7E0000, /* SOH */ + 0x7E7E7E7E7E7E0000, /* STX */ + 0x7E7E7E7E7E7E0000, /* ETX */ + 0x7E7E7E7E7E7E0000, /* EOT */ + 0x7E7E7E7E7E7E0000, /* ENQ */ + 0x7E7E7E7E7E7E0000, /* ACK */ + 0x7E7E7E7E7E7E0000, /* BEL */ + 0x7E7E7E7E7E7E0000, /* BS */ + 0x0, /* TAB */ + 0x7E7E7E7E7E7E0000, /* LF */ + 0x7E7E7E7E7E7E0000, /* VT */ + 0x7E7E7E7E7E7E0000, /* FF */ + 0x7E7E7E7E7E7E0000, /* CR */ + 0x7E7E7E7E7E7E0000, /* SO */ + 0x7E7E7E7E7E7E0000, /* SI */ + 0x7E7E7E7E7E7E0000, /* DLE */ + 0x7E7E7E7E7E7E0000, /* DC1 */ + 0x7E7E7E7E7E7E0000, /* DC2 */ + 0x7E7E7E7E7E7E0000, /* DC3 */ + 0x7E7E7E7E7E7E0000, /* DC4 */ + 0x7E7E7E7E7E7E0000, /* NAK */ + 0x7E7E7E7E7E7E0000, /* SYN */ + 0x7E7E7E7E7E7E0000, /* ETB */ + 0x7E7E7E7E7E7E0000, /* CAN */ + 0x7E7E7E7E7E7E0000, /* EM */ + 0x7E7E7E7E7E7E0000, /* SUB */ + 0x7E7E7E7E7E7E0000, /* ESC */ + 0x7E7E7E7E7E7E0000, /* FS */ + 0x7E7E7E7E7E7E0000, /* GS */ + 0x7E7E7E7E7E7E0000, /* RS */ + 0x7E7E7E7E7E7E0000, /* US */ + 0x0, /* (space) */ + 0x808080800080000, /* ! */ + 0x2828000000000000, /* " */ + 0x287C287C280000, /* # */ + 0x81E281C0A3C0800, /* $ */ + 0x6094681629060000, /* % */ + 0x1C20201926190000, /* & */ + 0x808000000000000, /* ' */ + 0x810202010080000, /* ( */ + 0x1008040408100000, /* ) */ + 0x2A1C3E1C2A000000, /* * */ + 0x8083E08080000, /* + */ + 0x81000, /* , */ + 0x3C00000000, /* - */ + 0x80000, /* . */ + 0x204081020400000, /* / */ + 0x1824424224180000, /* 0 */ + 0x8180808081C0000, /* 1 */ + 0x3C420418207E0000, /* 2 */ + 0x3C420418423C0000, /* 3 */ + 0x81828487C080000, /* 4 */ + 0x7E407C02423C0000, /* 5 */ + 0x3C407C42423C0000, /* 6 */ + 0x7E04081020400000, /* 7 */ + 0x3C423C42423C0000, /* 8 */ + 0x3C42423E023C0000, /* 9 */ + 0x80000080000, /* : */ + 0x80000081000, /* ; */ + 0x6186018060000, /* < */ + 0x7E007E000000, /* = */ + 0x60180618600000, /* > */ + 0x3844041800100000, /* ? */ + 0x3C449C945C201C, /* @ */ + 0x1818243C42420000, /* A */ + 0x7844784444780000, /* B */ + 0x3844808044380000, /* C */ + 0x7844444444780000, /* D */ + 0x7C407840407C0000, /* E */ + 0x7C40784040400000, /* F */ + 0x3844809C44380000, /* G */ + 0x42427E4242420000, /* H */ + 0x3E080808083E0000, /* I */ + 0x1C04040444380000, /* J */ + 0x4448507048440000, /* K */ + 0x40404040407E0000, /* L */ + 0x4163554941410000, /* M */ + 0x4262524A46420000, /* N */ + 0x1C222222221C0000, /* O */ + 0x7844784040400000, /* P */ + 0x1C222222221C0200, /* Q */ + 0x7844785048440000, /* R */ + 0x1C22100C221C0000, /* S */ + 0x7F08080808080000, /* T */ + 0x42424242423C0000, /* U */ + 0x8142422424180000, /* V */ + 0x4141495563410000, /* W */ + 0x4224181824420000, /* X */ + 0x4122140808080000, /* Y */ + 0x7E040810207E0000, /* Z */ + 0x3820202020380000, /* [ */ + 0x4020100804020000, /* */ + 0x3808080808380000, /* ] */ + 0x1028000000000000, /* ^ */ + 0x7E0000, /* _ */ + 0x1008000000000000, /* ` */ + 0x3C023E463A0000, /* a */ + 0x40407C42625C0000, /* b */ + 0x1C20201C0000, /* c */ + 0x2023E42463A0000, /* d */ + 0x3C427E403C0000, /* e */ + 0x18103810100000, /* f */ + 0x344C44340438, /* g */ + 0x2020382424240000, /* h */ + 0x800080808080000, /* i */ + 0x800180808080870, /* j */ + 0x20202428302C0000, /* k */ + 0x1010101010180000, /* l */ + 0x665A42420000, /* m */ + 0x2E3222220000, /* n */ + 0x3C42423C0000, /* o */ + 0x5C62427C4040, /* p */ + 0x3A46423E0202, /* q */ + 0x2C3220200000, /* r */ + 0x1C201804380000, /* s */ + 0x103C1010180000, /* t */ + 0x2222261A0000, /* u */ + 0x424224180000, /* v */ + 0x81815A660000, /* w */ + 0x422418660000, /* x */ + 0x422214081060, /* y */ + 0x3C08103C0000, /* z */ + 0x1C103030101C0000, /* { */ + 0x808080808080800, /* | */ + 0x38080C0C08380000, /* } */ + 0x324C000000, /* ~ */ + 0x7E7E7E7E7E7E0000 /* DEL */ +}; +