From 4644b6f769e2da7c74aa03ac778df8ff62a9d1a1 Mon Sep 17 00:00:00 2001 From: "danielgarcia@gmail.com" Date: Sat, 1 Jun 2013 09:11:56 +0000 Subject: Checking in the TCL work code in case someone wants it - builds, no testing yet, though --- chipsets.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'chipsets.h') diff --git a/chipsets.h b/chipsets.h index 999fda1f..3656bcd5 100644 --- a/chipsets.h +++ b/chipsets.h @@ -140,6 +140,75 @@ public: #endif }; +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// P9813 definition - takes data/clock/select pin values (N.B. should take an SPI definition?) +// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +template +class P9813Controller : public CLEDController { + typedef SPIOutput SPI; + SPI mSPI; + CMinWait<24> mWaitDelay; + + void writeBoundary() { mSPI.writeWord(0); mSPI.writeWord(0); } + + inline void writeLed(const struct CRGB & data, uint8_t scale) __attribute__((always_inline)) { + // prep the byte + register uint8_t r = scale8(data[RGB_BYTE0(RGB_ORDER)], scale); + register uint8_t g = scale8(data[RGB_BYTE1(RGB_ORDER)], scale); + register uint8_t b = scale8(data[RGB_BYTE2(RGB_ORDER)], scale); + + register uint8_t top = 0xC0 | (~b & 0xC0) >> 2 | (~g & 0xC0) >> 4 | (~r & 0xC0); + mSPI.writeByte(top); mSPI.writeByte(b); mSPI.writeByte(g); mSPI.writeByte(r); + } + +public: + P9813Controller() {} + + virtual void init() { + mSPI.init(); + } + + virtual void clearLeds(int nLeds) { + showColor(CRGB(0,0,0), nLeds); + } + + virtual void showColor(const struct CRGB & data, int nLeds, uint8_t scale = 255) { + mSPI.select(); + + writeBoundary(); + while(nLeds--) { + writeLed(data, scale); + } + writeBoundary(); + + mSPI.waitFully(); + mSPI.release(); + mWaitDelay.mark(); + } + + virtual void show(const struct CRGB *data, int nLeds, uint8_t scale) { + mSPI.select(); + + writeBoundary(); + for(int i = 0; i < nLeds; i++) { + writeLed(data[i], scale); + } + writeBoundary(); + + mSPI.release(); + } + +#ifdef SUPPORT_ARGB + virtual void show(const struct CRGB *data, int nLeds, uint8_t scale) { + mWaitDelay.wait(); + mSPI.template writeBytes3<1, RGB_ORDER>((byte*)data, nLeds * 4, scale); + mWaitDelay.mark(); + } +#endif +}; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // -- cgit v1.2.3