ATV modulator: Web API: add possibility to set image and video files

pull/162/head
f4exb 2018-04-15 02:22:54 +02:00
rodzic 875cf59fda
commit 6320716eb9
10 zmienionych plików z 191 dodań i 39 usunięć

Wyświetl plik

@ -42,7 +42,6 @@ MESSAGE_CLASS_DEFINITION(ATVMod::MsgReportVideoFileSourceStreamData, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureCameraIndex, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureCameraData, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgReportCameraData, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureOverlayText, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgReportEffectiveSampleRate, Message)
const QString ATVMod::m_channelIdURI = "sdrangel.channeltx.modatv";
@ -613,12 +612,6 @@ bool ATVMod::handleMessage(const Message& cmd)
return true;
}
else if (MsgConfigureOverlayText::match(cmd))
{
MsgConfigureOverlayText& cfg = (MsgConfigureOverlayText&) cmd;
m_overlayText = cfg.getOverlayText().toStdString();
return true;
}
else if (DSPSignalNotification::match(cmd))
{
return true;
@ -800,6 +793,7 @@ void ATVMod::openImage(const QString& fileName)
if (m_imageOK)
{
m_imageFileName = fileName;
m_imageFromFile.copyTo(m_imageOriginal);
if (m_settings.m_showOverlayText) {
@ -808,6 +802,11 @@ void ATVMod::openImage(const QString& fileName)
resizeImage();
}
else
{
m_imageFileName.clear();
qDebug("ATVMod::openImage: cannot open image file %s", qPrintable(fileName));
}
}
void ATVMod::openVideo(const QString& fileName)
@ -818,6 +817,7 @@ void ATVMod::openVideo(const QString& fileName)
if (m_videoOK)
{
m_videoFileName = fileName;
m_videoFPS = m_video.get(CV_CAP_PROP_FPS);
m_videoWidth = (int) m_video.get(CV_CAP_PROP_FRAME_WIDTH);
m_videoHeight = (int) m_video.get(CV_CAP_PROP_FRAME_HEIGHT);
@ -845,7 +845,8 @@ void ATVMod::openVideo(const QString& fileName)
}
else
{
qDebug("ATVMod::openVideo: cannot open video file");
m_videoFileName.clear();
qDebug("ATVMod::openVideo: cannot open video file %s", qPrintable(fileName));
}
}
@ -1001,13 +1002,13 @@ void ATVMod::mixImageAndText(cv::Mat& image)
int baseline=0;
fontScale = fontScale < 4.0f ? 4.0f : fontScale; // minimum size
cv::Size textSize = cv::getTextSize(m_overlayText, fontFace, fontScale, thickness, &baseline);
cv::Size textSize = cv::getTextSize(m_settings.m_overlayText.toStdString(), fontFace, fontScale, thickness, &baseline);
baseline += thickness;
// position the text in the top left corner
cv::Point textOrg(6, textSize.height+10);
// then put the text itself
cv::putText(image, m_overlayText, textOrg, fontFace, fontScale, cv::Scalar::all(255*m_settings.m_uniformLevel), thickness, CV_AA);
cv::putText(image, m_settings.m_overlayText.toStdString(), textOrg, fontFace, fontScale, cv::Scalar::all(255*m_settings.m_uniformLevel), thickness, CV_AA);
}
void ATVMod::applyChannelSettings(int outputSampleRate, int inputFrequencyOffset, bool force)
@ -1250,6 +1251,9 @@ int ATVMod::webapiSettingsPutPatch(
if (channelSettingsKeys.contains("forceDecimator")) {
settings.m_forceDecimator = response.getAtvModSettings()->getForceDecimator() != 0;
}
if (channelSettingsKeys.contains("showOverlayText")) {
settings.m_showOverlayText = response.getAtvModSettings()->getShowOverlayText() != 0;
}
if (channelSettingsKeys.contains("overlayText")) {
settings.m_overlayText = *response.getAtvModSettings()->getOverlayText();
}
@ -1276,6 +1280,34 @@ int ATVMod::webapiSettingsPutPatch(
m_guiMessageQueue->push(msgToGUI);
}
if (channelSettingsKeys.contains("imageFileName"))
{
MsgConfigureImageFileName *msg = MsgConfigureImageFileName::create(
*response.getAtvModSettings()->getImageFileName());
m_inputMessageQueue.push(msg);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureImageFileName *msgToGUI = MsgConfigureImageFileName::create(
*response.getAtvModSettings()->getImageFileName());
m_guiMessageQueue->push(msgToGUI);
}
}
if (channelSettingsKeys.contains("videoFileName"))
{
MsgConfigureVideoFileName *msg = MsgConfigureVideoFileName::create(
*response.getAtvModSettings()->getVideoFileName());
m_inputMessageQueue.push(msg);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureVideoFileName *msgToGUI = MsgConfigureVideoFileName::create(
*response.getAtvModSettings()->getVideoFileName());
m_guiMessageQueue->push(msgToGUI);
}
}
webapiFormatChannelSettings(response, settings);
return 200;
@ -1310,6 +1342,7 @@ void ATVMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
response.getAtvModSettings()->setRfScalingFactor(settings.m_rfScalingFactor);
response.getAtvModSettings()->setFmExcursion(settings.m_fmExcursion);
response.getAtvModSettings()->setForceDecimator(settings.m_forceDecimator ? 1 : 0);
response.getAtvModSettings()->setShowOverlayText(settings.m_showOverlayText ? 1 : 0);
if (response.getAtvModSettings()->getOverlayText()) {
*response.getAtvModSettings()->getOverlayText() = settings.m_overlayText;
@ -1324,6 +1357,18 @@ void ATVMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
} else {
response.getAtvModSettings()->setTitle(new QString(settings.m_title));
}
if (response.getAtvModSettings()->getImageFileName()) {
*response.getAtvModSettings()->getImageFileName() = m_imageFileName;
} else {
response.getAtvModSettings()->setImageFileName(new QString(m_imageFileName));
}
if (response.getAtvModSettings()->getVideoFileName()) {
*response.getAtvModSettings()->getVideoFileName() = m_videoFileName;
} else {
response.getAtvModSettings()->setVideoFileName(new QString(m_videoFileName));
}
}
void ATVMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)

