-#include "irctrl.h"
#include <cstdlib>
-IrCtrl::IrCtrl()
+#include <sys/socket.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+
+#include <QSettings>
+#include <QByteArray>
+#include <QString>
+#include <QDebug>
+
+#include "irctrl.h"
+
+IrCtrl::IrCtrl(QObject *parent)
+ : QObject(parent)
{
- std::system("lircctl start");
+ QSettings settings;
+ m_killLircTimer.setInterval(
+ settings.value("idleTimeout", "300").toInt() * 1000);
+ m_killLircTimer.setSingleShot(true);
+ connect(&m_killLircTimer, SIGNAL(timeout()),
+ this, SLOT(stopLirc()));
+ startLirc();
+ m_killLircTimer.start();
}
-
+
IrCtrl::~IrCtrl()
{
- std::system("lircctl stop");
}
-void IrCtrl::setRemoteName(const QString &newRemoteName)
+void IrCtrl::sendCmd(const QString &cmd)
{
- this->remoteName = newRemoteName;
-}
+ if (!m_killLircTimer.isActive()) {
+ startLirc();
+ } else {
+ m_killLircTimer.stop();
+ }
-void IrCtrl::sendCmd0(bool)
-{
-}
+ QSettings settings;
+ QString remoteName = settings.value("remoteName", "").toString();
+ QString cmdStr = "SEND_ONCE " + remoteName + " " + cmd + "\n";
+ QByteArray buf = cmdStr.toAscii();
-void IrCtrl::sendCmd1(bool)
-{
-}
+ sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = INADDR_LOOPBACK;
+ addr.sin_port = LIRC_PORT;
+ int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sock == -1) {
+ qDebug() << "Socket open fail";
+ } else {
+ int c = ::connect(sock, (sockaddr*)&addr, sizeof(sockaddr_in));
+ if (c == 0) {
+ write(sock, buf.constData(), buf.count());
+ } else {
+ qDebug() << "Connect fail";
+ }
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+ }
-void IrCtrl::sendCmd2(bool)
-{
+ m_killLircTimer.start();
}
-void IrCtrl::sendCmd3(bool)
-{
-}
-void IrCtrl::sendCmd4(bool)
+void IrCtrl::stopLirc()
{
+ std::system("sudo /etc/init.d/lirc stop");
}
-void IrCtrl::sendCmd5(bool)
+void IrCtrl::startLirc()
{
+ std::system("sudo /etc/init.d/lirc start");
}
+