mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Fixes - Smoothing, Color-Calibration (#1532)
* Smoothing Remove ouputrate as duplicate to update frequency * Serial LDEDDevices -Increase writeBlack to overcome issues on high baud rates * Serial LED-Devices - Support device feedback, show statistics provided by HyperSerial * Fix - Update Color Calibration on Remote Control when settings saved * Serial LED-Devices - Support device feedback, show statistics provided by HyperSerial
This commit is contained in:
@@ -47,7 +47,6 @@ const char* SETTINGS_KEY_OUTPUT_DELAY = "updateDelay";
|
||||
|
||||
const char* SETTINGS_KEY_DECAY = "decay";
|
||||
const char* SETTINGS_KEY_INTERPOLATION_RATE = "interpolationRate";
|
||||
const char* SETTINGS_KEY_OUTPUT_RATE = "outputRate";
|
||||
const char* SETTINGS_KEY_DITHERING = "dithering";
|
||||
|
||||
const int64_t DEFAULT_SETTLINGTIME = 200; // in ms
|
||||
@@ -133,7 +132,6 @@ void LinearColorSmoothing::handleSettingsUpdate(settings::type type, const QJson
|
||||
cfg._pause = false;
|
||||
cfg._outputDelay = static_cast<unsigned>(obj[SETTINGS_KEY_OUTPUT_DELAY].toInt(DEFAULT_OUTPUTDEPLAY));
|
||||
|
||||
cfg._outputRate = obj[SETTINGS_KEY_OUTPUT_RATE].toDouble(DEFAULT_UPDATEFREQUENCY);
|
||||
cfg._interpolationRate = obj[SETTINGS_KEY_INTERPOLATION_RATE].toDouble(DEFAULT_UPDATEFREQUENCY);
|
||||
cfg._dithering = obj[SETTINGS_KEY_DITHERING].toBool(false);
|
||||
cfg._decay = obj[SETTINGS_KEY_DECAY].toDouble(1.0);
|
||||
@@ -584,7 +582,6 @@ unsigned LinearColorSmoothing::addConfig(int settlingTime_ms, double ledUpdateFr
|
||||
static_cast<int>(MS_PER_MICRO / ledUpdateFrequency_hz),
|
||||
SmoothingType::Linear,
|
||||
ledUpdateFrequency_hz,
|
||||
ledUpdateFrequency_hz,
|
||||
updateDelay
|
||||
};
|
||||
_cfgList.append(cfg);
|
||||
@@ -605,7 +602,6 @@ unsigned LinearColorSmoothing::updateConfig(int cfgID, int settlingTime_ms, doub
|
||||
static_cast<int>(MS_PER_MICRO / ledUpdateFrequency_hz),
|
||||
SmoothingType::Linear,
|
||||
ledUpdateFrequency_hz,
|
||||
ledUpdateFrequency_hz,
|
||||
updateDelay
|
||||
};
|
||||
_cfgList[updatedCfgID] = cfg;
|
||||
@@ -631,8 +627,7 @@ bool LinearColorSmoothing::selectConfig(int cfgID, bool force)
|
||||
_settlingTime = _cfgList[cfgID]._settlingTime;
|
||||
_outputDelay = _cfgList[cfgID]._outputDelay;
|
||||
_pause = _cfgList[cfgID]._pause;
|
||||
_outputRate = _cfgList[cfgID]._outputRate;
|
||||
_outputIntervalMicros = int64_t(1000000.0 / _outputRate); // 1s = 1e6 µs
|
||||
_outputIntervalMicros = int64_t(1000000.0 / _updateInterval); // 1s = 1e6 µs
|
||||
_interpolationRate = _cfgList[cfgID]._interpolationRate;
|
||||
_interpolationIntervalMicros = int64_t(1000000.0 / _interpolationRate);
|
||||
_dithering = _cfgList[cfgID]._dithering;
|
||||
@@ -711,8 +706,7 @@ QString LinearColorSmoothing::getConfig(int cfgID)
|
||||
case SmoothingType::Decay:
|
||||
{
|
||||
const double thalf = (1.0-std::pow(1.0/2, 1.0/_decay))*_settlingTime;
|
||||
configText += QString (", outputRate %1Hz, interpolationRate: %2Hz, dithering: %3, decay: %4 -> halftime: %5ms")
|
||||
.arg(cfg._outputRate,0,'f',2)
|
||||
configText += QString (", interpolationRate: %1Hz, dithering: %2, decay: %3 -> halftime: %4ms")
|
||||
.arg(cfg._interpolationRate,0,'f',2)
|
||||
.arg((cfg._dithering) ? "true" : "false")
|
||||
.arg(cfg._decay,0,'f',2)
|
||||
@@ -732,12 +726,11 @@ LinearColorSmoothing::SmoothingCfg::SmoothingCfg() :
|
||||
{
|
||||
}
|
||||
|
||||
LinearColorSmoothing::SmoothingCfg::SmoothingCfg(bool pause, int64_t settlingTime, int updateInterval, SmoothingType type, double outputRate, double interpolationRate, unsigned outputDelay, bool dithering, double decay) :
|
||||
LinearColorSmoothing::SmoothingCfg::SmoothingCfg(bool pause, int64_t settlingTime, int updateInterval, SmoothingType type, double interpolationRate, unsigned outputDelay, bool dithering, double decay) :
|
||||
_pause(pause),
|
||||
_settlingTime(settlingTime),
|
||||
_updateInterval(updateInterval),
|
||||
_type(type),
|
||||
_outputRate(outputRate),
|
||||
_interpolationRate(interpolationRate),
|
||||
_outputDelay(outputDelay),
|
||||
_dithering(dithering),
|
||||
|
@@ -50,20 +50,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"outputRate": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_smooth_outputRate_title",
|
||||
"minimum": 1.0,
|
||||
"maximum": 1000.0,
|
||||
"default": 1.0,
|
||||
"append": "edt_append_hz",
|
||||
"propertyOrder": 6,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"type": "decay"
|
||||
}
|
||||
}
|
||||
},
|
||||
"decay": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_smooth_decay_title",
|
||||
|
@@ -119,7 +119,7 @@ void LedDeviceAdalight::prepareHeader()
|
||||
qToBigEndian<quint16>(static_cast<quint16>(totalLedCount), &_ledBuffer[3]);
|
||||
_ledBuffer[5] = _ledBuffer[3] ^ _ledBuffer[4] ^ 0x55; // Checksum
|
||||
|
||||
Debug( _log, "Adalight header for %d leds: %c%c%c 0x%02x 0x%02x 0x%02x", _ledCount,
|
||||
Debug( _log, "Adalight header for %d leds (size: %d): %c%c%c 0x%02x 0x%02x 0x%02x", _ledCount, _ledBuffer.size(),
|
||||
_ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3], _ledBuffer[4], _ledBuffer[5] );
|
||||
}
|
||||
|
||||
@@ -179,6 +179,31 @@ int LedDeviceAdalight::write(const std::vector<ColorRgb> & ledValues)
|
||||
return rc;
|
||||
}
|
||||
|
||||
void LedDeviceAdalight::readFeedback()
|
||||
{
|
||||
if (_streamProtocol == Adalight::AWA)
|
||||
{
|
||||
bool continuousLines {true};
|
||||
while ( _rs232Port.canReadLine() )
|
||||
{
|
||||
QByteArray record = _rs232Port.readLine();
|
||||
if (record.startsWith("FPS:"))
|
||||
{
|
||||
if (continuousLines)
|
||||
{
|
||||
continuousLines = false;
|
||||
}
|
||||
Debug(_log, "Statistics %s", record.trimmed().constData());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << record.toStdString() << std::flush;
|
||||
continuousLines = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LedDeviceAdalight::whiteChannelExtension(uint8_t*& writer)
|
||||
{
|
||||
if (_streamProtocol == Adalight::AWA && _white_channel_calibration)
|
||||
|
@@ -37,6 +37,14 @@ public:
|
||||
/// @return LedDevice constructed
|
||||
static LedDevice* construct(const QJsonObject &deviceConfig);
|
||||
|
||||
private slots:
|
||||
|
||||
///
|
||||
/// @brief Handle feedback provided by the device
|
||||
/// Allows to show statistics and error for the "Awa" protocol, if configured in the ESP-sketch
|
||||
///
|
||||
void readFeedback() override;
|
||||
|
||||
private:
|
||||
|
||||
///
|
||||
|
@@ -18,7 +18,7 @@ namespace {
|
||||
constexpr std::chrono::milliseconds WRITE_TIMEOUT{ 1000 }; // device write timeout in ms
|
||||
constexpr std::chrono::milliseconds OPEN_TIMEOUT{ 5000 }; // device open timeout in ms
|
||||
const int MAX_WRITE_TIMEOUTS = 5; // Maximum number of allowed timeouts
|
||||
const int NUM_POWEROFF_WRITE_BLACK = 2; // Number of write "BLACK" during powering off
|
||||
const int NUM_POWEROFF_WRITE_BLACK = 5; // Number of write "BLACK" during powering off
|
||||
|
||||
constexpr std::chrono::milliseconds DEFAULT_IDENTIFY_TIME{ 500 };
|
||||
|
||||
@@ -86,6 +86,8 @@ int ProviderRs232::open()
|
||||
// open device physically
|
||||
if ( tryOpen(_delayAfterConnect_ms) )
|
||||
{
|
||||
connect(&_rs232Port, &QSerialPort::readyRead, this, &ProviderRs232::readFeedback);
|
||||
|
||||
// Everything is OK, device is ready
|
||||
_isDeviceReady = true;
|
||||
retval = 0;
|
||||
@@ -106,6 +108,9 @@ int ProviderRs232::close()
|
||||
{
|
||||
Debug(_log,"Flush was successful");
|
||||
}
|
||||
|
||||
disconnect(&_rs232Port, &QSerialPort::readyRead, this, &ProviderRs232::readFeedback);
|
||||
|
||||
Debug(_log,"Close UART: %s", QSTRING_CSTR(_deviceName) );
|
||||
_rs232Port.close();
|
||||
// Everything is OK -> device is closed
|
||||
@@ -261,6 +266,23 @@ int ProviderRs232::writeBytes(const qint64 size, const uint8_t *data)
|
||||
return rc;
|
||||
}
|
||||
|
||||
void ProviderRs232::readFeedback()
|
||||
{
|
||||
QByteArray readData = _rs232Port.readAll();
|
||||
if (!readData.isEmpty())
|
||||
{
|
||||
//Output as received
|
||||
std::cout << readData.toStdString();
|
||||
|
||||
//Output as Hex
|
||||
//#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
|
||||
// std::cout << readData.toHex(':').toStdString();
|
||||
//#else
|
||||
// std::cout << readData.toHex().toStdString();
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
|
||||
QString ProviderRs232::discoverFirst()
|
||||
{
|
||||
// take first available USB serial port - currently no probing!
|
||||
|
@@ -123,6 +123,11 @@ protected slots:
|
||||
///
|
||||
void setInError( const QString& errorMsg) override;
|
||||
|
||||
///
|
||||
/// @brief Handle any feedback provided by the device
|
||||
///
|
||||
virtual void readFeedback();
|
||||
|
||||
private:
|
||||
|
||||
///
|
||||
|
Reference in New Issue
Block a user