Add backup/restore of button config

qcpfix
Phil Taylor 2023-03-29 23:33:18 +01:00
rodzic 468cd2de0d
commit 0304ac67f6
6 zmienionych plików z 284 dodań i 36 usunięć

Wyświetl plik

@ -321,14 +321,18 @@ void controllerSetup::removeDevice(USBDEVICE* dev)
for (int i = 0; i < ui->tabWidget->count(); i++) {
auto widget = ui->tabWidget->widget(i);
if (widget->objectName() == dev->path) {
qInfo(logUsbControl()) << "Removing child widgets for" << dev->product;
qDeleteAll(widget->findChildren<QWidget *>("", Qt::FindDirectChildrenOnly));
remove = i;
//break;
}
}
if (remove != -1) {
qInfo(logUsbControl()) << "Removing tab" << dev->product;
//auto widget = ui->tabWidget->widget(remove);
ui->tabWidget->removeTab(remove);
//widget->deleteLater();
}
if (ui->tabWidget->count() == 0)
{
@ -347,6 +351,14 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVector<BUTTO
QMutexLocker locker(mutex);
for (int i=0; i<ui->tabWidget->count();i++) {
if (ui->tabWidget->widget(i)->objectName() == dev->path)
{
qInfo(logUsbControl()) <<"Tab for " << dev->product << "("<< dev->path << ") Already exists!";
return;
}
}
qDebug(logUsbControl()) << "Adding new tab for" << dev->product;
noControllersText->hide();
@ -594,6 +606,8 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVector<BUTTO
numTabs++;
dev->uiCreated = true;
// Finally update the device with the default values
emit sendRequest(dev,usbFeatureType::featureSensitivity,cntrl->sensitivity);
emit sendRequest(dev,usbFeatureType::featureBrightness,cntrl->brightness);
@ -739,12 +753,37 @@ void controllerSetup::disableClicked(USBDEVICE* dev, bool clicked, QWidget* widg
void controllerSetup::setConnected(USBDEVICE* dev)
{
if (dev->connected)
QMutexLocker locker(mutex);
if (dev->uiCreated)
{
dev->message->setStyleSheet("QLabel { color : green; }");
dev->message->setText("Connected");
} else {
dev->message->setStyleSheet("QLabel { color : red; }");
dev->message->setText("Not Connected");
if (dev->connected)
{
dev->message->setStyleSheet("QLabel { color : green; }");
dev->message->setText("Connected");
} else {
dev->message->setStyleSheet("QLabel { color : red; }");
dev->message->setText("Not Connected");
}
}
}
void controllerSetup::on_backupButton_clicked()
{
QString file = QFileDialog::getSaveFileName(this,"Select Backup Filename",".","Backup Files (*.ini)");
if (!file.isEmpty()) {
QFileInfo info = QFileInfo(file);
emit backup(file, ui->tabWidget->currentWidget()->objectName());
}
}
void controllerSetup::on_restoreButton_clicked()
{
QString file = QFileDialog::getOpenFileName(this,"Select Backup Filename",".","Backup Files (*.ini)");
if (!file.isEmpty()) {
QFileInfo info = QFileInfo(file);
emit restore(file, ui->tabWidget->currentWidget()->objectName());
}
}

Wyświetl plik

@ -20,6 +20,7 @@
#include <QScopedPointer>
#include <QCheckBox>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>
#include <QObject>
@ -69,6 +70,8 @@ signals:
void sendRequest(USBDEVICE* dev, usbFeatureType request, quint8 val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR);
void programDisable(USBDEVICE* dev, bool disable);
void programPages(USBDEVICE* dev, int pages);
void backup(QString file, QString path);
void restore(QString file, QString path);
public slots:
void init();
@ -95,7 +98,8 @@ public slots:
void setConnected(USBDEVICE* dev);
void hideEvent(QHideEvent *event);
void on_tabWidget_currentChanged(int index);
void on_backupButton_clicked();
void on_restoreButton_clicked();
private:

Wyświetl plik

@ -14,6 +14,26 @@
<string>Controller setup</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Tab 1</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Tab 2</string>
</attribute>
</widget>
</widget>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout">
<property name="spacing">
@ -31,6 +51,20 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="backupButton">
<property name="text">
<string>Backup</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="restoreButton">
<property name="text">
<string>Restore</string>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
@ -60,26 +94,6 @@
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Tab 1</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Tab 2</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>

Wyświetl plik

@ -262,12 +262,13 @@ void usbController::run()
#endif
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
//#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
auto it = usbDevices.begin();
while (it != usbDevices.end())
{
if (it.value().remove)
{
qInfo(logUsbControl()) << "Device has been removed, deleting from known devices" << it.value().product;
it = usbDevices.erase(it);
}
else
@ -275,11 +276,11 @@ void usbController::run()
++it;
}
}
#else
//#else
// Remove any devices from the list that are not connected (doesn't work on QT5!)
usbDevices.erase(std::remove_if(usbDevices.begin(), usbDevices.end(), [](const USBDEVICE& dev)
{ if (dev.remove) qInfo(logUsbControl()) << "Removing device" << dev.product; return (dev.remove); }),usbDevices.end());
#endif
// usbDevices.erase(std::remove_if(usbDevices.begin(), usbDevices.end(), [](const USBDEVICE& dev)
// { if (dev.remove) qInfo(logUsbControl()) << "Removing device" << dev.product; return (dev.remove); }),usbDevices.end());
//#endif
struct hid_device_info* devs;
devs = hid_enumerate(0x0, 0x0);
// Step through all currenly connected devices and add any newly discovered ones to usbDevices.
@ -302,6 +303,7 @@ void usbController::run()
newDev.serial = QString::fromWCharArray(devs->serial_number);
newDev.path = QString::fromLocal8Bit(devs->path);
newDev.deviceId = QString("0x%1").arg(newDev.type.productId, 4, 16, QChar('0'));
qDebug(logUsbControl()) << "New device detected" << newDev.product;
usbDevices.insert(newDev.path,newDev);
}
devs = devs->next;
@ -385,6 +387,8 @@ void usbController::run()
buttonList->append(BUTTON(*but));
}
}
} else {
qInfo(logUsbControl()) << "Found buttons for this device, loading.";
}
// We need to set the parent device for all buttons belonging to this device!
@ -402,7 +406,7 @@ void usbController::run()
if (boff != commands.end())
but->offCommand = new COMMAND(*boff);
else
qWarning(logUsbControl()) << "Off Command" << but->on << "not found";
qWarning(logUsbControl()) << "Off Command" << but->off << "not found";
but->parent = &dev;
}
@ -434,15 +438,14 @@ void usbController::run()
qWarning(logUsbControl()) << "Knob Command" << kb->cmd << "not found";
kb->parent = &dev;
if (dev.currentPage == 1)
if (kb->page == 1)
dev.knobValues[kb->num].name = kb->cmd;
}
}
// Let the UI know we have a new controller
emit newDevice(&dev, &(*controllers)[dev.path],buttonList, knobList, &commands, mutex);
dev.uiCreated = true;
}
}
else if (dev.uiCreated)
@ -493,6 +496,7 @@ void usbController::runTimer()
dev.connected = false;
dev.remove = true;
devicesConnected--;
QTimer::singleShot(250, this, SLOT(run())); // Cleanup
break;
}
@ -1822,4 +1826,185 @@ void usbController::receiveLevel(cmds cmd, unsigned char level)
}
}
void usbController::backupController(QString file, QString path)
{
QSettings settings = QSettings(file, QSettings::Format::IniFormat);
qInfo(logUsbControl()) << "Backup of" << path << "to" << file;
settings.beginGroup("Controller");
QMutexLocker locker(mutex);
CONTROLLER cntrl = (*controllers)[path];
settings.setValue("Disabled", cntrl.disabled);
settings.setValue("Sensitivity", cntrl.sensitivity);
settings.setValue("Brightness", cntrl.brightness);
settings.setValue("Orientation", cntrl.orientation);
settings.setValue("Speed", cntrl.speed);
settings.setValue("Timeout", cntrl.timeout);
settings.setValue("Pages", cntrl.pages);
settings.setValue("Color", cntrl.color.name(QColor::HexArgb));
settings.setValue("LCD", cntrl.lcd);
int n=0;
settings.beginWriteArray("Buttons");
for (auto b = buttonList->begin(); b != buttonList->end(); b++)
{
if (b->path == path)
{
settings.setArrayIndex(n);
settings.setValue("Page", b->page);
settings.setValue("Dev", b->dev);
settings.setValue("Num", b->num);
settings.setValue("Name", b->name);
settings.setValue("Left", b->pos.left());
settings.setValue("Top", b->pos.top());
settings.setValue("Width", b->pos.width());
settings.setValue("Height", b->pos.height());
settings.setValue("Colour", b->textColour.name(QColor::HexArgb));
settings.setValue("BackgroundOn", b->backgroundOn.name(QColor::HexArgb));
settings.setValue("BackgroundOff", b->backgroundOff.name(QColor::HexArgb));
if (b->icon != Q_NULLPTR) {
settings.setValue("Icon", *b->icon);
settings.setValue("IconName", b->iconName);
}
settings.setValue("Toggle", b->toggle);
if (b->onCommand != Q_NULLPTR)
settings.setValue("OnCommand", b->onCommand->text);
if (b->offCommand != Q_NULLPTR)
settings.setValue("OffCommand", b->offCommand->text);
++n;
}
}
settings.endArray();
n = 0;
settings.beginWriteArray("Knobs");
for (auto k = knobList->begin(); k != knobList->end(); k++)
{
if (k->path == path)
{
settings.setArrayIndex(n);
settings.setValue("Page", k->page);
settings.setValue("Dev", k->dev);
settings.setValue("Num", k->num);
settings.setValue("Left", k->pos.left());
settings.setValue("Top", k->pos.top());
settings.setValue("Width", k->pos.width());
settings.setValue("Height", k->pos.height());
settings.setValue("Colour", k->textColour.name());
if (k->command != Q_NULLPTR)
settings.setValue("Command", k->command->text);
++n;
}
}
settings.endArray();
settings.endGroup();
settings.sync();
}
void usbController::restoreController(QString file, QString path)
{
CONTROLLER cntrl = (*controllers)[path];
USBDEVICE* dev = &usbDevices[path];
QSettings settings = QSettings(file, QSettings::Format::IniFormat);
qInfo(logUsbControl()) << "Restore of" << path << "from" << file;
settings.beginGroup("Controller");
emit removeDevice(dev);
QMutexLocker locker(mutex);
// Remove buttons/knobs
buttonList->erase(std::remove_if(buttonList->begin(), buttonList->end(), [path](const BUTTON& b)
{ return (b.path == path); }),buttonList->end());
cntrl.disabled = settings.value("Disabled", false).toBool();
cntrl.sensitivity = settings.value("Sensitivity", 1).toInt();
cntrl.pages = settings.value("Pages", 1).toInt();
cntrl.brightness = (quint8)settings.value("Brightness", 2).toInt();
cntrl.orientation = (quint8)settings.value("Orientation", 2).toInt();
cntrl.speed = (quint8)settings.value("Speed", 2).toInt();
cntrl.timeout = (quint8)settings.value("Timeout", 30).toInt();
cntrl.color.setNamedColor(settings.value("Color", QColor(Qt::white).name(QColor::HexArgb)).toString());
cntrl.lcd = (cmds)settings.value("LCD",0).toInt();
int numButtons = settings.beginReadArray("Buttons");
if (numButtons == 0) {
settings.endArray();
}
else {
for (int b = 0; b < numButtons; b++)
{
settings.setArrayIndex(b);
BUTTON but;
but.page = settings.value("Page", 1).toInt();
but.dev = (usbDeviceType)settings.value("Dev", 0).toInt();
but.num = settings.value("Num", 0).toInt();
but.name = settings.value("Name", "").toString();
but.pos = QRect(settings.value("Left", 0).toInt(),
settings.value("Top", 0).toInt(),
settings.value("Width", 0).toInt(),
settings.value("Height", 0).toInt());
but.textColour.setNamedColor(settings.value("Colour", QColor(Qt::white).name(QColor::HexArgb)).toString());
but.backgroundOn.setNamedColor(settings.value("BackgroundOn", QColor(Qt::lightGray).name(QColor::HexArgb)).toString());
but.backgroundOff.setNamedColor(settings.value("BackgroundOff", QColor(Qt::blue).name(QColor::HexArgb)).toString());
but.toggle = settings.value("Toggle", false).toBool();
if (settings.value("Icon",NULL) != NULL) {
but.icon = new QImage(settings.value("Icon",NULL).value<QImage>());
but.iconName = settings.value("IconName", "").toString();
}
but.on = settings.value("OnCommand", "None").toString();
but.off = settings.value("OffCommand", "None").toString();
but.path = path;
buttonList->append(but);
}
settings.endArray();
}
knobList->erase(std::remove_if(knobList->begin(), knobList->end(), [path](const KNOB& k)
{ return (k.path == path); }),knobList->end());
int numKnobs = settings.beginReadArray("Knobs");
if (numKnobs == 0) {
settings.endArray();
}
else {
for (int k = 0; k < numKnobs; k++)
{
settings.setArrayIndex(k);
KNOB kb;
kb.page = settings.value("Page", 1).toInt();
kb.dev = (usbDeviceType)settings.value("Dev", 0).toInt();
kb.num = settings.value("Num", 0).toInt();
kb.name = settings.value("Name", "").toString();
kb.pos = QRect(settings.value("Left", 0).toInt(),
settings.value("Top", 0).toInt(),
settings.value("Width", 0).toInt(),
settings.value("Height", 0).toInt());
kb.textColour = QColor((settings.value("Colour", "Green").toString()));
kb.cmd = settings.value("Command", "None").toString();
kb.path = path;
knobList->append(kb);
}
settings.endArray();
}
settings.endGroup();
settings.sync();
qInfo(logUsbControl()) << "Disconnecting device" << dev->product;
emit removeDevice(dev);
hid_close(dev->handle);
dev->handle = NULL;
dev->connected = false;
dev->remove = true;
dev->uiCreated = false;
devicesConnected--;
QTimer::singleShot(250, this, SLOT(run()));
}
#endif

