Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: LEDBus.cpp
- Revision:
- 0:1e68c70236a4
- Child:
- 1:6119419c2730
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LEDBus.cpp Tue May 10 20:07:28 2016 +0000 @@ -0,0 +1,168 @@ +#include "LEDBus.h" + + + + +LEDBus::LEDBus(PinName wirePin, ByteOrder byteOrder, float t0h_us, float t0l_us, float t1h_us, float t1l_us, float tReset_us) : _wire(wirePin) +{ + float ticksPerMicroSecond = SystemCoreClock/MICRO_SECOND; + + _byteOrder = byteOrder; + + _delayT1H = ticksPerMicroSecond * t1h_us; + _delayT0H = ticksPerMicroSecond * t0h_us; + _delayT1L = ticksPerMicroSecond * t1l_us; + _delayT0L = ticksPerMicroSecond * t0l_us; + + _delayReset = ticksPerMicroSecond * tReset_us; + + // Uncomment to see micro controller frequency and delays + Serial pc(USBTX, USBRX); + pc.printf("%d Hz\n\r", SystemCoreClock); + pc.printf("%f ticks/us\n\r", ticksPerMicroSecond); + pc.printf("T0H: %d ticks\n\r", _delayT0H); + pc.printf("T1H: %d ticks\n\r", _delayT1H); + pc.printf("T0L: %d ticks\n\r", _delayT0L); + pc.printf("T1L: %d ticks\n\r", _delayT1L); + pc.printf("Reset: %d ticks\n\r", _delayReset); + +} + +LEDBus::~LEDBus() +{ +} + +void LEDBus::write(uint8_t byte) +{ + for (int b = 7; b >= 0; b--) { + bool bit = byte & (1 << b); + + _wire = 1; + + if (bit) { + delay(_delayT1H); + } else { + delay(_delayT0H); + } + + _wire = 0; + + if (bit) { + delay(_delayT1L); + } else { + delay(_delayT0L); + } + } +} + +void LEDBus::delay(unsigned int ticks) +{ + // each loop should be around 6 clock cycles... + for (unsigned volatile int i = 0; i < ticks; i+=6) { + /* nop */ + } +} + +void LEDBus::write(uint8_t* buffer, unsigned int size) +{ + for (int i = 0; i < size; i++) { + write(buffer[i]); + } + + delay(_delayReset); +} + +void LEDBus::write(Color** buffer, unsigned int size) +{ + for (int i = 0; i < size; i++) { + switch(_byteOrder) { + case RGB: + write(buffer[i]->red); + write(buffer[i]->green); + write(buffer[i]->blue); + break; + case RBG: + write(buffer[i]->red); + write(buffer[i]->blue); + write(buffer[i]->green); + break; + case GRB: + write(buffer[i]->green); + write(buffer[i]->red); + write(buffer[i]->blue); + break; + case GBR: + write(buffer[i]->green); + write(buffer[i]->blue); + write(buffer[i]->red); + break; + case BRG: + write(buffer[i]->blue); + write(buffer[i]->red); + write(buffer[i]->green); + case BGR: + write(buffer[i]->blue); + write(buffer[i]->green); + write(buffer[i]->red); + break; + } + + } + + delay(_delayReset); +} + + +void LEDBus::update(ColorGenerator generator, unsigned int numberOfLEDs) +{ + unsigned char buffer[numberOfLEDs*3]; + + for (int i = 0; i < numberOfLEDs; i++) { + Color* color = new Color(); + generator(color, i); + + int ir,ig,ib; + + switch(_byteOrder) { + case RGB: + ir = 0; + ig = 1; + ib = 2; + break; + case RBG: + ir = 0; + ig = 2; + ib = 1; + break; + case GRB: + ir = 1; + ig = 0; + ib = 2; + break; + case GBR: + ir = 2; + ig = 0; + ib = 1; + break; + case BRG: + ir = 1; + ig = 2; + ib = 0; + case BGR: + ir = 2; + ig = 1; + ib = 0; + break; + } + + buffer[i*3 +ir] = color->red; + buffer[i*3 +ig] = color->green; + buffer[i*3 +ib] = color->blue; + + delete color; + } + + write(buffer, numberOfLEDs*3); +} + +