1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-22 23:56:13 +01:00

Update IO_NeoPixel.h

This commit is contained in:
Asbelos 2024-09-05 22:02:29 +01:00
parent 530b77bbab
commit 235f3c82b5

View File

@ -128,7 +128,7 @@
class NeoPixel : public IODevice { class NeoPixel : public IODevice {
public: public:
static void create(VPIN vpin, int nPins, uint16_t mode, I2CAddress i2cAddress) { static void create(VPIN vpin, int nPins, uint16_t mode=(NEO_GRB | NEO_KHZ800), I2CAddress i2cAddress=0x60) {
if (checkNoOverlap(vpin, nPins, mode, i2cAddress)) new NeoPixel(vpin, nPins, mode, i2cAddress); if (checkNoOverlap(vpin, nPins, mode, i2cAddress)) new NeoPixel(vpin, nPins, mode, i2cAddress);
} }
@ -142,12 +142,17 @@ private:
static const byte SEESAW_NEOPIXEL_BUF_LENGTH = 0x03; static const byte SEESAW_NEOPIXEL_BUF_LENGTH = 0x03;
static const byte SEESAW_NEOPIXEL_BUF=0x04; static const byte SEESAW_NEOPIXEL_BUF=0x04;
static const byte SEESAW_NEOPIXEL_SHOW=0x05; static const byte SEESAW_NEOPIXEL_SHOW=0x05;
// all adafruit examples say this pin. Presumably its hard wired
// in the adapter anyway.
static const byte SEESAW_PIN15 = 15;
// Constructor // Constructor
NeoPixel(VPIN firstVpin, int nPins, uint16_t mode, I2CAddress i2cAddress) { NeoPixel(VPIN firstVpin, int nPins, uint16_t mode, I2CAddress i2cAddress) {
_firstVpin = firstVpin; _firstVpin = firstVpin;
_nPins=nPins;
_I2CAddress = i2cAddress; _I2CAddress = i2cAddress;
_brightness=2; // 0,1,2,3 _brightness=2; // TODO 0,1,2,3
_redOffset=mode >> 4 & 0x03; _redOffset=mode >> 4 & 0x03;
_greenOffset=mode >> 2 & 0x03; _greenOffset=mode >> 2 & 0x03;
_blueOffset=mode & 0x03; _blueOffset=mode & 0x03;
@ -165,14 +170,20 @@ private:
_deviceState = DEVSTATE_FAILED; _deviceState = DEVSTATE_FAILED;
return; return;
} }
byte setbuffer[] = {SEESAW_NEOPIXEL_BASE, SEESAW_NEOPIXEL_BUF_LENGTH,
(byte)(_bytesPerPixel >> 8), (byte)(_bytesPerPixel & 0xFF)};
I2CManager.write(_I2CAddress, setbuffer, sizeof(setbuffer));
byte speedBuffer[]={SEESAW_NEOPIXEL_BASE, SEESAW_NEOPIXEL_SPEED,_kHz800}; byte speedBuffer[]={SEESAW_NEOPIXEL_BASE, SEESAW_NEOPIXEL_SPEED,_kHz800};
I2CManager.write(_I2CAddress, speedBuffer, sizeof(speedBuffer)); I2CManager.write(_I2CAddress, speedBuffer, sizeof(speedBuffer));
// In the driver there are 3 of 4 byts per pixel
auto numBytes=_bytesPerPixel * _nPins;
byte setbuffer[] = {SEESAW_NEOPIXEL_BASE, SEESAW_NEOPIXEL_BUF_LENGTH,
(byte)(numBytes >> 8), (byte)(numBytes & 0xFF)};
I2CManager.write(_I2CAddress, setbuffer, sizeof(setbuffer));
const byte pinbuffer[] = {SEESAW_NEOPIXEL_BASE, SEESAW_NEOPIXEL_PIN,SEESAW_PIN15};
I2CManager.write(_I2CAddress, pinbuffer, sizeof(pinbuffer));
// but in dccex there are only 2 bytes per pixel
pixelBuffer=(uint16_t *) calloc(_nPins,sizeof(uint16_t)); // all pixels off pixelBuffer=(uint16_t *) calloc(_nPins,sizeof(uint16_t)); // all pixels off
_display(); _display();
} }
@ -236,8 +247,7 @@ private:
} }
void transmit(uint16_t pin) { void transmit(uint16_t pin, bool show=true) {
byte buffer[8]={SEESAW_NEOPIXEL_BASE,SEESAW_NEOPIXEL_BUF,0x00,0x00,0x00,0x00,0x00}; byte buffer[8]={SEESAW_NEOPIXEL_BASE,SEESAW_NEOPIXEL_BUF,0x00,0x00,0x00,0x00,0x00};
uint16_t offset= pin * _bytesPerPixel; uint16_t offset= pin * _bytesPerPixel;
buffer[2]=(byte)(offset>>8); buffer[2]=(byte)(offset>>8);
@ -251,8 +261,14 @@ private:
// Transmit pixel to driver // Transmit pixel to driver
I2CManager.write(_I2CAddress,buffer,4 +_bytesPerPixel); I2CManager.write(_I2CAddress,buffer,4 +_bytesPerPixel);
buffer[1]=SEESAW_NEOPIXEL_SHOW;
I2CManager.write(_I2CAddress,buffer,2); if (show) {
// Show, but only if after previous 300uS
while((micros() - lastShowTime) < 300L);
byte showBuffer[]={SEESAW_NEOPIXEL_BASE,SEESAW_NEOPIXEL_SHOW};
I2CManager.write(_I2CAddress,showBuffer,sizeof(showBuffer));
lastShowTime=micros();
}
} }
uint16_t* pixelBuffer = nullptr; uint16_t* pixelBuffer = nullptr;
byte _brightness; byte _brightness;
@ -260,6 +276,7 @@ private:
byte _redOffset; byte _redOffset;
byte _greenOffset; byte _greenOffset;
byte _blueOffset; byte _blueOffset;
unsigned long lastShowTime=0;
bool _kHz800; bool _kHz800;
}; };