mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-26 22:15:31 -04:00
SSB demod DNR API support
This commit is contained in:
parent
179cd71c54
commit
91815cc87e
@ -542,6 +542,21 @@ void SSBDemod::webapiUpdateChannelSettings(
|
||||
if (channelSettingsKeys.contains("agcThresholdGate")) {
|
||||
settings.m_agcThresholdGate = response.getSsbDemodSettings()->getAgcThresholdGate();
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnr")) {
|
||||
settings.m_dnr = response.getSsbDemodSettings()->getDnr() != 0;
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrAboveAvgFactor")) {
|
||||
settings.m_dnrAboveAvgFactor = response.getSsbDemodSettings()->getDnrAboveAvgFactor();
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrSigmaFactor")) {
|
||||
settings.m_dnrSigmaFactor = response.getSsbDemodSettings()->getDnrSigmaFactor();
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrNbPeaks")) {
|
||||
settings.m_dnrNbPeaks = response.getSsbDemodSettings()->getDnrNbPeaks();
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrAlpha")) {
|
||||
settings.m_dnrAlpha = response.getSsbDemodSettings()->getDnrAlpha();
|
||||
}
|
||||
if (channelSettingsKeys.contains("rgbColor")) {
|
||||
settings.m_rgbColor = response.getSsbDemodSettings()->getRgbColor();
|
||||
}
|
||||
@ -610,6 +625,12 @@ void SSBDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp
|
||||
response.getSsbDemodSettings()->setAgcTimeLog2(settings.m_agcTimeLog2);
|
||||
response.getSsbDemodSettings()->setAgcPowerThreshold(settings.m_agcPowerThreshold);
|
||||
response.getSsbDemodSettings()->setAgcThresholdGate(settings.m_agcThresholdGate);
|
||||
response.getSsbDemodSettings()->setDnr(settings.m_dnr ? 1 : 0);
|
||||
response.getSsbDemodSettings()->setDnrScheme(settings.m_dnrScheme);
|
||||
response.getSsbDemodSettings()->setDnrAboveAvgFactor(settings.m_dnrAboveAvgFactor);
|
||||
response.getSsbDemodSettings()->setDnrSigmaFactor(settings.m_dnrSigmaFactor);
|
||||
response.getSsbDemodSettings()->setDnrNbPeaks(settings.m_dnrNbPeaks);
|
||||
response.getSsbDemodSettings()->setDnrAlpha(settings.m_dnrAlpha);
|
||||
response.getSsbDemodSettings()->setRgbColor(settings.m_rgbColor);
|
||||
|
||||
if (response.getSsbDemodSettings()->getTitle()) {
|
||||
@ -812,6 +833,21 @@ void SSBDemod::webapiFormatChannelSettings(
|
||||
if (channelSettingsKeys.contains("agcThresholdGate") || force) {
|
||||
swgSSBDemodSettings->setAgcThresholdGate(settings.m_agcThresholdGate);
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnr")) {
|
||||
swgSSBDemodSettings->setDnr(settings.m_dnr ? 1 : 0);
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrAboveAvgFactor")) {
|
||||
swgSSBDemodSettings->setDnrAboveAvgFactor(settings.m_dnrAboveAvgFactor);
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrSigmaFactor")) {
|
||||
swgSSBDemodSettings->setDnrSigmaFactor(settings.m_dnrSigmaFactor);
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrNbPeaks")) {
|
||||
swgSSBDemodSettings->setDnrNbPeaks(settings.m_dnrNbPeaks);
|
||||
}
|
||||
if (channelSettingsKeys.contains("dnrAlpha")) {
|
||||
swgSSBDemodSettings->setDnrAlpha(settings.m_dnrAlpha);
|
||||
}
|
||||
if (channelSettingsKeys.contains("rgbColor") || force) {
|
||||
swgSSBDemodSettings->setRgbColor(settings.m_rgbColor);
|
||||
}
|
||||
|
@ -1473,6 +1473,19 @@ margin-bottom: 20px;
|
||||
"type" : "integer",
|
||||
"description" : "Synchronous AM sidebands mode (DSB, USB, LSB)"
|
||||
},
|
||||
"frequencyMode" : {
|
||||
"type" : "integer",
|
||||
"description" : "(0 for Offset, 1 for MW, 2 for 25k, 3 for 8.33k)"
|
||||
},
|
||||
"frequency" : {
|
||||
"type" : "integer",
|
||||
"format" : "int64",
|
||||
"description" : "Channel center frequency"
|
||||
},
|
||||
"snap" : {
|
||||
"type" : "integer",
|
||||
"description" : "Snap channel marker to channel center frequencies"
|
||||
},
|
||||
"streamIndex" : {
|
||||
"type" : "integer",
|
||||
"description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
|
||||
@ -13603,6 +13616,33 @@ margin-bottom: 20px;
|
||||
"type" : "integer",
|
||||
"description" : "Audio squelch gate in ms"
|
||||
},
|
||||
"dnr" : {
|
||||
"type" : "integer",
|
||||
"description" : "Toggle noise reduction:\n * 0 - Noise reduction off\n * 1 - Noise reduction on\n"
|
||||
},
|
||||
"dnrScheme" : {
|
||||
"type" : "integer",
|
||||
"description" : "Noise reduction scheme:\n * 0 - Average of magnitudes\n * 1 - Average and standard deviation of magnitudes\n * 2 - Magnitude maxima (peaks)\n"
|
||||
},
|
||||
"dnrAboveAvgFactor" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Multiplier of the average to deteermine magnitude threshold in average scheme"
|
||||
},
|
||||
"dnrSigmaFactor" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Standard deviation (sigma) multiplier to deteermine magnitude threshold in average and standard deviation scheme"
|
||||
},
|
||||
"dnrNbPeaks" : {
|
||||
"type" : "integer",
|
||||
"description" : "Number of magnitude peak maxima selected in peaks scheme"
|
||||
},
|
||||
"dnrAlpha" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Smoothing constant (alpha) of the exponential smoothing filter. Must be between 0 and 1."
|
||||
},
|
||||
"rgbColor" : {
|
||||
"type" : "integer"
|
||||
},
|
||||
@ -58361,7 +58401,7 @@ except ApiException as e:
|
||||
</div>
|
||||
<div id="generator">
|
||||
<div class="content">
|
||||
Generated 2023-10-26T10:32:08.802+02:00
|
||||
Generated 2023-11-05T10:45:45.965+01:00
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -37,6 +37,16 @@ AMDemodSettings:
|
||||
syncAMOperation:
|
||||
description: Synchronous AM sidebands mode (DSB, USB, LSB)
|
||||
type: integer
|
||||
frequencyMode:
|
||||
description: (0 for Offset, 1 for MW, 2 for 25k, 3 for 8.33k)
|
||||
type: integer
|
||||
frequency:
|
||||
description: Channel center frequency
|
||||
type: integer
|
||||
format: int64
|
||||
snap:
|
||||
description: Snap channel marker to channel center frequencies
|
||||
type: integer
|
||||
streamIndex:
|
||||
description: MIMO channel. Not relevant when connected to SI (single Rx).
|
||||
type: integer
|
||||
|
@ -57,6 +57,34 @@ SSBDemodSettings:
|
||||
agcThresholdGate:
|
||||
description: Audio squelch gate in ms
|
||||
type: integer
|
||||
dnr:
|
||||
type: integer
|
||||
description: >
|
||||
Toggle noise reduction:
|
||||
* 0 - Noise reduction off
|
||||
* 1 - Noise reduction on
|
||||
dnrScheme:
|
||||
type: integer
|
||||
description: >
|
||||
Noise reduction scheme:
|
||||
* 0 - Average of magnitudes
|
||||
* 1 - Average and standard deviation of magnitudes
|
||||
* 2 - Magnitude maxima (peaks)
|
||||
dnrAboveAvgFactor:
|
||||
type: number
|
||||
format: float
|
||||
description: Multiplier of the average to deteermine magnitude threshold in average scheme
|
||||
dnrSigmaFactor:
|
||||
type: number
|
||||
format: float
|
||||
description: Standard deviation (sigma) multiplier to deteermine magnitude threshold in average and standard deviation scheme
|
||||
dnrNbPeaks:
|
||||
type: integer
|
||||
description: Number of magnitude peak maxima selected in peaks scheme
|
||||
dnrAlpha:
|
||||
type: number
|
||||
format: float
|
||||
description: Smoothing constant (alpha) of the exponential smoothing filter. Must be between 0 and 1.
|
||||
rgbColor:
|
||||
type: integer
|
||||
title:
|
||||
|
@ -57,6 +57,34 @@ SSBDemodSettings:
|
||||
agcThresholdGate:
|
||||
description: Audio squelch gate in ms
|
||||
type: integer
|
||||
dnr:
|
||||
type: integer
|
||||
description: >
|
||||
Toggle noise reduction:
|
||||
* 0 - Noise reduction off
|
||||
* 1 - Noise reduction on
|
||||
dnrScheme:
|
||||
type: integer
|
||||
description: >
|
||||
Noise reduction scheme:
|
||||
* 0 - Average of magnitudes
|
||||
* 1 - Average and standard deviation of magnitudes
|
||||
* 2 - Magnitude maxima (peaks)
|
||||
dnrAboveAvgFactor:
|
||||
type: number
|
||||
format: float
|
||||
description: Multiplier of the average to deteermine magnitude threshold in average scheme
|
||||
dnrSigmaFactor:
|
||||
type: number
|
||||
format: float
|
||||
description: Standard deviation (sigma) multiplier to deteermine magnitude threshold in average and standard deviation scheme
|
||||
dnrNbPeaks:
|
||||
type: integer
|
||||
description: Number of magnitude peak maxima selected in peaks scheme
|
||||
dnrAlpha:
|
||||
type: number
|
||||
format: float
|
||||
description: Smoothing constant (alpha) of the exponential smoothing filter. Must be between 0 and 1.
|
||||
rgbColor:
|
||||
type: integer
|
||||
title:
|
||||
|
@ -1473,6 +1473,19 @@ margin-bottom: 20px;
|
||||
"type" : "integer",
|
||||
"description" : "Synchronous AM sidebands mode (DSB, USB, LSB)"
|
||||
},
|
||||
"frequencyMode" : {
|
||||
"type" : "integer",
|
||||
"description" : "(0 for Offset, 1 for MW, 2 for 25k, 3 for 8.33k)"
|
||||
},
|
||||
"frequency" : {
|
||||
"type" : "integer",
|
||||
"format" : "int64",
|
||||
"description" : "Channel center frequency"
|
||||
},
|
||||
"snap" : {
|
||||
"type" : "integer",
|
||||
"description" : "Snap channel marker to channel center frequencies"
|
||||
},
|
||||
"streamIndex" : {
|
||||
"type" : "integer",
|
||||
"description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
|
||||
@ -13603,6 +13616,33 @@ margin-bottom: 20px;
|
||||
"type" : "integer",
|
||||
"description" : "Audio squelch gate in ms"
|
||||
},
|
||||
"dnr" : {
|
||||
"type" : "integer",
|
||||
"description" : "Toggle noise reduction:\n * 0 - Noise reduction off\n * 1 - Noise reduction on\n"
|
||||
},
|
||||
"dnrScheme" : {
|
||||
"type" : "integer",
|
||||
"description" : "Noise reduction scheme:\n * 0 - Average of magnitudes\n * 1 - Average and standard deviation of magnitudes\n * 2 - Magnitude maxima (peaks)\n"
|
||||
},
|
||||
"dnrAboveAvgFactor" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Multiplier of the average to deteermine magnitude threshold in average scheme"
|
||||
},
|
||||
"dnrSigmaFactor" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Standard deviation (sigma) multiplier to deteermine magnitude threshold in average and standard deviation scheme"
|
||||
},
|
||||
"dnrNbPeaks" : {
|
||||
"type" : "integer",
|
||||
"description" : "Number of magnitude peak maxima selected in peaks scheme"
|
||||
},
|
||||
"dnrAlpha" : {
|
||||
"type" : "number",
|
||||
"format" : "float",
|
||||
"description" : "Smoothing constant (alpha) of the exponential smoothing filter. Must be between 0 and 1."
|
||||
},
|
||||
"rgbColor" : {
|
||||
"type" : "integer"
|
||||
},
|
||||
@ -58361,7 +58401,7 @@ except ApiException as e:
|
||||
</div>
|
||||
<div id="generator">
|
||||
<div class="content">
|
||||
Generated 2023-10-26T10:32:08.802+02:00
|
||||
Generated 2023-11-05T10:45:45.965+01:00
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -621,3 +621,4 @@ SWGAMDemodSettings::isSet(){
|
||||
return isObjectUpdated;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,6 +60,18 @@ SWGSSBDemodSettings::SWGSSBDemodSettings() {
|
||||
m_agc_power_threshold_isSet = false;
|
||||
agc_threshold_gate = 0;
|
||||
m_agc_threshold_gate_isSet = false;
|
||||
dnr = 0;
|
||||
m_dnr_isSet = false;
|
||||
dnr_scheme = 0;
|
||||
m_dnr_scheme_isSet = false;
|
||||
dnr_above_avg_factor = 0.0f;
|
||||
m_dnr_above_avg_factor_isSet = false;
|
||||
dnr_sigma_factor = 0.0f;
|
||||
m_dnr_sigma_factor_isSet = false;
|
||||
dnr_nb_peaks = 0;
|
||||
m_dnr_nb_peaks_isSet = false;
|
||||
dnr_alpha = 0.0f;
|
||||
m_dnr_alpha_isSet = false;
|
||||
rgb_color = 0;
|
||||
m_rgb_color_isSet = false;
|
||||
title = nullptr;
|
||||
@ -124,6 +136,18 @@ SWGSSBDemodSettings::init() {
|
||||
m_agc_power_threshold_isSet = false;
|
||||
agc_threshold_gate = 0;
|
||||
m_agc_threshold_gate_isSet = false;
|
||||
dnr = 0;
|
||||
m_dnr_isSet = false;
|
||||
dnr_scheme = 0;
|
||||
m_dnr_scheme_isSet = false;
|
||||
dnr_above_avg_factor = 0.0f;
|
||||
m_dnr_above_avg_factor_isSet = false;
|
||||
dnr_sigma_factor = 0.0f;
|
||||
m_dnr_sigma_factor_isSet = false;
|
||||
dnr_nb_peaks = 0;
|
||||
m_dnr_nb_peaks_isSet = false;
|
||||
dnr_alpha = 0.0f;
|
||||
m_dnr_alpha_isSet = false;
|
||||
rgb_color = 0;
|
||||
m_rgb_color_isSet = false;
|
||||
title = new QString("");
|
||||
@ -166,6 +190,12 @@ SWGSSBDemodSettings::cleanup() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -237,6 +267,18 @@ SWGSSBDemodSettings::fromJsonObject(QJsonObject &pJson) {
|
||||
|
||||
::SWGSDRangel::setValue(&agc_threshold_gate, pJson["agcThresholdGate"], "qint32", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr, pJson["dnr"], "qint32", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr_scheme, pJson["dnrScheme"], "qint32", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr_above_avg_factor, pJson["dnrAboveAvgFactor"], "float", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr_sigma_factor, pJson["dnrSigmaFactor"], "float", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr_nb_peaks, pJson["dnrNbPeaks"], "qint32", "");
|
||||
|
||||
::SWGSDRangel::setValue(&dnr_alpha, pJson["dnrAlpha"], "float", "");
|
||||
|
||||
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
|
||||
|
||||
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
|
||||
@ -325,6 +367,24 @@ SWGSSBDemodSettings::asJsonObject() {
|
||||
if(m_agc_threshold_gate_isSet){
|
||||
obj->insert("agcThresholdGate", QJsonValue(agc_threshold_gate));
|
||||
}
|
||||
if(m_dnr_isSet){
|
||||
obj->insert("dnr", QJsonValue(dnr));
|
||||
}
|
||||
if(m_dnr_scheme_isSet){
|
||||
obj->insert("dnrScheme", QJsonValue(dnr_scheme));
|
||||
}
|
||||
if(m_dnr_above_avg_factor_isSet){
|
||||
obj->insert("dnrAboveAvgFactor", QJsonValue(dnr_above_avg_factor));
|
||||
}
|
||||
if(m_dnr_sigma_factor_isSet){
|
||||
obj->insert("dnrSigmaFactor", QJsonValue(dnr_sigma_factor));
|
||||
}
|
||||
if(m_dnr_nb_peaks_isSet){
|
||||
obj->insert("dnrNbPeaks", QJsonValue(dnr_nb_peaks));
|
||||
}
|
||||
if(m_dnr_alpha_isSet){
|
||||
obj->insert("dnrAlpha", QJsonValue(dnr_alpha));
|
||||
}
|
||||
if(m_rgb_color_isSet){
|
||||
obj->insert("rgbColor", QJsonValue(rgb_color));
|
||||
}
|
||||
@ -525,6 +585,66 @@ SWGSSBDemodSettings::setAgcThresholdGate(qint32 agc_threshold_gate) {
|
||||
this->m_agc_threshold_gate_isSet = true;
|
||||
}
|
||||
|
||||
qint32
|
||||
SWGSSBDemodSettings::getDnr() {
|
||||
return dnr;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnr(qint32 dnr) {
|
||||
this->dnr = dnr;
|
||||
this->m_dnr_isSet = true;
|
||||
}
|
||||
|
||||
qint32
|
||||
SWGSSBDemodSettings::getDnrScheme() {
|
||||
return dnr_scheme;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnrScheme(qint32 dnr_scheme) {
|
||||
this->dnr_scheme = dnr_scheme;
|
||||
this->m_dnr_scheme_isSet = true;
|
||||
}
|
||||
|
||||
float
|
||||
SWGSSBDemodSettings::getDnrAboveAvgFactor() {
|
||||
return dnr_above_avg_factor;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnrAboveAvgFactor(float dnr_above_avg_factor) {
|
||||
this->dnr_above_avg_factor = dnr_above_avg_factor;
|
||||
this->m_dnr_above_avg_factor_isSet = true;
|
||||
}
|
||||
|
||||
float
|
||||
SWGSSBDemodSettings::getDnrSigmaFactor() {
|
||||
return dnr_sigma_factor;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnrSigmaFactor(float dnr_sigma_factor) {
|
||||
this->dnr_sigma_factor = dnr_sigma_factor;
|
||||
this->m_dnr_sigma_factor_isSet = true;
|
||||
}
|
||||
|
||||
qint32
|
||||
SWGSSBDemodSettings::getDnrNbPeaks() {
|
||||
return dnr_nb_peaks;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnrNbPeaks(qint32 dnr_nb_peaks) {
|
||||
this->dnr_nb_peaks = dnr_nb_peaks;
|
||||
this->m_dnr_nb_peaks_isSet = true;
|
||||
}
|
||||
|
||||
float
|
||||
SWGSSBDemodSettings::getDnrAlpha() {
|
||||
return dnr_alpha;
|
||||
}
|
||||
void
|
||||
SWGSSBDemodSettings::setDnrAlpha(float dnr_alpha) {
|
||||
this->dnr_alpha = dnr_alpha;
|
||||
this->m_dnr_alpha_isSet = true;
|
||||
}
|
||||
|
||||
qint32
|
||||
SWGSSBDemodSettings::getRgbColor() {
|
||||
return rgb_color;
|
||||
@ -698,6 +818,24 @@ SWGSSBDemodSettings::isSet(){
|
||||
if(m_agc_threshold_gate_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_scheme_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_above_avg_factor_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_sigma_factor_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_nb_peaks_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_dnr_alpha_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
if(m_rgb_color_isSet){
|
||||
isObjectUpdated = true; break;
|
||||
}
|
||||
|
@ -93,6 +93,24 @@ public:
|
||||
qint32 getAgcThresholdGate();
|
||||
void setAgcThresholdGate(qint32 agc_threshold_gate);
|
||||
|
||||
qint32 getDnr();
|
||||
void setDnr(qint32 dnr);
|
||||
|
||||
qint32 getDnrScheme();
|
||||
void setDnrScheme(qint32 dnr_scheme);
|
||||
|
||||
float getDnrAboveAvgFactor();
|
||||
void setDnrAboveAvgFactor(float dnr_above_avg_factor);
|
||||
|
||||
float getDnrSigmaFactor();
|
||||
void setDnrSigmaFactor(float dnr_sigma_factor);
|
||||
|
||||
qint32 getDnrNbPeaks();
|
||||
void setDnrNbPeaks(qint32 dnr_nb_peaks);
|
||||
|
||||
float getDnrAlpha();
|
||||
void setDnrAlpha(float dnr_alpha);
|
||||
|
||||
qint32 getRgbColor();
|
||||
void setRgbColor(qint32 rgb_color);
|
||||
|
||||
@ -181,6 +199,24 @@ private:
|
||||
qint32 agc_threshold_gate;
|
||||
bool m_agc_threshold_gate_isSet;
|
||||
|
||||
qint32 dnr;
|
||||
bool m_dnr_isSet;
|
||||
|
||||
qint32 dnr_scheme;
|
||||
bool m_dnr_scheme_isSet;
|
||||
|
||||
float dnr_above_avg_factor;
|
||||
bool m_dnr_above_avg_factor_isSet;
|
||||
|
||||
float dnr_sigma_factor;
|
||||
bool m_dnr_sigma_factor_isSet;
|
||||
|
||||
qint32 dnr_nb_peaks;
|
||||
bool m_dnr_nb_peaks_isSet;
|
||||
|
||||
float dnr_alpha;
|
||||
bool m_dnr_alpha_isSet;
|
||||
|
||||
qint32 rgb_color;
|
||||
bool m_rgb_color_isSet;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user