Skip to content

Commit 6da8426

Browse files
committed
Fix Rpi5 PIO PWM driver
1 parent 50fd9a6 commit 6da8426

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

include/led-drivers/pwm/rpi_pio/DriverRpiPio.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#pragma once
22

33
#include <led-drivers/LedDevice.h>
4-
#include <QFile>
54

65
class DriverRpiPio : public LedDevice
76
{
@@ -16,7 +15,6 @@ class DriverRpiPio : public LedDevice
1615
int writeFiniteColors(const std::vector<ColorRgb>& ledValues) override;
1716

1817
private:
19-
std::unique_ptr<QFile> _renderer;
2018
QString _output;
2119
bool _isRgbw;
2220
RGBW::WhiteAlgorithm _whiteAlgorithm;
@@ -25,7 +23,7 @@ class DriverRpiPio : public LedDevice
2523
uint8_t _white_channel_green;
2624
uint8_t _white_channel_blue;
2725

28-
RGBW::RgbwChannelCorrection channelCorrection;
26+
RGBW::RgbwChannelCorrection channelCorrection{};
2927

3028
static bool isRegistered;
3129
};

sources/led-drivers/pwm/rpi_pio/DriverRpiPio.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,25 +82,25 @@ int DriverRpiPio::open()
8282
if (!fi.exists())
8383
{
8484
Error(_log, "The device does not exists: %s", QSTRING_CSTR(_output));
85-
Error(_log, "Must be configured first like for ex: dtoverlay=ws2812-pio,gpio=18,num_leds=30,is_rgbw=1 in /boot/firmware/config.txt. Only RPI5+");
85+
Error(_log, "Must be configured first like for ex: dtoverlay=ws2812-pio,gpio=18,num_leds=30,rgbw in /boot/firmware/config.txt. rgbw only for sk6812 RGBW. num_leds is your LED number. Only RPI5+");
8686
return retval;
8787
}
8888

8989
if (!fi.isWritable())
9090
{
91-
Error(_log, "The device is not writable. Are you root or have write rights for: %s", QSTRING_CSTR(_output));
91+
Error(_log, "The device is not writable. Are you root or your user has write access rights to: %s", QSTRING_CSTR(_output));
9292
return retval;
9393
}
9494

95-
_renderer = std::make_unique<QFile>(_output);
96-
if (!_renderer->open(QIODevice::WriteOnly))
95+
QFile renderer(_output);
96+
if (!renderer.open(QIODevice::WriteOnly))
9797
{
98-
_renderer = nullptr;
9998
Error(_log, "Cannot open the device for writing: %s", QSTRING_CSTR(_output));
10099
return retval;
101100
}
102101
else
103102
{
103+
renderer.close();
104104
_isDeviceReady = true;
105105
retval = 0;
106106
}
@@ -112,19 +112,20 @@ int DriverRpiPio::close()
112112
int retval = 0;
113113
_isDeviceReady = false;
114114

115-
if (_renderer)
116-
{
117-
_renderer->close();
118-
_renderer = nullptr;
119-
}
120-
121115
return retval;
122116
}
123117

124118
int DriverRpiPio::writeFiniteColors(const std::vector<ColorRgb>& ledValues)
125119
{
126120
QByteArray render;
127121

122+
QFile renderer(_output);
123+
if (!renderer.open(QIODevice::WriteOnly))
124+
{
125+
this->setInError("Cannot open the device for writing");
126+
return 0;
127+
}
128+
128129
if (_isRgbw)
129130
{
130131
render.reserve(ledValues.size() * 4);
@@ -139,8 +140,8 @@ int DriverRpiPio::writeFiniteColors(const std::vector<ColorRgb>& ledValues)
139140

140141
rgb2rgbw(color, &tempRgbw, _whiteAlgorithm, channelCorrection);
141142

142-
render.append(static_cast<char>(tempRgbw.red));
143143
render.append(static_cast<char>(tempRgbw.green));
144+
render.append(static_cast<char>(tempRgbw.red));
144145
render.append(static_cast<char>(tempRgbw.blue));
145146
render.append(static_cast<char>(tempRgbw.white));
146147
}
@@ -150,14 +151,14 @@ int DriverRpiPio::writeFiniteColors(const std::vector<ColorRgb>& ledValues)
150151
render.reserve(ledValues.size() * 3);
151152
for (const ColorRgb& color : ledValues)
152153
{
153-
render.append(static_cast<char>(color.red));
154154
render.append(static_cast<char>(color.green));
155+
render.append(static_cast<char>(color.red));
155156
render.append(static_cast<char>(color.blue));
156157
}
157158
}
158159

159-
auto written = _renderer->write(render);
160-
_renderer->flush();
160+
auto written = renderer.write(render);
161+
renderer.close();
161162

162163
return written;
163164
}

0 commit comments

Comments
 (0)