aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ensembledatabase.cpp32
-rw-r--r--src/ensembledatabase.hpp9
-rw-r--r--src/fig0_8.cpp12
-rw-r--r--src/fig2.cpp8
4 files changed, 51 insertions, 10 deletions
diff --git a/src/ensembledatabase.cpp b/src/ensembledatabase.cpp
index e5066a6..735aca3 100644
--- a/src/ensembledatabase.cpp
+++ b/src/ensembledatabase.cpp
@@ -29,9 +29,11 @@
#include <locale>
#include <codecvt>
+#include <iomanip>
#include <sstream>
#include "ensembledatabase.hpp"
#include "charset.hpp"
+#include "utils.hpp"
namespace ensemble_database {
@@ -118,9 +120,17 @@ string label_t::assemble() const
string label_t::assembly_state() const
{
stringstream ss;
- ss << "[";
+ ss << "(";
for (const auto& s : segments) {
- ss << s.first << ",";
+ ss << s.first;
+ if (get_verbosity() > 1) {
+ ss << "[";
+ for (const auto& c : s.second) {
+ ss << hex << setw(2) << (int)c << " ";
+ }
+ ss << "]" << dec;
+ }
+ ss << ",";
}
ss << "count=" << segment_count << ",";
@@ -138,12 +148,12 @@ string label_t::assembly_state() const
ss << "UNDEFINED";
break;
}
- ss << "]";
+ ss << ")";
return ss.str();
}
-component_t& service_t::get_component(uint32_t subchannel_id)
+component_t& service_t::get_component_by_subchannel(uint32_t subchannel_id)
{
for (auto& component : components) {
if (component.subchId == subchannel_id) {
@@ -151,10 +161,22 @@ component_t& service_t::get_component(uint32_t subchannel_id)
}
}
- throw not_found("component referring to subchannel " +
+ throw not_found("component with subchannel id " +
to_string(subchannel_id) + " not found");
}
+component_t& service_t::get_component_by_scids(uint8_t scids)
+{
+ for (auto& component : components) {
+ if (component.scids == scids) {
+ return component;
+ }
+ }
+
+ throw not_found("component with SCIdS " +
+ to_string(scids) + " not found");
+}
+
component_t& service_t::get_or_create_component(uint32_t subchannel_id)
{
for (auto& component : components) {
diff --git a/src/ensembledatabase.hpp b/src/ensembledatabase.hpp
index dee434d..fff989f 100644
--- a/src/ensembledatabase.hpp
+++ b/src/ensembledatabase.hpp
@@ -94,11 +94,15 @@ struct subchannel_t {
};
struct component_t {
- uint32_t service_id;
+ uint32_t service_id = 0;
uint8_t subchId;
+ uint8_t scids = 255; // 255 is invalid, as scids is only 4 bits wide
+
bool primary;
+ label_t label;
+
/* TODO
uint8_t type;
@@ -114,7 +118,8 @@ struct service_t {
std::list<component_t> components;
- component_t& get_component(uint32_t subchannel_id);
+ component_t& get_component_by_subchannel(uint32_t subchannel_id);
+ component_t& get_component_by_scids(uint8_t scids);
component_t& get_or_create_component(uint32_t subchannel_id);
// TODO PTy language announcement
diff --git a/src/fig0_8.cpp b/src/fig0_8.cpp
index 5060202..8a651ad 100644
--- a/src/fig0_8.cpp
+++ b/src/fig0_8.cpp
@@ -83,6 +83,7 @@ fig_result_t fig0_8(fig0_common_t& fig0, const display_settings_t &disp)
Rfa = (f[i] >> 4) & 0x7;
SCIdS = f[i] & 0x0F;
r.complete |= fig0_8_is_complete(SId, SCIdS);
+
r.msgs.emplace_back("-");
r.msgs.emplace_back(1, strprintf("SId=0x%X", SId));
r.msgs.emplace_back(1, strprintf("Ext flag=%d 8-bit Rfa %s",
@@ -103,6 +104,17 @@ fig_result_t fig0_8(fig0_common_t& fig0, const display_settings_t &disp)
if (MSC_FIC_flag == 0) {
// MSC in stream mode and SubChId identifies the sub-channel
SubChId = f[i] & 0x3F;
+
+ try {
+ auto& srv = fig0.ensemble.get_service(SId);
+ auto& component = srv.get_component_by_subchannel(SubChId);
+ component.scids = SCIdS;
+ }
+ catch (ensemble_database::not_found &e) {
+ r.errors.push_back("Not yet in DB");
+ }
+
+
r.msgs.emplace_back(1, strprintf("MSC/FIC flag=%d MSC, SubChId=0x%X", MSC_FIC_flag, SubChId));
}
else {
diff --git a/src/fig2.cpp b/src/fig2.cpp
index 74243ce..97622c8 100644
--- a/src/fig2.cpp
+++ b/src/fig2.cpp
@@ -185,10 +185,12 @@ fig_result_t fig2_select(fig2_common_t& fig2, const display_settings_t &disp)
try {
auto& service = fig2.ensemble.get_service(sid);
- handle_ext_label_data_field(fig2, service.label, disp, r);
+ auto& comp = service.get_component_by_scids(SCIdS);
- const auto complete_label = service.label.assemble();
- r.msgs.push_back(strprintf("Label segments=\"%s\"", service.label.assembly_state().c_str()));
+ handle_ext_label_data_field(fig2, comp.label, disp, r);
+
+ const auto complete_label = comp.label.assemble();
+ r.msgs.push_back(strprintf("Label segments=\"%s\"", comp.label.assembly_state().c_str()));
if (not complete_label.empty()) {
r.msgs.push_back(strprintf("Label=\"%s\"", complete_label.c_str()));
}