mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-07 09:23:22 +02:00
180 lines
4.1 KiB
C++
180 lines
4.1 KiB
C++
// btsentinel4web.cpp
|
|
//
|
|
// Rivendell switcher driver for the BroadcastTools Sentinel4Web AES switcher
|
|
//
|
|
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License version 2 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
//
|
|
|
|
#include <stdlib.h>
|
|
#include <syslog.h>
|
|
|
|
#include <rdapplication.h>
|
|
#include <rddb.h>
|
|
|
|
#include "btsentinel4web.h"
|
|
#include "globals.h"
|
|
|
|
BtSentinel4Web::BtSentinel4Web(RDMatrix *matrix,QObject *parent)
|
|
: Switcher(matrix,parent)
|
|
{
|
|
bt_address=matrix->ipAddress(RDMatrix::Primary);
|
|
bt_port=matrix->ipPort(RDMatrix::Primary);
|
|
|
|
//
|
|
// Socket
|
|
//
|
|
bt_socket=new QTcpSocket(this);
|
|
connect(bt_socket,SIGNAL(connected()),this,SLOT(connectedData()));
|
|
connect(bt_socket,SIGNAL(error(QAbstractSocket::SocketError)),
|
|
this,SLOT(errorData(QAbstractSocket::SocketError)));
|
|
connect(bt_socket,SIGNAL(readyRead()),this,SLOT(readyReadData()));
|
|
|
|
//
|
|
// Watchdog
|
|
//
|
|
bt_watchdog_timer=new QTimer(this);
|
|
connect(bt_watchdog_timer,SIGNAL(timeout()),this,SLOT(watchdogData()));
|
|
|
|
bt_watchdog_reset_timer=new QTimer(this);
|
|
connect(bt_watchdog_reset_timer,SIGNAL(timeout()),this,SLOT(watchdogResetData()));
|
|
|
|
|
|
bt_socket->connectToHost(bt_address.toString(),bt_port);
|
|
bt_watchdog_timer->start(BTSENTINEL4WEB_WATCHDOG_INTERVAL,true);
|
|
}
|
|
|
|
|
|
BtSentinel4Web::~BtSentinel4Web()
|
|
{
|
|
delete bt_socket;
|
|
}
|
|
|
|
|
|
RDMatrix::Type BtSentinel4Web::type()
|
|
{
|
|
return RDMatrix::BtSentinel4Web;
|
|
}
|
|
|
|
|
|
unsigned BtSentinel4Web::gpiQuantity()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
unsigned BtSentinel4Web::gpoQuantity()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
bool BtSentinel4Web::primaryTtyActive()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
|
|
bool BtSentinel4Web::secondaryTtyActive()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::processCommand(RDMacro *cmd)
|
|
{
|
|
unsigned input;
|
|
unsigned output;
|
|
QString msg;
|
|
|
|
switch(cmd->command()) {
|
|
case RDMacro::ST:
|
|
input=cmd->arg(1).toUInt();
|
|
if(input>BTSENTINEL4WEB_INPUTS) {
|
|
cmd->acknowledge(false);
|
|
emit rmlEcho(cmd);
|
|
return;
|
|
}
|
|
output=cmd->arg(2).toUInt();
|
|
if(output>BTSENTINEL4WEB_OUTPUTS) {
|
|
cmd->acknowledge(false);
|
|
emit rmlEcho(cmd);
|
|
return;
|
|
}
|
|
if(input==0) {
|
|
msg="*0MA";
|
|
}
|
|
else {
|
|
msg=QString().sprintf("*0%02u",input);
|
|
}
|
|
bt_socket->writeBlock(msg,msg.length());
|
|
cmd->acknowledge(true);
|
|
emit rmlEcho(cmd);
|
|
break;
|
|
|
|
default:
|
|
cmd->acknowledge(false);
|
|
emit rmlEcho(cmd);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::connectedData()
|
|
{
|
|
bt_socket->writeBlock("*0U",3);
|
|
rda->syslog(LOG_INFO,"connected to BT Sentinel4Web device at %s",
|
|
(const char *)bt_socket->peerAddress().toString().toUtf8());
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::errorData(QAbstractSocket::SocketError err)
|
|
{
|
|
watchdogData();
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::readyReadData()
|
|
{
|
|
char data[1500];
|
|
|
|
while(bt_socket->readBlock(data,1500)>0);
|
|
bt_watchdog_timer->stop();
|
|
bt_socket->writeBlock("*0U",3);
|
|
bt_watchdog_timer->start(BTSENTINEL4WEB_WATCHDOG_INTERVAL,true);
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::watchdogData()
|
|
{
|
|
rda->syslog(LOG_WARNING,"lost connection to BT Sentinel4Web device at %s",
|
|
(const char *)bt_socket->peerAddress().toString().toUtf8());
|
|
bt_watchdog_reset_timer->start(BTSENTINEL4WEB_WATCHDOG_INTERVAL,true);
|
|
}
|
|
|
|
|
|
void BtSentinel4Web::watchdogResetData()
|
|
{
|
|
delete bt_socket;
|
|
bt_socket=new QTcpSocket(this);
|
|
connect(bt_socket,SIGNAL(connected()),this,SLOT(connectedData()));
|
|
connect(bt_socket,SIGNAL(error(QAbstractSocket::SocketError)),
|
|
this,SLOT(errorData(QAbstractSocket::SocketError)));
|
|
connect(bt_socket,SIGNAL(readyRead()),this,SLOT(readyReadData()));
|
|
|
|
bt_socket->connectToHost(bt_address.toString(),bt_port);
|
|
bt_watchdog_timer->start(BTSENTINEL4WEB_WATCHDOG_INTERVAL,true);
|
|
}
|