New AMBE engine (3)

pull/398/head
f4exb 2019-07-20 23:25:00 +02:00
rodzic f04b6eb975
commit 144b0db196
19 zmienionych plików z 133 dodań i 147 usunięć

Wyświetl plik

@ -33,7 +33,12 @@
#endif
#endif
#include <chrono>
#include <thread>
#include <QThread>
#include <QBuffer>
#include <QDataStream>
#include "ambeworker.h"
#include "ambeengine.h"
@ -42,10 +47,12 @@ AMBEEngine::AMBEEngine()
{}
AMBEEngine::~AMBEEngine()
{}
{
qDebug("AMBEEngine::~AMBEEngine: %lu controllers", m_controllers.size());
}
#ifdef __WINDOWS__
void DVSerialEngine::getComList()
void AMBEEngine::getComList()
{
m_comList.clear();
m_comList8250.clear();
@ -100,8 +107,8 @@ void AMBEEngine::getComList()
#ifndef __WINDOWS__
void AMBEEngine::register_comport(
std::list<std::string>& comList,
std::list<std::string>& comList8250,
std::vector<std::string>& comList,
std::vector<std::string>& comList8250,
const std::string& dir)
{
// Get the driver the device is using
@ -123,11 +130,11 @@ void AMBEEngine::register_comport(
}
void AMBEEngine::probe_serial8250_comports(
std::list<std::string>& comList,
std::list<std::string> comList8250)
std::vector<std::string>& comList,
std::vector<std::string> comList8250)
{
struct serial_struct serinfo;
std::list<std::string>::iterator it = comList8250.begin();
std::vector<std::string>::iterator it = comList8250.begin();
// Iterate over all serial8250-devices
while (it != comList8250.end())
@ -177,16 +184,17 @@ std::string AMBEEngine::get_driver(const std::string& tty)
}
#endif // not Windows
bool AMBEEngine::scan(std::vector<QString>& ambeDevices)
void AMBEEngine::scan(std::vector<QString>& ambeDevices)
{
getComList();
std::list<std::string>::const_iterator it = m_comList.begin();
std::vector<std::string>::const_iterator it = m_comList.begin();
ambeDevices.clear();
while (it != m_comList.end())
{
AMBEWorker *worker = new AMBEWorker();
qDebug("AMBEEngine::scan: com: %s", it->c_str());
if (worker->open(*it))
{
ambeDevices.push_back(QString(it->c_str()));
@ -214,6 +222,7 @@ bool AMBEEngine::registerController(const std::string& deviceRef)
connect(m_controllers.back().worker, SIGNAL(finished()), m_controllers.back().worker, SLOT(deleteLater()));
connect(m_controllers.back().thread, SIGNAL(finished()), m_controllers.back().thread, SLOT(deleteLater()));
connect(&m_controllers.back().worker->m_inputMessageQueue, SIGNAL(messageEnqueued()), m_controllers.back().worker, SLOT(handleInputMessages()));
std::this_thread::sleep_for(std::chrono::seconds(1));
m_controllers.back().thread->start();
return true;
@ -224,7 +233,6 @@ bool AMBEEngine::registerController(const std::string& deviceRef)
void AMBEEngine::releaseController(const std::string& deviceRef)
{
qDebug("AMBEEngine::releaseController");
std::vector<AMBEController>::iterator it = m_controllers.begin();
while (it != m_controllers.end())
@ -237,7 +245,7 @@ void AMBEEngine::releaseController(const std::string& deviceRef)
it->worker->m_inputMessageQueue.clear();
it->worker->close();
m_controllers.erase(it);
qDebug() << "DVSerialEngine::releaseController: closed device at: " << it->device.c_str();
qDebug() << "AMBEEngine::releaseController: closed device at: " << it->device.c_str();
break;
}
@ -247,7 +255,6 @@ void AMBEEngine::releaseController(const std::string& deviceRef)
void AMBEEngine::releaseAll()
{
qDebug("AMBEEngine::releaseAll");
std::vector<AMBEController>::iterator it = m_controllers.begin();
while (it != m_controllers.end())
@ -257,7 +264,7 @@ void AMBEEngine::releaseAll()
it->thread->wait(100);
it->worker->m_inputMessageQueue.clear();
it->worker->close();
qDebug() << "DVSerialEngine::release: closed device at: " << it->device.c_str();
qDebug() << "AMBEEngine::release: closed device at: " << it->device.c_str();
++it;
}
@ -319,3 +326,47 @@ void AMBEEngine::pushMbeFrame(
}
}
}
QByteArray AMBEEngine::serialize() const
{
QStringList qDeviceList;
std::vector<AMBEController>::const_iterator it = m_controllers.begin();
while (it != m_controllers.end())
{
qDebug("AMBEEngine::serialize: %s", it->device.c_str());
qDeviceList << QString(it->device.c_str());
++it;
}
QByteArray data;
QDataStream *stream = new QDataStream(&data, QIODevice::WriteOnly);
(*stream) << qDeviceList;
delete stream;
return data;
}
bool AMBEEngine::deserialize(const QByteArray& data)
{
if (data.size() <= 0)
{
qDebug("AMBEEngine::deserialize: invalid or no data");
return false;
}
QStringList qDeviceList;
QDataStream *stream = new QDataStream(data);
(*stream) >> qDeviceList;
delete stream;
releaseAll();
for (int i = 0; i < qDeviceList.size(); ++i)
{
qDebug(" AMBEEngine::deserialize: %s", qDeviceList.at(i).toStdString().c_str());
registerController(qDeviceList.at(i).toStdString());
}
return true;
}

Wyświetl plik

@ -21,11 +21,11 @@
#include <vector>
#include <string>
#include <list>
#include <QObject>
#include <QMutex>
#include <QString>
#include <QByteArray>
#include "export.h"
@ -40,7 +40,7 @@ public:
AMBEEngine();
~AMBEEngine();
bool scan(std::vector<QString>& ambeDevices);
void scan(std::vector<QString>& ambeDevices);
void releaseAll();
int getNbDevices() const { return m_controllers.size(); } //!< number of devices used
@ -57,9 +57,17 @@ public:
int upsampling,
AudioFifo *audioFifo);
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
private:
struct AMBEController
{
AMBEController() :
thread(nullptr),
worker(nullptr)
{}
QThread *thread;
AMBEWorker *worker;
std::string device;
@ -67,14 +75,14 @@ private:
#ifndef __WINDOWS__
static std::string get_driver(const std::string& tty);
static void register_comport(std::list<std::string>& comList, std::list<std::string>& comList8250, const std::string& dir);
static void probe_serial8250_comports(std::list<std::string>& comList, std::list<std::string> comList8250);
static void register_comport(std::vector<std::string>& comList, std::vector<std::string>& comList8250, const std::string& dir);
static void probe_serial8250_comports(std::vector<std::string>& comList, std::vector<std::string> comList8250);
#endif
void getComList();
std::list<std::string> m_comList;
std::list<std::string> m_comList8250;
std::vector<AMBEController> m_controllers;
std::vector<std::string> m_comList;
std::vector<std::string> m_comList8250;
QMutex m_mutex;
};

Wyświetl plik

@ -200,7 +200,7 @@ void AMBEWorker::noUpsample(short *in, int nbSamplesIn, unsigned char channels)
}
else
{
qDebug("DVSerialWorker::noUpsample: audio buffer is full check its size");
qDebug("AMBEWorker::noUpsample: audio buffer is full check its size");
}
}
}

