/*
Copyright © 2016 Hasan Yavuz Özderya
This file is part of serialplot.
serialplot is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
serialplot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with serialplot. If not, see .
*/
#include
#include
#include "commandpanel.h"
#include "ui_commandpanel.h"
#include "setting_defines.h"
CommandPanel::CommandPanel(QSerialPort* port, QWidget *parent) :
QWidget(parent),
ui(new Ui::CommandPanel),
_menu(trUtf8("Commands")), _newCommandAction(trUtf8("New Command"), this)
{
serialPort = port;
ui->setupUi(this);
auto layout = new QVBoxLayout();
layout->setSpacing(0);
ui->scrollAreaWidgetContents->setLayout(layout);
#ifdef Q_OS_WIN
ui->pbNew->setIcon(QIcon(":/icons/list-add"));
#endif // Q_OS_WIN
connect(ui->pbNew, &QPushButton::clicked, this, &CommandPanel::newCommand);
connect(&_newCommandAction, &QAction::triggered, this, &CommandPanel::newCommand);
_menu.addAction(&_newCommandAction);
_menu.addSeparator();
command_name_counter = 0;
}
CommandPanel::~CommandPanel()
{
commands.clear(); // UI will 'delete' actual objects
delete ui;
}
CommandWidget* CommandPanel::newCommand()
{
auto command = new CommandWidget();
command_name_counter++;
command->setName(trUtf8("Command ") + QString::number(command_name_counter));
ui->scrollAreaWidgetContents->layout()->addWidget(command);
command->setFocusToEdit();
connect(command, &CommandWidget::sendCommand, this, &CommandPanel::sendCommand);
connect(command, &CommandWidget::focusRequested, this, &CommandPanel::focusRequested);
_menu.addAction(command->sendAction());
// add to command list and remove on destroy
commands << command;
connect(command, &QObject::destroyed, [this](QObject* obj)
{
commands.removeOne(static_cast(obj));
});
return command;
}
void CommandPanel::sendCommand(QByteArray command)
{
if (!serialPort->isOpen())
{
qCritical() << "Port is not open!";
return;
}
if (serialPort->write(command) < 0)
{
qCritical() << "Send command failed!";
}
}
QMenu* CommandPanel::menu()
{
return &_menu;
}
QAction* CommandPanel::newCommandAction()
{
return &_newCommandAction;
}
unsigned CommandPanel::numOfCommands()
{
return commands.size();
}
void CommandPanel::saveSettings(QSettings* settings)
{
settings->beginGroup(SettingGroup_Commands);
settings->beginWriteArray(SG_Commands_Command);
for (int i = 0; i < commands.size(); i ++)
{
settings->setArrayIndex(i);
auto command = commands[i];
settings->setValue(SG_Commands_Name, command->name());
settings->setValue(SG_Commands_Type, command->isASCIIMode() ? "ascii" : "hex");
settings->setValue(SG_Commands_Data, command->commandText());
}
settings->endArray();
settings->endGroup();
}
void CommandPanel::loadSettings(QSettings* settings)
{
// clear all commands
while (commands.size())
{
auto command = commands.takeLast();
command->disconnect();
delete command;
}
// load commands
settings->beginGroup(SettingGroup_Commands);
unsigned size = settings->beginReadArray(SG_Commands_Command);
for (unsigned i = 0; i < size; i ++)
{
settings->setArrayIndex(i);
auto command = newCommand();
// load command name
QString name = settings->value(SG_Commands_Name, "").toString();
if (!name.isEmpty()) command->setName(name);
// Important: type should be set before command data for correct validation
QString type = settings->value(SG_Commands_Type, "").toString();
if (type == "ascii")
{
command->setASCIIMode(true);
}
else if (type == "hex")
{
command->setASCIIMode(false);
} // else unchanged
// load command data
command->setCommandText(settings->value(SG_Commands_Data, "").toString());
}
settings->endArray();
settings->endGroup();
}