Wyświetl plik

@ -324,27 +324,6 @@ public:
{ }
};
class MsgConfigureOverlayText : public Message
{
MESSAGE_CLASS_DECLARATION
public:
const QString& getOverlayText() const { return m_overlayText; }
static MsgConfigureOverlayText* create(const QString& overlayText)
{
return new MsgConfigureOverlayText(overlayText);
}
private:
QString m_overlayText;
MsgConfigureOverlayText(const QString& overlayText) :
Message(),
m_overlayText(overlayText)
{ }
};
class MsgReportEffectiveSampleRate : public Message
{
MESSAGE_CLASS_DECLARATION
@ -534,6 +513,8 @@ private:
int m_cameraIndex; //!< curent camera index in list of available cameras
std::string m_overlayText;
QString m_imageFileName;
QString m_videoFileName;
// Used for standard SSB
fftfilt* m_SSBFilter;

Wyświetl plik

@ -158,6 +158,18 @@ bool ATVModGUI::handleMessage(const Message& message)
blockApplySettings(false);
return true;
}
else if (ATVMod::MsgConfigureImageFileName::match(message))
{
const ATVMod::MsgConfigureImageFileName& cfg = (ATVMod::MsgConfigureImageFileName&) message;
ui->imageFileText->setText(cfg.getFileName());
return true;
}
else if (ATVMod::MsgConfigureVideoFileName::match(message))
{
const ATVMod::MsgConfigureVideoFileName& cfg = (ATVMod::MsgConfigureVideoFileName&) message;
ui->videoFileText->setText(cfg.getFileName());
return true;
}
else
{
return false;
@ -570,8 +582,7 @@ void ATVModGUI::on_overlayTextShow_toggled(bool checked)
void ATVModGUI::on_overlayText_textEdited(const QString& arg1 __attribute__((unused)))
{
m_settings.m_overlayText = arg1;
ATVMod::MsgConfigureOverlayText* message = ATVMod::MsgConfigureOverlayText::create(ui->overlayText->text());
m_atvMod->getInputMessageQueue()->push(message);
applySettings();
}
void ATVModGUI::configureImageFileName()
@ -731,9 +742,7 @@ void ATVModGUI::displaySettings()
ui->uniformLevelText->setText(QString("%1").arg(ui->uniformLevel->value()));
ui->overlayText->setText(m_settings.m_overlayText);
ATVMod::MsgConfigureOverlayText* message = ATVMod::MsgConfigureOverlayText::create(ui->overlayText->text());
m_atvMod->getInputMessageQueue()->push(message);
ui->overlayTextShow->setChecked(m_settings.m_showOverlayText);
blockApplySettings(false);
}

Wyświetl plik

@ -891,6 +891,9 @@ margin-bottom: 20px;
"forceDecimator" : {
"type" : "integer"
},
"showOverlayText" : {
"type" : "integer"
},
"overlayText" : {
"type" : "string"
},
@ -899,6 +902,12 @@ margin-bottom: 20px;
},
"title" : {
"type" : "string"
},
"imageFileName" : {
"type" : "string"
},
"videoFileName" : {
"type" : "string"
}
},
"description" : "ATVMod"
@ -20529,7 +20538,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2018-04-14T22:10:55.895+02:00
Generated 2018-04-15T01:40:30.919+02:00
</div>
</div>
</div>