Wyświetl plik

@ -155,44 +155,25 @@ DSPDeviceMIMOEngine *DSPEngine::getDeviceMIMOEngineByUID(uint uid)
return nullptr;
}
#ifdef DSD_USE_SERIALDV
void DSPEngine::setDVSerialSupport(bool support)
{
if (support)
{
m_dvSerialSupport = m_dvSerialEngine.scan();
}
else
{
m_dvSerialEngine.release();
m_dvSerialSupport = false;
}
}
#else
void DSPEngine::setDVSerialSupport(bool support)
{ (void) support; }
#endif
bool DSPEngine::hasDVSerialSupport()
{
#ifdef DSD_USE_SERIALDV
return m_dvSerialSupport;
#else
return false;
#endif
return m_ambeEngine.getNbDevices() > 0;
}
#ifdef DSD_USE_SERIALDV
void DSPEngine::setDVSerialSupport(bool support)
{ (void) support; }
void DSPEngine::getDVSerialNames(std::vector<std::string>& deviceNames)
{
m_dvSerialEngine.getDevicesNames(deviceNames);
}
#else
void DSPEngine::getDVSerialNames(std::vector<std::string>& deviceNames)
{ (void) deviceNames; }
#endif
std::vector<QString> qDeviceRefs;
m_ambeEngine.getDeviceRefs(qDeviceRefs);
deviceNames.clear();
for (std::vector<QString>::const_iterator it = qDeviceRefs.begin(); it != qDeviceRefs.end(); ++it) {
deviceNames.push_back(it->toStdString());
}
}
#ifdef DSD_USE_SERIALDV
void DSPEngine::pushMbeFrame(
const unsigned char *mbeFrame,
int mbeRateIndex,
@ -202,24 +183,5 @@ void DSPEngine::pushMbeFrame(
int upsampling,
AudioFifo *audioFifo)
{
m_dvSerialEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, useHP, upsampling, audioFifo);
m_ambeEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, useHP, upsampling, audioFifo);
}
#else
void DSPEngine::pushMbeFrame(
const unsigned char *mbeFrame,
int mbeRateIndex,
int mbeVolumeIndex,
unsigned char channels,
bool useHP,
int upsampling,
AudioFifo *audioFifo)
{
(void) mbeFrame;
(void) mbeRateIndex;
(void) mbeVolumeIndex;
(void) channels;
(void) useHP;
(void) upsampling;
(void) audioFifo;
}
#endif

