Lirc timeout mechanism
[irwi] / src / irctrl_p.cpp
1 #include <cstdlib>
2
3 #include <QTcpSocket>
4 #include <QHostAddress>
5 #include <QAbstractSocket>
6 #include <QSettings>
7 #include <QTimer>
8
9 #include "irctrl_p.h"
10
11 IrCtrlPrivate::IrCtrlPrivate()
12     : settings(NULL)
13 {
14     settings = new QSettings(this);
15
16     killLircTimer = new QTimer(this);
17     killLircTimer->setInterval(
18             settings->value("idleTimeout", 300).toInt() * 1000);
19     killLircTimer->setSingleShot(true);
20     connect(killLircTimer, SIGNAL(timeout()), this, SLOT(stopLirc()));
21     startLirc();
22     killLircTimer->start();
23 }
24
25 IrCtrlPrivate::~IrCtrlPrivate()
26 {
27     delete settings;
28     settings = NULL;
29     delete killLircTimer;
30     stopLirc();
31 }
32
33 void IrCtrlPrivate::stopLirc()
34 {
35     std::system("sudo /etc/init.d/lirc stop");
36 }
37
38 void IrCtrlPrivate::startLirc()
39 {
40     std::system("sudo /etc/init.d/lirc start");
41 }
42
43 void IrCtrlPrivate::genericSendCmd(const QString &commandName)
44 {
45     if (!killLircTimer->isActive()) {
46         startLirc();
47     } else {
48         killLircTimer->stop();
49     }
50
51     QTcpSocket sock;
52     sock.setSocketOption(QAbstractSocket::LowDelayOption, 1);
53     sock.connectToHost(QHostAddress::LocalHost, 
54             settings->value("lircPort", LIRC_PORT).toInt(),
55             QIODevice::WriteOnly|QIODevice::Unbuffered);
56     sock.waitForConnected();
57     QString remoteName =
58         settings->value("remoteName", "REMOTE_NAME_MISSING").toString();
59     QString cmd = "SEND_ONCE " + remoteName + " " + commandName + "\n";
60     sock.write(cmd.toAscii());
61     sock.waitForBytesWritten();
62     sock.close();
63
64     killLircTimer->start();
65 }
66
67