|
| 1 | +// SPDX-FileCopyrightText: 2019 Anne Barela for Adafruit Industries |
| 2 | +// |
| 3 | +// SPDX-License-Identifier: MIT |
| 4 | + |
| 5 | +// Helper functions for a two-dimensional XY matrix of pixels. |
| 6 | +// Special credit to Mark Kriegsman for RGB Shades Kickstarter 2014-10-18 |
| 7 | +// https://www.kickstarter.com/projects/macetech/rgb-led-shades |
| 8 | +// |
| 9 | +// This special 'XY' code lets you program as a plain matrix. |
| 10 | +// |
| 11 | +// Writing to and reading from the 'holes' in the layout is |
| 12 | +// also allowed; holes retain their data, it's just not displayed. |
| 13 | +// |
| 14 | +// You can also test to see if you're on or off the layout |
| 15 | +// like this |
| 16 | +// if( XY(x,y) > LAST_VISIBLE_LED ) { ...off the layout...} |
| 17 | +// |
| 18 | +// X and Y bounds checking is also included, so it is safe |
| 19 | +// to just do this without checking x or y in your code: |
| 20 | +// leds[ XY(x,y) ] == CRGB::Red; |
| 21 | +// All out of bounds coordinates map to the first hidden pixel. |
| 22 | +// |
| 23 | +// XY(x,y) takes x and y coordinates and returns an LED index number, |
| 24 | +// for use like this: leds[ XY(x,y) ] == CRGB::Red; |
| 25 | + |
| 26 | +#include <FastLED.h> |
| 27 | + |
| 28 | +// Parameters for width and height |
| 29 | +const uint8_t kMatrixWidth = 24; |
| 30 | +const uint8_t kMatrixHeight = 8; |
| 31 | +const uint8_t kBorderWidth = 2; //for swirly |
| 32 | + |
| 33 | +#define NUM_LEDS (kMatrixWidth * kMatrixHeight) |
| 34 | +CRGB leds[ NUM_LEDS ]; |
| 35 | + |
| 36 | +// This function will return the right 'led index number' for |
| 37 | +// a given set of X and Y coordinates on DiscoBandCamp |
| 38 | +// This code, plus the supporting 80-byte table is much smaller |
| 39 | +// and much faster than trying to calculate the pixel ID with code. |
| 40 | +#define LAST_VISIBLE_LED 119 |
| 41 | +uint16_t XY(uint16_t x, uint16_t y, uint16_t width, uint16_t height) |
| 42 | +{ |
| 43 | + (void)width; |
| 44 | + (void)height; |
| 45 | + // any out of bounds address maps to the first hidden pixel |
| 46 | + if( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) { |
| 47 | + return (LAST_VISIBLE_LED + 1); |
| 48 | + } |
| 49 | + |
| 50 | +// On the visual left of DiscoBandCamp, wearers right |
| 51 | +// +------------------------------------------ |
| 52 | +// | 10 9 8 7 6 5 4 3 2 1 0 |
| 53 | +// | . 20 19 18 17 16 15 14 13 12 11 |
| 54 | +// | . . 29 28 27 26 25 24 23 22 21 |
| 55 | +// | . . . 37 36 35 34 33 32 31 30 |
| 56 | +// | . . . . 44 43 42 41 40 39 38 |
| 57 | +// | . . . . . 50 49 48 47 46 45 |
| 58 | +// | . . . . . . 55 54 53 52 51 |
| 59 | +// | . . . . . . . 59 58 57 56 |
| 60 | + |
| 61 | +//this is how DiscoBandCamp works |
| 62 | + const uint8_t JacketTable[] = { |
| 63 | +10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 145, |
| 64 | +153,60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, |
| 65 | +120,11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 146, |
| 66 | +154,80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 182, |
| 67 | +121,127,21, 22, 23, 24, 25, 26, 27, 28, 29, 147, |
| 68 | +155,89, 88, 87, 86, 85, 84, 83, 82, 81, 176,183, |
| 69 | +122,128,133,30, 31, 32, 33, 34, 35, 36, 37, 148, |
| 70 | +156,97, 96, 95, 94, 93, 92, 91, 90, 171,177,184, |
| 71 | +123,129,134,135,38, 39, 40, 41, 42, 43, 44, 149, |
| 72 | +157,104,103,102,101,100,99, 98, 167,172,178,185, |
| 73 | +124,130,134,136,139,45, 46, 47, 48, 49, 50, 150, |
| 74 | +158,110,109,108,107,106,105,164,168,173,179,186, |
| 75 | +125,131,134,137,140,142,51, 52, 53, 54, 55, 151, |
| 76 | +159,115,114,113,112,111,162,165,169,174,180,187, |
| 77 | +126,132,134,138,141,143,144,56, 57, 58, 59, 152, |
| 78 | +160,119,118,117,116,161,163,166,170,175,181,188, |
| 79 | + }; |
| 80 | + |
| 81 | + uint8_t i = (y * kMatrixWidth) + x; |
| 82 | + uint8_t j = JacketTable[i]; |
| 83 | + return j; |
| 84 | +} |
| 85 | + |
| 86 | +// Instantiate an XYMap object |
| 87 | +fl::XYMap myXYMap = fl::XYMap::constructWithUserFunction(kMatrixWidth, kMatrixHeight, XY); |
0 commit comments