Wyświetl plik

@ -27,9 +27,6 @@
#include "audio/audiooutput.h"
#include "audio/audioinput.h"
#include "export.h"
#ifdef DSD_USE_SERIALDV
#include "dsp/dvserialengine.h"
#endif
#include "ambe/ambeengine.h"
class DSPDeviceSourceEngine;
@ -56,6 +53,7 @@ public:
void removeLastDeviceMIMOEngine();
AudioDeviceManager *getAudioDeviceManager() { return &m_audioDeviceManager; }
AMBEEngine *getAMBEEngine() { return &m_ambeEngine; }
uint32_t getDeviceSourceEnginesNumber() const { return m_deviceSourceEngines.size(); }
DSPDeviceSourceEngine *getDeviceSourceEngineByIndex(uint deviceIndex) { return m_deviceSourceEngines[deviceIndex]; }
@ -82,7 +80,6 @@ public:
bool useHP,
int upsampling,
AudioFifo *audioFifo);
AMBEEngine& getAMBEEngine() { return m_ambeEngine; }
const QTimer& getMasterTimer() const { return m_masterTimer; }
void setMIMOSupport(bool mimoSupport) { m_mimoSupport = mimoSupport; }
@ -101,9 +98,6 @@ private:
QTimer m_masterTimer;
bool m_dvSerialSupport;
bool m_mimoSupport;
#ifdef DSD_USE_SERIALDV
DVSerialEngine m_dvSerialEngine;
#endif
AMBEEngine m_ambeEngine;
};

Wyświetl plik

