2022-10-30 Fred Gleason <fredg@paravelsystems.com>

* Reimplemented the 'Request Deck Status' command using
	'RDCatchEvent'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason
2022-10-30 14:54:29 -04:00
parent d38349cf39
commit d65517215b
14 changed files with 413 additions and 72 deletions

View File

@@ -289,6 +289,8 @@ MainObject::MainObject(QObject *parent)
this,SLOT(gpiStateChangedData(int,int,bool)));
connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)),
this,SLOT(notificationReceivedData(RDNotification *)));
connect(rda->ripc(),SIGNAL(catchEventReceived(RDCatchEvent *)),
this,SLOT(catchEventReceivedData(RDCatchEvent *)));
//
// CAE Connection
@@ -463,6 +465,51 @@ void MainObject::notificationReceivedData(RDNotification *notify)
}
void MainObject::catchEventReceivedData(RDCatchEvent *evt)
{
rda->syslog(LOG_NOTICE,"catchEventReceivedData(): %s",
evt->dump().toUtf8().constData());
if(evt->operation()==RDCatchEvent::DeckStatusQueryOp) {
SendFullEventResponse(rda->station()->address());
}
/*
chan=cmds.at(1).toInt(&ok);
if(!ok) {
EchoArgs(conn->id(),'-');
return;
}
if(chan==0) {
SendFullStatus(conn->id());
return;
}
chan--;
if(chan<MAX_DECKS) {
if(catch_record_deck_status[chan]==RDDeck::Offline) {
EchoArgs(conn->id(),'-');
return;
}
EchoCommand(conn->id(),QString::asprintf("RE %u %d %d!",
chan+1,
catch_record_deck_status[chan],
catch_record_id[chan]));
EchoCommand(conn->id(),QString::asprintf("MN %u %d!",chan+1,
catch_monitor_state[chan]));
return;
}
if((chan>=128)&&(chan<(MAX_DECKS+128))) {
if(catch_playout_deck_status[chan-128]==RDDeck::Offline) {
EchoArgs(conn->id(),'-');
return;
}
EchoCommand(conn->id(),
QString::asprintf("RE %u %d %d!",
chan+1,catch_playout_deck_status[chan-128],
catch_playout_id[chan-128]));
*/
}
void MainObject::newConnectionData()
{
int i=0;
@@ -516,10 +563,14 @@ void MainObject::gpiStateChangedData(int matrix,int line,bool state)
catch_events[i].gpiOffsetTimer()->
start(catch_events[i].startOffset());
catch_events[i].gpiStartTimer()->stop();
SendEventResponse(catch_events[i].channel(),RDDeck::Ready,
catch_events[i].id(),"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
catch_events[i].channel(),
RDDeck::Ready,
catch_events[i].id()).toUtf8());
*/
}
else {
if(StartRecording(i)) {
@@ -567,9 +618,12 @@ void MainObject::startTimerData(int id)
WriteExitCodeById(id,RDRecording::Ok);
catch_record_deck_status[deck]=RDDeck::Idle;
catch_record_id[deck]=0;
SendEventResponse(deck+1,catch_record_deck_status[deck],id,"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck+1,catch_record_deck_status[deck],
id).toUtf8());
*/
rda->syslog(LOG_INFO,"gpi start window closes: event: %d, gpi: %d:%d",
id,catch_events[event].startMatrix(),
catch_events[event].startLine());
@@ -624,10 +678,14 @@ void MainObject::engineData(int id)
catch_events[event].channel()-128,
catch_events[event].id());
WriteExitCode(event,RDRecording::DeviceBusy);
SendEventResponse(0,RDDeck::Recording,catch_events[event].id(),
catch_events[event].cutName());
/*
BroadcastCommand(QString::asprintf("RE 0 %d %d %s!",RDDeck::Recording,
catch_events[event].id(),
catch_events[event].cutName().
toUtf8().constData()).toUtf8());
*/
return;
}
}
@@ -639,12 +697,17 @@ void MainObject::engineData(int id)
case RDRecording::Recording:
if(!RDCut::exists(catch_events[event].cutName())) {
WriteExitCode(event,RDRecording::NoCut);
SendEventResponse(catch_events[event].channel(),
catch_record_deck_status[catch_events[event].channel()-1],
catch_events[event].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE %d %d %d!",
catch_events[event].channel(),
catch_record_deck_status[catch_events[event].
channel()-1],
catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"record aborted: no such cut: %s, id: %d",
catch_events[event].cutName().toUtf8().constData(),
catch_events[event].id());
@@ -713,11 +776,16 @@ void MainObject::engineData(int id)
catch_events[event].id();
catch_events[event].setStatus(RDDeck::Waiting);
WriteExitCode(event,RDRecording::Waiting);
SendEventResponse(catch_events[event].channel(),
catch_record_deck_status[catch_events[event].channel()-1],
catch_events[event].id(),"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
catch_events[event].channel(),
catch_record_deck_status[catch_events[event].
channel()-1],
catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_INFO,"gpi start window opens: event: %d, gpi: %d:%d",
id,catch_events[event].startMatrix(),
catch_events[event].startLine());
@@ -728,12 +796,17 @@ void MainObject::engineData(int id)
case RDRecording::Playout:
if(!RDCut::exists(catch_events[event].cutName())) {
WriteExitCode(event,RDRecording::NoCut);
SendEventResponse(catch_events[event].channel(),
catch_playout_deck_status[catch_events[event].channel()-129],
catch_events[event].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE %d %d %d!",
catch_events[event].channel(),
catch_playout_deck_status[catch_events[event].
channel()-129],
catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"playout aborted: no such cut: %s, id: %d",
(const char *)catch_events[event].cutName().toUtf8(),
catch_events[event].id());
@@ -771,8 +844,11 @@ void MainObject::engineData(int id)
case RDRecording::MacroEvent:
if(!RDCart::exists(catch_events[event].macroCart())) {
WriteExitCode(event,RDRecording::NoCut);
SendEventResponse(0,RDDeck::Offline,catch_events[event].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE 0 0 %d!",catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"macro aborted: no such cart: %u, id: %d",
catch_events[event].macroCart(),
catch_events[event].id());
@@ -788,8 +864,11 @@ void MainObject::engineData(int id)
case RDRecording::Download:
if(!RDCut::exists(catch_events[event].cutName())) {
WriteExitCode(event,RDRecording::NoCut);
SendEventResponse(0,RDDeck::Offline,catch_events[event].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE 0 0 %d!",catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"download aborted: no such cut: %s, id: %d",
(const char *)catch_events[event].cutName().toUtf8(),
catch_events[event].id());
@@ -832,8 +911,11 @@ void MainObject::engineData(int id)
case RDRecording::Upload:
if(!RDCut::exists(catch_events[event].cutName())) {
WriteExitCode(event,RDRecording::NoCut);
SendEventResponse(0,RDDeck::Offline,catch_events[event].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE 0 0 %d!",catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"upload aborted: no such cut: %s, id: %d",
(const char *)catch_events[event].cutName().toUtf8(),
catch_events[event].id());
@@ -904,9 +986,13 @@ void MainObject::recordLoadedData(int card,int stream)
{
int deck=GetRecordDeck(card,stream);
catch_record_deck_status[deck-1]=RDDeck::Ready;
SendEventResponse(deck,catch_record_deck_status[deck-1],
catch_record_id[deck-1],"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,catch_record_deck_status[deck-1],
catch_record_id[deck-1]).toUtf8());
*/
rda->syslog(LOG_DEBUG,"Loaded - Card: %d Stream: %d\n",card,stream);
}
@@ -921,10 +1007,14 @@ void MainObject::recordingData(int card,int stream)
if(event>=0) {
cutname=catch_events[event].cutName();
}
SendEventResponse(deck,catch_record_deck_status[deck-1],
catch_record_id[deck-1],cutname);
/*
BroadcastCommand(QString::asprintf("RE %d %d %d %s!",
deck,catch_record_deck_status[deck-1],
catch_record_id[deck-1],
cutname.toUtf8().constData()).toUtf8());
*/
catch_record_status[deck-1]=true;
if(debug) {
printf("Recording - Card: %d Stream: %d, Id: %d\n",card,stream,
@@ -982,9 +1072,12 @@ void MainObject::recordUnloadedData(int card,int stream,unsigned msecs)
(const char *)catch_record_name[deck-1].toUtf8());
WriteExitCodeById(catch_record_id[deck-1],RDRecording::Ok);
}
SendEventResponse(deck,RDDeck::Idle,catch_record_id[deck-1],"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,RDDeck::Idle,
catch_record_id[deck-1]).toUtf8());
*/
catch_record_id[deck-1]=0;
if(debug) {
printf("Unloaded - Card: %d Stream: %d\n",card,stream);
@@ -1019,9 +1112,13 @@ void MainObject::playLoadedData(int handle)
{
int deck=GetPlayoutDeck(handle);
catch_playout_deck_status[deck-129]=RDDeck::Ready;
SendEventResponse(deck,catch_playout_deck_status[deck-129],
catch_playout_id[deck-129],"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,catch_playout_deck_status[deck-129],
catch_playout_id[deck-129]).toUtf8());
*/
if(debug) {
printf("Play Loaded - Card: %d Stream: %d\n",
catch_playout_card[deck-129],
@@ -1036,9 +1133,13 @@ void MainObject::playingData(int handle)
catch_playout_deck_status[deck-129]=RDDeck::Recording;
WriteExitCodeById(catch_playout_id[deck-129],
RDRecording::PlayActive);
SendEventResponse(deck,catch_playout_deck_status[deck-129],
catch_playout_id[deck-129],"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,catch_playout_deck_status[deck-129],
catch_playout_id[deck-129]).toUtf8());
*/
catch_playout_status[GetPlayoutDeck(handle)]=true;
if(debug) {
printf("Playing - Card: %d Stream: %d\n",
@@ -1075,9 +1176,13 @@ void MainObject::playUnloadedData(int handle)
(const char *)catch_playout_name[deck-129].toUtf8());
catch_playout_deck_status[deck-129]=RDDeck::Idle;
WriteExitCodeById(catch_playout_id[deck-129],RDRecording::Ok);
SendEventResponse(deck,catch_playout_deck_status[deck-129],
catch_playout_id[deck-129],"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",deck,
catch_playout_deck_status[deck-129],
catch_playout_id[deck-129]).toUtf8());
*/
if(debug) {
printf("Play unloaded - Card: %d Stream: %d\n",
catch_playout_card[deck-129],catch_playout_stream[deck-129]);
@@ -1133,9 +1238,12 @@ void MainObject::eventFinishedData(int id)
return;
}
catch_events[event].setStatus(RDDeck::Idle);
SendEventResponse(0,RDDeck::Idle,catch_macro_event_id[id],"");
/*
BroadcastCommand(QString::asprintf("RE 0 %d %d!",
RDDeck::Idle,
catch_macro_event_id[id]).toUtf8());
*/
if(catch_events[event].oneShot()) {
PurgeEvent(event);
}
@@ -1182,10 +1290,14 @@ void MainObject::updateXloadsData()
case RDRecording::ServerError:
case RDRecording::InternalError:
it=catch_active_xloads.begin()+i;
SendEventResponse(0,RDDeck::Idle,
catch_events[catch_active_xloads[i]].id(),"");
/*
BroadcastCommand(QString().
sprintf("RE 0 %d %d!",RDDeck::Idle,
catch_events[catch_active_xloads[i]].id()).
toUtf8());
*/
catch_active_xloads.erase(it,it+1);
break;
@@ -1234,9 +1346,13 @@ bool MainObject::StartRecording(int event)
if((catch_record_card[deck-1]<0)||
(catch_record_stream[deck-1]<0)) {
WriteExitCodeById(catch_events[event].id(),RDRecording::InternalError);
SendEventResponse(deck,catch_record_deck_status[deck-1],
catch_events[event].id(),"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,catch_record_deck_status[deck-1],
catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,"invalid audio device for deck: %d, event: %d",
deck,catch_events[event].id());
return false;
@@ -1248,9 +1364,13 @@ bool MainObject::StartRecording(int event)
if((catch_record_deck_status[deck-1]!=RDDeck::Idle)&&
(catch_record_deck_status[deck-1]!=RDDeck::Waiting)) {
WriteExitCodeById(catch_events[event].id(),RDRecording::DeviceBusy);
SendEventResponse(deck,catch_record_deck_status[deck-1],
catch_events[event].id(),"");
/*
BroadcastCommand(QString::asprintf("RE %d %d %d!",
deck,catch_record_deck_status[deck-1],
catch_events[event].id()).toUtf8());
*/
rda->syslog(LOG_WARNING,
"device busy for deck: %d, event: %d | in use by event: %d",
deck,catch_events[event].id(),catch_record_id[deck-1]);
@@ -1505,9 +1625,12 @@ void MainObject::StartDownloadEvent(int event)
if(!catch_xload_timer->isActive()) {
catch_xload_timer->start(XLOAD_UPDATE_INTERVAL);
}
SendEventResponse(0,RDDeck::Recording,catch_events[event].id(),"");
/*
BroadcastCommand(QString::asprintf("RE 0 %d %d!",
RDDeck::Recording,
catch_events[event].id()).toUtf8());
*/
StartBatch(catch_events[event].id());
}
@@ -1536,8 +1659,11 @@ bool MainObject::ExecuteMacroCart(RDCart *cart,int id,int event)
catch_events[event].setStatus(RDDeck::Recording);
}
if(id!=-1) {
SendEventResponse(0,RDDeck::Recording,id,"");
/*
BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Recording,id).
toUtf8());
*/
}
catch_macro_event_id[event_id]=id;
catch_event_pool[event_id]=
@@ -1552,30 +1678,87 @@ bool MainObject::ExecuteMacroCart(RDCart *cart,int id,int event)
}
void MainObject::SendFullStatus(int ch)
void MainObject::SendEventResponse(int chan,RDDeck::Status status,int id,
const QString &cutname)
{
RDCatchEvent *evt=new RDCatchEvent();
evt->setOperation(RDCatchEvent::DeckStatusResponseOp);
evt->setDeckChannel(chan);
evt->setDeckStatus(status);
evt->setEventId(id);
if(!cutname.isEmpty()) {
evt->setCartNumber(RDCut::cartNumber(cutname));
evt->setCutNumber(RDCut::cutNumber(cutname));
}
rda->ripc()->sendCatchEvent(evt);
delete evt;
}
void MainObject::SendFullEventResponse(const QHostAddress &addr)
{
RDCatchEvent *evt=new RDCatchEvent();
//
// Deck-less Events
//
evt->clear();
evt->setOperation(RDCatchEvent::DeckStatusResponseOp);
evt->setDeckChannel(0);
for(unsigned i=0;i<catch_events.size();i++) {
if(catch_events[i].status()!=RDDeck::Idle) {
EchoCommand(ch,QString::asprintf("RE 0 %d %d!",
catch_events[i].status(),
catch_events[i].id()));
evt->setDeckStatus(catch_events[i].status());
evt->setEventId(catch_events[i].id());
rda->ripc()->sendCatchEvent(evt);
}
}
evt->setDeckStatus(RDDeck::Recording);
for(unsigned i=0;i<catch_active_xloads.size();i++) {
EchoCommand(ch,QString::asprintf("RE 0 %d %d",
RDDeck::Recording,
catch_events[catch_active_xloads[i]].
id()));
evt->setEventId(catch_events[catch_active_xloads[i]].id());
rda->ripc()->sendCatchEvent(evt);
}
//
// Decks
//
evt->clear();
evt->setOperation(RDCatchEvent::DeckStatusResponseOp);
for(int i=0;i<MAX_DECKS;i++) {
EchoCommand(ch,QString::asprintf("RE %d %d %d!",i+1,
catch_record_deck_status[i],
catch_record_id[i]));
EchoCommand(ch,QString::asprintf("RE %d %d %d!",i+129,
catch_playout_deck_status[i],
catch_playout_id[i]));
EchoCommand(ch,QString::asprintf("MN %u %d!",i+1,catch_monitor_state[i]));
//
// Record Decks
//
evt->setDeckChannel(i+1);
evt->setDeckStatus(catch_record_deck_status[i]);
evt->setEventId(catch_record_id[i]);
if(catch_record_deck_status[i]==RDDeck::Recording) {
evt->setCartNumber(RDCut::cartNumber(catch_record_name[i]));
evt->setCutNumber(RDCut::cutNumber(catch_record_name[i]));
}
else {
evt->setCartNumber(0);
evt->setCutNumber(0);
}
rda->ripc()->sendCatchEvent(evt);
//
// Play Decks
//
evt->setDeckChannel(i+129);
evt->setDeckStatus(catch_playout_deck_status[i]);
evt->setEventId(catch_playout_id[i]);
if(catch_playout_deck_status[i]==RDDeck::Recording) {
evt->setCartNumber(RDCut::cartNumber(catch_playout_name[i]));
evt->setCutNumber(RDCut::cutNumber(catch_playout_name[i]));
}
else {
evt->setCartNumber(0);
evt->setCutNumber(0);
}
rda->ripc()->sendCatchEvent(evt);
}
delete evt;
}
@@ -1685,6 +1868,7 @@ void MainObject::DispatchCommand(ServerConnection *conn)
}
if((cmds.at(0)=="RE")&&(cmds.size()==2)) { // Request Status
/*
chan=cmds.at(1).toInt(&ok);
if(!ok) {
EchoArgs(conn->id(),'-');
@@ -1720,6 +1904,7 @@ void MainObject::DispatchCommand(ServerConnection *conn)
return;
}
EchoArgs(conn->id(),'-');
*/
return;
}
@@ -1808,12 +1993,15 @@ void MainObject::DispatchCommand(ServerConnection *conn)
return;
}
WriteExitCode(event,(RDRecording::ExitCode)code,str);
BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Idle,id));
SendEventResponse(0,RDDeck::Idle,id,"");
// BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Idle,id));
if((RDRecording::ExitCode)code==RDRecording::Ok) {
BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Idle,id));
SendEventResponse(0,RDDeck::Idle,id,"");
// BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Idle,id));
}
else {
BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Offline,id));
SendEventResponse(0,RDDeck::Offline,id,"");
// BroadcastCommand(QString::asprintf("RE 0 %d %d!",RDDeck::Offline,id));
}
}
}