1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd and/or its subsidiary(-ies).
4** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
5** Contact: http://www.qt-project.org/legal
6**
7** This file is part of the QtSystems module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL21$
10** Commercial License Usage
11** Licensees holding valid commercial Qt licenses may use this file in
12** accordance with the commercial license agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and The Qt Company. For licensing terms
15** and conditions see http://www.qt.io/terms-conditions. For further
16** information use the contact form at http://www.qt.io/contact-us.
17**
18** GNU Lesser General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU Lesser
20** General Public License version 2.1 or version 3 as published by the Free
21** Software Foundation and appearing in the file LICENSE.LGPLv21 and
22** LICENSE.LGPLv3 included in the packaging of this file. Please review the
23** following information to ensure the GNU Lesser General Public License
24** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
25** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
26**
27** As a special exception, The Qt Company gives you certain additional
28** rights. These rights are described in The Qt Company LGPL Exception
29** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
30**
31** $QT_END_LICENSE$
32**
33****************************************************************************/
34
35#include "qbatteryinfo.h"
36
37#include <QtCore/qnumeric.h>
38
39#if defined(QT_SIMULATOR)
40# include "simulator/qsysteminfo_simulator_p.h"
41#elif defined(Q_OS_LINUX)
42#if defined(QT_NO_UPOWER)
43#include "linux/qbatteryinfo_linux_p.h"
44#else
45#include "linux/qbatteryinfo_upower_p.h"
46#endif
47#elif defined(Q_OS_WIN)
48# include "windows/qbatteryinfo_win_p.h"
49#elif defined(Q_OS_MAC)
50# include "mac/qbatteryinfo_mac_p.h"
51#else
52QT_BEGIN_NAMESPACE
53class QBatteryInfoPrivate
54{
55public:
56 QBatteryInfoPrivate(QBatteryInfo *) {}
57 QBatteryInfoPrivate(int batteryIndex, QBatteryInfo *): index(batteryIndex) {}
58
59 int batteryCount() { return -1; }
60 int batteryIndex() { return index; }
61 bool isValid() { return false; }
62 void setBatteryIndex(int batteryIndex) { index = batteryIndex; }
63 int currentFlow() { return 0; }
64 int cycleCount() { return -1; }
65 int maximumCapacity() { return -1; }
66 int remainingCapacity() { return -1; }
67 int remainingChargingTime() { return -1; }
68 int voltage() { return -1; }
69 QBatteryInfo::ChargerType chargerType() { return QBatteryInfo::UnknownCharger; }
70 QBatteryInfo::ChargingState chargingState() { return QBatteryInfo::UnknownChargingState; }
71 QBatteryInfo::LevelStatus levelStatus() { return QBatteryInfo::LevelUnknown; }
72 QBatteryInfo::Health health() { return QBatteryInfo::HealthUnknown; }
73 float temperature() { return qQNaN(); }
74private:
75 int index;
76};
77QT_END_NAMESPACE
78#endif
79
80#include <QtCore/qmetaobject.h>
81
82QT_BEGIN_NAMESPACE
83
84/*!
85 \class QBatteryInfo
86 \inmodule QtSystemInfo
87 \brief The QBatteryInfo class provides various information about the batteries.
88 \ingroup systeminfo
89
90 Note that on some platforms, listening to the signals could lead to a heavy CPU usage. Therefore,
91 you are strongly suggested to disconnect the signals when no longer needed in your application.
92
93 Battery index starts at \c 0, which indicates the first battery.
94*/
95
96/*!
97 \enum QBatteryInfo::ChargerType
98 This enum describes the type of charger used.
99
100 \value UnknownCharger The charger type is unknown, or no charger.
101 \value WallCharger Using wall (mains) charger.
102 \value USBCharger Using USB charger when the system cannot differentiate the current.
103 \value VariableCurrentCharger Using variable current charger such as bicycle or solar.
104*/
105
106/*!
107 \enum QBatteryInfo::ChargingState
108 This enum describes the charging state.
109
110 \value UnknownChargingState The charging state is unknown or charging error occured.
111 \value Charging The battery is charging.
112 \value IdleChargingState The battery is idle (neither Charging nor Discharging)
113 \value Discharging The battery is discharging.
114*/
115
116/*!
117 \enum QBatteryInfo::LevelStatus
118 This enum describes the level status of the battery.
119
120 \value LevelUnknown Battery level undetermined.
121 \value LevelEmpty Battery is considered be empty and device needs to shut down.
122 \value LevelLow Battery level is low and warnings need to be issued to the user.
123 \value LevelOk Battery level is Ok. It is above "Low" but not "Full".
124 \value LevelFull Battery is fully charged.
125*/
126
127/*!
128 \enum QBatteryInfo::Health
129 This enum describes the health of the battery.
130
131 \value HealthUnknown Battery health undetermined
132 \value HealthOk Battery health is OK
133 \value HealthBad Battery health is bad
134*/
135
136/*!
137 Constructs a \l QBatteryInfo object with the given \a parent. The \l batteryIndex()
138 will default to \c 0.
139*/
140QBatteryInfo::QBatteryInfo(QObject *parent)
141 : QObject(parent)
142#if !defined(QT_SIMULATOR)
143 , d_ptr(new QBatteryInfoPrivate(this))
144#else
145 , d_ptr(new QBatteryInfoSimulator(this))
146#endif // QT_SIMULATOR
147
148{
149}
150
151/*!
152 Constructs a \l QBatteryInfo object with the given \a batteryIndex and \a parent.
153*/
154QBatteryInfo::QBatteryInfo(int batteryIndex, QObject *parent)
155 : QObject(parent)
156#if !defined(QT_SIMULATOR)
157 , d_ptr(new QBatteryInfoPrivate(batteryIndex, this))
158#else
159 , d_ptr(new QBatteryInfoSimulator(this))
160#endif // QT_SIMULATOR
161
162{
163}
164
165/*!
166 Destroys the object
167*/
168QBatteryInfo::~QBatteryInfo()
169{
170}
171
172/*!
173 \property QBatteryInfo::batteryCount
174 \brief The number of batteries available.
175
176 In case of an error or if the information is not available \c -1 is returned.
177*/
178int QBatteryInfo::batteryCount() const
179{
180 return d_ptr->batteryCount();
181}
182
183/*!
184 \property QBatteryInfo::batteryIndex
185 \brief The current battery index
186
187 The first battery is represented by \c 0.
188*/
189int QBatteryInfo::batteryIndex() const
190{
191 return d_ptr->batteryIndex();
192}
193
194void QBatteryInfo::setBatteryIndex(int batteryIndex)
195{
196 d_ptr->setBatteryIndex(batteryIndex);
197}
198
199/*!
200 \property QBatteryInfo::valid
201 \brief The validity of this instance
202
203 If this property returns \c false \l batteryIndex() is the only other method that will return
204 a valid value. All other methods will return default or invalid values and should not be relied
205 upon for displaying to the user or for comparisons.
206*/
207bool QBatteryInfo::isValid() const
208{
209 return d_ptr->isValid();
210}
211
212/*!
213 \property QBatteryInfo::currentFlow
214 \brief The current flow of the battery
215
216 This value is measured in milliamperes (mA). A positive returned value means the battery is
217 discharging, while a negative value means the battery is charging. In case of an error or if the
218 information is not available \c 0 is returned.
219*/
220int QBatteryInfo::currentFlow() const
221{
222 return d_ptr->currentFlow();
223}
224
225/*!
226 \property QBatteryInfo::level
227 \brief The level of the battery as a percentage
228
229 In case of an error or if the information is not available \c -1 is returned.
230
231 \sa maximumCapacity(), remainingCapacity(), levelStatus()
232*/
233int QBatteryInfo::level() const
234{
235 return d_ptr->level();
236}
237
238/*!
239 \property QBatteryInfo::cycleCount
240 \brief The cycle count of the battery
241
242 In case of an error or if the information is not available \c -1 is returned.
243 */
244int QBatteryInfo::cycleCount() const
245{
246 return d_ptr->cycleCount();
247}
248
249/*!
250 \property QBatteryInfo::maximumCapacity
251 \brief The maximum capacity of the battery
252
253 This value is measured in mAh. In case of an error or if the information is not available \c -1
254 is returned.
255
256 \sa remainingCapacity(), level(), levelStatus()
257*/
258int QBatteryInfo::maximumCapacity() const
259{
260 return d_ptr->maximumCapacity();
261}
262
263/*!
264 \property QBatteryInfo::remainingCapacity
265 \brief The remaining capacity of the battery
266
267 This value is measured in mAh. In case of an error or if the information is not available \c -1
268 is returned.
269
270 \sa maximumCapacity(), level(), levelStatus()
271*/
272int QBatteryInfo::remainingCapacity() const
273{
274 return d_ptr->remainingCapacity();
275}
276
277/*!
278 \property QBatteryInfo::remainingChargingTime
279 \brief The remaining charging time needed for the battery
280
281 This value is measured in seconds. If the battery is full or not charging \c 0 is returned. In
282 case of an error or if the information is not available \c -1 is returned.
283*/
284int QBatteryInfo::remainingChargingTime() const
285{
286 return d_ptr->remainingChargingTime();
287}
288
289/*!
290 \property QBatteryInfo::voltage
291 \brief The voltage of the battery
292
293 This value is measured in millivolts (mV). In case of an error or if the information is not
294 available \c -1 is returned.
295*/
296int QBatteryInfo::voltage() const
297{
298 return d_ptr->voltage();
299}
300
301/*!
302 \property QBatteryInfo::chargerType
303 \brief The type of the charger
304*/
305QBatteryInfo::ChargerType QBatteryInfo::chargerType() const
306{
307 return d_ptr->chargerType();
308}
309
310/*!
311 \property QBatteryInfo::chargingState
312 \brief The charging state of the battery
313*/
314QBatteryInfo::ChargingState QBatteryInfo::chargingState() const
315{
316 return d_ptr->chargingState();
317}
318
319/*!
320 \property QBatteryInfo::levelStatus
321 \brief The level status of the battery
322
323 This represents an Empty/Low/Full style representation of the \l level().
324
325 \sa maximumCapacity(), remainingCapacity(), level()
326*/
327QBatteryInfo::LevelStatus QBatteryInfo::levelStatus() const
328{
329 return d_ptr->levelStatus();
330}
331
332/*!
333 \property QBatteryInfo::health
334 \brief The health of the battery
335*/
336QBatteryInfo::Health QBatteryInfo::health() const
337{
338 return d_ptr->health();
339}
340
341/*!
342 \property QBatteryInfo::temperature
343 \brief The temperature of the battery
344
345 This value is measured in Celsius. In case of an error or if the information is not available,
346 \c NaN is returned.
347
348 \sa qQNaN()
349 */
350float QBatteryInfo::temperature() const
351{
352 return d_ptr->temperature();
353}
354
355/*!
356 \internal
357
358 Returns the signal that corresponds to \a proxySignal in the
359 meta-object of the \a sourceObject.
360*/
361QMetaMethod proxyToSourceSignal(const QMetaMethod &proxySignal, QObject *sourceObject)
362{
363 if (!proxySignal.isValid())
364 return proxySignal;
365 Q_ASSERT(proxySignal.methodType() == QMetaMethod::Signal);
366 Q_ASSERT(sourceObject != 0);
367 const QMetaObject *sourceMeta = sourceObject->metaObject();
368 int sourceIndex = sourceMeta->indexOfSignal(signal: proxySignal.methodSignature());
369 Q_ASSERT(sourceIndex != -1);
370 return sourceMeta->method(index: sourceIndex);
371}
372
373/*!
374 \internal
375*/
376void QBatteryInfo::connectNotify(const QMetaMethod &signal)
377{
378#if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC)
379 QMetaMethod sourceSignal = proxyToSourceSignal(proxySignal: signal, sourceObject: d_ptr);
380 connect(sender: d_ptr, signal: sourceSignal, receiver: this, method: signal, type: Qt::UniqueConnection);
381#else
382 Q_UNUSED(signal)
383#endif
384}
385
386/*!
387 \internal
388*/
389void QBatteryInfo::disconnectNotify(const QMetaMethod &signal)
390{
391#if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC)
392 // We can only disconnect with the private implementation, when there is no receivers for the signal.
393 if (isSignalConnected(signal))
394 return;
395
396 QMetaMethod sourceSignal = proxyToSourceSignal(proxySignal: signal, sourceObject: d_ptr);
397 disconnect(sender: d_ptr, signal: sourceSignal, receiver: this, member: signal);
398#else
399 Q_UNUSED(signal)
400#endif
401}
402
403QT_END_NAMESPACE
404

source code of qtsystems/src/systeminfo/qbatteryinfo.cpp