Network bus changes:

- moved brightness scaling to broadcast fn
- removed double buffer
- fixed getPixelColor()
This commit is contained in:
Blaž Kristan 2021-10-04 13:44:44 +02:00
parent 5149078f6a
commit aef53a8753
5 changed files with 13 additions and 31 deletions

View File

@ -43,7 +43,7 @@ struct BusConfig {
type = busType & 0x7F; // bit 7 may be/is hacked to include RGBW info (1=RGBW, 0=RGB)
count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; skipAmount = skip;
uint8_t nPins = 1;
if (type >= 10 || type <= 15) nPins = 4;
if (type >= 10 && type <= 15) nPins = 4; // IP address stored in pins
else if (type > 47) nPins = 2;
else if (type > 40 && type < 46) nPins = NUM_PWM_PINS(type);
for (uint8_t i = 0; i < nPins; i++) pins[i] = ppins[i];
@ -401,7 +401,6 @@ class BusNetwork : public Bus {
_client = IPAddress(bc.pins[0],bc.pins[1],bc.pins[2],bc.pins[3]);
_broadcastLock = false;
_valid = true;
_data2 = (byte *)malloc(_len * _UDPchannels);
};
void setPixelColor(uint16_t pix, uint32_t c) {
@ -416,32 +415,18 @@ class BusNetwork : public Bus {
uint32_t getPixelColor(uint16_t pix) {
if (!_valid || pix >= _len) return 0;
uint16_t offset = pix * _UDPchannels;
// behave as NeoPixelBus
return (
(_rgbw ? (scale8(_data[offset+3], _bri) << 24) : 0)
| (scale8(_data[offset] , _bri) << 16)
| (scale8(_data[offset+1], _bri) << 8)
| (scale8(_data[offset+2], _bri) )
(_rgbw ? (_data[offset+3] << 24) : 0)
| (_data[offset] << 16)
| (_data[offset+1] << 8)
| (_data[offset+2] )
);
}
void show() {
if (!_valid || !canShow()) return;
_broadcastLock = true;
// apply brightness to second buffer
if (_data2 == nullptr) {
// but display original buffer if memory allocation failed
realtimeBroadcast(_UDPtype, _client, _len, _data, _rgbw);
} else {
for (uint16_t pix=0; pix<_len; pix++) {
uint16_t offset = pix * _UDPchannels;
_data2[offset ] = scale8(_data[offset ], _bri);
_data2[offset+1] = scale8(_data[offset+1], _bri);
_data2[offset+2] = scale8(_data[offset+2], _bri);
if (_rgbw) _data2[offset+3] = scale8(_data[offset+3], _bri);
}
realtimeBroadcast(_UDPtype, _client, _len, _data2, _rgbw);
}
realtimeBroadcast(_UDPtype, _client, _len, _data, _bri, _rgbw);
_broadcastLock = false;
}
@ -474,8 +459,6 @@ class BusNetwork : public Bus {
_valid = false;
if (_data != nullptr) free(_data);
_data = nullptr;
if (_data2 != nullptr) free(_data2);
_data2 = nullptr;
}
~BusNetwork() {
@ -491,7 +474,7 @@ class BusNetwork : public Bus {
uint8_t _UDPchannels;
bool _rgbw;
bool _broadcastLock;
byte *_data, *_data2;
byte *_data;
};

View File

@ -104,7 +104,6 @@
}
//returns mem usage
function getMem(t, len, p0) {
if (t >= 10 && t <= 12) return len*6; // double buffer for network UDP bus
if (t > 15 && t < 32) {
if (maxM < 10000 && p0==3) { //8266 DMA uses 5x the mem
if (t > 29) return len*20; //RGBW

View File

@ -197,7 +197,7 @@ bool updateVal(const String* req, const char* key, byte* val, byte minv=0, byte
//udp.cpp
void notify(byte callMode, bool followUp=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, bool isRGBW=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false);
void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC);
void handleNotifications();
void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w);

File diff suppressed because one or more lines are too long

View File

@ -552,7 +552,7 @@ void sendSysInfoUDP()
uint8_t sequenceNumber = 0; // this needs to be shared across all outputs
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8_t *buffer, bool isRGBW) {
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8_t *buffer, uint8_t bri, bool isRGBW) {
if (!interfacesInited) return 1; // network not initialised
WiFiUDP ddpUdp;
@ -610,9 +610,9 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
// write the colors, the write write(const uint8_t *buffer, size_t size)
// function is just a loop internally too
for (uint16_t i = 0; i < packetSize; i += 3) {
ddpUdp.write(buffer[bufferOffset++]); // R
ddpUdp.write(buffer[bufferOffset++]); // G
ddpUdp.write(buffer[bufferOffset++]); // B
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // R
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // G
ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // B
if (isRGBW) bufferOffset++;
}