XYmap.h
 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  
27  // Parameters for width and height
28  const uint8_t kMatrixWidth = 24;
29  const uint8_t kMatrixHeight = 8;
30  const uint8_t kBorderWidth = 2; //for swirly
31  
32  #define NUM_LEDS (kMatrixWidth * kMatrixHeight)
33  CRGB leds[ NUM_LEDS ];
34  
35  // This function will return the right 'led index number' for 
36  // a given set of X and Y coordinates on DiscoBandCamp
37  // This code, plus the supporting 80-byte table is much smaller 
38  // and much faster than trying to calculate the pixel ID with code.
39  #define LAST_VISIBLE_LED 119
40  uint8_t XY( uint8_t x, uint8_t y)
41  {
42    // any out of bounds address maps to the first hidden pixel
43    if( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) {
44      return (LAST_VISIBLE_LED + 1);
45    }
46  
47  //   On the visual left of DiscoBandCamp, wearers right
48  //     +------------------------------------------ 
49  //   | 10   9   8   7   6   5   4   3   2   1   0
50  //   | .    20  19  18  17  16  15  14  13  12  11
51  //   | .    .   29  28  27  26  25  24  23  22  21
52  //   | .    .   .   37  36  35  34  33  32  31  30  
53  //   | .    .   .   .   44  43  42  41  40  39  38
54  //   | .    .   .   .   .   50  49  48  47  46  45
55  //   | .    .   .   .   .   .   55  54  53  52  51  
56  //   | .    .   .   .   .   .   .   59  58  57  56
57  
58  //this is how DiscoBandCamp works
59    const uint8_t JacketTable[] = {
60  10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  145,
61  153,60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
62  120,11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 146,  
63  154,80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 182, 
64  121,127,21, 22, 23, 24, 25, 26, 27, 28, 29, 147, 
65  155,89, 88, 87, 86, 85, 84, 83, 82, 81, 176,183, 
66  122,128,133,30, 31, 32, 33, 34, 35, 36, 37, 148,  
67  156,97, 96, 95, 94, 93, 92, 91, 90, 171,177,184, 
68  123,129,134,135,38, 39, 40, 41, 42, 43, 44, 149,  
69  157,104,103,102,101,100,99, 98, 167,172,178,185, 
70  124,130,134,136,139,45, 46, 47, 48, 49, 50, 150,  
71  158,110,109,108,107,106,105,164,168,173,179,186, 
72  125,131,134,137,140,142,51, 52, 53, 54, 55, 151,  
73  159,115,114,113,112,111,162,165,169,174,180,187, 
74  126,132,134,138,141,143,144,56, 57, 58, 59, 152,  
75  160,119,118,117,116,161,163,166,170,175,181,188,
76    };
77  
78    uint8_t i = (y * kMatrixWidth) + x;
79    uint8_t j = JacketTable[i];
80    return j;
81  }