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.
Fork of wsDrive by
wsDrive.cpp
- Committer:
- JojoS
- Date:
- 2016-12-10
- Revision:
- 6:270a9728ee29
- Parent:
- 4:c965e448d96b
File content as of revision 6:270a9728ee29:
#include "wsDrive.h"
wsDrive::wsDrive(PinName mosi, PinName miso, PinName clk) : BurstSPI(mosi,miso,clk)
{
#if defined(TARGET_STM32F4)
frequency(4000000);
format(4*4, 1); // one WS bit -> four SPI bits
#else
frequency(2400000);
format(3*4, 1); // one WS bit -> three SPI bits
#endif
pixArray = NULL;
pixArray16 = NULL;
pixelLen = 0;
}
void wsDrive::setData(pixelInfo *dataStart, uint16_t dataLen)
{
pixArray = dataStart;
pixelLen = dataLen;
pixArray16 = NULL;
}
void wsDrive::setData(pixelInfo16 *dataStart, uint16_t dataLen)
{
pixArray16 = dataStart;
pixelLen = dataLen;
pixArray = NULL;
}
void wsDrive::sendData()
{
uint16_t pixIndex = 0;
if (pixArray) {
while (pixIndex < pixelLen) {
sendPixel(pixArray + pixIndex++);
}
} else if (pixArray16) {
while (pixIndex < pixelLen) {
sendPixel(pixArray16 + pixIndex++);
}
}
}
// each bytes sent as two 12 bit messages (3 bits of data per LED bit).
void wsDrive::sendByte(unsigned char value)
{
uint16_t dataToSend = 0;
uint8_t mask = 0x80;
#if defined(TARGET_STM32F4)
while (mask) {
dataToSend += (value & mask)?0x0C:0x08; // 1000 for a 0 or 1100 for a 1
if (mask & 0x11) { // trans
fastWrite(dataToSend);
dataToSend = 0;
}
dataToSend = dataToSend << 4;
mask = mask >> 1;
}
#else
while (mask) {
dataToSend += (value & mask)?0x06:0x4; // 100 for a 0 or 110 for a 1
if (mask & 0x11) { // trans
fastWrite(dataToSend);
dataToSend = 0;
}
dataToSend = dataToSend << 3;
mask = mask >> 1;
}
#endif
}
void wsDrive::sendPixel(pixelInfo *pixToSend)
{
sendByte(pixToSend->G);
sendByte(pixToSend->R);
sendByte(pixToSend->B);
}
void wsDrive::sendPixel(pixelInfo16 *pixToSend)
{
if (pixToSend->G > 0xff)
sendByte(0xff);
else if (pixToSend->G < 0)
sendByte(0xff);
else
sendByte((unsigned char)pixToSend->G);
if (pixToSend->R > 0xff)
sendByte(0xff);
else if (pixToSend->R < 0)
sendByte(0xff);
else
sendByte((unsigned char)pixToSend->R);
if (pixToSend->B > 0xff)
sendByte(0xff);
else if (pixToSend->B < 0)
sendByte(0xff);
else
sendByte((unsigned char)pixToSend->B);
}
