summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2014-01-02 00:47:27 +0000
committerrandomdan <randomdan@localhost>2014-01-02 00:47:27 +0000
commit44d425f11a051c383451f9a55714d14b7c9d6676 (patch)
tree6d71c250e5f5a22199de731c44481df3a474f665
parentExeceute updates of network, services and events on a schedule and on start up (diff)
downloadp2pvr-44d425f11a051c383451f9a55714d14b7c9d6676.tar.bz2
p2pvr-44d425f11a051c383451f9a55714d14b7c9d6676.tar.xz
p2pvr-44d425f11a051c383451f9a55714d14b7c9d6676.zip
Correctly map transport stream specifications in network tables for dvb-t (dvb-c and dvb-s still need doing)
Select delivery methods in transport stream id order Catch exceptions in scheduled update thread, unhandled ones abort
-rw-r--r--p2pvr/lib/maintenance.cpp44
-rw-r--r--p2pvr/lib/si.cpp6
-rw-r--r--p2pvr/lib/siParsers/network.cpp71
3 files changed, 93 insertions, 28 deletions
diff --git a/p2pvr/lib/maintenance.cpp b/p2pvr/lib/maintenance.cpp
index 2bc026e..f2bf012 100644
--- a/p2pvr/lib/maintenance.cpp
+++ b/p2pvr/lib/maintenance.cpp
@@ -5,6 +5,7 @@
#include <Ice/Ice.h>
#include "bindTimerTask.h"
#include <linux/dvb/frontend.h>
+#include <cxxabi.h>
time_t Maintenance::periodUpdateNetwork;
time_t Maintenance::periodUpdateServices;
@@ -57,26 +58,33 @@ Maintenance::ScheduledUpdate()
Logger()->messagebf(LOG_DEBUG, "%s: triggered", __PRETTY_FUNCTION__);
if (!updateRunning) {
std::thread update([this] {
- ScopeObject notRunning([this]{ updateRunning = false; });
- updateRunning = true;
- auto si = P2PVR::MaintenancePrx::checkedCast(adapter->createProxy(adapter->getCommunicator()->stringToIdentity("Maintenance")));
- time_t now = time(NULL);
- if (lastUpdateNetwork < now - periodUpdateNetwork) {
- Logger()->messagebf(LOG_INFO, "%s: updating network", __PRETTY_FUNCTION__);
- si->UpdateNetwork(FE_OFDM);
- time(&lastUpdateNetwork);
+ try {
+ ScopeObject notRunning([this]{ updateRunning = false; });
+ updateRunning = true;
+ auto si = P2PVR::MaintenancePrx::checkedCast(adapter->createProxy(adapter->getCommunicator()->stringToIdentity("Maintenance")));
+ time_t now = time(NULL);
+ if (lastUpdateNetwork < now - periodUpdateNetwork) {
+ Logger()->messagebf(LOG_INFO, "%s: updating network", __PRETTY_FUNCTION__);
+ si->UpdateNetwork(FE_OFDM);
+ time(&lastUpdateNetwork);
+ }
+ if (lastUpdateServices < now - periodUpdateServices) {
+ Logger()->messagebf(LOG_INFO, "%s: updating services", __PRETTY_FUNCTION__);
+ si->UpdateServices(FE_OFDM);
+ time(&lastUpdateServices);
+ }
+ if (lastUpdateEvents < now - periodUpdateEvents) {
+ Logger()->messagebf(LOG_INFO, "%s: updating events", __PRETTY_FUNCTION__);
+ si->UpdateEvents(FE_OFDM);
+ time(&lastUpdateEvents);
+ }
+ Logger()->messagebf(LOG_DEBUG, "%s: completed", __PRETTY_FUNCTION__);
}
- if (lastUpdateServices < now - periodUpdateServices) {
- Logger()->messagebf(LOG_INFO, "%s: updating services", __PRETTY_FUNCTION__);
- si->UpdateServices(FE_OFDM);
- time(&lastUpdateServices);
+ catch (const std::exception & ex) {
+ char * buf = __cxxabiv1::__cxa_demangle(typeid(ex).name(), NULL, NULL, NULL);
+ Logger()->messagebf(LOG_ERR, "%s: failed %s: %s", __PRETTY_FUNCTION__, buf, ex.what());
+ free(buf);
}
- if (lastUpdateEvents < now - periodUpdateEvents) {
- Logger()->messagebf(LOG_INFO, "%s: updating events", __PRETTY_FUNCTION__);
- si->UpdateEvents(FE_OFDM);
- time(&lastUpdateEvents);
- }
- Logger()->messagebf(LOG_DEBUG, "%s: completed", __PRETTY_FUNCTION__);
});
update.detach();
}
diff --git a/p2pvr/lib/si.cpp b/p2pvr/lib/si.cpp
index 131cf69..3431b67 100644
--- a/p2pvr/lib/si.cpp
+++ b/p2pvr/lib/si.cpp
@@ -21,19 +21,19 @@ SI::GetAllDeliveries(short type, const Ice::Current &)
case FE_OFDM:
{
SqlContainerCreator<P2PVR::Deliveries, DVBSI::TerrestrialDelivery> cc(rtn);
- cc.populate(Select("SELECT * FROM delivery_dvbt").second);
+ cc.populate(Select("SELECT * FROM delivery_dvbt ORDER BY transportStreamId").second);
break;
}
case FE_QAM:
{
SqlContainerCreator<P2PVR::Deliveries, DVBSI::CableDelivery> cc(rtn);
- cc.populate(Select("SELECT * FROM delivery_dvbc").second);
+ cc.populate(Select("SELECT * FROM delivery_dvbc ORDER BY transportStreamId").second);
break;
}
case FE_QPSK:
{
SqlContainerCreator<P2PVR::Deliveries, DVBSI::SatelliteDelivery> cc(rtn);
- cc.populate(Select("SELECT * FROM delivery_dvbs").second);
+ cc.populate(Select("SELECT * FROM delivery_dvbs ORDER BY transportStreamId").second);
break;
}
}
diff --git a/p2pvr/lib/siParsers/network.cpp b/p2pvr/lib/siParsers/network.cpp
index b9a58ba..b91da1a 100644
--- a/p2pvr/lib/siParsers/network.cpp
+++ b/p2pvr/lib/siParsers/network.cpp
@@ -1,6 +1,9 @@
#include <pch.hpp>
#include "network.h"
#include <boost/bind.hpp>
+#include <linux/dvb/frontend.h>
+#include <safeMapFind.h>
+#include <misc.h>
struct NetworkStreamsHeader {
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
@@ -154,6 +157,60 @@ SiNetworkInformationParser::parseDescriptor_NetworkName(DVBSI::NetworkPtr n, con
n->Name = *convert((const char *)p, len);
}
+#define SINOTSUPPORTED(What) \
+class What##NotSupported : public NotSupported { public: What##NotSupported(short id) : NotSupported(stringbf(#What" 0x%2x", id)) { } };
+
+std::map<short, fe_bandwidth_t> tbandwidths {
+ {0, BANDWIDTH_8_MHZ},
+ {1, BANDWIDTH_7_MHZ},
+ {2, BANDWIDTH_6_MHZ},
+ {3, BANDWIDTH_5_MHZ}
+};
+SINOTSUPPORTED(Bandwidth);
+
+std::map<short, fe_modulation_t> tconstellations {
+ {0, QPSK},
+ {1, QAM_16},
+ {2, QAM_64}
+};
+SINOTSUPPORTED(Constellation);
+
+std::map<short, fe_hierarchy_t> thierarchies {
+ {0, HIERARCHY_NONE},
+ {1, HIERARCHY_1},
+ {2, HIERARCHY_2},
+ {3, HIERARCHY_4},
+ {4, HIERARCHY_NONE},
+ {5, HIERARCHY_1},
+ {6, HIERARCHY_2},
+ {7, HIERARCHY_4}
+};
+SINOTSUPPORTED(Hierarchy);
+
+std::map<short, fe_code_rate_t> tcoderates {
+ {0, FEC_1_2},
+ {1, FEC_2_3},
+ {2, FEC_3_4},
+ {3, FEC_5_6},
+ {4, FEC_7_8}
+};
+SINOTSUPPORTED(CodeRate);
+
+std::map<short, fe_guard_interval_t> tguardintervals {
+ {0, GUARD_INTERVAL_1_32},
+ {1, GUARD_INTERVAL_1_16},
+ {2, GUARD_INTERVAL_1_8},
+ {3, GUARD_INTERVAL_1_4}
+};
+SINOTSUPPORTED(GuardInterval);
+
+std::map<short, fe_transmit_mode_t> ttransmitmodes {
+ {0, TRANSMISSION_MODE_2K},
+ {1, TRANSMISSION_MODE_8K},
+ {2, TRANSMISSION_MODE_4K}
+};
+SINOTSUPPORTED(TransmissionMode);
+
void
SiNetworkInformationParser::parseDescriptor_TerrestrialDelivery(DVBSI::NetworkTransportStreamPtr nts, const u_char * data, size_t len)
{
@@ -162,16 +219,16 @@ SiNetworkInformationParser::parseDescriptor_TerrestrialDelivery(DVBSI::NetworkTr
DVBSI::TerrestrialDeliveryPtr td = new DVBSI::TerrestrialDelivery;
td->Frequency = ((uint64_t)ntohl(tdd->Frequency)) * 10;
td->TransportStreamId = nts->TransportStreamId;
- td->Bandwidth = tdd->Bandwidth;
+ td->Bandwidth = safeMapLookup<BandwidthNotSupported>(tbandwidths, tdd->Bandwidth);
td->Priority = tdd->Priority;
td->TimeSlicing = tdd->TimeSlicing;
td->MpeFec = tdd->MpeFec;
- td->Constellation = tdd->Constellation;
- td->Hierarchy = tdd->Hierarchy;
- td->CodeRateHP = tdd->CodeRateHP;
- td->CodeRateLP = tdd->CodeRateLP;
- td->GuardInterval = tdd->GuardInterval;
- td->TransmissionMode = tdd->TransmissionMode;
+ td->Constellation = safeMapLookup<ConstellationNotSupported>(tconstellations, tdd->Constellation);
+ td->Hierarchy = safeMapLookup<HierarchyNotSupported>(thierarchies, tdd->Hierarchy);
+ td->CodeRateHP = safeMapLookup<CodeRateNotSupported>(tcoderates, tdd->CodeRateHP);
+ td->CodeRateLP = safeMapLookup<CodeRateNotSupported>(tcoderates, tdd->CodeRateLP);
+ td->GuardInterval = safeMapLookup<GuardIntervalNotSupported>(tguardintervals, tdd->GuardInterval);
+ td->TransmissionMode = safeMapLookup<TransmissionModeNotSupported>(ttransmitmodes, tdd->TransmissionMode);
td->OtherFrequencyFlag = tdd->OtherFrequencyFlag;
nts->Terrestrial = td;
}