summaryrefslogtreecommitdiffstats
path: root/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmilo/kmilo_kvaio/kvaiodriverinterface.cpp')
-rw-r--r--kmilo/kmilo_kvaio/kvaiodriverinterface.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp b/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp
new file mode 100644
index 0000000..32da70a
--- /dev/null
+++ b/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp
@@ -0,0 +1,221 @@
+/* -*- C++ -*-
+
+ This file implements the KVaioDriverInterface class.
+ It provides an event-oriented wrapper for the kernel sonypi driver.
+
+ $ Author: Mirko Boehm $
+ $ Copyright: (C) 1996-2003, Mirko Boehm $
+ $ Contact: mirko@kde.org
+ http://www.kde.org
+ http://www.hackerbuero.org $
+ $ License: LGPL with the following explicit clarification:
+ This code may be linked against any version of the Qt toolkit
+ from Troll Tech, Norway. $
+
+ $Id$
+
+ * Portions of this code are
+ * (C) 2001-2002 Stelian Pop <stelian@popies.net> and
+ * (C) 2001-2002 Alcove <www.alcove.com>.
+ * Thanks to Stelian for the implementation of the sonypi driver.
+*/
+
+#include "kvaiodriverinterface.h"
+
+extern "C" {
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <X11/Xlib.h>
+//#include <X11/extensions/XTest.h>
+
+#include "./sonypi.h"
+}
+
+#include <qsocketnotifier.h>
+#include <kdebug.h>
+
+// Taken from Stelian Pop's spicctrl utility:
+
+/* Have our own definition of ioctls... */
+
+/* get/set brightness */
+#define SONYPI_IOCGBRT _IOR('v', 0, __u8)
+#define SONYPI_IOCSBRT _IOW('v', 0, __u8)
+
+/* get battery full capacity/remaining capacity */
+#define SONYPI_IOCGBAT1CAP _IOR('v', 2, __u16)
+#define SONYPI_IOCGBAT1REM _IOR('v', 3, __u16)
+#define SONYPI_IOCGBAT2CAP _IOR('v', 4, __u16)
+#define SONYPI_IOCGBAT2REM _IOR('v', 5, __u16)
+
+/* get battery flags: battery1/battery2/ac adapter present */
+#define SONYPI_BFLAGS_B1 0x01
+#define SONYPI_BFLAGS_B2 0x02
+#define SONYPI_BFLAGS_AC 0x04
+#define SONYPI_IOCGBATFLAGS _IOR('v', 7, __u8)
+
+/* get/set bluetooth subsystem state on/off */
+#define SONYPI_IOCGBLUE _IOR('v', 8, __u8)
+#define SONYPI_IOCSBLUE _IOW('v', 9, __u8)
+
+KVaioDriverInterface::KVaioDriverInterface(QObject *parent)
+ : QObject(parent),
+ mFd(0),
+ mNotifier(0)
+{
+}
+
+bool KVaioDriverInterface::connectToDriver(bool listen)
+{
+ const char* DriverFile = "/dev/sonypi";
+
+ mFd = open(DriverFile, O_RDONLY);
+
+ // mFd = open(DriverFile, O_RDWR);
+
+ if(mFd == -1)
+ {
+ kdDebug() << "KVaio: Failed to open /dev/sonypi: "
+ << strerror(errno) << "." << endl;
+ return false;
+ }
+
+ fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) | O_ASYNC);
+
+ if(listen)
+ {
+ mNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read, this);
+ connect(mNotifier, SIGNAL(activated(int)), SLOT(socketActivated(int)));
+ }
+ return true;
+}
+
+void KVaioDriverInterface::disconnectFromDriver()
+{
+ delete mNotifier;
+ mNotifier = 0;
+
+ if(mFd!=0)
+ {
+ close(mFd);
+ mFd = 0;
+ }
+}
+
+void KVaioDriverInterface::socketActivated(int)
+{
+ unsigned char events[8];
+ int count;
+
+ do {
+ count = read(mFd, &events, sizeof(events));
+ for(int index = 0; index<count; index++)
+ {
+ emit(vaioEvent(events[index]));
+ }
+ } while(count==sizeof(events));
+}
+
+int KVaioDriverInterface::brightness()
+{
+ unsigned char value = 0;
+ int result=0;
+
+ result = ioctl(mFd, SONYPI_IOCGBRT, &value);
+
+ if (result >= 0)
+ {
+ return value;
+ } else {
+ return -1;
+ }
+
+}
+
+void KVaioDriverInterface::setBrightness(int value)
+{
+ static unsigned char cache; // to avoid unnecessary updates
+ int result;
+ unsigned char value8 = 0;
+
+ if(value<0) value=0;
+ if(value>255) value=255;
+
+ value8 = __u8(value);
+
+ if(value8 != cache)
+ {
+ result = ioctl(mFd, SONYPI_IOCSBRT, &value8);
+
+ if(result<0)
+ {
+ kdDebug() << "KVaioDriverInterface::setBrightness: ioctl failed."
+ << endl;
+ }
+ cache = value8;
+ }
+}
+
+bool KVaioDriverInterface::getBatteryStatus(
+ bool& bat1Avail, int& bat1Remaining, int& bat1Max,
+ bool& bat2Avail, int& bat2Remaining, int& bat2Max,
+ bool& acConnected)
+{
+ unsigned char batFlags = 0;
+
+ bool retval = true;
+
+ if(ioctl(mFd, SONYPI_IOCGBATFLAGS, &batFlags)<0)
+ {
+ retval = false;
+ } else {
+ __u16 rem1 = 0, rem2 = 0, cap1 = 0, cap2 = 0;
+
+ bat1Avail = batFlags & SONYPI_BFLAGS_B1;
+ bat2Avail = batFlags & SONYPI_BFLAGS_B2;
+ acConnected = batFlags & SONYPI_BFLAGS_AC;
+
+// kdDebug() << "KVaioDriverInterface::getBatteryStatus: battery 1: "
+// << (bat1Avail ? "available" : "not available") << endl
+// << " battery 2: "
+// << (bat2Avail ? "available" : "not available") << endl
+// << " AC adapter: "
+// << (acConnected ? "connected" : "connected")
+// << "." << endl;
+
+ if(bat1Avail
+ && ioctl(mFd, SONYPI_IOCGBAT1CAP, &cap1) >= 0
+ && ioctl(mFd, SONYPI_IOCGBAT1REM, &rem1) >= 0)
+ {
+ bat1Max = cap1;
+ bat1Remaining = rem1;
+ } else {
+ bat1Remaining = 0;
+ bat1Max = 0;
+ retval = false;
+ }
+
+ if(bat2Avail
+ && ioctl(mFd, SONYPI_IOCGBAT2CAP, &cap2) >= 0
+ && ioctl(mFd, SONYPI_IOCGBAT2REM, &rem2) >= 0)
+ {
+ bat2Max = cap2;
+ bat2Remaining = rem2;
+ } else {
+ bat2Remaining = 0;
+ bat2Max = 0;
+ retval = false;
+ }
+ }
+
+ return retval;
+}
+
+#include "kvaiodriverinterface.moc"
+