Wyświetl plik

@ -22,6 +22,8 @@
#include <QPainter>
#include <QImageWriter>
#include <QBuffer>
#include <QSettings>
#if defined(USB_CONTROLLER) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QGamepad>
@ -239,6 +241,8 @@ public slots:
void sendRequest(USBDEVICE *dev, usbFeatureType feature, quint8 val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR);
void sendToLCD(QImage *img);
void backupController(QString file, QString path);
void restoreController(QString file, QString path);
signals:
void jogPlus();

Wyświetl plik

@ -1721,6 +1721,8 @@ void wfmain::setupUsbControllerDevice()
connect(this, SIGNAL(sendLevel(cmds, unsigned char)), usbControllerDev, SLOT(receiveLevel(cmds, unsigned char)));
connect(this, SIGNAL(initUsbController(QMutex*,usbMap*,QVector<BUTTON>*,QVector<KNOB>*)), usbControllerDev, SLOT(init(QMutex*,usbMap*,QVector<BUTTON>*,QVector<KNOB>*)));
connect(this, SIGNAL(usbHotplug()), usbControllerDev, SLOT(run()));
connect(shut, SIGNAL(backup(QString, QString)), usbControllerDev, SLOT(backupController(QString, QString)));
connect(shut, SIGNAL(restore(QString, QString)), usbControllerDev, SLOT(restoreController(QString, QString)));
#endif
}