00001
00002
00003
00004 #include <cerrno>
00005 #include <cstring>
00006
00007 #include <fcntl.h>
00008 #include <unistd.h>
00009 #ifndef USING_MINGW
00010 #include <sys/select.h>
00011 #endif
00012
00013 #include "mythlogging.h"
00014 #include "mythdbcon.h"
00015 #include "asisignalmonitor.h"
00016 #include "atscstreamdata.h"
00017 #include "mpegtables.h"
00018 #include "atsctables.h"
00019
00020 #include "asichannel.h"
00021 #include "asirecorder.h"
00022 #include "asistreamhandler.h"
00023
00024 #define LOC QString("ASISM(%1): ").arg(channel->GetDevice())
00025
00040 ASISignalMonitor::ASISignalMonitor(
00041 int db_cardnum, ASIChannel *_channel, uint64_t _flags) :
00042 DTVSignalMonitor(db_cardnum, _channel, _flags),
00043 streamHandlerStarted(false), streamHandler(NULL)
00044 {
00045 LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
00046 streamHandler = ASIStreamHandler::Get(_channel->GetDevice());
00047 }
00048
00052 ASISignalMonitor::~ASISignalMonitor()
00053 {
00054 LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor");
00055 Stop();
00056 ASIStreamHandler::Return(streamHandler);
00057 }
00058
00062 void ASISignalMonitor::Stop(void)
00063 {
00064 LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- begin");
00065 SignalMonitor::Stop();
00066 if (GetStreamData())
00067 streamHandler->RemoveListener(GetStreamData());
00068 streamHandlerStarted = false;
00069
00070 LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- end");
00071 }
00072
00073 ASIChannel *ASISignalMonitor::GetASIChannel(void)
00074 {
00075 return dynamic_cast<ASIChannel*>(channel);
00076 }
00077
00084 void ASISignalMonitor::UpdateValues(void)
00085 {
00086 if (!running || exit)
00087 return;
00088
00089 if (streamHandlerStarted)
00090 {
00091 EmitStatus();
00092 if (IsAllGood())
00093 SendMessageAllGood();
00094
00095
00096
00097 update_done = true;
00098 return;
00099 }
00100
00101
00102 bool isLocked = true;
00103 {
00104 QMutexLocker locker(&statusLock);
00105 signalStrength.SetValue(100);
00106 signalLock.SetValue(1);
00107 }
00108
00109 EmitStatus();
00110 if (IsAllGood())
00111 SendMessageAllGood();
00112
00113
00114
00115 if (isLocked && GetStreamData() &&
00116 HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT |
00117 kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT |
00118 kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT))
00119 {
00120 streamHandler->AddListener(GetStreamData());
00121 streamHandlerStarted = true;
00122 }
00123
00124 update_done = true;
00125 }