Wyświetl plik

@ -41,12 +41,18 @@ ATVModSettings:
format: float
forceDecimator:
type: integer
showOverlayText:
type: integer
overlayText:
type: string
rgbColor:
type: integer
title:
type: string
imageFileName:
type: string
videoFileName:
type: string
ATVModReport:
description: ATVMod

Wyświetl plik

@ -41,12 +41,18 @@ ATVModSettings:
format: float
forceDecimator:
type: integer
showOverlayText:
type: integer
overlayText:
type: string
rgbColor:
type: integer
title:
type: string
imageFileName:
type: string
videoFileName:
type: string
ATVModReport:
description: ATVMod

Wyświetl plik

@ -891,6 +891,9 @@ margin-bottom: 20px;
"forceDecimator" : {
"type" : "integer"
},
"showOverlayText" : {
"type" : "integer"
},
"overlayText" : {
"type" : "string"
},
@ -899,6 +902,12 @@ margin-bottom: 20px;
},
"title" : {
"type" : "string"
},
"imageFileName" : {
"type" : "string"
},
"videoFileName" : {
"type" : "string"
}
},
"description" : "ATVMod"
@ -20529,7 +20538,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2018-04-14T22:10:55.895+02:00
Generated 2018-04-15T01:40:30.919+02:00
</div>
</div>
</div>

Wyświetl plik

