1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
|
/**************************************************************************
* Copyright (C) 2006-2007 by Danny Kukawka *
* <dkukawka@suse.de>, <danny.kukawka@web.de> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of version 2 of the GNU General Public License *
* as published by the Free Software Foundation. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
/*!
* \file hardware.h
* \brief Headerfile for hardwareinfo.cpp. This file collect/hold all
* Hardware information as e.g. battery and ac state.
*/
/*!
* \class HardwareInfo
* \brief class for hardware information related funtionality
* \author Danny Kukawka, <dkukawka@suse.de>, <danny.kukawka@web.de>
* \date 2006-2007
*/
#ifndef _HARDWARE_H_
#define _HARDWARE_H_
// Global Header
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
// QT - Header
#include <qstring.h>
#include <qobject.h>
#include <qvaluelist.h>
#include <qptrlist.h>
#include <qdict.h>
// HAL Library
#include <hal/libhal.h>
#include "dbusHAL.h"
#include "hardware_battery.h"
#include "hardware_batteryCollection.h"
enum suspend_type {
SUSPEND2DISK,
SUSPEND2RAM,
STANDBY
};
enum cpufreq_type {
UNKNOWN_CPUFREQ = -1,
PERFORMANCE,
DYNAMIC,
POWERSAVE
};
enum device_type {
BATTERY,
AC_ADAPTER,
BUTTON_SLEEP,
BUTTON_POWER,
LID,
LAPTOP_PANEL,
UNKNOWN_DEVICE
};
enum ERROR_MSG {
DBUS_NO_RIGHTS,
DBUS_NOT_RUNNING,
DBUS_RUNNING
};
//! hold information if suspend/standby/pm actions are supported and allowed
/*!
* This dictionary contains information about the available pm capabilities and
* the related interfaces in HAL.
*/
typedef struct SuspendStates {
//! true if the machine support suspend2ram and the interface is available
bool suspend2ram;
//! true if the machine support suspend2ram, but no interface available
bool suspend2ram_can;
//! true if the machine support suspend2ram and PolicyKit allow to call the interface
int suspend2ram_allowed;
//! true if the machine support suspend2disk and the interface is available
bool suspend2disk;
//! true if the machine support suspend2disk, but no interface available
bool suspend2disk_can;
//! true if the machine support suspend2disk and PolicyKit allow to call the interface
int suspend2disk_allowed;
//! true if the machine support standby and the interface is available
bool standby;
//! true if the machine support standby, but no interface available
bool standby_can;
//! true if the machine support standby and PolicyKit allow to call the interface
int standby_allowed;
SuspendStates () {
suspend2ram = false;
suspend2ram_can = false;
suspend2ram_allowed = -1;
suspend2disk = false;
suspend2disk_can = false;
suspend2disk_allowed = -1;
standby = false;
standby_can = false;
standby_allowed = -1;
}
} SuspendStates;
class HardwareInfo : public QObject{
Q_OBJECT
private:
//! pointer to the dbusHAL connection class
dbusHAL *dbus_HAL;
//! hold udis of special hardware execpt batteries represented by a QString pairs (name,udi)
/*!
* This directory handle udis for known fixed devices as e.g ac adapter. This devices are
* currently available:
* \li acadapter
* \li lidclose
* \li laptop_panel
*/
QDict<QString> udis;
//! hold the UDIs of all hardware we handle atm
/*!
* This QStringList contains the list of UDIs we handle at the moment in this
* class. This should be used to handle device events from HAL for devices we
* want to monitor
*/
QStringList allUDIs;
//! hold information if suspend/standby/pm actions are supported and allowed
/*!
* This dictionary contains information about the available pm capabilities and
* the related interfaces in HAL.
*/
SuspendStates suspend_states;
QTime calledSuspend;
//! hold the list of pointers to all relevant batteries
QPtrList<Battery> BatteryList;
//! hold the information about all primary batteries
BatteryCollection *primaryBatteries;
//! hold the name of the CPU Freq governor from the last check
QString cpuFreqGovernor;
//! hold the ConsoleKit name/path of the actual session
QString consoleKitSession;
//! enum with the currently active CPU Freq policy
/*! This enum contains the enum with the currently set CPU Freq Policy. */
cpufreq_type currentCPUFreqPolicy;
//! the state of the ac adapter
/*!
* This boolean represent information about the AC adapter state.
* \li true: if AC adapter is present
* \li false: it AC adapter is not present
*/
bool acadapter;
//! the state of the lidclose button
/*!
* This boolean represent information about the Lid button state.
* \li true: if lid is closed
* \li false: else
*/
bool lidclose;
//! if the machine support APM
/*!
* This boolean represent information if the machine support APM or not.
* \li true: if APM supported
* \li false: else
*/
bool has_APM;
//! if the machine support ACPI
/*!
* This boolean represent information if the machine support ACPI or not.
* \li true: if ACPI supported
* \li false: else
*/
bool has_ACPI;
//! if the machine support PMU (ppc power management)
/*!
* This boolean represent information if the machine support PMU or not.
* \li true: if PMU supported
* \li false: else
*/
bool has_PMU;
//! if the machine support change CPU Freq via HAL interface
/*!
* This boolean represent information if the machine support change the
* CPU freqency via HAL.
* \li true: if supported
* \li false: else
*/
bool cpuFreq;
//! if the machine support change *SchedPowerSavings methodes via HAL interface
/*!
* This boolean represent information if the machine support change the
* SchedPowerSavings methodes via HAL.
* \li true: if supported
* \li false: else
*/
bool schedPowerSavings;
//! if the machine support change brightness
/*!
* This boolean represent information if the machine support brightness changes.
* \li true: if supported
* \li false: else
*/
bool brightness;
//! if brightness get controled via keyevents in hardware
/*!
* This boolean represent information if the machine handle brightness button
* and keyevents in hardware. If so KPowersave should ignore key events.
* \li true: if handled in hardware
* \li false: else
*/
bool brightness_in_hardware;
//! if the machine is a laptop
/*!
* This boolean represent information if the machine is a laptop.
* \li true: if the machine is a laptop
* \li false: else
*/
bool laptop;
//! if the current desktop session is active
/*!
* This boolean represent information if the current desktop session in
* Which KPowersave runs is marked in ConsoleKit as active or not.
* \li true: if active
* \li false: else
*/
bool sessionIsActive;
//! if the current user can use the CPU Freq interface
/*!
* This integer tell if the current user is allowed to change the
* CPU Frequency policy via the HAL interface
* \li 1: if allowed
* \li 0: if not allowed
* \li -1: if unknown (e.g. there is no policy/PolicyKit)
*/
int cpuFreqAllowed;
//! if the current user can use the brightness interface
/*!
* This integer tell if the current user is allowed to change the
* brightness via the HAL interface
* \li 1: if allowed
* \li 0: if not allowed
* \li -1: if unknown (e.g. there is no policy/PolicyKit)
*/
int brightnessAllowed;
//! Integer with the number of current brightness
/*! This contains the current brighness level. */
int currentBrightnessLevel;
//! Integer with the number of availabl brightness level
/*! This contains the number of available brightness levels for internal usage. */
int availableBrightnessLevels;
//! interger with the current warning level
int primaryBatteriesWarnLevel;
//! interger with the current low level
int primaryBatteriesLowLevel;
//! interger with the current critical level
int primaryBatteriesCriticalLevel;
// --> functions
//! check if the machine support ACPI/APM/PMU or not
void checkPowermanagement();
//! check the possible suspend/standby states
void checkSuspend();
//! check if the machine support change CPU Freq via HAL
void checkCPUFreq();
//! check the current brightness level
void checkCurrentBrightness();
//! check if the machine is a laptop
void checkIsLaptop();
//! initalise all hardware information
bool intialiseHWInfo();
//! reinit all hardware information
bool reinitHardwareInfos();
//! to check the current ConsoleKit session
bool checkConsoleKitSession();
//! to check if we should handle a device
bool checkIfHandleDevice ( QString _udi, int *type );
//! to set the CPUFreq governor
bool setCPUFreqGovernor( const char *governor );
//! to get the state of SchedPowerSave setting of kernel/HAL
bool getSchedPowerSavings();
//! to set the state of SchedPowerSave setting of kernel/HAL
bool setSchedPowerSavings( bool enable );
//! find and update a battery information
void updateBatteryValues (QString udi, QString property);
private slots:
//! to fetch events from D-Bus and handle them
void processMessage (msg_type type, QString message, QString value);
//! to update \ref primaryBatteries
void updatePrimaryBatteries ();
//! to set \ref update_info_primBattery_changed
void setPrimaryBatteriesChanges ();
//! check the state of the lidclose button
void checkLidcloseState();
//! check the state of the AC adapter
void checkACAdapterState();
//! check if brightness change is possible
void checkBrightness();
//! SLOT to handle the reconnect to D-Bus
void reconnectDBUS();
//! SLOT to forward signal about changed battery warning state
void emitBatteryWARNState (int type, int state);
//! SLOT to handle resume and forward a signal for resume
void handleResumeSignal (int result);
//! to emit signal for power button
void emitPowerButtonPressed();
//! to emit signal for sleep button
void emitSleepButtonPressed();
//! to emit signal for s2disk button
void emitS2diskButtonPressed();
//! to emit signal for session state
void emitSessionActiveState();
//! to handle signal for brightness Up buttons/keys
void brightnessUpPressed();
//! to handle signal for brightness Down buttons/keys
void brightnessDownPressed();
signals:
//! signal for larger data changes
void generalDataChanged();
//! emited if the CPU Freq Policy changed
void currentCPUFreqPolicyChanged();
//! signal the AC adapter
void ACStatus( bool );
//! signal for the lidclose button
void lidcloseStatus ( bool );
//! signal for pressed the power button
void powerButtonPressed ();
//! signal for pressed sleep (suspend2ram) button
void sleepButtonPressed ();
//! signal for pressed the suspend2disk (hibernate) button
void s2diskButtonPressed ();
// battery related signals
//! signal if the primary battery collection changed
void primaryBatteryChanged();
//! signal to inform about reaching a warning state
void batteryWARNState(int type, int state);
// Error signals
//! signal if the HAL daemon terminate and restart
void halRunning( bool );
//! signal if the D-Bus daemon terminate and restart
void dbusRunning( int );
//! signal if the IsActive state of
void desktopSessionIsActive (bool);
//! signal if we are back from resume
void resumed ( int success );
public:
// update related info --> need to be reset if the data was read
//! tells if the CPUFreq Policy changed
/*!
* This boolean represent information about CPUFreq Policy changes.
* \li true: if something changed
* \li false: if nothing changed (or this is reset to false if the message was consumed)
*/
bool update_info_cpufreq_policy_changed;
//! tells if the AC status changed
/*!
* This boolean represent information about AC status changes.
* \li true: if something changed
* \li false: if nothing changed (or this is reset to false if the message was consumed)
*/
bool update_info_ac_changed;
//! tells if the primary battery collection changed some values
/*!
* This boolean represent information about primary battery changes.
* \li true: if something changed
* \li false: if nothing changed (or this is reset to false if the message was consumed)
*/
bool update_info_primBattery_changed;
//! boolean which tell us if the D-Bus daemon was terminated
/*!
* This boolean contains information if the D-Bus daemon terminated and
* we recieved "dbus.terminate"
* \li true: If D-Bus terminated
* \li false: If D-Bus not terminated
*/
bool dbus_terminated;
//! boolean which tell us if the HAL daemon was terminated
/*!
* This boolean contains information if the HAL daemon terminated and
* we recieved "hal.terminate"
* \li true: If HAL terminated
* \li false: If HAL not terminated
*/
bool hal_terminated;
// --> functions
//! default constructor
HardwareInfo();
//! default destructor
~HardwareInfo();
// to get private members
//! get info about support of suspend/standby
SuspendStates getSuspendSupport() const;
//! get a pointer to the primary batteries
BatteryCollection* getPrimaryBatteries() const;
//! get all batteries
QPtrList<Battery> getAllBatteries() const;
//! check the currently set CPU Frequency Policy
cpufreq_type checkCurrentCPUFreqPolicy();
//! get max brightness level
int getMaxBrightnessLevel() const;
//! get current brightness level
int getCurrentBrightnessLevel() const;
//! get currently CPU Frequency Policy
int getCurrentCPUFreqPolicy() const;
//! if the user is allowed to change CPU Freq PolicyKit
int isCpuFreqAllowed ();
//! if org.freedesktop.Policy.Power has a owner
bool isPolicyPowerIfaceOwned();
//! get state of the AC adapter
bool getAcAdapter() const;
//! get the state of the lid button
bool getLidclose() const;
//! check if the machine is a latop
bool isLaptop() const;
//! check if there is a connection to D-Bus _and_ HAL
bool isOnline() const;
//! check if the machine support ACPI
bool hasACPI() const;
//! check if the machine support APM
bool hasAPM() const;
//! check if the machine support PMU
bool hasPMU() const;
//! check if the machine support change the CPU frequency
bool supportCPUFreq() const;
//! check if the machine support brightness changes
bool supportBrightness() const;
//! check if the current session is active
bool currentSessionIsActive() const;
// --> functions to call a HAL interface and trigger an action
//! execute/trigger a suspend via the HAL interface
bool suspend ( suspend_type suspend );
//! set the brightness via HAL interface
bool setBrightness ( int level, int percent = -1);
//! to set the brightness down
bool setBrightnessDown(int percentageStep = -1);
//! to set the brightness up
bool setBrightnessUp(int percentageStep = -1);
//! set the CPU frequency policy/speed
bool setCPUFreq ( cpufreq_type cpufreq, int limit = 51 );
//! call SetPowerSave method on HAL.
bool setPowerSave( bool on );
//! function to set warning states for the primary battery collection
void setPrimaryBatteriesWarningLevel (int _warn = -1, int _low = -1, int _crit = -1 );
};
#endif
|