Qt Virtual Chart Table (QVCT)
CDeviceGpsdGps.cpp
Go to the documentation of this file.
1 // INDENTING (emacs/vi): -*- mode:c++; tab-width:2; c-basic-offset:2; intent-tabs-mode:nil; -*- ex: set tabstop=2 expandtab:
2 
3 /*
4  * Qt Virtual Chart Table (QVCT)
5  * Copyright (C) 2012 Cedric Dufour <http://cedric.dufour.name>
6  * Author: Cedric Dufour <http://cedric.dufour.name>
7  *
8  * The Qt Virtual Chart Table (QVCT) is free software:
9  * you can redistribute it and/or modify it under the terms of the GNU General
10  * Public License as published by the Free Software Foundation, Version 3.
11  *
12  * The Qt Virtual Chart Table (QVCT) is distributed in the hope
13  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU General Public License for more details.
17  */
18 
19 // C/C++
20 #include <cmath>
21 
22 // QT
23 #include <QDomElement> // QtXml module
24 #include <QString>
25 #include <QXmlStreamWriter>
26 
27 // GPSD
28 #include "gps.h"
29 // #include "gpsdclient.h"
30 #ifndef STATUS_DGPS_FIX
31 #define STATUS_DGPS_FIX 2
32 #endif
33 
34 // QVCT
35 #include "QVCTRuntime.hpp"
40 
41 
42 //------------------------------------------------------------------------------
43 // CONSTRUCTORS / DESTRUCTOR
44 //------------------------------------------------------------------------------
45 
46 CDeviceGpsdGps::CDeviceGpsdGps( const QString& _rqsName )
47  : CDevice( _rqsName )
48  , qsHost( "127.0.0.1" )
49  , iPort( 2947 )
50  , qsSource()
51  , psGpsData( 0 )
52  , pqSocketNotifier( 0 )
53  , bPaused( false )
54 {}
55 
57 {
58  stop();
59 }
60 
61 
62 //------------------------------------------------------------------------------
63 // METHODS: CDevice (implement/override)
64 //------------------------------------------------------------------------------
65 
67 {
68  QVCT::EStatus __eStatus = QVCT::CRITICAL;
69  switch( _eOperatingMode )
70  {
71 
72  case CDevice::STOP:
73  __eStatus = stop();
74  break;
75 
76  case CDevice::PAUSE:
77  __eStatus = pause();
78  break;
79 
80  case CDevice::START:
81  __eStatus = start();
82  break;
83 
84  default:; // WHAT THE F*** !?!
85  }
86  if( __eStatus != QVCT::OK )
87  {
88  qCritical( "ERROR[%s]: Failed to switch operating mode; host=%s, port=%d", Q_FUNC_INFO, qPrintable( qsHost ), iPort );
89  }
90  return __eStatus;
91 }
92 
94 {
99 }
100 
102 {
103  CDeviceGpsdGpsEditView* __poDeviceGpsdGpsEditView = new CDeviceGpsdGpsEditView( this );
104  if( __poDeviceGpsdGpsEditView->exec() == QDialog::Accepted ) showDetail();
105  delete __poDeviceGpsdGpsEditView;
106 }
107 
108 void CDeviceGpsdGps::parseQVCT( const QDomElement& _rqDomElement )
109 {
110  QDomElement __qDomElement = _rqDomElement.firstChildElement( "Configuration" );
111  if( __qDomElement.isNull() ) return;
112  qsHost = __qDomElement.attribute( "host", "127.0.0.1" );
113  iPort = __qDomElement.attribute( "port", "2947" ).toInt();
114  qsSource = __qDomElement.attribute( "source" );
115 }
116 
117 void CDeviceGpsdGps::dumpQVCT( QXmlStreamWriter & _rqXmlStreamWriter ) const
118 {
119  // Device
120  _rqXmlStreamWriter.writeStartElement( "Device" );
121  // ... driver
122  _rqXmlStreamWriter.writeAttribute( "name", qsName );
123  _rqXmlStreamWriter.writeAttribute( "driver", "gpsd_gps" );
124  // ... configuration
125  _rqXmlStreamWriter.writeStartElement( "Configuration" );
126  _rqXmlStreamWriter.writeAttribute( "host", qsHost );
127  _rqXmlStreamWriter.writeAttribute( "port", QString::number( iPort ) );
128  if( !qsSource.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "source", qsSource );
129  _rqXmlStreamWriter.writeEndElement(); // Configuration
130  // ... [end]
131  _rqXmlStreamWriter.writeEndElement(); // Device
132 }
133 
134 
135 //------------------------------------------------------------------------------
136 // METHODS
137 //------------------------------------------------------------------------------
138 
139 //
140 // SLOTS
141 //
143 {
144  //qDebug( "DEBUG[%s]: Begin", Q_FUNC_INFO );
145  QMutex* __pqMutexDataChange = QVCTRuntime::useMutexDataChange();
146  __pqMutexDataChange->lock();
147  pqSocketNotifier->setEnabled( false );
148 
149  do // data-processing loop
150  {
151  //qDebug( "DEBUG[%s]: GPS data are waiting to be read", Q_FUNC_INFO );
152 
153  // Retrieve data
154  int __iStatus;
155 #if GPSD_API_MAJOR_VERSION >= 7
156  __iStatus = gps_read( psGpsData, NULL, 0 );
157 #elif GPSD_API_MAJOR_VERSION >= 5
158  __iStatus = gps_read( psGpsData );
159 #else
160  __iStatus = gps_poll( psGpsData );
161 #endif
162  if( __iStatus == 0 ) break; // No data available
163  if( __iStatus < 0 )
164  {
165  qCritical( "ERROR[%s]: Failed to read data from device; status=%d", Q_FUNC_INFO, __iStatus );
166  emit signalError( QString( tr("Failed to read data from device")+"; status=%1" ).arg( __iStatus ) );
167  stop();
168  return;
169  }
170  //qDebug( "DEBUG[%s]: GPS data successfully read", Q_FUNC_INFO );
171  //qDebug( "DEBUG[%s]: SET=%s", Q_FUNC_INFO, qPrintable( QString::number( psGpsData->set, 16 ) ) );
172 
173  // Do not process data if paused
174  if( bPaused ) continue;
175 
176  // Check data status
177  if( !( psGpsData->set & PACKET_SET ) ) continue; // We need a valid packet
178  emit signalActivity();
179 
180  // Check device data
181  // NOTE: ( psGpsData->set & DEVICE_SET ) is unreliable; let's use an alternate method
182  if( psGpsData->dev.path[0] == '\0' ) continue; // We MUST have a device/source name
183  QString __qsSource = QString::fromLatin1( psGpsData->dev.path );
184  //qDebug( "DEBUG[%s]: GPS data are available from source %s", Q_FUNC_INFO, qPrintable( __qsSource ) );
185 
186  // Check source (filter)
187  if( !qsSource.isEmpty() && qsSource != __qsSource ) continue;
188 
189  // Check position/course data
190  if( psGpsData->set & (TIME_SET|LATLON_SET|ALTITUDE_SET|TRACK_SET|SPEED_SET|CLIMB_SET) )
191  {
192  CDeviceDataFix __oDeviceDataFix( __qsSource );
193  __oDeviceDataFix.setSourceType( CDeviceDataSource::GPS );
194 
195  // Fix type
196  {
197  int __eFixType = CDeviceDataFix::FIX_UNDEFINED;
198  if( psGpsData->set & STATUS_SET )
199  {
200  __eFixType &= ~CDeviceDataFix::FIX_UNDEFINED;
201 #if GPSD_API_MAJOR_VERSION >= 10
202  switch( psGpsData->fix.status )
203 #else
204  switch( psGpsData->status )
205 #endif
206  {
207  case STATUS_NO_FIX: __eFixType |= CDeviceDataFix::FIX_NONE; break;
208  case STATUS_FIX: __eFixType |= CDeviceDataFix::FIX_2D; break;
210  default:;
211  }
212  }
213  if( psGpsData->fix.mode != MODE_NOT_SEEN )
214  {
215  __eFixType &= ~CDeviceDataFix::FIX_UNDEFINED;
216  switch( psGpsData->fix.mode )
217  {
218  case MODE_NO_FIX: __eFixType |= CDeviceDataFix::FIX_NONE; break;
219  case MODE_2D: __eFixType |= CDeviceDataFix::FIX_2D; break;
220  case MODE_3D: __eFixType |= CDeviceDataFix::FIX_2D | CDeviceDataFix::FIX_3D; break;
221  default:;
222  }
223  }
224  __oDeviceDataFix.setType( __eFixType );
225  }
226 
227  // Time
228 #if GPSD_API_MAJOR_VERSION >= 9
229  if( psGpsData->fix.time.tv_sec > 0 ) __oDeviceDataFix.setTime( psGpsData->fix.time.tv_sec, psGpsData->fix.time.tv_nsec );
230 #else
231  if( !std::isnan( psGpsData->fix.time ) && psGpsData->fix.time > 0.0 ) __oDeviceDataFix.setTime( psGpsData->fix.time );
232 #endif
233 
234  // Position
235  if( !std::isnan( psGpsData->fix.longitude ) && !std::isnan( psGpsData->fix.latitude ) )
236  __oDeviceDataFix.setPosition( psGpsData->fix.longitude, psGpsData->fix.latitude,
237  !std::isnan( psGpsData->fix.altitude ) ? psGpsData->fix.altitude : CDataPosition::UNDEFINED_ELEVATION );
238 
239  // Course
240  if( !std::isnan( psGpsData->fix.track ) ) __oDeviceDataFix.setBearing( psGpsData->fix.track );
241  if( !std::isnan( psGpsData->fix.speed ) && fabs( psGpsData->fix.speed ) > 0.0 ) __oDeviceDataFix.setSpeed( psGpsData->fix.speed );
242  if( !std::isnan( psGpsData->fix.climb ) && fabs( psGpsData->fix.climb ) > 0.0 ) __oDeviceDataFix.setSpeedVertical( psGpsData->fix.climb );
243 
244  // Errors
245  if( !std::isnan( psGpsData->fix.ept ) && psGpsData->fix.ept > 0.0 ) __oDeviceDataFix.setErrorTime( psGpsData->fix.ept );
246  if( !std::isnan( psGpsData->fix.epx ) && !std::isnan( psGpsData->fix.epy )
247  && ( psGpsData->fix.epx > 0.0 || psGpsData->fix.epy > 0.0 ) )
248  __oDeviceDataFix.setErrorPosition( sqrt( psGpsData->fix.epx*psGpsData->fix.epx + psGpsData->fix.epy*psGpsData->fix.epy ),
249  !std::isnan( psGpsData->fix.epv ) && psGpsData->fix.epv > 0.0 ? psGpsData->fix.epv : CDataValidity::UNDEFINED_VALUE );
250  if( !std::isnan( psGpsData->fix.epd ) && psGpsData->fix.epd > 0.0 ) __oDeviceDataFix.setErrorBearing( psGpsData->fix.epd );
251  if( !std::isnan( psGpsData->fix.eps ) && psGpsData->fix.eps > 0.0 )
252  __oDeviceDataFix.setErrorSpeed( psGpsData->fix.eps,
253  !std::isnan( psGpsData->fix.epc ) && psGpsData->fix.epc > 0.0 ? psGpsData->fix.epc : CDataValidity::UNDEFINED_VALUE );
254 
255  // DOPs
256  double __fdDopHorizontal = CDeviceDataDop::UNDEFINED_VALUE;
257  if( !std::isnan( psGpsData->dop.hdop ) && psGpsData->dop.hdop > 0.0 ) __fdDopHorizontal = psGpsData->dop.hdop;
258  else if( !std::isnan( psGpsData->dop.xdop ) && psGpsData->dop.xdop > 0.0
259  && !std::isnan( psGpsData->dop.ydop ) && psGpsData->dop.ydop > 0.0 )
260  __fdDopHorizontal = sqrt( psGpsData->dop.xdop*psGpsData->dop.xdop + psGpsData->dop.ydop*psGpsData->dop.ydop );
261  __oDeviceDataFix.setDopPosition( __fdDopHorizontal,
262  !std::isnan( psGpsData->dop.vdop ) && psGpsData->dop.vdop > 0.0 ? psGpsData->dop.vdop : CDeviceDataDop::UNDEFINED_VALUE );
263  if( !std::isnan( psGpsData->dop.tdop ) && psGpsData->dop.tdop > 0.0 ) __oDeviceDataFix.setDopTime( psGpsData->dop.tdop );
264 
265  // Sources (satellites)
266  __oDeviceDataFix.setSources( psGpsData->satellites_visible, psGpsData->satellites_used );
267 
268  // [end]
269  emit signalDataFix( __oDeviceDataFix );
270  }
271 
272  // Check sky view data
273  if( psGpsData->set & SATELLITE_SET )
274  {
275  CDeviceDataSkyView __oDeviceDataSkyView( __qsSource );
276  __oDeviceDataSkyView.setSourceType( CDeviceDataSource::GPS );
277 
278  // Time
279 #if GPSD_API_MAJOR_VERSION >= 9
280  if( psGpsData->skyview_time.tv_sec > 0 ) __oDeviceDataSkyView.setTime( psGpsData->skyview_time.tv_sec, psGpsData->skyview_time.tv_nsec );
281 #else
282  if( !std::isnan( psGpsData->skyview_time ) && psGpsData->skyview_time > 0.0 ) __oDeviceDataSkyView.setTime( psGpsData->skyview_time );
283 #endif
284 
285  // Loop through satellites data
286  for( int __i = 0; __i < psGpsData->satellites_visible; __i++ )
287  {
288 #if GPSD_API_MAJOR_VERSION >= 6
289  int __iPRN = psGpsData->skyview[ __i ].PRN;
290  CDeviceDataSatellite __oDeviceDataSatellite( __iPRN );
291  __oDeviceDataSatellite.setAzimuth( psGpsData->skyview[ __i ].azimuth );
292  __oDeviceDataSatellite.setElevation( psGpsData->skyview[ __i ].elevation );
293  __oDeviceDataSatellite.setSignal( psGpsData->skyview[ __i ].ss );
294 #else
295  int __iPRN = psGpsData->PRN[ __i ];
296  CDeviceDataSatellite __oDeviceDataSatellite( __iPRN );
297  __oDeviceDataSatellite.setAzimuth( psGpsData->azimuth[ __i ] );
298  __oDeviceDataSatellite.setElevation( psGpsData->elevation[ __i ] );
299  __oDeviceDataSatellite.setSignal( psGpsData->ss[ __i ] );
300 #endif
301  bool __bUsed = false;
302  for( int __j = 0; __j < psGpsData->satellites_used; __j++ )
303  {
304 #if GPSD_API_MAJOR_VERSION >= 6
305  if( psGpsData->skyview[ __j ].used == __iPRN )
306 #else
307  if( psGpsData->used[ __j ] == __iPRN )
308 #endif
309  {
310  __bUsed = true;
311  break;
312  }
313  }
314  __oDeviceDataSatellite.setUsed( __bUsed );
315  __oDeviceDataSkyView.append( __oDeviceDataSatellite );
316  }
317 
318  // DOPs
319  double __fdDopHorizontal = CDeviceDataDop::UNDEFINED_VALUE;
320  if( !std::isnan( psGpsData->dop.hdop ) && psGpsData->dop.hdop > 0.0 ) __fdDopHorizontal = psGpsData->dop.hdop;
321  else if( !std::isnan( psGpsData->dop.xdop ) && psGpsData->dop.xdop > 0.0
322  && !std::isnan( psGpsData->dop.ydop ) && psGpsData->dop.ydop > 0.0 )
323  __fdDopHorizontal = sqrt( psGpsData->dop.xdop*psGpsData->dop.xdop + psGpsData->dop.ydop*psGpsData->dop.ydop );
324  __oDeviceDataSkyView.setDopPosition( __fdDopHorizontal,
325  !std::isnan( psGpsData->dop.vdop ) && psGpsData->dop.vdop > 0.0 ? psGpsData->dop.vdop : CDeviceDataDop::UNDEFINED_VALUE );
326  if( !std::isnan( psGpsData->dop.tdop ) && psGpsData->dop.tdop > 0.0 ) __oDeviceDataSkyView.setDopTime( psGpsData->dop.tdop );
327 
328  // [end]
329  emit signalDataSkyView( __oDeviceDataSkyView );
330  }
331  }
332  while( true ); // data-processing loop
333 
334  pqSocketNotifier->setEnabled( true );
335  __pqMutexDataChange->unlock();
336  //qDebug( "DEBUG[%s]: End", Q_FUNC_INFO );
337 }
338 
339 //
340 // OTHER
341 //
342 
344 {
345  bPaused = false;
346  if( pqSocketNotifier )
347  {
348  QObject::disconnect( pqSocketNotifier, 0, this, 0 );
349  pqSocketNotifier->setEnabled( false );
350  delete pqSocketNotifier;
351  pqSocketNotifier = 0;
352  }
353  if( psGpsData )
354  {
355  gps_stream( psGpsData, WATCH_DISABLE, NULL );
356  gps_close( psGpsData );
357  psGpsData = 0;
358  }
359  qDebug( "DEBUG[%s]: Device successfully stopped", Q_FUNC_INFO );
361  return QVCT::OK;
362 }
363 
365 {
366  if( psGpsData )
367  {
368  bPaused = !bPaused;
369  }
370  qDebug( "DEBUG[%s]: Device successfully paused", Q_FUNC_INFO );
372  return QVCT::OK;
373 }
374 
376 {
377  if( psGpsData ) return QVCT::OK;
378  int __iStatus = 0;
379  do // error-catching loop
380  {
381  bPaused = false;
382 
383  // Open device
384 #if GPSD_API_MAJOR_VERSION >= 5
385  __iStatus = gps_open( qsHost.toLocal8Bit().constData(), QString::number( iPort ).toLocal8Bit().constData(), &sGpsData );
386  psGpsData = &sGpsData;
387 #else
388  psGpsData = gps_open( qsHost.toLocal8Bit().constData(), QString::number( iPort ).toLocal8Bit().constData() );
389  if( !psGpsData ) __iStatus = -1;
390 #endif
391  if( __iStatus < 0 )
392  {
393  psGpsData = 0;
394  qCritical( "ERROR[%s]: Failed to open device; status=%d", Q_FUNC_INFO, __iStatus );
395  emit signalError( QString( tr("Failed to open device")+"; status=%1" ).arg( __iStatus ) );
396  break;
397  }
398 
399  // Initialize socket notifier
400 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
401  pqSocketNotifier = new QSocketNotifier( (qintptr)psGpsData->gps_fd, QSocketNotifier::Read );
402 #else
403  pqSocketNotifier = new QSocketNotifier( (quintptr)psGpsData->gps_fd, QSocketNotifier::Read );
404 #endif
405  QObject::connect( pqSocketNotifier, SIGNAL( activated(int) ), this, SLOT( slotProcessData(int) ) );
406  pqSocketNotifier->setEnabled( true );
407 
408  // Start GPS data streaming
409  // F***: Source filtering should be achieved using 'gps_stream' ad-hoc mechanism... except
410  // it requires 'gpsdclient.{h,c}' resources which are not available as part of 'libgps' (...)
411  // if( !qsSource.isEmpty() )
412  // {
413  // gpsd_source_spec( QString( qsHost+":"+QString::number( iPort )+":"+qsSource ).toAscii().data(), &sGpsSource );
414  // __iStatus = gps_stream( psGpsData, WATCH_DEVICE|WATCH_ENABLE|WATCH_NEWSTYLE, &sGpsSource );
415  // }
416  // else
417  // {
418  // __iStatus = gps_stream( psGpsData, WATCH_ENABLE|WATCH_NEWSTYLE, NULL );
419  // }
420  __iStatus = gps_stream( psGpsData, WATCH_ENABLE|WATCH_NEWSTYLE, NULL );
421  if( __iStatus < 0 )
422  {
423  qCritical( "ERROR[%s]: Failed to stream data from device; status=%d", Q_FUNC_INFO, __iStatus );
424  emit signalError( QString( tr("Failed to stream data from device")+"; status=%1" ).arg( __iStatus ) );
425  break;
426  }
427 
428  }
429  while( false ); // error-catching loop
430  if( __iStatus < 0 )
431  {
432  stop();
433  return QVCT::ERROR;
434  }
435 #ifndef USE_QT
436  qDebug( "DEBUG[%s]: Device successfully started; socket=%d", Q_FUNC_INFO, psGpsData->gps_fd );
437 #else
438  qDebug( "DEBUG[%s]: Device successfully started; socket=%p", Q_FUNC_INFO, psGpsData->gps_fd );
439 #endif
441  return QVCT::OK;
442 }
443 
445 {
446  if( !psGpsData ) return CDevice::STOP;
447  if( bPaused ) return CDevice::PAUSE;
448  return CDevice::START;
449 }
#define STATUS_DGPS_FIX
void setBearing(double _fdBearing)
Sets this course's bearing, in degrees.
Definition: CDataCourse.hpp:96
void setSpeed(double _fdSpeed, double _fdSpeedVertical=UNDEFINED_SPEED)
Sets this course's horizontal speed, in meters per second.
void setSpeedVertical(double _fdSpeedVertical)
Sets this course's vertical speed, in meters per second.
void setPosition(double _fdLongitude, double _fdLatitude, double _fdElevation=UNDEFINED_ELEVATION)
Sets new coordinates.
static constexpr double UNDEFINED_ELEVATION
Specific value for an undefined elevation.
void setTime(double _fdTime)
Sets the time, in seconds from Unix epoch.
Definition: CDataTime.cpp:60
static constexpr double UNDEFINED_VALUE
void setDopTime(double _fdDopTime)
Sets the time Dilution-of-Precision (TDOP)
void setDopPosition(double _fdDopHorizontal, double _fdDopVertical=UNDEFINED_VALUE)
Sets the position Dilution-of-Precision (HDOP, VDOP)
static const double UNDEFINED_VALUE
Specific value for an undefined component.
Fix data [source,time,position,course,DOPs,...].
void setErrorPosition(double _fdErrorHorizontal, double _fdErrorVertical=CDataValidity::UNDEFINED_VALUE)
Sets the (horizontal and vertical) position error, in meters.
void setErrorSpeed(double _fdErrorSpeed, double _fdErrorSpeedVertical=CDataValidity::UNDEFINED_VALUE)
Sets the (horizontal and vertical) speed error, in meters per second.
void setErrorBearing(double _fdErrorBearing)
Sets the bearing error, in degrees.
void setType(int _eType)
Sets the fix type.
void setErrorTime(double _fdErrorTime)
Sets the time error, in seconds.
void setSources(int _iSourcesSeen, int _iSourcesUsed)
Sets the sources count (most likely satellites)
Satellite data [PRN,signal,azimuth,elevation,etc.].
void setUsed(bool _bUsed)
Sets the satellite usage status.
void setElevation(double _fdElevation)
Sets the satellite elevation, in degrees.
void setAzimuth(double _fdAzimuth)
Sets the satellite azimuth, in degrees.
void setSignal(double _fdSignal)
Sets the satellite signal-to-noise ratio, in decibels.
Sky view data (satellites details)
void setSourceType(EType _eType)
Sets the source type.
virtual void refreshContent()
Refreshes the content of the underlying widget.
[UI] Route container's edit view
struct gps_data_t sGpsData
GPSD data.
bool bPaused
Pause status.
int iPort
Network port.
void parseQVCT(const QDomElement &_rqDomElement)
Retrieves the device's configuration from the given QVCT source (file)
CDeviceGpsdGps(const QString &_rqsName)
virtual ~CDeviceGpsdGps()
QVCT::EStatus setOperatingMode(CDevice::EOperatingMode _eOperatingMode)
Sets the device's operating mode.
QString qsSource
Source (filter)
QVCT::EStatus start()
Stop the device.
struct gps_data_t * psGpsData
GPSD data pointer.
virtual void showDetail()
Displays the device's details (in the appropriate widget/view)
QString qsHost
Network host.
virtual void showEdit()
Displays the device's edit (configuration) widget/view.
QVCT::EStatus stop()
Start the device.
QVCT::EStatus pause()
Pause the device.
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores the device's configuration to the given QVCT destination (file)
QSocketNotifier * pqSocketNotifier
Socket notifier.
CDevice::EOperatingMode status()
Returns the device's status (operating mode)
void slotProcessData(int)
Slots to process device data.
Generic navigation device (GPS, speedometer, compass, etc.)
Definition: CDevice.hpp:43
void signalDataFix(const CDeviceDataFix &_roDeviceDataFix)
Signal emitted by the device when an updated fix is available.
void signalActivity()
Signal emitted by the device when activity occures.
EOperatingMode
Device operating mode (stop, start, pause)
Definition: CDevice.hpp:58
@ PAUSE
Definition: CDevice.hpp:58
@ STOP
Definition: CDevice.hpp:58
@ START
Definition: CDevice.hpp:58
void signalDataSkyView(const CDeviceDataSkyView &_roDeviceDataSkyView)
Signal emitted by the device when an updated sky view is available.
void signalError(const QString &_rqsErrorMessage)
Signal emitted by the device when an error occured.
void signalOperatingMode(CDevice::EOperatingMode _eOperatingMode)
Signal emitted by the device when its operating mode changed.
void switchView(EView eView)
Displays the requested container/item details (switching to the appropriate widget)
@ DEVICE
Device overlay.
void switchView(EView eView)
Displays the requested overlay (switching to the appropriate tab)
void setOverlayObject(COverlayObject *_poOverlayObject)
Sets the overlay object to be displayed (and refreshes the underlying widget)
QString qsName
Object name.
static COverlayDetailView * useOverlayDetailView()
static CDeviceDetailView * useDeviceDetailView()
static QMutex * useMutexDataChange()
static COverlayListView * useOverlayListView()
EStatus
Definition: QVCT.hpp:41
@ ERROR
Definition: QVCT.hpp:41
@ OK
Definition: QVCT.hpp:41
@ CRITICAL
Definition: QVCT.hpp:41