@ -62,12 +62,18 @@ SWGATVModSettings::SWGATVModSettings() {
m_fm_excursion_isSet = false;
force_decimator = 0;
m_force_decimator_isSet = false;
show_overlay_text = 0;
m_show_overlay_text_isSet = false;
overlay_text = nullptr;
m_overlay_text_isSet = false;
rgb_color = 0;
m_rgb_color_isSet = false;
title = nullptr;
m_title_isSet = false;
image_file_name = nullptr;
m_image_file_name_isSet = false;
video_file_name = nullptr;
m_video_file_name_isSet = false;
}
SWGATVModSettings::~SWGATVModSettings() {
@ -110,12 +116,18 @@ SWGATVModSettings::init() {
m_fm_excursion_isSet = false;
force_decimator = 0;
m_force_decimator_isSet = false;
show_overlay_text = 0;
m_show_overlay_text_isSet = false;
overlay_text = new QString("");
m_overlay_text_isSet = false;
rgb_color = 0;
m_rgb_color_isSet = false;
title = new QString("");
m_title_isSet = false;
image_file_name = new QString("");
m_image_file_name_isSet = false;
video_file_name = new QString("");
m_video_file_name_isSet = false;
}
void
@ -137,6 +149,7 @@ SWGATVModSettings::cleanup() {
if(overlay_text != nullptr) {
delete overlay_text;
}
@ -144,6 +157,12 @@ SWGATVModSettings::cleanup() {
if(title != nullptr) {
delete title;
}
if(image_file_name != nullptr) {
delete image_file_name;
}
if(video_file_name != nullptr) {
delete video_file_name;
}
}
SWGATVModSettings*
@ -191,12 +210,18 @@ SWGATVModSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&force_decimator, pJson["forceDecimator"], "qint32", "");
::SWGSDRangel::setValue(&show_overlay_text, pJson["showOverlayText"], "qint32", "");
::SWGSDRangel::setValue(&overlay_text, pJson["overlayText"], "QString", "QString");
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
::SWGSDRangel::setValue(&image_file_name, pJson["imageFileName"], "QString", "QString");
::SWGSDRangel::setValue(&video_file_name, pJson["videoFileName"], "QString", "QString");
}
QString
@ -264,6 +289,9 @@ SWGATVModSettings::asJsonObject() {
if(m_force_decimator_isSet){
obj->insert("forceDecimator", QJsonValue(force_decimator));
}
if(m_show_overlay_text_isSet){
obj->insert("showOverlayText", QJsonValue(show_overlay_text));
}
if(overlay_text != nullptr && *overlay_text != QString("")){
toJsonValue(QString("overlayText"), overlay_text, obj, QString("QString"));
}
@ -273,6 +301,12 @@ SWGATVModSettings::asJsonObject() {
if(title != nullptr && *title != QString("")){
toJsonValue(QString("title"), title, obj, QString("QString"));
}
if(image_file_name != nullptr && *image_file_name != QString("")){
toJsonValue(QString("imageFileName"), image_file_name, obj, QString("QString"));
}
if(video_file_name != nullptr && *video_file_name != QString("")){
toJsonValue(QString("videoFileName"), video_file_name, obj, QString("QString"));
}
return obj;
}
@ -447,6 +481,16 @@ SWGATVModSettings::setForceDecimator(qint32 force_decimator) {
this->m_force_decimator_isSet = true;
}
qint32
SWGATVModSettings::getShowOverlayText() {
return show_overlay_text;
}
void
SWGATVModSettings::setShowOverlayText(qint32 show_overlay_text) {
this->show_overlay_text = show_overlay_text;
this->m_show_overlay_text_isSet = true;
}
QString*
SWGATVModSettings::getOverlayText() {
return overlay_text;
@ -477,6 +521,26 @@ SWGATVModSettings::setTitle(QString* title) {
this->m_title_isSet = true;
}
QString*
SWGATVModSettings::getImageFileName() {
return image_file_name;
}
void
SWGATVModSettings::setImageFileName(QString* image_file_name) {
this->image_file_name = image_file_name;
this->m_image_file_name_isSet = true;
}
QString*
SWGATVModSettings::getVideoFileName() {
return video_file_name;
}
void
SWGATVModSettings::setVideoFileName(QString* video_file_name) {
this->video_file_name = video_file_name;
this->m_video_file_name_isSet = true;
}
bool
SWGATVModSettings::isSet(){
@ -499,9 +563,12 @@ SWGATVModSettings::isSet(){
if(m_rf_scaling_factor_isSet){ isObjectUpdated = true; break;}
if(m_fm_excursion_isSet){ isObjectUpdated = true; break;}
if(m_force_decimator_isSet){ isObjectUpdated = true; break;}
if(m_show_overlay_text_isSet){ isObjectUpdated = true; break;}
if(overlay_text != nullptr && *overlay_text != QString("")){ isObjectUpdated = true; break;}
if(m_rgb_color_isSet){ isObjectUpdated = true; break;}
if(title != nullptr && *title != QString("")){ isObjectUpdated = true; break;}
if(image_file_name != nullptr && *image_file_name != QString("")){ isObjectUpdated = true; break;}
if(video_file_name != nullptr && *video_file_name != QString("")){ isObjectUpdated = true; break;}
}while(false);
return isObjectUpdated;
}

Wyświetl plik

@ -93,6 +93,9 @@ public:
qint32 getForceDecimator();
void setForceDecimator(qint32 force_decimator);
qint32 getShowOverlayText();
void setShowOverlayText(qint32 show_overlay_text);
QString* getOverlayText();
void setOverlayText(QString* overlay_text);
@ -102,6 +105,12 @@ public:
QString* getTitle();
void setTitle(QString* title);
QString* getImageFileName();
void setImageFileName(QString* image_file_name);
QString* getVideoFileName();
void setVideoFileName(QString* video_file_name);
virtual bool isSet() override;
@ -157,6 +166,9 @@ private:
qint32 force_decimator;
bool m_force_decimator_isSet;
qint32 show_overlay_text;
bool m_show_overlay_text_isSet;
QString* overlay_text;
bool m_overlay_text_isSet;
@ -166,6 +178,12 @@ private:
QString* title;
bool m_title_isSet;
QString* image_file_name;
bool m_image_file_name_isSet;
QString* video_file_name;
bool m_video_file_name_isSet;
};
}

Wyświetl plik

@ -171,14 +171,16 @@ def setupChannel(options):
settings["ATVModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["ATVModSettings"]["rfBandwidth"] = 30000
settings["ATVModSettings"]["forceDecimator"] = 1 # This is to engage filter
settings["ATVModSettings"]["imageFileName"] = "/home/f4exb/sdrangel/lena_4.3.png"
settings["ATVModSettings"]["atvStd"] = 5 # ATVStdHSkip
settings["ATVModSettings"]["atvModInput"] = 1 # ATVModInputHBars
settings["ATVModSettings"]["atvModInput"] = 6 # ATVModInputImage
settings["ATVModSettings"]["atvModulation"] = 1 # ATVModulationFM
settings["ATVModSettings"]["fps"] = 2
settings["ATVModSettings"]["nbLines"] = 90
settings["ATVModSettings"]["uniformLevel"] = 1.0 # 100% white
settings["ATVModSettings"]["fmExcursion"] = 0.2 # FM excursion is 20% of channel bandwidth
settings["ATVModSettings"]["overlayText"] = "F4EXB"
settings["ATVModSettings"]["showOverlayText"] = 1
elif options.channel_id == "SSBMod":
settings["SSBModSettings"]["title"] = "Test SSB"
settings["SSBModSettings"]["inputFrequencyOffset"] = options.channel_freq