7#include "portselector.h"
9#include "indipropertyswitch.h"
10#include "ksnotification.h"
11#include "ekos_debug.h"
13#include "indi/driverinfo.h"
14#include "indi/clientmanager.h"
17#include <QDialogButtonBox>
23const QStringList Device::BAUD_RATES = {
"9600",
"19200",
"38400",
"57600",
"115200",
"230400" };
24const QString Device::ACTIVE_STYLESHEET =
"background-color: #004400;";
29Device::Device(
const QSharedPointer<ISD::GenericDevice> &device, QGridLayout *grid,
30 uint8_t row) : m_Name(device->getDeviceName()), m_Device(device), m_Grid(grid), m_Row(row)
37 connect(m_Device.get(), &ISD::GenericDevice::propertyUpdated,
this, &Device::updateProperty);
48 INDI::PropertySwitch connectionMode = m_Device->getBaseDevice().getSwitch(
"CONNECTION_MODE");
49 if (!connectionMode.isValid())
54 m_LED->setState(KLed::On);
66 m_SerialB->setToolTip(
i18n(
"Select <b>Serial</b> if your device is connected via Serial to USB adapter."));
67 m_Grid->addWidget(m_SerialB, m_Row, 2);
70 INDI::PropertySwitch connectionMode = m_Device->getBaseDevice().getSwitch(
"CONNECTION_MODE");
71 connectionMode.reset();
72 connectionMode[0].setState(ISS_ON);
73 m_Device->sendNewProperty(connectionMode);
79 m_NetworkB->setToolTip(
i18n(
"Select <b>Network</b> if your device is connected via Ethernet or WiFi."));
80 m_Grid->addWidget(m_NetworkB, m_Row, 3);
83 INDI::PropertySwitch connectionMode = m_Device->getBaseDevice().getSwitch(
"CONNECTION_MODE");
84 connectionMode.reset();
85 connectionMode[1].setState(ISS_ON);
86 m_Device->sendNewProperty(connectionMode);
89 if (connectionMode.findWidgetByName(
"CONNECTION_SERIAL"))
91 if (m_Device->getBaseDevice().getProperty(
"SYSTEM_PORTS").isValid())
96 m_Ports->setToolTip(
i18n(
"Select Serial port"));
98 INDI::PropertySwitch systemPorts = m_Device->getBaseDevice().getSwitch(
"SYSTEM_PORTS");
99 for (
auto &oneSwitch : systemPorts)
100 m_Ports->addItem(oneSwitch.getLabel());
105 INDI::PropertySwitch systemPorts = m_Device->getBaseDevice().getProperty(
"SYSTEM_PORTS");
106 if (systemPorts.isValid())
109 systemPorts[index].setState(ISS_ON);
110 m_Device->sendNewProperty(systemPorts);
116 INDI::PropertyText port = m_Device->getBaseDevice().getText(
"DEVICE_PORT");
117 port[0].setText(m_Ports->lineEdit()->text().toLatin1().constData());
118 m_Device->sendNewProperty(port);
122 if (m_Device->getBaseDevice().getProperty(
"DEVICE_BAUD_RATE").isValid())
126 m_BaudRates->setToolTip(
i18n(
"Select Baud rate"));
130 INDI::PropertySwitch systemBauds = m_Device->getBaseDevice().getSwitch(
"DEVICE_BAUD_RATE");
132 systemBauds[index].setState(ISS_ON);
133 m_Device->sendNewProperty(systemBauds);
138 m_SerialB->setEnabled(
false);
140 if (connectionMode.findWidgetByName(
"CONNECTION_TCP"))
147 INDI::PropertyText server = m_Device->getBaseDevice().getText(
"DEVICE_ADDRESS");
148 server[0].setText(m_HostName->text().toLatin1().constData());
149 m_Device->sendNewProperty(server);
156 auto server = m_Device->getProperty(
"DEVICE_ADDRESS").getText();
157 server->at(1)->setText(m_HostPort->text().toLatin1().constData());
158 m_Device->sendNewProperty(server);
164 auto connectionType = m_Device->getProperty(
"CONNECTION_TYPE").getSwitch();
165 connectionType->reset();
166 connectionType->at(0)->setState(ISS_ON);
167 m_Device->sendNewProperty(connectionType);
173 auto connectionType = m_Device->getProperty(
"CONNECTION_TYPE").getSwitch();
174 connectionType->reset();
175 connectionType->at(1)->setState(ISS_ON);
176 m_Device->sendNewProperty(connectionType);
180 m_NetworkB->setEnabled(
false);
184 m_ConnectB->setToolTip(
i18n(
"Connect"));
186 m_Grid->addWidget(m_ConnectB, m_Row, 8);
191 m_DisconnectB->setToolTip(
i18n(
"Disconnect"));
193 m_Grid->addWidget(m_DisconnectB, m_Row, 9);
196 setConnectionMode(
static_cast<ConnectionMode
>(connectionMode.findOnSwitchIndex()));
204void Device::syncGUI()
207 if (m_LED ==
nullptr)
213 if (m_LED ==
nullptr)
217 m_LED->setColor(ColorCode.value(m_Device->getState(
"CONNECTION")));
219 auto connectionMode = m_Device->getProperty(
"CONNECTION_MODE").getSwitch();
221 if (connectionMode->findOnSwitchIndex() == CONNECTION_SERIAL)
223 m_ActiveConnectionMode = CONNECTION_SERIAL;
224 m_SerialB->setStyleSheet(ACTIVE_STYLESHEET);
225 m_NetworkB->setStyleSheet(
QString());
229 auto port = m_Device->getProperty(
"DEVICE_PORT").getText();
230 m_Ports->setEditText(port->at(0)->getText());
235 auto systemBauds = m_Device->getProperty(
"DEVICE_BAUD_RATE").getSwitch();
236 m_BaudRates->setCurrentIndex(systemBauds->findOnSwitchIndex());
241 m_ActiveConnectionMode = CONNECTION_NETWORK;
242 m_SerialB->setStyleSheet(
QString());
243 m_NetworkB->setStyleSheet(ACTIVE_STYLESHEET);
245 if (m_Device->getProperty(
"DEVICE_ADDRESS").isValid())
247 auto server = m_Device->getProperty(
"DEVICE_ADDRESS").getText();
248 m_HostName->setText(server->at(0)->getText());
249 m_HostPort->setText(server->at(1)->getText());
252 if (m_Device->getProperty(
"CONNECTION_TYPE").isValid())
254 auto connectionType = m_Device->getBaseDevice().getSwitch(
"CONNECTION_TYPE").getSwitch();
255 m_HostProtocolTCP->setStyleSheet(connectionType->findOnSwitchIndex() == 0 ? ACTIVE_STYLESHEET :
QString());
256 m_HostProtocolUDP->setStyleSheet(connectionType->findOnSwitchIndex() == 1 ? ACTIVE_STYLESHEET :
QString());
264uint8_t Device::systemPortCount()
const
267 return m_Ports->count();
275void Device::setConnectionMode(ConnectionMode mode)
277 m_ActiveConnectionMode = mode;
279 if (mode == CONNECTION_SERIAL)
283 m_Grid->removeWidget(m_HostName);
284 m_HostName->setParent(
nullptr);
285 m_Grid->removeWidget(m_HostPort);
286 m_HostPort->setParent(
nullptr);
287 m_Grid->removeWidget(m_HostProtocolTCP);
288 m_HostProtocolTCP->setParent(
nullptr);
289 m_Grid->removeWidget(m_HostProtocolUDP);
290 m_HostProtocolUDP->setParent(
nullptr);
293 m_Grid->addWidget(m_Ports, m_Row, 4, 1, 2);
294 m_Grid->addWidget(m_BaudRates, m_Row, 6, 1, 2);
295 m_Grid->setColumnStretch(4, 2);
297 else if (mode == CONNECTION_NETWORK)
301 m_Grid->removeWidget(m_Ports);
302 m_Ports->setParent(
nullptr);
303 m_Grid->removeWidget(m_BaudRates);
304 m_BaudRates->setParent(
nullptr);
307 m_Grid->addWidget(m_HostName, m_Row, 4);
308 m_Grid->addWidget(m_HostPort, m_Row, 5);
309 m_Grid->addWidget(m_HostProtocolTCP, m_Row, 6);
310 m_Grid->addWidget(m_HostProtocolUDP, m_Row, 7);
311 m_Grid->setColumnStretch(4, 2);
318void Device::updateProperty(INDI::Property prop)
320 if (prop.isNameMatch(
"CONNECTION_MODE"))
322 auto svp = prop.getSwitch();
323 setConnectionMode(
static_cast<ConnectionMode
>(svp->findOnSwitchIndex()));
326 else if (prop.isNameMatch(
"CONNECTION_TYPE") || prop.isNameMatch(
"SYSTEM_PORTS") ||
327 prop.isNameMatch(
"DEVICE_BAUD_RATE") || prop.isNameMatch(
"DEVICE_PORT"))
329 else if (prop.isNameMatch(
"CONNECTION") && m_ConnectB)
331 if (m_Device->isConnected())
333 m_ConnectB->setStyleSheet(ACTIVE_STYLESHEET);
334 m_DisconnectB->setStyleSheet(
QString());
338 m_ConnectB->setStyleSheet(
QString());
339 m_DisconnectB->setStyleSheet(ACTIVE_STYLESHEET);
347void Device::setConnected()
355void Device::setDisconnected()
381 setWindowTitle(
i18nc(
"@title:window",
"Port Selector"));
392 auto pos = std::find_if(m_Devices.begin(), m_Devices.end(), [device](std::unique_ptr<Device> &oneDevice)
394 return oneDevice->name() == device->getDeviceName();
398 if (pos == m_Devices.end())
400 std::unique_ptr<Device> dev(
new Device(device, m_Layout, m_Devices.size()));
401 m_Devices.push_back(std::move(dev));
414void Dialog::removeDevice(
const QString &name)
416 m_Devices.erase(std::remove_if(m_Devices.begin(), m_Devices.end(), [name](
const auto & oneDevice)
418 return oneDevice->name() == name;
419 }), m_Devices.end());
427bool Dialog::shouldShow()
const
429 if (m_Devices.empty())
432 uint32_t systemPortCount = 0;
433 uint32_t serialDevices = 0;
434 uint32_t networkDevices = 0;
436 for (
const auto &oneDevice : m_Devices)
438 if (oneDevice->systemPortCount() > 0)
439 systemPortCount = oneDevice->systemPortCount();
441 if (oneDevice->activeConnectionMode() == CONNECTION_SERIAL)
443 else if (oneDevice->activeConnectionMode() == CONNECTION_NETWORK)
449 if (networkDevices == 0 && serialDevices <= 1 && systemPortCount <= 1)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void addLayout(QLayout *layout, int stretch)
void addStretch(int stretch)
void activated(int index)
void addItems(const QStringList &texts)
void setEditable(bool editable)
QIcon fromTheme(const QString &name)
void setText(const QString &)
void setPlaceholderText(const QString &)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)