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>
18 #include <QPushButton>
23 const QStringList Device::BAUD_RATES = {
"9600",
"19200",
"38400",
"57600",
"115200",
"230400" };
24 const QString Device::ACTIVE_STYLESHEET =
"background-color: #004400;";
29 Device::Device(
ISD::GenericDevice *device,
QGridLayout *grid, uint8_t row) : m_Name(device->getDeviceName()), m_Device(device), m_Grid(grid), m_Row(row)
36 connect(m_Device, &ISD::GenericDevice::switchUpdated,
this, &Device::processSwitch);
37 connect(m_Device, &ISD::GenericDevice::textUpdated,
this, &Device::processText);
38 connect(m_Device, &ISD::GenericDevice::Connected,
this, &Device::setConnected);
39 connect(m_Device, &ISD::GenericDevice::Disconnected,
this, &Device::setDisconnected);
48 bool Device::initGUI()
50 INDI::Property modeProperty = m_Device->getBaseDevice()->getSwitch(
"CONNECTION_MODE");
51 if (!modeProperty.isValid())
56 m_LED->setState(KLed::On);
68 m_SerialB->setToolTip(
i18n(
"Select <b>Serial</b> if your device is connected via Serial to USB adapter."));
69 m_Grid->addWidget(m_SerialB, m_Row, 2);
72 INDI::PropertyView<ISwitch> connectionMode = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_MODE"));
73 IUResetSwitch(&connectionMode);
74 connectionMode.at(0)->setState(ISS_ON);
75 connectionMode.at(1)->setState(ISS_OFF);
76 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&connectionMode);
82 m_NetworkB->setToolTip(
i18n(
"Select <b>Network</b> if your device is connected via Ethernet or WiFi."));
83 m_Grid->addWidget(m_NetworkB, m_Row, 3);
86 INDI::PropertyView<ISwitch> connectionMode = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_MODE"));
87 IUResetSwitch(&connectionMode);
88 connectionMode.at(0)->setState(ISS_OFF);
89 connectionMode.at(1)->setState(ISS_ON);
90 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&connectionMode);
93 INDI::PropertyView<ISwitch> connectionMode = *(modeProperty->getSwitch());
94 if (connectionMode.findWidgetByName(
"CONNECTION_SERIAL"))
96 if (m_Device->getBaseDevice()->getProperty(
"SYSTEM_PORTS").isValid())
101 m_Ports->setToolTip(
i18n(
"Select Serial port"));
103 INDI::PropertyView<ISwitch> systemPorts = *(m_Device->getBaseDevice()->getSwitch(
"SYSTEM_PORTS"));
104 for (
auto &oneSwitch : systemPorts)
105 m_Ports->addItem(oneSwitch.getLabel());
110 INDI::Property systemPorts = m_Device->getBaseDevice()->
getProperty(
"SYSTEM_PORTS");
111 if (systemPorts.isValid())
113 INDI::PropertyView<ISwitch> systemPortsSwitch = *(systemPorts->getSwitch());
114 IUResetSwitch(&systemPortsSwitch);
115 systemPortsSwitch.at(index)->setState(ISS_ON);
116 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&systemPortsSwitch);
122 INDI::PropertyView<IText> port = *(m_Device->getBaseDevice()->getText(
"DEVICE_PORT"));
123 port.at(0)->setText(m_Ports->lineEdit()->text().toLatin1().constData());
124 m_Device->getDriverInfo()->getClientManager()->sendNewText(&port);
128 if (m_Device->getBaseDevice()->getProperty(
"DEVICE_BAUD_RATE").isValid())
132 m_BaudRates->setToolTip(
i18n(
"Select Baud rate"));
136 INDI::PropertyView<ISwitch> systemBauds = *(m_Device->getBaseDevice()->getSwitch(
"DEVICE_BAUD_RATE"));
137 IUResetSwitch(&systemBauds);
138 systemBauds.at(index)->setState(ISS_ON);
139 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&systemBauds);
144 m_SerialB->setEnabled(
false);
146 if (connectionMode.findWidgetByName(
"CONNECTION_TCP"))
153 INDI::PropertyView<IText> server = *(m_Device->getBaseDevice()->
getText(
"DEVICE_ADDRESS"));
154 server.at(0)->setText(m_HostName->text().toLatin1().constData());
155 m_Device->getDriverInfo()->getClientManager()->sendNewText(&server);
162 INDI::PropertyView<IText> server = *(m_Device->getBaseDevice()->
getText(
"DEVICE_ADDRESS"));
163 server.at(1)->setText(m_HostPort->text().toLatin1().constData());
164 m_Device->getDriverInfo()->getClientManager()->sendNewText(&server);
170 INDI::PropertyView<ISwitch> connectionType = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_TYPE"));
171 IUResetSwitch(&connectionType);
172 connectionType.at(0)->setState(ISS_ON);
173 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&connectionType);
179 INDI::PropertyView<ISwitch> connectionType = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_TYPE"));
180 IUResetSwitch(&connectionType);
181 connectionType.at(1)->setState(ISS_ON);
182 m_Device->getDriverInfo()->getClientManager()->sendNewSwitch(&connectionType);
186 m_NetworkB->setEnabled(
false);
190 m_ConnectB->setToolTip(
i18n(
"Connect"));
192 m_Grid->addWidget(m_ConnectB, m_Row, 8);
197 m_DisconnectB->setToolTip(
i18n(
"Disconnect"));
199 m_Grid->addWidget(m_DisconnectB, m_Row, 9);
202 setConnectionMode(
static_cast<ConnectionMode
>(connectionMode.findOnSwitchIndex()));
210 void Device::syncGUI()
213 if (m_LED ==
nullptr)
219 if (m_LED ==
nullptr)
223 m_LED->setColor(ColorCode.value(m_Device->getState(
"CONNECTION")));
225 INDI::PropertyView<ISwitch> connectionMode = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_MODE"));
227 if (connectionMode.findOnSwitchIndex() == CONNECTION_SERIAL)
229 m_ActiveConnectionMode = CONNECTION_SERIAL;
230 m_SerialB->setStyleSheet(ACTIVE_STYLESHEET);
231 m_NetworkB->setStyleSheet(
QString());
235 INDI::PropertyView<IText> port = *(m_Device->getBaseDevice()->getText(
"DEVICE_PORT"));
236 m_Ports->setEditText(port.at(0)->getText());
241 INDI::PropertyView<ISwitch> systemBauds = *(m_Device->getBaseDevice()->getSwitch(
"DEVICE_BAUD_RATE"));
242 m_BaudRates->setCurrentIndex(systemBauds.findOnSwitchIndex());
247 m_ActiveConnectionMode = CONNECTION_NETWORK;
248 m_SerialB->setStyleSheet(
QString());
249 m_NetworkB->setStyleSheet(ACTIVE_STYLESHEET);
251 if (m_Device->getBaseDevice()->getProperty(
"DEVICE_ADDRESS").isValid())
253 INDI::PropertyView<IText> server = *(m_Device->getBaseDevice()->getText(
"DEVICE_ADDRESS"));
254 m_HostName->setText(server.at(0)->getText());
255 m_HostPort->setText(server.at(1)->getText());
258 if (m_Device->getBaseDevice()->getProperty(
"CONNECTION_TYPE").isValid())
260 INDI::PropertyView<ISwitch> connectionType = *(m_Device->getBaseDevice()->getSwitch(
"CONNECTION_TYPE"));
261 m_HostProtocolTCP->setStyleSheet(connectionType.findOnSwitchIndex() == 0 ? ACTIVE_STYLESHEET :
QString());
262 m_HostProtocolUDP->setStyleSheet(connectionType.findOnSwitchIndex() == 1 ? ACTIVE_STYLESHEET :
QString());
266 if (m_Device->isConnected())
268 m_ConnectB->setStyleSheet(ACTIVE_STYLESHEET);
269 m_DisconnectB->setStyleSheet(
QString());
273 m_ConnectB->setStyleSheet(
QString());
274 m_DisconnectB->setStyleSheet(ACTIVE_STYLESHEET);
281 uint8_t Device::systemPortCount()
const
284 return m_Ports->count();
292 void Device::setConnectionMode(ConnectionMode mode)
294 m_ActiveConnectionMode = mode;
296 if (mode == CONNECTION_SERIAL)
300 m_Grid->removeWidget(m_HostName);
301 m_HostName->setParent(
nullptr);
302 m_Grid->removeWidget(m_HostPort);
303 m_HostPort->setParent(
nullptr);
304 m_Grid->removeWidget(m_HostProtocolTCP);
305 m_HostProtocolTCP->setParent(
nullptr);
306 m_Grid->removeWidget(m_HostProtocolUDP);
307 m_HostProtocolUDP->setParent(
nullptr);
310 m_Grid->addWidget(m_Ports, m_Row, 4, 1, 2);
311 m_Grid->addWidget(m_BaudRates, m_Row, 6, 1, 2);
312 m_Grid->setColumnStretch(4, 2);
314 else if (mode == CONNECTION_NETWORK)
318 m_Grid->removeWidget(m_Ports);
319 m_Ports->setParent(
nullptr);
320 m_Grid->removeWidget(m_BaudRates);
321 m_BaudRates->setParent(
nullptr);
324 m_Grid->addWidget(m_HostName, m_Row, 4);
325 m_Grid->addWidget(m_HostPort, m_Row, 5);
326 m_Grid->addWidget(m_HostProtocolTCP, m_Row, 6);
327 m_Grid->addWidget(m_HostProtocolUDP, m_Row, 7);
328 m_Grid->setColumnStretch(4, 2);
335 void Device::processSwitch(ISwitchVectorProperty *svp)
338 if (prop ==
"CONNECTION_MODE")
340 setConnectionMode(
static_cast<ConnectionMode
>(IUFindOnSwitchIndex(svp)));
343 else if (prop ==
"CONNECTION_TYPE" || prop ==
"SYSTEM_PORTS" ||
344 prop ==
"DEVICE_BAUD_RATE")
351 void Device::processText(ITextVectorProperty *tvp)
354 if (prop ==
"DEVICE_PORT")
361 void Device::setConnected()
369 void Device::setDisconnected()
395 setWindowTitle(
i18nc(
"@title:window",
"Port Selector"));
403 auto pos = std::find_if(m_Devices.begin(), m_Devices.end(), [device](std::unique_ptr<Device> &oneDevice)
405 return oneDevice->name() == device->getDeviceName();
409 if (pos == m_Devices.end())
411 std::unique_ptr<Device> dev(
new Device(device, m_Layout, m_Devices.size()));
412 m_Devices.push_back(std::move(dev));
425 void Dialog::removeDevice(
const QString &name)
427 m_Devices.erase(std::remove_if(m_Devices.begin(), m_Devices.end(), [name](
const auto & oneDevice)
429 return oneDevice->name() == name;
430 }), m_Devices.end());
438 bool Dialog::shouldShow()
const
440 if (m_Devices.empty())
443 uint32_t systemPortCount = 0;
444 uint32_t serialDevices = 0;
445 uint32_t networkDevices = 0;
447 for (
const auto &oneDevice : m_Devices)
449 if (oneDevice->systemPortCount() > 0)
450 systemPortCount = oneDevice->systemPortCount();
452 if (oneDevice->activeConnectionMode() == CONNECTION_SERIAL)
454 else if (oneDevice->activeConnectionMode() == CONNECTION_NETWORK)
460 if (networkDevices == 0 && serialDevices <= 1 && systemPortCount <= 1)