@ -707,7 +707,7 @@ margin-bottom: 20px;
"description" : "1 if device is to be removed from active list"
}
},
"description" : "AMBE devices actibe in the system"
"description" : "AMBE devices active in the system"
};
defs.AMBEDevices = {
"required" : [ "nbDevices" ],
@ -27046,7 +27046,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2019-07-19T18:33:26.198+02:00
Generated 2019-07-20T20:43:22.760+02:00
</div>
</div>
</div>

Wyświetl plik

@ -1767,7 +1767,7 @@ definitions:
$ref: "#/definitions/AMBEDevice"
AMBEDevice:
description: "AMBE devices actibe in the system"
description: "AMBE devices active in the system"
properties:
deviceRef:
description: "Serial device name or server address"

Wyświetl plik

@ -3,8 +3,12 @@
#include "settings/mainsettings.h"
#include "commands/command.h"
#include "audio/audiodevicemanager.h"
#include "ambe/ambeengine.h"
MainSettings::MainSettings() : m_audioDeviceManager(0)
MainSettings::MainSettings() :
m_audioDeviceManager(nullptr),
m_ambeEngine(nullptr)
{
resetToDefaults();
qInfo("MainSettings::MainSettings: settings file: format: %d location: %s", getFileFormat(), qPrintable(getFileLocation()));
@ -42,11 +46,14 @@ void MainSettings::load()
m_preferences.deserialize(qUncompress(QByteArray::fromBase64(s.value("preferences").toByteArray())));
m_workingPreset.deserialize(qUncompress(QByteArray::fromBase64(s.value("current").toByteArray())));
if (m_audioDeviceManager)
{
if (m_audioDeviceManager) {
m_audioDeviceManager->deserialize(qUncompress(QByteArray::fromBase64(s.value("audio").toByteArray())));
}
if (m_ambeEngine) {
m_ambeEngine->deserialize(qUncompress(QByteArray::fromBase64(s.value("ambe").toByteArray())));
}
QStringList groups = s.childGroups();
for(int i = 0; i < groups.size(); ++i)
@ -95,11 +102,14 @@ void MainSettings::save() const
s.setValue("preferences", qCompress(m_preferences.serialize()).toBase64());
s.setValue("current", qCompress(m_workingPreset.serialize()).toBase64());
if (m_audioDeviceManager)
{
if (m_audioDeviceManager) {
s.setValue("audio", qCompress(m_audioDeviceManager->serialize()).toBase64());
}
if (m_ambeEngine) {
s.setValue("ambe", qCompress(m_ambeEngine->serialize()).toBase64());
}
QStringList groups = s.childGroups();
for(int i = 0; i < groups.size(); ++i)

Wyświetl plik

@ -2,13 +2,14 @@
#define INCLUDE_SETTINGS_H
#include <QString>
#include "audio/audiodevicemanager.h"
#include "device/deviceuserargs.h"
#include "preferences.h"
#include "preset.h"
#include "export.h"
class Command;
class AudioDeviceManager;
class AMBEEngine;
class SDRBASE_API MainSettings {
public:
@ -63,6 +64,7 @@ public:
const AudioDeviceManager *getAudioDeviceManager() const { return m_audioDeviceManager; }
void setAudioDeviceManager(AudioDeviceManager *audioDeviceManager) { m_audioDeviceManager = audioDeviceManager; }
void setAMBEEngine(AMBEEngine *ambeEngine) { m_ambeEngine = ambeEngine; }
protected:
Preferences m_preferences;
@ -73,6 +75,7 @@ protected:
typedef QList<Command*> Commands;
Commands m_commands;
DeviceUserArgs m_hardwareDeviceUserArgs;
AMBEEngine *m_ambeEngine;
};
#endif // INCLUDE_SETTINGS_H

Wyświetl plik

@ -24,7 +24,7 @@
ParserBench::ParserBench() :
m_testOption(QStringList() << "t" << "test",
"Test type.",
"Test type: decimateii, decimatefi, decimateff, decimateif, decimateinfii, decimatesupii, ambe",
"test",
"decimateii"),
m_nbSamplesOption(QStringList() << "n" << "nb-samples",

Wyświetl plik

@ -22,7 +22,7 @@
#include "ambedevicesdialog.h"
#include "ui_ambedevicesdialog.h"
AMBEDevicesDialog::AMBEDevicesDialog(AMBEEngine& ambeEngine, QWidget* parent) :
AMBEDevicesDialog::AMBEDevicesDialog(AMBEEngine* ambeEngine, QWidget* parent) :
QDialog(parent),
ui(new Ui::AMBEDevicesDialog),
m_ambeEngine(ambeEngine)
@ -40,7 +40,7 @@ AMBEDevicesDialog::~AMBEDevicesDialog()
void AMBEDevicesDialog::populateSerialList()
{
std::vector<QString> ambeSerialDevices;
m_ambeEngine.scan(ambeSerialDevices);
m_ambeEngine->scan(ambeSerialDevices);
ui->ambeSerialDevices->clear();
std::vector<QString>::const_iterator it = ambeSerialDevices.begin();
@ -53,7 +53,7 @@ void AMBEDevicesDialog::populateSerialList()
void AMBEDevicesDialog::refreshInUseList()
{
std::vector<QString> inUseDevices;
m_ambeEngine.getDeviceRefs(inUseDevices);
m_ambeEngine->getDeviceRefs(inUseDevices);
ui->ambeDeviceRefs->clear();
std::vector<QString>::const_iterator it = inUseDevices.begin();
@ -80,7 +80,7 @@ void AMBEDevicesDialog::on_importSerial_clicked(bool checked)
if (foundItems.size() == 0)
{
if (m_ambeEngine.registerController(serialName.toStdString()))
if (m_ambeEngine->registerController(serialName.toStdString()))
{
ui->ambeDeviceRefs->addItem(serialName);
ui->statusText->setText(tr("%1 added").arg(serialName));
@ -109,7 +109,7 @@ void AMBEDevicesDialog::on_importAllSerial_clicked(bool checked)
if (foundItems.size() == 0)
{
if (m_ambeEngine.registerController(serialName.toStdString()))
if (m_ambeEngine->registerController(serialName.toStdString()))
{
ui->ambeDeviceRefs->addItem(serialName);
count++;
@ -132,7 +132,7 @@ void AMBEDevicesDialog::on_removeAmbeDevice_clicked(bool checked)
}
QString deviceName = deviceItem->text();
m_ambeEngine.releaseController(deviceName.toStdString());
m_ambeEngine->releaseController(deviceName.toStdString());
ui->statusText->setText(tr("%1 removed").arg(deviceName));
refreshInUseList();
}
@ -151,7 +151,7 @@ void AMBEDevicesDialog::on_clearAmbeList_clicked(bool checked)
return;
}
m_ambeEngine.releaseAll();
m_ambeEngine->releaseAll();
ui->ambeDeviceRefs->clear();
ui->statusText->setText("All items released");
}
@ -164,7 +164,7 @@ void AMBEDevicesDialog::on_importAddress_clicked(bool checked)
if (foundItems.size() == 0)
{
if (m_ambeEngine.registerController(addressAndPort.toStdString()))
if (m_ambeEngine->registerController(addressAndPort.toStdString()))
{
ui->ambeDeviceRefs->addItem(addressAndPort);
ui->statusText->setText(tr("%1 added").arg(addressAndPort));

Wyświetl plik

@ -34,7 +34,7 @@ class SDRGUI_API AMBEDevicesDialog : public QDialog {
Q_OBJECT
public:
explicit AMBEDevicesDialog(AMBEEngine& ambeEngine, QWidget* parent = nullptr);
explicit AMBEDevicesDialog(AMBEEngine* ambeEngine, QWidget* parent = nullptr);
~AMBEDevicesDialog();
private:
@ -42,7 +42,7 @@ private:
void refreshInUseList();
Ui::AMBEDevicesDialog* ui;
AMBEEngine& m_ambeEngine;
AMBEEngine* m_ambeEngine;
private slots:
void on_importSerial_clicked(bool checked);

Wyświetl plik

@ -123,6 +123,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
splash->showStatusMessage("starting...", Qt::white);
m_settings.setAudioDeviceManager(m_dspEngine->getAudioDeviceManager());
m_settings.setAMBEEngine(m_dspEngine->getAMBEEngine());
ui->setupUi(this);
createStatusBar();
@ -1628,48 +1629,6 @@ void MainWindow::on_action_AMBE_triggered()
ambeDevicesDialog.exec();
}
void MainWindow::on_action_DV_Serial_triggered(bool checked)
{
m_dspEngine->setDVSerialSupport(checked);
if (checked)
{
if (m_dspEngine->hasDVSerialSupport())
{
std::vector<std::string> deviceNames;
m_dspEngine->getDVSerialNames(deviceNames);
if (deviceNames.size() == 0)
{
QMessageBox::information(this, tr("Message"), tr("No DV serial devices found"));
qDebug("MainWindow::on_action_DV_Serial_triggered: No DV serial devices found");
}
else
{
std::vector<std::string>::iterator it = deviceNames.begin();
std::string deviceNamesStr = "DV Serial devices found: ";
while (it != deviceNames.end())
{
if (it != deviceNames.begin()) {
deviceNamesStr += ",";
}
deviceNamesStr += *it;
++it;
}
QMessageBox::information(this, tr("Message"), tr(deviceNamesStr.c_str()));
}
}
else
{
QMessageBox::information(this, tr("Message"), tr("No DV serial support"));
qDebug("MainWindow::on_action_DV_Serial_triggered: No DV serial support");
}
}
}
void MainWindow::sampleSourceChanged()
{
// Do it in the currently selected source tab

Wyświetl plik

@ -380,7 +380,6 @@ private slots:
void on_action_Audio_triggered();
void on_action_Logging_triggered();
void on_action_AMBE_triggered();
void on_action_DV_Serial_triggered(bool checked);
void on_action_My_Position_triggered();
void on_action_DeviceUserArguments_triggered();
void sampleSourceChanged();

Wyświetl plik

@ -64,7 +64,7 @@
<x>0</x>
<y>0</y>
<width>1012</width>
<height>19</height>
<height>20</height>
</rect>
</property>
<widget class="QMenu" name="menu_File">
@ -126,7 +126,6 @@
<addaction name="action_Audio"/>
<addaction name="action_Logging"/>
<addaction name="action_AMBE"/>
<addaction name="action_DV_Serial"/>
<addaction name="action_My_Position"/>
<addaction name="menuDevices"/>
</widget>

Wyświetl plik

@ -59,6 +59,7 @@ MainCore::MainCore(qtwebapp::LoggerWithFile *logger, const MainParser& parser, Q
m_instance = this;
m_settings.setAudioDeviceManager(m_dspEngine->getAudioDeviceManager());
m_settings.setAMBEEngine(m_dspEngine->getAMBEEngine());
m_pluginManager = new PluginManager(this);
m_pluginManager->loadPlugins(QString("pluginssrv"));

Wyświetl plik

@ -1767,7 +1767,7 @@ definitions:
$ref: "#/definitions/AMBEDevice"
AMBEDevice:
description: "AMBE devices actibe in the system"
description: "AMBE devices active in the system"
properties:
deviceRef:
description: "Serial device name or server address"

Wyświetl plik

@ -707,7 +707,7 @@ margin-bottom: 20px;
"description" : "1 if device is to be removed from active list"
}
},
"description" : "AMBE devices actibe in the system"
"description" : "AMBE devices active in the system"
};
defs.AMBEDevices = {
"required" : [ "nbDevices" ],
@ -27046,7 +27046,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2019-07-19T18:33:26.198+02:00
Generated 2019-07-20T20:43:22.760+02:00
</div>
</div>
</div>

Wyświetl plik

@ -13,7 +13,7 @@
/*
* SWGAMBEDevice.h
*
* AMBE devices actibe in the system
* AMBE devices active in the system
*/
#ifndef SWGAMBEDevice_H_