• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • indi
devicemanager.cpp
Go to the documentation of this file.
1 /* Device Manager
2  Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
3 
4  This application is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  JM Changelog
10  2004-16-1: Start
11 
12  */
13 
14 #include "devicemanager.h"
15 
16 #include "Options.h"
17 #include "indimenu.h"
18 #include "indiproperty.h"
19 #include "indigroup.h"
20 #include "indidevice.h"
21 #include "indistd.h"
22 #include "indidriver.h"
23 #include "kstars.h"
24 #include "kstarsdatetime.h"
25 
26 #include <indicom.h>
27 
28 #include <config-kstars.h>
29 
30 //#include <stdlib.h>
31 //#include <unistd.h>
32 
33 #include <QTcpSocket>
34 #include <QTextEdit>
35 
36 #include <KProcess>
37 #include <KLocale>
38 #include <KDebug>
39 #include <KMessageBox>
40 #include <KStatusBar>
41 
42 const int INDI_MAX_TRIES=3;
43 
44 /*******************************************************************
45 ** The device manager contain devices running from one indiserver
46 ** This allow KStars to control multiple devices distributed acorss
47 ** multiple servers seemingly in a way that is completely transparent
48 ** to devices and drivers alike.
49 ** The device Manager can be thought of as the 'networking' parent
50 ** of devices, while indimenu is 'GUI' parent of devices
51 *******************************************************************/
52 DeviceManager::DeviceManager(INDIMenu *INDIparent, QString inHost, uint inPort, ManagerMode inMode)
53  {
54  parent = INDIparent;
55  serverProcess = NULL;
56  XMLParser = NULL;
57  host = inHost;
58  port = inPort;
59  mode = inMode;
60 }
61 
62 DeviceManager::~DeviceManager()
63 {
64  serverSocket.close();
65 
66  if (serverProcess)
67  serverProcess->close();
68 
69  delete (serverProcess);
70 
71  if (XMLParser)
72  delLilXML(XMLParser);
73 
74  XMLParser = NULL;
75 
76  while ( ! indi_dev.isEmpty() ) delete indi_dev.takeFirst();
77 }
78 
79 void DeviceManager::startServer()
80  {
81  serverProcess = new KProcess;
82 
83  if (managed_devices.isEmpty())
84  {
85  kWarning() << "managed_devices was not set! Cannot start server!";
86  return;
87  }
88 
89  *serverProcess << Options::indiServer();
90  *serverProcess << "-v" << "-p" << QString::number(port);
91 
92 
93  foreach(IDevice *device, managed_devices)
94  {
95  // JM: Temporary workaround for indiserver limit of client BLOBs for CCDs.
96  if (device->type == KSTARS_CCD)
97  {
98  *serverProcess << "-m" << "100";
99  break;
100  }
101  }
102 
103  foreach(IDevice *device, managed_devices)
104  *serverProcess << device->driver;
105 
106 
107  if (mode == DeviceManager::M_LOCAL)
108  {
109  connect(serverProcess, SIGNAL(readyReadStandardError()), this, SLOT(processStandardError()));
110  serverProcess->setOutputChannelMode(KProcess::SeparateChannels);
111  serverProcess->setReadChannel(QProcess::StandardError);
112  }
113 
114  serverProcess->start();
115 
116  serverProcess->waitForStarted();
117 
118  if (mode == DeviceManager::M_LOCAL)
119  connectToServer();
120 }
121 
122 void DeviceManager::stopServer()
123 {
124  serverProcess->terminate();
125 }
126 
127 void DeviceManager::connectToServer()
128 {
129  connect(&serverSocket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
130 
131  for (int i=0; i < INDI_MAX_TRIES; i++)
132  {
133  serverSocket.connectToHost(host, port);
134  if (serverSocket.waitForConnected(1000))
135  {
136 
137  connect(&serverSocket, SIGNAL(error( QAbstractSocket::SocketError )), this, SLOT(connectionError()));
138  connectionSuccess();
139  return;
140  }
141 
142  usleep(100000);
143  }
144 
145  connectionError();
146  }
147 
148 void DeviceManager::enableBLOB(bool enable, QString device, QString property)
149 {
150  QTextStream serverFP(&serverSocket);
151  QString openTag;
152 
153  if (device.isEmpty())
154  return;
155 
156  if (property.isEmpty() == false)
157  openTag = QString("<enableBLOB device='%1' name='%2'>").arg(device).arg(property);
158  else
159  openTag = QString("<enableBLOB device='%1'>").arg(device);
160 
161  if (enable)
162  {
163  serverFP << QString("%1Also</enableBLOB>\n").arg(openTag);
164  kDebug() << QString("%1Also</enableBLOB>\n").arg(openTag);
165  }
166  else
167  {
168  serverFP << QString("%1Never</enableBLOB>\n").arg(openTag);
169  kDebug() << QString("%1Never</enableBLOB>\n").arg(openTag);
170  }
171 }
172 
173 void DeviceManager::connectionSuccess()
174 {
175  QTextStream serverFP(&serverSocket);
176 
177  if (XMLParser)
178  delLilXML(XMLParser);
179  XMLParser = newLilXML();
180 
181  serverFP << QString("<getProperties version='%1'/>\n").arg(INDIVERSION);
182 }
183 
184 void DeviceManager::connectionError()
185  {
186  QString errMsg = QString("Connection to INDI host at %1 on port %2 encountered an error: %3.").arg(host).arg(port).arg(serverSocket.errorString());
187  KMessageBox::error(NULL, errMsg);
188 
189  emit deviceManagerError(this);
190 }
191 
192 void DeviceManager::appendManagedDevices(QList<IDevice *> & processed_devices)
193 {
194  managed_devices = processed_devices;
195 
196  foreach (IDevice *device, managed_devices)
197  {
198  device->unique_label = parent->getUniqueDeviceLabel(device->tree_label);
199  //device->mode = mode;
200  device->deviceManager = this;
201  }
202 }
203 
204 void DeviceManager::processStandardError()
205 {
206  if (serverProcess == NULL)
207  return;
208 
209  serverBuffer.append(serverProcess->readAllStandardError());
210  emit newServerInput();
211 }
212 
213 void DeviceManager::dataReceived()
214 {
215  char errmsg[ERRMSG_SIZE];
216  int nr=0, err_code=0;
217  QTextStream serverFP(&serverSocket);
218  QString ibuf, err_cmd;
219 
220  ibuf = serverFP.readAll();
221  nr = ibuf.length();
222 
223  /* process each char */
224  for (int i = 0; i < nr; i++)
225  {
226  if (!XMLParser)
227  return;
228 
229  XMLEle *root = readXMLEle (XMLParser, ibuf[i].toAscii(), errmsg);
230  if (root)
231  {
232  if ( (err_code = dispatchCommand(root, err_cmd)) < 0)
233  {
234  // Silenty ignore property duplication errors
235  if (err_code != INDI_PROPERTY_DUPLICATED)
236  {
237  //kDebug() << "Dispatch command error: " << err_cmd << endl;
238  fprintf(stderr, "Dispatch command error: %d for command %s\n", err_code, qPrintable(err_cmd));
239  prXMLEle (stderr, root, 0);
240  }
241  }
242 
243  delXMLEle (root);
244  }
245  else if (*errmsg)
246  {
247  kDebug() << "XML Root Error: " << errmsg;
248  }
249  }
250  }
251 
252 int DeviceManager::dispatchCommand(XMLEle *root, QString & errmsg)
253 {
254 
255  if (!strcmp (tagXMLEle(root), "message"))
256  return messageCmd(root, errmsg);
257  else if (!strcmp (tagXMLEle(root), "delProperty"))
258  return delPropertyCmd(root, errmsg);
259 
260  /* Get the device, if not available, create it */
261  INDI_D *dp = findDev (root, 1, errmsg);
262  if (dp == NULL)
263  {
264  errmsg = "No device available and none was created";
265  return INDI_DEVICE_NOT_FOUND;
266  }
267 
268  if (!strcmp (tagXMLEle(root), "defTextVector"))
269  return dp->buildTextGUI(root, errmsg);
270  else if (!strcmp (tagXMLEle(root), "defNumberVector"))
271  return dp->buildNumberGUI(root, errmsg);
272  else if (!strcmp (tagXMLEle(root), "defSwitchVector"))
273  return dp->buildSwitchesGUI(root, errmsg);
274  else if (!strcmp (tagXMLEle(root), "defLightVector"))
275  return dp->buildLightsGUI(root, errmsg);
276  else if (!strcmp (tagXMLEle(root), "defBLOBVector"))
277  return dp->buildBLOBGUI(root, errmsg);
278  else if (!strcmp (tagXMLEle(root), "setTextVector") ||
279  !strcmp (tagXMLEle(root), "setNumberVector") ||
280  !strcmp (tagXMLEle(root), "setSwitchVector") ||
281  !strcmp (tagXMLEle(root), "setLightVector") ||
282  !strcmp (tagXMLEle(root), "setBLOBVector"))
283  return dp->setAnyCmd(root, errmsg);
284  // Ignore if we get NewXXX commands
285  else if (QString(tagXMLEle(root)).startsWith("new"))
286  return 0;
287 
288  return INDI_DISPATCH_ERROR;
289 }
290 
291 /* delete the property in the given device, including widgets and data structs.
292  * when last property is deleted, delete the device too.
293  * if no property name attribute at all, delete the whole device regardless.
294  * return 0 if ok, else -1 with reason in errmsg[].
295  */
296 int DeviceManager::delPropertyCmd (XMLEle *root, QString & errmsg)
297 {
298  XMLAtt *ap;
299  INDI_D *dp;
300  INDI_P *pp;
301 
302  /* dig out device and optional property name */
303  dp = findDev (root, 0, errmsg);
304  if (!dp)
305  return INDI_DEVICE_NOT_FOUND;
306 
307  checkMsg(root, dp);
308 
309  ap = findXMLAtt (root, "name");
310 
311  /* Delete property if it exists, otherwise, delete the whole device */
312  if (ap)
313  {
314  pp = dp->findProp(QString(valuXMLAtt(ap)));
315 
316  if(pp)
317  return dp->removeProperty(pp);
318  else
319  return INDI_PROPERTY_INVALID;
320  }
321  // delete the whole device
322  else
323  return removeDevice(dp->name, errmsg);
324 }
325 
326 int DeviceManager::removeDevice( const QString &devName, QString & errmsg )
327 {
328  // remove all devices if devName == NULL
329  if (devName == NULL)
330  {
331  while ( ! indi_dev.isEmpty() ) delete indi_dev.takeFirst();
332  return (0);
333  }
334 
335  for (int i=0; i < indi_dev.size(); i++)
336  {
337  if (indi_dev[i]->name == devName)
338  {
339  delete indi_dev.takeAt(i);
340  return (0);
341  }
342  }
343 
344  errmsg = QString("Device %1 not found").arg(devName);
345  return INDI_DEVICE_NOT_FOUND;
346 }
347 
348 INDI_D * DeviceManager::findDev( const QString &devName, QString & errmsg )
349 {
350  /* search for existing */
351  for (int i = 0; i < indi_dev.size(); i++)
352  {
353  if (indi_dev[i]->name == devName)
354  return indi_dev[i];
355  }
356 
357  errmsg = QString("INDI: no such device %1").arg(devName);
358 
359  return NULL;
360 }
361 
362 /* add new device to mainrc_w using info in dep.
363 - * if trouble return NULL with reason in errmsg[]
364 - */
365 INDI_D * DeviceManager::addDevice (XMLEle *dep, QString & errmsg)
366 {
367 
368  INDI_D *dp;
369  XMLAtt *ap;
370  QString device_name, unique_label;
371  IDevice *targetDevice=NULL;
372 
373  /* allocate new INDI_D on indi_dev */
374  ap = findAtt (dep, "device", errmsg);
375  if (!ap)
376  {
377  errmsg = QString("Unable to find device attribute in XML tree. Cannot add device.");
378  kDebug() << errmsg << endl;
379  return NULL;
380  }
381 
382  device_name = QString(valuXMLAtt(ap));
383 
384  if (mode != M_CLIENT)
385  foreach(IDevice *device, managed_devices)
386  {
387  // Each device manager has a list of managed_devices (IDevice). Each IDevice has the original constant name of the driver (driver_class)
388  // Therefore, when a new device is discovered, we match the driver name (which never changes, it's always static from indiserver) against the driver_class
389  // of IDevice because IDevice can have several names. It can have the tree_label which is the name it has in the local tree widget. Finally, the name that shows
390  // up in the INDI control panel is the unique name of the driver, which is for most cases tree_label, but if that exists already then we get tree_label_1..etc
391 
392  if (device->name == device_name && device->state == IDevice::DEV_TERMINATE)
393  {
394  device->state = IDevice::DEV_START;
395  unique_label = device->unique_label = parent->getUniqueDeviceLabel(device->tree_label);
396  targetDevice = device;
397  break;
398  }
399  }
400 
401  // For remote INDI drivers with no label attributes
402  if (unique_label.isEmpty())
403  unique_label = parent->getUniqueDeviceLabel(device_name);
404 
405  dp = new INDI_D(parent, this, device_name, unique_label, targetDevice);
406  indi_dev.append(dp);
407  emit newDevice(dp);
408 
409  enableBLOB(true, device_name);
410 
411  connect(dp->stdDev, SIGNAL(newTelescope()), parent->ksw->indiDriver(), SLOT(newTelescopeDiscovered()), Qt::QueuedConnection);
412 
413  /* ok */
414  return dp;
415 
416 }
417 
418 INDI_D * DeviceManager::findDev (XMLEle *root, int create, QString & errmsg)
419 {
420  XMLAtt *ap;
421  char *dn;
422 
423  /* get device name */
424  ap = findAtt (root, "device", errmsg);
425  if (!ap)
426  {
427  errmsg = QString("No device attribute found in element %1").arg(tagXMLEle(root));
428  return (NULL);
429  }
430  dn = valuXMLAtt(ap);
431 
432  /* search for existing */
433  for (int i = 0; i < indi_dev.size(); i++)
434  {
435  if (indi_dev[i]->name == QString(dn))
436  return indi_dev[i];
437  }
438 
439  /* not found, create if ok */
440  if (create)
441  return (addDevice (root, errmsg));
442 
443  errmsg = QString("INDI: <%1> no such device %2").arg(tagXMLEle(root)).arg(dn);
444  return NULL;
445 }
446 
447 /* a general message command received from the device.
448  * return 0 if ok, else -1 with reason in errmsg[].
449  */
450 int DeviceManager::messageCmd (XMLEle *root, QString & errmsg)
451 {
452  checkMsg (root, findDev (root, 0, errmsg));
453  return (0);
454 }
455 
456 /* display message attribute.
457  * N.B. don't put carriage control in msg, we take care of that.
458  */
459 void DeviceManager::checkMsg (XMLEle *root, INDI_D *dp)
460 {
461  XMLAtt *ap;
462  ap = findXMLAtt(root, "message");
463 
464  if (ap)
465  doMsg(root, dp);
466 }
467 
468 /* display valu of message and timestamp in dp's scrolled area, if any, else general.
469  * prefix our time stamp if not included.
470  * N.B. don't put carriage control in msg, we take care of that.
471  */
472 void DeviceManager::doMsg (XMLEle *msg, INDI_D *dp)
473 {
474  QTextEdit *txt_w;
475  XMLAtt *message;
476  XMLAtt *timestamp;
477 
478  if (dp == NULL)
479  {
480  kDebug() << "Warning: dp is null.";
481  return;
482  }
483 
484  txt_w = dp->msgST_w;
485 
486  /* prefix our timestamp if not with msg */
487  timestamp = findXMLAtt (msg, "timestamp");
488 
489  if (timestamp)
490  txt_w->insertPlainText(QString(valuXMLAtt(timestamp)) + QString(" "));
491  else
492  txt_w->insertPlainText( KStarsDateTime::currentDateTime().toString("yyyy/mm/dd - h:m:s ap "));
493 
494  /* finally! the msg */
495  message = findXMLAtt(msg, "message");
496 
497  if (!message) return;
498 
499  // Prepend to the log viewer
500  txt_w->insertPlainText( QString(valuXMLAtt(message)) + QString("\n"));
501  QTextCursor c = txt_w->textCursor();
502  c.movePosition(QTextCursor::Start);
503  txt_w->setTextCursor(c);
504 
505  if ( Options::showINDIMessages() )
506  parent->ksw->statusBar()->changeItem( QString(valuXMLAtt(message)), 0);
507 
508 }
509 
510 void DeviceManager::sendNewText (INDI_P *pp)
511 {
512  INDI_E *lp;
513 
514  QTextStream serverFP(&serverSocket);
515 
516  serverFP << QString("<newTextVector\n");
517  serverFP << QString(" device='%1'\n").arg(qPrintable( pp->pg->dp->name));
518  serverFP << QString(" name='%1'\n>").arg(qPrintable( pp->name));
519 
520  //for (lp = pp->el.first(); lp != NULL; lp = pp->el.next())
521  foreach(lp, pp->el)
522  {
523  serverFP << QString(" <oneText\n");
524  serverFP << QString(" name='%1'>\n").arg(qPrintable( lp->name));
525  serverFP << QString(" %1\n").arg(qPrintable( lp->text));
526  serverFP << QString(" </oneText>\n");
527  }
528  serverFP << QString("</newTextVector>\n");
529 }
530 
531 void DeviceManager::sendNewNumber (INDI_P *pp)
532 {
533  INDI_E *lp;
534 
535  QTextStream serverFP(&serverSocket);
536 
537  serverFP << QString("<newNumberVector\n");
538  serverFP << QString(" device='%1'\n").arg(qPrintable( pp->pg->dp->name));
539  serverFP << QString(" name='%1'\n>").arg(qPrintable( pp->name));
540 
541  foreach(lp, pp->el)
542  {
543  serverFP << QString(" <oneNumber\n");
544  serverFP << QString(" name='%1'>\n").arg(qPrintable( lp->name));
545  if (lp->text.isEmpty() || lp->spin_w)
546  serverFP << QString(" %1\n").arg(lp->targetValue);
547  else
548  serverFP << QString(" %1\n").arg(lp->text);
549  serverFP << QString(" </oneNumber>\n");
550  }
551  serverFP << QString("</newNumberVector>\n");
552 
553 }
554 
555 void DeviceManager::sendNewSwitch (INDI_P *pp, INDI_E *lp)
556 {
557  QTextStream serverFP(&serverSocket);
558 
559  serverFP << QString("<newSwitchVector\n");
560  serverFP << QString(" device='%1'\n").arg(qPrintable( pp->pg->dp->name));
561  serverFP << QString(" name='%1'>\n").arg(qPrintable( pp->name));
562  serverFP << QString(" <oneSwitch\n");
563  serverFP << QString(" name='%1'>\n").arg(qPrintable( lp->name));
564  serverFP << QString(" %1\n").arg(lp->switch_state == ISS_ON ? "On" : "Off");
565  serverFP << QString(" </oneSwitch>\n");
566 
567  serverFP << QString("</newSwitchVector>\n");
568 
569 }
570 
571 void DeviceManager::startBlob( const QString &devName, const QString &propName, const QString &timestamp)
572 {
573  QTextStream serverFP(&serverSocket);
574 
575  serverFP << QString("<newBLOBVector\n");
576  serverFP << QString(" device='%1'\n").arg(qPrintable( devName));
577  serverFP << QString(" name='%1'\n").arg(qPrintable( propName));
578  serverFP << QString(" timestamp='%1'>\n").arg(qPrintable( timestamp));
579 
580 }
581 
582 void DeviceManager::sendOneBlob( const QString &blobName, unsigned int blobSize, const QString &blobFormat, unsigned char * blobBuffer)
583 {
584  QTextStream serverFP(&serverSocket);
585 
586  serverFP << QString(" <oneBLOB\n");
587  serverFP << QString(" name='%1'\n").arg(qPrintable( blobName));
588  serverFP << QString(" size='%1'\n").arg(blobSize);
589  serverFP << QString(" format='%1'>\n").arg(qPrintable( blobFormat));
590 
591  for (unsigned i = 0; i < blobSize; i += 72)
592  serverFP << QString().sprintf(" %.72s\n", blobBuffer+i);
593 
594  serverFP << QString(" </oneBLOB>\n");
595 
596 }
597 
598 void DeviceManager::finishBlob()
599 {
600  QTextStream serverFP(&serverSocket);
601 
602  serverFP << QString("</newBLOBVector>\n");
603 }
604 
605 #include "devicemanager.moc"
INDI_D::removeProperty
bool removeProperty(INDI::Property *prop)
Definition: indidevice.cpp:104
DeviceManager::managed_devices
QList< IDevice * > managed_devices
Definition: devicemanager.h:39
devicemanager.h
INDIVERSION
#define INDIVERSION
Definition: indicommon.h:13
DeviceManager::dataReceived
void dataReceived()
Definition: devicemanager.cpp:213
INDI_P
Definition: indiproperty.h:38
DeviceManager::findDev
INDI_D * findDev(XMLEle *root, int create, QString &errmsg)
Definition: devicemanager.cpp:418
IDevice::DEV_START
Definition: indidriver.h:54
DeviceManager::deviceManagerError
void deviceManagerError(DeviceManager *)
indimenu.h
DeviceManager::connectToServer
void connectToServer()
Definition: devicemanager.cpp:127
DeviceManager::DeviceManager
DeviceManager(INDIMenu *INDIparent, QString inHost, uint inPort, ManagerMode inMode)
Definition: devicemanager.cpp:52
DeviceManager::connectionError
void connectionError()
Definition: devicemanager.cpp:184
DeviceManager::serverBuffer
QString serverBuffer
Definition: devicemanager.h:45
DeviceManager::doMsg
void doMsg(XMLEle *msg, INDI_D *dp)
Definition: devicemanager.cpp:472
IDevice::DEV_TERMINATE
Definition: indidriver.h:54
DeviceManager::INDI_PROPERTY_DUPLICATED
Definition: devicemanager.h:32
DeviceManager::newServerInput
void newServerInput()
Options::showINDIMessages
static bool showINDIMessages()
Get Display INDI messages in the statusbar?
Definition: Options.h:543
INDI_E
Definition: indielement.h:44
DeviceManager::newDevice
void newDevice(INDI_D *)
indidevice.h
DeviceManager::startBlob
void startBlob(const QString &devName, const QString &propName, const QString &timestamp)
Definition: devicemanager.cpp:571
IDevice::tree_label
QString tree_label
Definition: indidriver.h:57
IDevice::name
QString name
Definition: indidriver.h:59
Options::indiServer
static QString indiServer()
Get PATH to indiserver binary.
Definition: Options.h:771
DeviceManager::dispatchCommand
int dispatchCommand(XMLEle *root, QString &errmsg)
Definition: devicemanager.cpp:252
DeviceManager::stopServer
void stopServer()
Definition: devicemanager.cpp:122
DeviceManager::sendOneBlob
void sendOneBlob(const QString &blobName, unsigned int blobSize, const QString &blobFormat, unsigned char *blobBuffer)
Definition: devicemanager.cpp:582
INDIMenu
Definition: indimenu.h:37
DeviceManager::addDevice
INDI_D * addDevice(XMLEle *dep, QString &errmsg)
Definition: devicemanager.cpp:365
IDevice::type
int type
Definition: indidriver.h:68
DeviceManager::processStandardError
void processStandardError()
Definition: devicemanager.cpp:204
DeviceManager::appendManagedDevices
void appendManagedDevices(QList< IDevice * > &processed_devices)
Definition: devicemanager.cpp:192
DeviceManager::mode
ManagerMode mode
Definition: devicemanager.h:46
INDIMenu::getUniqueDeviceLabel
QString getUniqueDeviceLabel(const QString &deviceName)
Definition: indimenu.cpp:180
INDI_MAX_TRIES
const int INDI_MAX_TRIES
Definition: devicemanager.cpp:42
DeviceManager::startServer
void startServer()
Definition: devicemanager.cpp:79
INDI_D
Definition: indidevice.h:30
KStarsDateTime::currentDateTime
static KStarsDateTime currentDateTime(KDateTime::Spec ts=KDateTime::Spec::ClockTime())
Definition: kstarsdatetime.cpp:67
DeviceManager::port
uint port
Definition: devicemanager.h:44
IDevice::driver
QString driver
Definition: indidriver.h:60
DeviceManager::serverSocket
QTcpSocket serverSocket
Definition: devicemanager.h:41
DeviceManager::~DeviceManager
~DeviceManager()
Definition: devicemanager.cpp:62
DeviceManager::INDI_PROPERTY_INVALID
Definition: devicemanager.h:32
DeviceManager::XMLParser
LilXML * XMLParser
Definition: devicemanager.h:42
DeviceManager::enableBLOB
void enableBLOB(bool enable, QString device=QString(), QString property=QString())
Definition: devicemanager.cpp:148
indidriver.h
IDevice::state
DeviceStatus state
Definition: indidriver.h:64
INDIMenu::ksw
KStars * ksw
Definition: indimenu.h:44
KSTARS_CCD
Definition: indicommon.h:66
DeviceManager::finishBlob
void finishBlob()
Definition: devicemanager.cpp:598
Options.h
QTextStream
DeviceManager::M_CLIENT
Definition: devicemanager.h:31
DeviceManager::connectionSuccess
void connectionSuccess()
Definition: devicemanager.cpp:173
DeviceManager::parent
INDIMenu * parent
Definition: devicemanager.h:37
ERRMSG_SIZE
#define ERRMSG_SIZE
Definition: drivermanager.cpp:58
DeviceManager::sendNewSwitch
void sendNewSwitch(INDI_P *pp, INDI_E *lp)
Definition: devicemanager.cpp:555
DeviceManager::removeDevice
int removeDevice(const QString &devName, QString &errmsg)
Definition: devicemanager.cpp:326
DeviceManager::serverProcess
KProcess * serverProcess
Definition: devicemanager.h:47
DeviceManager::checkMsg
void checkMsg(XMLEle *root, INDI_D *dp)
Definition: devicemanager.cpp:459
DeviceManager::INDI_DEVICE_NOT_FOUND
Definition: devicemanager.h:32
DeviceManager::sendNewText
void sendNewText(INDI_P *pp)
Definition: devicemanager.cpp:510
IDevice
Definition: indidriver.h:46
indistd.h
DeviceManager::host
QString host
Definition: devicemanager.h:43
IDevice::unique_label
QString unique_label
Definition: indidriver.h:58
kstarsdatetime.h
DeviceManager::M_LOCAL
Definition: devicemanager.h:31
DeviceManager::sendNewNumber
void sendNewNumber(INDI_P *pp)
Definition: devicemanager.cpp:531
IDevice::deviceManager
DeviceManager * deviceManager
Definition: indidriver.h:67
DeviceManager::delPropertyCmd
int delPropertyCmd(XMLEle *root, QString &errmsg)
Definition: devicemanager.cpp:296
DeviceManager::indi_dev
QList< INDI_D * > indi_dev
Definition: devicemanager.h:38
indiproperty.h
DeviceManager::INDI_DISPATCH_ERROR
Definition: devicemanager.h:32
DeviceManager::messageCmd
int messageCmd(XMLEle *root, QString &errmsg)
Definition: devicemanager.cpp:450
DeviceManager::ManagerMode
ManagerMode
Definition: devicemanager.h:31
indigroup.h
kstars.h
QList
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal