This is a library for the DIGI-DOT-BOOSTER which can control LED stripes using the single wire protocol - ws2812 and compatible as well as RGBW LEDs like SK6812. Detailed information including the datasheet and protocol description are available here: http://www.led-genial.de/DIGI-DOT-Booster-WS2812-und-SK6812-ueber-SPI-Schnittstelle-ansteuern DIGI-DOT-BOOSTER acts as a SPI slave and waits for commands sent by a SPI master. This Library provides an easy to use abstraction layer for commands supported by the DD-Booster and adds some additional effects.

Dependents:   DD-Booster-waterdrop BLE_DD-Booster

Committer:
Gamadril
Date:
Wed Mar 08 08:49:00 2017 +0000
Revision:
2:4c1e47117cf8
Parent:
0:9e96b2bb1958
docs update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gamadril 0:9e96b2bb1958 1 /*
Gamadril 0:9e96b2bb1958 2 * DDBoster.cpp - Library to control the Digi-Dot-Booster using a high-level API
Gamadril 0:9e96b2bb1958 3 *
Gamadril 0:9e96b2bb1958 4 * https://github.com/Gamadril/DD-Booster-mbed
Gamadril 0:9e96b2bb1958 5 * MIT License
Gamadril 0:9e96b2bb1958 6 */
Gamadril 0:9e96b2bb1958 7
Gamadril 0:9e96b2bb1958 8 #include "DDBooster.h"
Gamadril 0:9e96b2bb1958 9
Gamadril 0:9e96b2bb1958 10 #define BOOSTER_CMD_DELAY 500
Gamadril 0:9e96b2bb1958 11 #define BOOSTER_LED_DELAY 30
Gamadril 0:9e96b2bb1958 12
Gamadril 0:9e96b2bb1958 13 #define BOOSTER_SETRGB 0xA1
Gamadril 0:9e96b2bb1958 14 #define BOOSTER_SETRGBW 0xA2
Gamadril 0:9e96b2bb1958 15 #define BOOSTER_SETHSV 0xA3
Gamadril 0:9e96b2bb1958 16 #define BOOSTER_SETLED 0xA4
Gamadril 0:9e96b2bb1958 17 #define BOOSTER_SETALL 0xA5
Gamadril 0:9e96b2bb1958 18 #define BOOSTER_SETRANGE 0xA6
Gamadril 0:9e96b2bb1958 19 #define BOOSTER_SETRAINBOW 0xA7
Gamadril 0:9e96b2bb1958 20 #define BOOSTER_GRADIENT 0xA8
Gamadril 0:9e96b2bb1958 21
Gamadril 0:9e96b2bb1958 22 #define BOOSTER_INIT 0xB1
Gamadril 0:9e96b2bb1958 23 #define BOOSTER_SHOW 0xB2
Gamadril 0:9e96b2bb1958 24 #define BOOSTER_SHIFTUP 0xB3
Gamadril 0:9e96b2bb1958 25 #define BOOSTER_SHIFTDOWN 0xB4
Gamadril 0:9e96b2bb1958 26 #define BOOSTER_COPYLED 0xB5
Gamadril 0:9e96b2bb1958 27 #define BOOSTER_REPEAT 0xB6
Gamadril 0:9e96b2bb1958 28
Gamadril 0:9e96b2bb1958 29 #define BOOSTER_RGBORDER 0xC1
Gamadril 0:9e96b2bb1958 30
Gamadril 0:9e96b2bb1958 31 DDBooster::DDBooster(PinName MOSI, PinName SCK, PinName CS, PinName RESET)
Gamadril 0:9e96b2bb1958 32 : _lastIndex(0)
Gamadril 0:9e96b2bb1958 33 , _device(MOSI, NC, SCK)
Gamadril 0:9e96b2bb1958 34 , _cs(CS, 1)
Gamadril 0:9e96b2bb1958 35 , _reset(RESET, 1)
Gamadril 0:9e96b2bb1958 36 {
Gamadril 0:9e96b2bb1958 37 _device.format(8,0);
Gamadril 0:9e96b2bb1958 38 _device.frequency(12000000);
Gamadril 0:9e96b2bb1958 39 }
Gamadril 0:9e96b2bb1958 40
Gamadril 0:9e96b2bb1958 41 void DDBooster::init(uint16_t ledCount, LedType ledType, LedColorOrder colorOrder)
Gamadril 0:9e96b2bb1958 42 {
Gamadril 0:9e96b2bb1958 43 // DD Booster expects the number of LEDs to be an even value (rounded up).
Gamadril 0:9e96b2bb1958 44 // 256 is defined as 0 to fit in one byte.
Gamadril 0:9e96b2bb1958 45 if (ledCount > 256) {
Gamadril 0:9e96b2bb1958 46 ledCount = 256;
Gamadril 0:9e96b2bb1958 47 }
Gamadril 0:9e96b2bb1958 48
Gamadril 0:9e96b2bb1958 49 _lastIndex = ledCount - 1;
Gamadril 0:9e96b2bb1958 50
Gamadril 0:9e96b2bb1958 51 uint8_t buffer[4];
Gamadril 0:9e96b2bb1958 52 buffer[0] = BOOSTER_INIT;
Gamadril 0:9e96b2bb1958 53 buffer[1] = ledCount + (ledCount & 1);
Gamadril 0:9e96b2bb1958 54 buffer[2] = ledType;
Gamadril 0:9e96b2bb1958 55 sendRawBytes(buffer, 3);
Gamadril 0:9e96b2bb1958 56
Gamadril 0:9e96b2bb1958 57 if (ledType == LED_RGB && colorOrder != ORDER_GRB) {
Gamadril 0:9e96b2bb1958 58 buffer[0] = BOOSTER_RGBORDER;
Gamadril 0:9e96b2bb1958 59 buffer[1] = 3;
Gamadril 0:9e96b2bb1958 60 buffer[2] = 2;
Gamadril 0:9e96b2bb1958 61 buffer[3] = 1;
Gamadril 0:9e96b2bb1958 62 sendRawBytes(buffer, 4);
Gamadril 0:9e96b2bb1958 63 }
Gamadril 0:9e96b2bb1958 64
Gamadril 0:9e96b2bb1958 65 // a delay after init is not documented, but seems to be necessary
Gamadril 0:9e96b2bb1958 66 wait_ms(40);
Gamadril 0:9e96b2bb1958 67 }
Gamadril 0:9e96b2bb1958 68
Gamadril 0:9e96b2bb1958 69 void DDBooster::reset()
Gamadril 0:9e96b2bb1958 70 {
Gamadril 0:9e96b2bb1958 71 if (_reset.is_connected()) {
Gamadril 0:9e96b2bb1958 72 _reset = 0;
Gamadril 0:9e96b2bb1958 73 wait_ms(100);
Gamadril 0:9e96b2bb1958 74 _reset = 1;
Gamadril 0:9e96b2bb1958 75 wait_ms(100);
Gamadril 0:9e96b2bb1958 76 }
Gamadril 0:9e96b2bb1958 77 }
Gamadril 0:9e96b2bb1958 78
Gamadril 0:9e96b2bb1958 79 void DDBooster::setRGB(uint8_t r, uint8_t g, uint8_t b)
Gamadril 0:9e96b2bb1958 80 {
Gamadril 0:9e96b2bb1958 81 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 82 BOOSTER_SETRGB,
Gamadril 0:9e96b2bb1958 83 r,
Gamadril 0:9e96b2bb1958 84 g,
Gamadril 0:9e96b2bb1958 85 b
Gamadril 0:9e96b2bb1958 86 };
Gamadril 0:9e96b2bb1958 87 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 88 }
Gamadril 0:9e96b2bb1958 89
Gamadril 0:9e96b2bb1958 90 void DDBooster::setRGBW(uint8_t r, uint8_t g, uint8_t b, uint8_t w)
Gamadril 0:9e96b2bb1958 91 {
Gamadril 0:9e96b2bb1958 92 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 93 BOOSTER_SETRGBW,
Gamadril 0:9e96b2bb1958 94 r,
Gamadril 0:9e96b2bb1958 95 g,
Gamadril 0:9e96b2bb1958 96 b,
Gamadril 0:9e96b2bb1958 97 w
Gamadril 0:9e96b2bb1958 98 };
Gamadril 0:9e96b2bb1958 99 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 100 }
Gamadril 0:9e96b2bb1958 101
Gamadril 0:9e96b2bb1958 102 void DDBooster::setHSV(uint16_t h, uint8_t s, uint8_t v)
Gamadril 0:9e96b2bb1958 103 {
Gamadril 0:9e96b2bb1958 104 if (h > 359) {
Gamadril 0:9e96b2bb1958 105 h = 359;
Gamadril 0:9e96b2bb1958 106 }
Gamadril 0:9e96b2bb1958 107 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 108 BOOSTER_SETHSV,
Gamadril 0:9e96b2bb1958 109 h & 0xFF,
Gamadril 0:9e96b2bb1958 110 h >> 8,
Gamadril 0:9e96b2bb1958 111 s,
Gamadril 0:9e96b2bb1958 112 v
Gamadril 0:9e96b2bb1958 113 };
Gamadril 0:9e96b2bb1958 114 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 115 }
Gamadril 0:9e96b2bb1958 116
Gamadril 0:9e96b2bb1958 117 void DDBooster::setLED(uint8_t index)
Gamadril 0:9e96b2bb1958 118 {
Gamadril 0:9e96b2bb1958 119 if (index > _lastIndex) {
Gamadril 0:9e96b2bb1958 120 return;
Gamadril 0:9e96b2bb1958 121 }
Gamadril 0:9e96b2bb1958 122 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 123 BOOSTER_SETLED,
Gamadril 0:9e96b2bb1958 124 index
Gamadril 0:9e96b2bb1958 125 };
Gamadril 0:9e96b2bb1958 126 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 127 }
Gamadril 0:9e96b2bb1958 128
Gamadril 0:9e96b2bb1958 129 void DDBooster::clearLED(uint8_t index)
Gamadril 0:9e96b2bb1958 130 {
Gamadril 0:9e96b2bb1958 131 if (index > _lastIndex) {
Gamadril 0:9e96b2bb1958 132 return;
Gamadril 0:9e96b2bb1958 133 }
Gamadril 0:9e96b2bb1958 134 // optimization by sending two commands in one transaction
Gamadril 0:9e96b2bb1958 135 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 136 BOOSTER_SETRGB,
Gamadril 0:9e96b2bb1958 137 0,
Gamadril 0:9e96b2bb1958 138 0,
Gamadril 0:9e96b2bb1958 139 0,
Gamadril 0:9e96b2bb1958 140 BOOSTER_SETLED,
Gamadril 0:9e96b2bb1958 141 index
Gamadril 0:9e96b2bb1958 142 };
Gamadril 0:9e96b2bb1958 143 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 144 }
Gamadril 0:9e96b2bb1958 145
Gamadril 0:9e96b2bb1958 146 void DDBooster::setAll()
Gamadril 0:9e96b2bb1958 147 {
Gamadril 0:9e96b2bb1958 148 uint8_t cmd[] = {BOOSTER_SETALL};
Gamadril 0:9e96b2bb1958 149 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 150 }
Gamadril 0:9e96b2bb1958 151
Gamadril 0:9e96b2bb1958 152 void DDBooster::clearAll()
Gamadril 0:9e96b2bb1958 153 {
Gamadril 0:9e96b2bb1958 154 // optimization by sending two commands in one transaction
Gamadril 0:9e96b2bb1958 155 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 156 BOOSTER_SETRGB,
Gamadril 0:9e96b2bb1958 157 0,
Gamadril 0:9e96b2bb1958 158 0,
Gamadril 0:9e96b2bb1958 159 0,
Gamadril 0:9e96b2bb1958 160 BOOSTER_SETALL
Gamadril 0:9e96b2bb1958 161 };
Gamadril 0:9e96b2bb1958 162 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 163 }
Gamadril 0:9e96b2bb1958 164
Gamadril 0:9e96b2bb1958 165 void DDBooster::setRange(uint8_t start, uint8_t end)
Gamadril 0:9e96b2bb1958 166 {
Gamadril 0:9e96b2bb1958 167 if (start > end || end > _lastIndex || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 168 return;
Gamadril 0:9e96b2bb1958 169 }
Gamadril 0:9e96b2bb1958 170 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 171 BOOSTER_SETRANGE,
Gamadril 0:9e96b2bb1958 172 start,
Gamadril 0:9e96b2bb1958 173 end
Gamadril 0:9e96b2bb1958 174 };
Gamadril 0:9e96b2bb1958 175 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 176 }
Gamadril 0:9e96b2bb1958 177
Gamadril 0:9e96b2bb1958 178 void DDBooster::setRainbow(uint16_t h, uint8_t s, uint8_t v, uint8_t start, uint8_t end, uint8_t step)
Gamadril 0:9e96b2bb1958 179 {
Gamadril 0:9e96b2bb1958 180 if (start > end || end > _lastIndex || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 181 return;
Gamadril 0:9e96b2bb1958 182 }
Gamadril 0:9e96b2bb1958 183 if (h > 359) {
Gamadril 0:9e96b2bb1958 184 h = 359;
Gamadril 0:9e96b2bb1958 185 }
Gamadril 0:9e96b2bb1958 186 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 187 BOOSTER_SETRAINBOW,
Gamadril 0:9e96b2bb1958 188 h & 0xFF,
Gamadril 0:9e96b2bb1958 189 h >> 8,
Gamadril 0:9e96b2bb1958 190 s,
Gamadril 0:9e96b2bb1958 191 v,
Gamadril 0:9e96b2bb1958 192 start,
Gamadril 0:9e96b2bb1958 193 end,
Gamadril 0:9e96b2bb1958 194 step
Gamadril 0:9e96b2bb1958 195 };
Gamadril 0:9e96b2bb1958 196 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 197 }
Gamadril 0:9e96b2bb1958 198
Gamadril 0:9e96b2bb1958 199 void DDBooster::setGradient(int start, int end, uint8_t from[3], uint8_t to[3])
Gamadril 0:9e96b2bb1958 200 {
Gamadril 0:9e96b2bb1958 201 if (start > end || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 202 return;
Gamadril 0:9e96b2bb1958 203 }
Gamadril 0:9e96b2bb1958 204
Gamadril 0:9e96b2bb1958 205 uint8_t steps = end - start;
Gamadril 0:9e96b2bb1958 206 if (steps == 0) {
Gamadril 0:9e96b2bb1958 207 setRGB(from[0], from[1], from[2]);
Gamadril 0:9e96b2bb1958 208 return;
Gamadril 0:9e96b2bb1958 209 }
Gamadril 0:9e96b2bb1958 210
Gamadril 0:9e96b2bb1958 211 uint8_t s = 0, e = steps;
Gamadril 0:9e96b2bb1958 212 if (start < 0) {
Gamadril 0:9e96b2bb1958 213 s = 0 - start;
Gamadril 0:9e96b2bb1958 214 }
Gamadril 0:9e96b2bb1958 215 if (end > _lastIndex) {
Gamadril 0:9e96b2bb1958 216 e -= (end - _lastIndex);
Gamadril 0:9e96b2bb1958 217 }
Gamadril 0:9e96b2bb1958 218
Gamadril 0:9e96b2bb1958 219 // optimized setRGB(r,g,b) and setLED(start + i) with one transaction and shared memory
Gamadril 0:9e96b2bb1958 220 uint8_t cmd[6];
Gamadril 0:9e96b2bb1958 221 cmd[0] = BOOSTER_SETRGB;
Gamadril 0:9e96b2bb1958 222 cmd[4] = BOOSTER_SETLED;
Gamadril 0:9e96b2bb1958 223 for (; s <= e; s++) {
Gamadril 0:9e96b2bb1958 224 cmd[1] = from[0] + (to[0] - from[0]) * s / steps;
Gamadril 0:9e96b2bb1958 225 cmd[2] = from[1] + (to[1] - from[1]) * s / steps;
Gamadril 0:9e96b2bb1958 226 cmd[3] = from[2] + (to[2] - from[2]) * s / steps;
Gamadril 0:9e96b2bb1958 227 cmd[5] = start + s;
Gamadril 0:9e96b2bb1958 228 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 229 }
Gamadril 0:9e96b2bb1958 230 }
Gamadril 0:9e96b2bb1958 231
Gamadril 0:9e96b2bb1958 232 void DDBooster::shiftUp(uint8_t start, uint8_t end, uint8_t count)
Gamadril 0:9e96b2bb1958 233 {
Gamadril 0:9e96b2bb1958 234 if (start > end || end > _lastIndex || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 235 return;
Gamadril 0:9e96b2bb1958 236 }
Gamadril 0:9e96b2bb1958 237 uint8_t cmd[4] = {
Gamadril 0:9e96b2bb1958 238 BOOSTER_SHIFTDOWN,
Gamadril 0:9e96b2bb1958 239 start,
Gamadril 0:9e96b2bb1958 240 end,
Gamadril 0:9e96b2bb1958 241 count
Gamadril 0:9e96b2bb1958 242 };
Gamadril 0:9e96b2bb1958 243 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 244 }
Gamadril 0:9e96b2bb1958 245
Gamadril 0:9e96b2bb1958 246 void DDBooster::shiftDown(uint8_t start, uint8_t end, uint8_t count)
Gamadril 0:9e96b2bb1958 247 {
Gamadril 0:9e96b2bb1958 248 if (start > end || end > _lastIndex || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 249 return;
Gamadril 0:9e96b2bb1958 250 }
Gamadril 0:9e96b2bb1958 251 uint8_t cmd[4] = {
Gamadril 0:9e96b2bb1958 252 BOOSTER_SHIFTDOWN,
Gamadril 0:9e96b2bb1958 253 start,
Gamadril 0:9e96b2bb1958 254 end,
Gamadril 0:9e96b2bb1958 255 count
Gamadril 0:9e96b2bb1958 256 };
Gamadril 0:9e96b2bb1958 257 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 258 }
Gamadril 0:9e96b2bb1958 259
Gamadril 0:9e96b2bb1958 260 void DDBooster::copyLED(uint8_t from, uint8_t to)
Gamadril 0:9e96b2bb1958 261 {
Gamadril 0:9e96b2bb1958 262 if (from > _lastIndex || to > _lastIndex) {
Gamadril 0:9e96b2bb1958 263 return;
Gamadril 0:9e96b2bb1958 264 }
Gamadril 0:9e96b2bb1958 265 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 266 BOOSTER_COPYLED,
Gamadril 0:9e96b2bb1958 267 from,
Gamadril 0:9e96b2bb1958 268 to
Gamadril 0:9e96b2bb1958 269 };
Gamadril 0:9e96b2bb1958 270 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 271 }
Gamadril 0:9e96b2bb1958 272
Gamadril 0:9e96b2bb1958 273 void DDBooster::repeat(uint8_t start, uint8_t end, uint8_t count)
Gamadril 0:9e96b2bb1958 274 {
Gamadril 0:9e96b2bb1958 275 if (start > end || end > _lastIndex || start > _lastIndex) {
Gamadril 0:9e96b2bb1958 276 return;
Gamadril 0:9e96b2bb1958 277 }
Gamadril 0:9e96b2bb1958 278 uint8_t cmd[] = {
Gamadril 0:9e96b2bb1958 279 BOOSTER_REPEAT,
Gamadril 0:9e96b2bb1958 280 start,
Gamadril 0:9e96b2bb1958 281 end,
Gamadril 0:9e96b2bb1958 282 count
Gamadril 0:9e96b2bb1958 283 };
Gamadril 0:9e96b2bb1958 284 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 285 }
Gamadril 0:9e96b2bb1958 286
Gamadril 0:9e96b2bb1958 287 void DDBooster::show()
Gamadril 0:9e96b2bb1958 288 {
Gamadril 0:9e96b2bb1958 289 uint8_t cmd[] = {BOOSTER_SHOW};
Gamadril 0:9e96b2bb1958 290 sendRawBytes(cmd, sizeof (cmd));
Gamadril 0:9e96b2bb1958 291 wait_us(BOOSTER_LED_DELAY * (_lastIndex + 1));
Gamadril 0:9e96b2bb1958 292 }
Gamadril 0:9e96b2bb1958 293
Gamadril 0:9e96b2bb1958 294 void DDBooster::sendRawBytes(const uint8_t *buffer, uint8_t length)
Gamadril 0:9e96b2bb1958 295 {
Gamadril 0:9e96b2bb1958 296 _cs = 0;
Gamadril 0:9e96b2bb1958 297 for (int i = 0; i < length; i++) {
Gamadril 0:9e96b2bb1958 298 _device.write(buffer[i]);
Gamadril 0:9e96b2bb1958 299 }
Gamadril 0:9e96b2bb1958 300 _cs = 1;
Gamadril 0:9e96b2bb1958 301 wait_us(BOOSTER_CMD_DELAY);
Gamadril 0:9e96b2bb1958 302 }