TLIGHT_PRODUCTS / WS281X
Committer:
mutech
Date:
Fri Jul 29 04:22:53 2016 +0000
Revision:
5:8e6835a94e10
Parent:
4:4af895bb2979
Child:
6:5aff0da4b663
WS2811/WS2812 Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mutech 0:dff187a80020 1 /* WS281X.cpp (for LPC82X/STM32F0x/STM32F746xx)
mutech 0:dff187a80020 2 * mbed Microcontroller Library
mutech 0:dff187a80020 3 * Copyright (c) 2016 muetch, t.kuroki, MIT License
mutech 0:dff187a80020 4 *
mutech 0:dff187a80020 5 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
mutech 0:dff187a80020 6 * and associated documentation files (the "Software"), to deal in the Software without restriction,
mutech 0:dff187a80020 7 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
mutech 0:dff187a80020 8 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
mutech 0:dff187a80020 9 * furnished to do so, subject to the following conditions:
mutech 0:dff187a80020 10 *
mutech 0:dff187a80020 11 * The above copyright notice and this permission notice shall be included in all copies or
mutech 0:dff187a80020 12 * substantial portions of the Software.
mutech 0:dff187a80020 13 *
mutech 0:dff187a80020 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
mutech 0:dff187a80020 15 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
mutech 0:dff187a80020 16 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
mutech 0:dff187a80020 17 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mutech 0:dff187a80020 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
mutech 0:dff187a80020 19 */
mutech 0:dff187a80020 20
mutech 0:dff187a80020 21 #include "WS281X.h"
mutech 0:dff187a80020 22 #include "pinmap.h"
mutech 0:dff187a80020 23
mutech 4:4af895bb2979 24 // TARGET_STM32F7
mutech 0:dff187a80020 25 // TARGET_DISCO_F746NG
mutech 0:dff187a80020 26 // TARGET_NUCLEO_F746ZG
mutech 4:4af895bb2979 27 // TARGET_STM32F0
mutech 0:dff187a80020 28 // TARGET_NUCLEO_F030R8
mutech 0:dff187a80020 29 // TARGET_NUCLEO_F070RB
mutech 4:4af895bb2979 30 // TARGET_LPC82X
mutech 0:dff187a80020 31 // TARGET_LPC824
mutech 0:dff187a80020 32
mutech 0:dff187a80020 33 //----------------------------------------------------------------------------
mutech 0:dff187a80020 34 WS281X::WS281X(PinName wirePin, PinMode pinMode, int numPixels, RGBOrder rgbOrder)
mutech 0:dff187a80020 35 : _wirePin(wirePin), _gpio(), _pixels(0)
mutech 0:dff187a80020 36 {
mutech 0:dff187a80020 37 gpio_init_inout(&_gpio, wirePin, PIN_OUTPUT, pinMode, 0);
mutech 0:dff187a80020 38 #if defined(TARGET_STM)
mutech 0:dff187a80020 39 pin_mode_ex(wirePin, pinMode);
mutech 0:dff187a80020 40 #endif
mutech 0:dff187a80020 41
mutech 0:dff187a80020 42 setRGBOrder(rgbOrder);
mutech 0:dff187a80020 43
mutech 0:dff187a80020 44 if (numPixels < 1)
mutech 0:dff187a80020 45 numPixels = 1;
mutech 0:dff187a80020 46 else if (numPixels > MAX_PIXELS)
mutech 0:dff187a80020 47 numPixels = MAX_PIXELS;
mutech 0:dff187a80020 48 _numPixels = (uint16_t)numPixels;
mutech 0:dff187a80020 49 _pixels = new RGBColor[_numPixels];
mutech 0:dff187a80020 50 _dummyPixel = 0;
mutech 0:dff187a80020 51
mutech 0:dff187a80020 52 clear();
mutech 0:dff187a80020 53 }
mutech 0:dff187a80020 54
mutech 0:dff187a80020 55 WS281X::~WS281X()
mutech 0:dff187a80020 56 {
mutech 0:dff187a80020 57 if (_pixels)
mutech 0:dff187a80020 58 delete[] _pixels;
mutech 0:dff187a80020 59 }
mutech 0:dff187a80020 60
mutech 0:dff187a80020 61 #if defined(TARGET_STM)
mutech 0:dff187a80020 62 void WS281X::pin_mode_ex(PinName pin, PinMode mode)
mutech 0:dff187a80020 63 {
mutech 0:dff187a80020 64 if (mode == OpenDrain)
mutech 0:dff187a80020 65 {
mutech 0:dff187a80020 66 int port_index = STM_PORT(pin);
mutech 0:dff187a80020 67 int pin_index = STM_PIN(pin);
mutech 0:dff187a80020 68 int offset = pin_index << 1;
mutech 0:dff187a80020 69
mutech 0:dff187a80020 70 GPIO_TypeDef * port_reg = ((GPIO_TypeDef *) (GPIOA_BASE + (port_index << 10)));
mutech 0:dff187a80020 71 // if (mode == OpenDrain)
mutech 0:dff187a80020 72 {
mutech 0:dff187a80020 73 port_reg->PUPDR &= ~(0x3 << offset);
mutech 0:dff187a80020 74 port_reg->OTYPER |= 1 << pin_index;
mutech 0:dff187a80020 75 }
mutech 0:dff187a80020 76 #if 0
mutech 0:dff187a80020 77 else
mutech 0:dff187a80020 78 {
mutech 0:dff187a80020 79 port_reg->OTYPER &= ~(1 << pin_index);
mutech 0:dff187a80020 80 port_reg->PUPDR &= ~(0x3 << offset);
mutech 0:dff187a80020 81 port_reg->PUPDR |= mode_ << offset;
mutech 0:dff187a80020 82 }
mutech 0:dff187a80020 83 #endif
mutech 0:dff187a80020 84 }
mutech 0:dff187a80020 85 else
mutech 0:dff187a80020 86 pin_mode(pin, mode);
mutech 0:dff187a80020 87 }
mutech 0:dff187a80020 88 #endif
mutech 0:dff187a80020 89
mutech 0:dff187a80020 90 void WS281X::setRGBOrder(RGBOrder rgbOrder)
mutech 0:dff187a80020 91 {
mutech 0:dff187a80020 92 _rgbOrder = rgbOrder;
mutech 0:dff187a80020 93 switch(_rgbOrder)
mutech 0:dff187a80020 94 {
mutech 0:dff187a80020 95 case RGB:
mutech 0:dff187a80020 96 _1st = 0;
mutech 0:dff187a80020 97 _2nd = 1;
mutech 0:dff187a80020 98 _3rd = 2;
mutech 0:dff187a80020 99 break;
mutech 0:dff187a80020 100
mutech 0:dff187a80020 101 case RBG:
mutech 0:dff187a80020 102 _1st = 0;
mutech 0:dff187a80020 103 _2nd = 2;
mutech 0:dff187a80020 104 _3rd = 1;
mutech 0:dff187a80020 105 break;
mutech 0:dff187a80020 106
mutech 0:dff187a80020 107 case GRB:
mutech 0:dff187a80020 108 _1st = 1;
mutech 0:dff187a80020 109 _2nd = 0;
mutech 0:dff187a80020 110 _3rd = 2;
mutech 0:dff187a80020 111 break;
mutech 0:dff187a80020 112
mutech 0:dff187a80020 113 case GBR:
mutech 0:dff187a80020 114 _1st = 2;
mutech 0:dff187a80020 115 _2nd = 0;
mutech 0:dff187a80020 116 _3rd = 1;
mutech 0:dff187a80020 117 break;
mutech 0:dff187a80020 118
mutech 0:dff187a80020 119 case BRG:
mutech 0:dff187a80020 120 _1st = 1;
mutech 0:dff187a80020 121 _2nd = 2;
mutech 0:dff187a80020 122 _3rd = 0;
mutech 0:dff187a80020 123 break;
mutech 0:dff187a80020 124
mutech 0:dff187a80020 125 case BGR:
mutech 0:dff187a80020 126 _1st = 2;
mutech 0:dff187a80020 127 _2nd = 1;
mutech 0:dff187a80020 128 _3rd = 0;
mutech 0:dff187a80020 129 break;
mutech 0:dff187a80020 130
mutech 0:dff187a80020 131 default:
mutech 0:dff187a80020 132 _1st = 0;
mutech 0:dff187a80020 133 _2nd = 1;
mutech 0:dff187a80020 134 _3rd = 2;
mutech 0:dff187a80020 135 break;
mutech 0:dff187a80020 136 }
mutech 0:dff187a80020 137 }
mutech 0:dff187a80020 138
mutech 0:dff187a80020 139 #define _nop1() __nop()
mutech 0:dff187a80020 140 #define _nop2() __nop(); __nop()
mutech 0:dff187a80020 141 #define _nop3() _nop1(); _nop2()
mutech 0:dff187a80020 142 #define _nop4() _nop2(); _nop2()
mutech 0:dff187a80020 143 #define _nop5() _nop1(); _nop4()
mutech 0:dff187a80020 144 #define _nop6() _nop2(); _nop4()
mutech 0:dff187a80020 145 #define _nop7() _nop3(); _nop4()
mutech 0:dff187a80020 146 #define _nop8() _nop4(); _nop4()
mutech 0:dff187a80020 147 #define _nop9() _nop1(); _nop8()
mutech 0:dff187a80020 148 #define _nop10() _nop2(); _nop8()
mutech 0:dff187a80020 149 #define _nop11() _nop3(); _nop8()
mutech 0:dff187a80020 150 #define _nop12() _nop4(); _nop8()
mutech 0:dff187a80020 151 #define _nop13() _nop5(); _nop8()
mutech 0:dff187a80020 152 #define _nop14() _nop6(); _nop8()
mutech 0:dff187a80020 153 #define _nop15() _nop7(); _nop8()
mutech 0:dff187a80020 154 #define _nop16() _nop8(); _nop8()
mutech 0:dff187a80020 155
mutech 4:4af895bb2979 156 #if defined(TARGET_LPC82X)
mutech 5:8e6835a94e10 157 // LPCXpresso824-MAX (30MHz)
mutech 0:dff187a80020 158 #define DELAY_T0H() do{ _nop2(); }while(0)
mutech 0:dff187a80020 159 #define DELAY_T1H() do{ _nop6(); }while(0)
mutech 0:dff187a80020 160 #define DELAY_TLOW() do{ _nop6(); }while(0)
mutech 0:dff187a80020 161 #define DELAY_TLOW2() //do{ _nop2(); }while(0)
mutech 4:4af895bb2979 162 #define DELAY_SPACE() do{ _nop4(); }while(0)
mutech 4:4af895bb2979 163 #define DELAY_NEXT() //do{ _nop1(); }while(0)
mutech 0:dff187a80020 164 #endif
mutech 0:dff187a80020 165
mutech 0:dff187a80020 166 #if defined(TARGET_STM32F0)
mutech 5:8e6835a94e10 167 // NUCLEO-F030R8 (48MHz)
mutech 5:8e6835a94e10 168 // NUCLEO-F070RB (48MHz)
mutech 0:dff187a80020 169 #define DELAY_T0H() do{ _nop8(); _nop4(); }while(0)
mutech 0:dff187a80020 170 #define DELAY_T1H() do{ _nop8(); _nop8(); }while(0)
mutech 0:dff187a80020 171 #define DELAY_TLOW() do{ _nop16(); }while(0)
mutech 0:dff187a80020 172 #define DELAY_TLOW2() //do{ _nop8(); _nop4(); }while(0)
mutech 4:4af895bb2979 173 #define DELAY_SPACE() do{ _nop8(); _nop6(); }while(0)
mutech 4:4af895bb2979 174 #define DELAY_NEXT() do{ _nop8(); }while(0)
mutech 0:dff187a80020 175 #endif
mutech 0:dff187a80020 176
mutech 4:4af895bb2979 177 #if defined(TARGET_NUCLEO_F746ZG)
mutech 4:4af895bb2979 178 // NUCLEO-F746ZG (216MHz)
mutech 0:dff187a80020 179 #define T0H (35)
mutech 5:8e6835a94e10 180 #define T0L (130-T0H)
mutech 4:4af895bb2979 181 #define T1H (75)
mutech 5:8e6835a94e10 182 #define T1L (130-T1H)
mutech 0:dff187a80020 183
mutech 0:dff187a80020 184 #define DELAY_T0H() _delay(T0H)
mutech 0:dff187a80020 185 #define DELAY_T1H() _delay(T1H-T0H)
mutech 0:dff187a80020 186 #define DELAY_TLOW() _delay(T1L)
mutech 0:dff187a80020 187 #define DELAY_TLOW2() //DELAY_TLOW()
mutech 5:8e6835a94e10 188 #define DELAY_SPACE() _delay(T1L+20)
mutech 4:4af895bb2979 189 #define DELAY_NEXT() _delay(50)
mutech 4:4af895bb2979 190 #endif
mutech 0:dff187a80020 191
mutech 4:4af895bb2979 192 #if defined(TARGET_DISCO_F746NG)
mutech 4:4af895bb2979 193 // TARGET_DISCO_F746NG (216MHz)
mutech 4:4af895bb2979 194 #define T0H (35)
mutech 4:4af895bb2979 195 #define T0L (110-T0H)
mutech 4:4af895bb2979 196 #define T1H (75)
mutech 4:4af895bb2979 197 #define T1L (110-T1H)
mutech 4:4af895bb2979 198
mutech 4:4af895bb2979 199 #define DELAY_T0H() _delay(T0H)
mutech 4:4af895bb2979 200 #define DELAY_T1H() _delay(T1H-T0H)
mutech 4:4af895bb2979 201 #define DELAY_TLOW() _delay(T1L)
mutech 4:4af895bb2979 202 #define DELAY_TLOW2() //DELAY_TLOW()
mutech 4:4af895bb2979 203 #define DELAY_SPACE() _delay(T1L+5)
mutech 4:4af895bb2979 204 #define DELAY_NEXT() _delay(50)
mutech 4:4af895bb2979 205 #endif
mutech 4:4af895bb2979 206
mutech 4:4af895bb2979 207 #if defined(TARGET_STM32F7)
mutech 0:dff187a80020 208 inline __attribute__((always_inline))
mutech 0:dff187a80020 209 void WS281X::_delay(int value)
mutech 0:dff187a80020 210 {
mutech 0:dff187a80020 211 do { __nop(); } while (--value);
mutech 0:dff187a80020 212 }
mutech 0:dff187a80020 213 #endif
mutech 0:dff187a80020 214
mutech 0:dff187a80020 215 inline __attribute__((always_inline))
mutech 0:dff187a80020 216 void WS281X::writeByte(__IO regsize_t *reg_set, __IO regsize_t *reg_clr, regsize_t *mask, uint8_t value)
mutech 0:dff187a80020 217 {
mutech 0:dff187a80020 218 do
mutech 0:dff187a80020 219 {
mutech 0:dff187a80020 220 // bit7
mutech 0:dff187a80020 221 *reg_set = mask[0];
mutech 0:dff187a80020 222 DELAY_T0H();
mutech 0:dff187a80020 223 *reg_clr = mask[(value >> 7) & 1];
mutech 0:dff187a80020 224 DELAY_T1H();
mutech 0:dff187a80020 225 *reg_clr = mask[0];
mutech 0:dff187a80020 226 DELAY_TLOW();
mutech 0:dff187a80020 227
mutech 0:dff187a80020 228 // bit6
mutech 0:dff187a80020 229 *reg_set = mask[0];
mutech 0:dff187a80020 230 DELAY_T0H();
mutech 0:dff187a80020 231 *reg_clr = mask[(value >> 6) & 1];
mutech 0:dff187a80020 232 DELAY_T1H();
mutech 0:dff187a80020 233 *reg_clr = mask[0];
mutech 0:dff187a80020 234 DELAY_TLOW();
mutech 0:dff187a80020 235
mutech 0:dff187a80020 236 // bit5
mutech 0:dff187a80020 237 *reg_set = mask[0];
mutech 0:dff187a80020 238 DELAY_T0H();
mutech 0:dff187a80020 239 *reg_clr = mask[(value >> 5) & 1];
mutech 0:dff187a80020 240 DELAY_T1H();
mutech 0:dff187a80020 241 *reg_clr = mask[0];
mutech 0:dff187a80020 242 DELAY_TLOW();
mutech 0:dff187a80020 243
mutech 0:dff187a80020 244 // bit4
mutech 0:dff187a80020 245 *reg_set = mask[0];
mutech 0:dff187a80020 246 DELAY_T0H();
mutech 0:dff187a80020 247 *reg_clr = mask[(value >> 4) & 1];
mutech 0:dff187a80020 248 DELAY_T1H();
mutech 0:dff187a80020 249 *reg_clr = mask[0];
mutech 0:dff187a80020 250 DELAY_TLOW();
mutech 0:dff187a80020 251
mutech 0:dff187a80020 252 // bit3
mutech 0:dff187a80020 253 *reg_set = mask[0];
mutech 0:dff187a80020 254 DELAY_T0H();
mutech 0:dff187a80020 255 *reg_clr = mask[(value >> 3) & 1];
mutech 0:dff187a80020 256 DELAY_T1H();
mutech 0:dff187a80020 257 *reg_clr = mask[0];
mutech 0:dff187a80020 258 DELAY_TLOW();
mutech 0:dff187a80020 259
mutech 0:dff187a80020 260 // bit2
mutech 0:dff187a80020 261 *reg_set = mask[0];
mutech 0:dff187a80020 262 DELAY_T0H();
mutech 0:dff187a80020 263 *reg_clr = mask[(value >> 2) & 1];
mutech 0:dff187a80020 264 DELAY_T1H();
mutech 0:dff187a80020 265 *reg_clr = mask[0];
mutech 0:dff187a80020 266 DELAY_TLOW();
mutech 0:dff187a80020 267
mutech 0:dff187a80020 268 // bit1
mutech 0:dff187a80020 269 *reg_set = mask[0];
mutech 0:dff187a80020 270 DELAY_T0H();
mutech 0:dff187a80020 271 *reg_clr = mask[(value >> 1) & 1];
mutech 0:dff187a80020 272 DELAY_T1H();
mutech 0:dff187a80020 273 *reg_clr = mask[0];
mutech 0:dff187a80020 274 DELAY_TLOW();
mutech 0:dff187a80020 275
mutech 0:dff187a80020 276 // bit0
mutech 0:dff187a80020 277 *reg_set = mask[0];
mutech 0:dff187a80020 278 DELAY_T0H();
mutech 0:dff187a80020 279 *reg_clr = mask[(value >> 0) & 1];
mutech 0:dff187a80020 280 DELAY_T1H();
mutech 0:dff187a80020 281 *reg_clr = mask[0];
mutech 0:dff187a80020 282 DELAY_TLOW2();
mutech 0:dff187a80020 283
mutech 0:dff187a80020 284 } while (0);
mutech 0:dff187a80020 285 }
mutech 0:dff187a80020 286
mutech 0:dff187a80020 287 void WS281X::show()
mutech 0:dff187a80020 288 {
mutech 0:dff187a80020 289 // CPU_FREQ = 30MHz -> 0.0333us/cycle
mutech 0:dff187a80020 290 // WS2811 0: 0.25us+1.0us, 1: 1.0us+0.25us
mutech 0:dff187a80020 291 // WS2812 0: 0.45us+0.8us, 1: 0.8us+0.45us
mutech 0:dff187a80020 292
mutech 0:dff187a80020 293 #if defined(TARGET_NXP)
mutech 0:dff187a80020 294 __IO uint32_t *reg_set = _gpio.reg_set;
mutech 0:dff187a80020 295 __IO uint32_t *reg_clr = _gpio.reg_clr;
mutech 0:dff187a80020 296 uint32_t mask[2] = { _gpio.mask, 0 };
mutech 0:dff187a80020 297 #elif defined(TARGET_STM32F0) || defined(TARGET_STM32F1)
mutech 0:dff187a80020 298 __IO uint32_t *reg_set = _gpio.reg_set;
mutech 0:dff187a80020 299 __IO uint32_t *reg_clr = _gpio.reg_clr;
mutech 0:dff187a80020 300 uint32_t mask[2] = { _gpio.mask, 0 };
mutech 0:dff187a80020 301 #elif defined(TARGET_STM)
mutech 0:dff187a80020 302 __IO uint16_t *reg_set = (__IO uint16_t *)_gpio.reg_set_clr;
mutech 0:dff187a80020 303 __IO uint16_t *reg_clr = reg_set + 1;
mutech 0:dff187a80020 304 uint16_t mask[2] = { _gpio.mask, 0 };
mutech 0:dff187a80020 305 #endif
mutech 0:dff187a80020 306
mutech 0:dff187a80020 307 uint8_t *pix = (uint8_t *)_pixels;
mutech 0:dff187a80020 308 uint8_t *end = pix + (_numPixels * sizeof(_pixels[0]));
mutech 0:dff187a80020 309
mutech 0:dff187a80020 310 __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
mutech 0:dff187a80020 311
mutech 0:dff187a80020 312 uint8_t value;
mutech 0:dff187a80020 313 do
mutech 0:dff187a80020 314 {
mutech 0:dff187a80020 315 value = pix[_1st];
mutech 0:dff187a80020 316 writeByte(reg_set, reg_clr, mask, value);
mutech 0:dff187a80020 317 DELAY_SPACE();
mutech 0:dff187a80020 318
mutech 0:dff187a80020 319 value = pix[_2nd];
mutech 0:dff187a80020 320 writeByte(reg_set, reg_clr, mask, value);
mutech 0:dff187a80020 321 DELAY_SPACE();
mutech 0:dff187a80020 322
mutech 0:dff187a80020 323 value = pix[_3rd];
mutech 0:dff187a80020 324 writeByte(reg_set, reg_clr, mask, value);
mutech 0:dff187a80020 325 pix += sizeof(_pixels[0]);
mutech 0:dff187a80020 326 DELAY_NEXT();
mutech 0:dff187a80020 327 } while (pix < end);
mutech 0:dff187a80020 328
mutech 0:dff187a80020 329 __enable_irq(); // Re-enable interrupts now that we are done.
mutech 0:dff187a80020 330
mutech 0:dff187a80020 331 wait_us(50);
mutech 0:dff187a80020 332 }
mutech 0:dff187a80020 333
mutech 0:dff187a80020 334 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
mutech 0:dff187a80020 335 void WS281X::repeatBlock(int block_size)
mutech 0:dff187a80020 336 {
mutech 0:dff187a80020 337 if (block_size < 1 || block_size >= _numPixels)
mutech 0:dff187a80020 338 return;
mutech 0:dff187a80020 339
mutech 0:dff187a80020 340 RGBColor *dest = _pixels + block_size;
mutech 0:dff187a80020 341 int left = _numPixels - block_size;
mutech 0:dff187a80020 342 while (left > block_size)
mutech 0:dff187a80020 343 {
mutech 0:dff187a80020 344 memcpy(dest, _pixels, block_size * sizeof(_pixels[0]));
mutech 0:dff187a80020 345 dest += block_size;
mutech 0:dff187a80020 346 left -= block_size;
mutech 0:dff187a80020 347 block_size <<= 1; // 次回は2倍のサイズの転送
mutech 0:dff187a80020 348 }
mutech 0:dff187a80020 349 memcpy(dest, _pixels, left * sizeof(_pixels[0]));
mutech 0:dff187a80020 350 }
mutech 0:dff187a80020 351
mutech 0:dff187a80020 352 // 指定色でバッファを埋める
mutech 2:cc8e091fd975 353 void WS281X::clear(RGBColor color)
mutech 0:dff187a80020 354 {
mutech 0:dff187a80020 355 _pixels[0] = color;
mutech 0:dff187a80020 356 repeatBlock(1);
mutech 0:dff187a80020 357 }
mutech 0:dff187a80020 358
mutech 0:dff187a80020 359 // 指定色でバッファを埋めた後表示
mutech 2:cc8e091fd975 360 void WS281X::show(RGBColor color)
mutech 0:dff187a80020 361 {
mutech 0:dff187a80020 362 clear(color);
mutech 0:dff187a80020 363 show();
mutech 0:dff187a80020 364 }
mutech 0:dff187a80020 365
mutech 0:dff187a80020 366 //----------------------------------------------------------------------------