From 2009dcd0494a671e2492aa865e690446388c7a5a Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 22 Apr 2017 05:18:40 +0200 Subject: Move all FIG structures to cpp files, fix FIG0_21 rfa --- src/fig/FIG0_0.cpp | 16 +++ src/fig/FIG0_0.h | 2 - src/fig/FIG0_1.cpp | 38 +++++- src/fig/FIG0_1.h | 2 - src/fig/FIG0_10.cpp | 45 +++++++ src/fig/FIG0_10.h | 2 - src/fig/FIG0_13.cpp | 26 ++++ src/fig/FIG0_13.h | 2 - src/fig/FIG0_17.cpp | 14 ++ src/fig/FIG0_17.h | 2 - src/fig/FIG0_18.cpp | 9 ++ src/fig/FIG0_18.h | 2 - src/fig/FIG0_19.cpp | 11 ++ src/fig/FIG0_19.h | 2 - src/fig/FIG0_2.cpp | 57 ++++++++ src/fig/FIG0_2.h | 2 - src/fig/FIG0_21.cpp | 60 ++++++++- src/fig/FIG0_21.h | 4 +- src/fig/FIG0_3.cpp | 27 ++++ src/fig/FIG0_3.h | 2 - src/fig/FIG0_5.cpp | 9 ++ src/fig/FIG0_5.h | 2 - src/fig/FIG0_6.cpp | 27 ++++ src/fig/FIG0_6.h | 2 - src/fig/FIG0_8.cpp | 29 ++++ src/fig/FIG0_8.h | 2 - src/fig/FIG0_9.cpp | 16 +++ src/fig/FIG0_9.h | 2 - src/fig/FIG0structs.h | 359 +------------------------------------------------- 29 files changed, 387 insertions(+), 386 deletions(-) (limited to 'src') diff --git a/src/fig/FIG0_0.cpp b/src/fig/FIG0_0.cpp index b4b0b3a..9a99984 100644 --- a/src/fig/FIG0_0.cpp +++ b/src/fig/FIG0_0.cpp @@ -23,11 +23,27 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_0.h" #include "utils.h" namespace FIC { +struct FIGtype0_0 { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; + + uint16_t EId; + uint8_t CIFcnt_hight:5; + uint8_t Al:1; + uint8_t Change:2; + uint8_t CIFcnt_low:8; +} PACKED; + //=========== FIG 0/0 =========== FillStatus FIG0_0::fill(uint8_t *buf, size_t max_size) diff --git a/src/fig/FIG0_0.h b/src/fig/FIG0_0.h index a5310c8..abed53a 100644 --- a/src/fig/FIG0_0.h +++ b/src/fig/FIG0_0.h @@ -27,8 +27,6 @@ #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/0, Multiplex Configuration Info (MCI), diff --git a/src/fig/FIG0_1.cpp b/src/fig/FIG0_1.cpp index 6ed40dd..60704f2 100644 --- a/src/fig/FIG0_1.cpp +++ b/src/fig/FIG0_1.cpp @@ -23,11 +23,41 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_1.h" #include "utils.h" namespace FIC { +struct FIGtype0_1 { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; +} PACKED; + +struct FIGtype0_1_SubChannel_ShortF { + uint8_t StartAdress_high:2; + uint8_t SubChId:6; + uint8_t StartAdress_low:8; + uint8_t TableIndex:6; + uint8_t TableSwitch:1; + uint8_t Short_Long_form:1; +} PACKED; + +struct FIGtype0_1_SubChannel_LongF { + uint8_t StartAdress_high:2; + uint8_t SubChId:6; + uint8_t StartAdress_low:8; + uint8_t Sub_ChannelSize_high:2; + uint8_t ProtectionLevel:2; + uint8_t Option:3; + uint8_t Short_Long_form:1; + uint8_t Sub_ChannelSize_low:8; +} PACKED; + FIG0_1::FIG0_1(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false), @@ -133,8 +163,8 @@ FillStatus FIG0_1::fill(uint8_t *buf, size_t max_size) } if (protection->form == UEP) { - FIG_01_SubChannel_ShortF *fig0_1subchShort = - (FIG_01_SubChannel_ShortF*)buf; + FIGtype0_1_SubChannel_ShortF *fig0_1subchShort = + (FIGtype0_1_SubChannel_ShortF*)buf; fig0_1subchShort->SubChId = (*subchannelFIG0_1)->id; fig0_1subchShort->StartAdress_high = @@ -156,8 +186,8 @@ FillStatus FIG0_1::fill(uint8_t *buf, size_t max_size) << " ix=" << subch_iter_ix; } else if (protection->form == EEP) { - FIG_01_SubChannel_LongF *fig0_1subchLong1 = - (FIG_01_SubChannel_LongF*)buf; + FIGtype0_1_SubChannel_LongF *fig0_1subchLong1 = + (FIGtype0_1_SubChannel_LongF*)buf; fig0_1subchLong1->SubChId = (*subchannelFIG0_1)->id; fig0_1subchLong1->StartAdress_high = diff --git a/src/fig/FIG0_1.h b/src/fig/FIG0_1.h index 6da4aec..fd98037 100644 --- a/src/fig/FIG0_1.h +++ b/src/fig/FIG0_1.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/1, MIC, Sub-Channel Organization, diff --git a/src/fig/FIG0_10.cpp b/src/fig/FIG0_10.cpp index e4ff710..3ce2847 100644 --- a/src/fig/FIG0_10.cpp +++ b/src/fig/FIG0_10.cpp @@ -23,11 +23,56 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_10.h" #include "utils.h" namespace FIC { +struct FIGtype0_10_LongForm { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; + + uint8_t MJD_high:7; + uint8_t RFU:1; + + uint8_t MJD_med; + + uint8_t Hours_high:3; + uint8_t UTC:1; + uint8_t ConfInd:1; + uint8_t LSI:1; + uint8_t MJD_low:2; + + uint8_t Minutes:6; + uint8_t Hours_low:2; + + uint8_t Milliseconds_high:2; + uint8_t Seconds:6; + + uint8_t Milliseconds_low; + + void setMJD(uint32_t date) { + MJD_high = (date >> 10) & 0x7f; + MJD_med = (date >> 2) & 0xff; + MJD_low = date & 0x03; + } + void setHours(uint16_t hours) { + Hours_high = (hours >> 2) & 0x07; + Hours_low = hours & 0x03; + } + + void setMilliseconds(uint16_t ms) { + Milliseconds_high = (ms >> 8) & 0x03; + Milliseconds_low = ms & 0xFF; + } +} PACKED; + FIG0_10::FIG0_10(FIGRuntimeInformation *rti) : m_rti(rti) { diff --git a/src/fig/FIG0_10.h b/src/fig/FIG0_10.h index 2991189..9210e0d 100644 --- a/src/fig/FIG0_10.h +++ b/src/fig/FIG0_10.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/10 diff --git a/src/fig/FIG0_13.cpp b/src/fig/FIG0_13.cpp index 51704f4..40a0be8 100644 --- a/src/fig/FIG0_13.cpp +++ b/src/fig/FIG0_13.cpp @@ -23,11 +23,37 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_13.h" #include "utils.h" namespace FIC { +// See EN 300 401, Clause 8.1.20 for the FIG0_13 description +struct FIG0_13_shortAppInfo { + uint16_t SId; + uint8_t No:4; + uint8_t SCIdS:4; +} PACKED; + +struct FIG0_13_longAppInfo { + uint32_t SId; + uint8_t No:4; + uint8_t SCIdS:4; +} PACKED; + +struct FIG0_13_app { + uint8_t typeHigh; + uint8_t length:5; + uint8_t typeLow:3; + void setType(uint16_t type) { + typeHigh = type >> 3; + typeLow = type & 0x1f; + } + uint16_t xpad; +} PACKED; + + FIG0_13::FIG0_13(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false), diff --git a/src/fig/FIG0_13.h b/src/fig/FIG0_13.h index 4c29278..4465aef 100644 --- a/src/fig/FIG0_13.h +++ b/src/fig/FIG0_13.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/13 diff --git a/src/fig/FIG0_17.cpp b/src/fig/FIG0_17.cpp index 2f5f03e..03d8814 100644 --- a/src/fig/FIG0_17.cpp +++ b/src/fig/FIG0_17.cpp @@ -23,11 +23,25 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_17.h" #include "utils.h" namespace FIC { +struct FIGtype0_17 { + uint16_t SId; + + uint8_t rfa2_high:4; + uint8_t rfu1:2; + uint8_t rfa1:1; + uint8_t SD:1; // Static/Dynamic + + uint8_t IntCode:5; + uint8_t rfu2:1; + uint8_t rfa2_low:2; +} PACKED; + FIG0_17::FIG0_17(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) diff --git a/src/fig/FIG0_17.h b/src/fig/FIG0_17.h index f2861d8..2d5088b 100644 --- a/src/fig/FIG0_17.h +++ b/src/fig/FIG0_17.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/17 diff --git a/src/fig/FIG0_18.cpp b/src/fig/FIG0_18.cpp index 9edc3d5..2d1a567 100644 --- a/src/fig/FIG0_18.cpp +++ b/src/fig/FIG0_18.cpp @@ -23,11 +23,20 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_18.h" #include "utils.h" namespace FIC { +struct FIGtype0_18 { + uint16_t SId; + uint16_t ASu; + uint8_t NumClusters:5; + uint8_t Rfa:3; + /* Followed by uint8_t Cluster IDs */ +} PACKED; + FIG0_18::FIG0_18(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) diff --git a/src/fig/FIG0_18.h b/src/fig/FIG0_18.h index 7712efb..f73687c 100644 --- a/src/fig/FIG0_18.h +++ b/src/fig/FIG0_18.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/18 diff --git a/src/fig/FIG0_19.cpp b/src/fig/FIG0_19.cpp index 8b9aca8..6da72a9 100644 --- a/src/fig/FIG0_19.cpp +++ b/src/fig/FIG0_19.cpp @@ -23,11 +23,22 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_19.h" #include "utils.h" namespace FIC { +struct FIGtype0_19 { + uint8_t ClusterId; + uint16_t ASw; + uint8_t SubChId:6; + uint8_t RegionFlag:1; // shall be zero + uint8_t NewFlag:1; + // Region and RFa not supported +} PACKED; + + FIG0_19::FIG0_19(FIGRuntimeInformation *rti) : m_rti(rti) { } diff --git a/src/fig/FIG0_19.h b/src/fig/FIG0_19.h index ce76f30..1d8f4a5 100644 --- a/src/fig/FIG0_19.h +++ b/src/fig/FIG0_19.h @@ -27,8 +27,6 @@ #include #include - -#include "fig/FIG0structs.h" #include "fig/TransitionHandler.h" namespace FIC { diff --git a/src/fig/FIG0_2.cpp b/src/fig/FIG0_2.cpp index 04bff60..0e5c13c 100644 --- a/src/fig/FIG0_2.cpp +++ b/src/fig/FIG0_2.cpp @@ -23,11 +23,68 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_2.h" #include "utils.h" namespace FIC { +struct FIGtype0_2 { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; +} PACKED; + + +struct FIGtype0_2_Service { + uint16_t SId; + uint8_t NbServiceComp:4; + uint8_t CAId:3; + uint8_t Local_flag:1; +} PACKED; + + +struct FIGtype0_2_Service_data { + uint32_t SId; + uint8_t NbServiceComp:4; + uint8_t CAId:3; + uint8_t Local_flag:1; +} PACKED; + + +struct FIGtype0_2_audio_component { + uint8_t ASCTy:6; + uint8_t TMid:2; + uint8_t CA_flag:1; + uint8_t PS:1; + uint8_t SubChId:6; +} PACKED; + + +struct FIGtype0_2_data_component { + uint8_t DSCTy:6; + uint8_t TMid:2; + uint8_t CA_flag:1; + uint8_t PS:1; + uint8_t SubChId:6; +} PACKED; + + +struct FIGtype0_2_packet_component { + uint8_t SCId_high:6; + uint8_t TMid:2; + uint8_t CA_flag:1; + uint8_t PS:1; + uint8_t SCId_low:6; + void setSCId(uint16_t SCId) { + SCId_high = SCId >> 6; + SCId_low = SCId & 0x3f; + } +} PACKED; + FIG0_2::FIG0_2(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false), diff --git a/src/fig/FIG0_2.h b/src/fig/FIG0_2.h index 4190922..2f35b21 100644 --- a/src/fig/FIG0_2.h +++ b/src/fig/FIG0_2.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/2, MCI, Service Organization, one instance of // FIGtype0_2_Service for each subchannel diff --git a/src/fig/FIG0_21.cpp b/src/fig/FIG0_21.cpp index 515e67a..402f064 100644 --- a/src/fig/FIG0_21.cpp +++ b/src/fig/FIG0_21.cpp @@ -23,11 +23,39 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_21.h" #include "utils.h" namespace FIC { +struct FIGtype0_21_header { + // This was RegionId in EN 300 401 V1.4.1 + uint8_t rfaHigh; + uint8_t rfaLow:3; + + uint8_t length_fi:5; +} PACKED; + +struct FIGtype0_21_fi_list_header { + uint16_t id; + uint8_t range_modulation:4; + uint8_t continuity:1; + uint8_t length_freq_list:3; +} PACKED; + +struct FIGtype0_21_fi_dab_entry { + uint8_t control_field:5; + uint8_t freqHigh:3; + uint16_t freqLow; + + void setFreq(uint32_t freq) { + freqHigh = (freq >> 16) & 0x7; + freqLow = freq & 0xffff; + } +} PACKED; + + FIG0_21::FIG0_21(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) @@ -36,10 +64,14 @@ FIG0_21::FIG0_21(FIGRuntimeInformation *rti) : FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) { +#define FIG0_21_TRACE debug FillStatus fs; size_t remaining = max_size; auto ensemble = m_rti->ensemble; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fill init " << + (m_initialised ? 1 : 0) << " ********************************"; + if (not m_initialised) { freqInfoFIG0_21 = ensemble->frequency_information.begin(); m_initialised = true; @@ -74,8 +106,11 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) const size_t required_size = sizeof(struct FIGtype0_21_header) + required_fi_size; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::loop " << (*freqInfoFIG0_21)->uid; + if (fig0 == nullptr) { if (remaining < 2 + required_size) { + etiLog.level(FIG0_21_TRACE) << "FIG0_21::no space for fig0"; break; } fig0 = (FIGtype0*)buf; @@ -93,24 +128,34 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) remaining -= 2; } else if (remaining < required_size) { + etiLog.level(FIG0_21_TRACE) << "FIG0_21::no space"; break; } for (const auto& fle : (*freqInfoFIG0_21)->frequency_information) { auto *fig0_21_header = (FIGtype0_21_header*)buf; - fig0_21_header->rfa = 0; // This was RegionId in EN 300 401 V1.4.1 + fig0_21_header->rfaHigh = 0; + fig0_21_header->rfaLow = 0; switch (fle.rm) { case RangeModulation::dab_ensemble: fig0_21_header->length_fi = fle.fi_dab.frequencies.size(); + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fle hdr DAB " << + fle.fi_dab.frequencies.size(); break; case RangeModulation::fm_with_rds: fig0_21_header->length_fi = fle.fi_fm.frequencies.size(); + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fle hdr FM " << + fle.fi_fm.frequencies.size(); break; case RangeModulation::drm: fig0_21_header->length_fi = fle.fi_drm.frequencies.size(); + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fle hdr DRM " << + fle.fi_drm.frequencies.size(); break; case RangeModulation::amss: fig0_21_header->length_fi = fle.fi_amss.frequencies.size(); + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fle hdr AMSS " << + fle.fi_amss.frequencies.size(); break; } @@ -141,6 +186,8 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) fig0->Length += 3; buf += 3; remaining -= 3; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::freq " << + freq.frequency; } break; case RangeModulation::fm_with_rds: @@ -154,6 +201,8 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) fig0->Length += 1; buf += 1; remaining -= 1; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::freq " << + freq; } break; case RangeModulation::drm: @@ -173,6 +222,8 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) fig0->Length += 2; buf += 2; remaining -= 2; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::freq " << + freq; } break; case RangeModulation::amss: @@ -192,14 +243,21 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) fig0->Length += 2; buf += 2; remaining -= 2; + etiLog.level(FIG0_21_TRACE) << "FIG0_21::freq " << + freq; } break; } // switch (RM) + etiLog.level(FIG0_21_TRACE) << "FIG0_21::fle end len=" << + static_cast(fig0->Length) << " rem=" << remaining; } // for over fle + etiLog.level(FIG0_21_TRACE) << "FIG0_21::next FI " + " ********************************"; } // for over FI if (freqInfoFIG0_21 == ensemble->frequency_information.end()) { fs.complete_fig_transmitted = true; + freqInfoFIG0_21 = ensemble->frequency_information.begin(); } fs.num_bytes_written = max_size - remaining; diff --git a/src/fig/FIG0_21.h b/src/fig/FIG0_21.h index 2542586..5ae57f7 100644 --- a/src/fig/FIG0_21.h +++ b/src/fig/FIG0_21.h @@ -29,8 +29,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/21 @@ -40,7 +38,7 @@ class FIG0_21 : public IFIG public: FIG0_21(FIGRuntimeInformation* rti); virtual FillStatus fill(uint8_t *buf, size_t max_size); - virtual FIG_rate repetition_rate(void) { return FIG_rate::E; } + virtual FIG_rate repetition_rate(void) { return FIG_rate::B; } virtual const int figtype(void) const { return 0; } virtual const int figextension(void) const { return 21; } diff --git a/src/fig/FIG0_3.cpp b/src/fig/FIG0_3.cpp index 2e84e20..b85c853 100644 --- a/src/fig/FIG0_3.cpp +++ b/src/fig/FIG0_3.cpp @@ -23,11 +23,38 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_3.h" #include "utils.h" namespace FIC { +/* Warning: When bit SCCA_flag is unset(0), the multiplexer R&S does not send + * the SCCA field. But, in the Factum ETI analyzer, if this field is not there, + * it is an error. + */ +struct FIGtype0_3 { + uint8_t SCId_high; + uint8_t SCCA_flag:1; + uint8_t rfa:3; + uint8_t SCId_low:4; + uint8_t DSCTy:6; + uint8_t rfu:1; + uint8_t DG_flag:1; + uint8_t Packet_address_high:2; + uint8_t SubChId:6; + uint8_t Packet_address_low; + uint16_t SCCA; + void setSCId(uint16_t SCId) { + SCId_high = SCId >> 4; + SCId_low = SCId & 0xf; + } + void setPacketAddress(uint16_t address) { + Packet_address_high = address >> 8; + Packet_address_low = address & 0xff; + } +} PACKED; + FIG0_3::FIG0_3(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) diff --git a/src/fig/FIG0_3.h b/src/fig/FIG0_3.h index 7b77086..d2b1563 100644 --- a/src/fig/FIG0_3.h +++ b/src/fig/FIG0_3.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/3 diff --git a/src/fig/FIG0_5.cpp b/src/fig/FIG0_5.cpp index 8650d29..8691a6b 100644 --- a/src/fig/FIG0_5.cpp +++ b/src/fig/FIG0_5.cpp @@ -23,11 +23,20 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_5.h" #include "utils.h" namespace FIC { +struct FIGtype0_5_short { + uint8_t SubChId:6; + uint8_t rfu:1; + uint8_t LS:1; + + uint8_t language; +} PACKED; + FIG0_5::FIG0_5(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) diff --git a/src/fig/FIG0_5.h b/src/fig/FIG0_5.h index 2fc92e7..51ac177 100644 --- a/src/fig/FIG0_5.h +++ b/src/fig/FIG0_5.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/5 diff --git a/src/fig/FIG0_6.cpp b/src/fig/FIG0_6.cpp index 5174ec2..51df05b 100644 --- a/src/fig/FIG0_6.cpp +++ b/src/fig/FIG0_6.cpp @@ -23,11 +23,38 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_6.h" #include "utils.h" namespace FIC { +struct FIGtype0_6 { + uint8_t LSN_high:4; // Linkage Set Number + uint8_t ILS:1; // 0=national / 1=international + uint8_t SH:1; // 0=Soft link / 1=Hard link + uint8_t LA:1; // Linkage actuator + uint8_t IdListFlag:1; // Marks the presence of the list + + uint8_t LSN_low; // Linkage Set Number + + void setLSN(uint16_t LSN) { + LSN_high = LSN >> 8; + LSN_low = LSN & 0xff; + } +} PACKED; + +#define FIG0_6_IDLQ_DAB 0x0 +#define FIG0_6_IDLQ_RDS 0x1 +#define FIG0_6_IDLQ_DRM_AMSS 0x3 + +struct FIGtype0_6_header { + uint8_t num_ids:4; // number of Ids to follow in the list + uint8_t rfa:1; // must be 0 + uint8_t IdLQ:2; // Identifier List Qualifier, see above defines + uint8_t rfu:1; // must be 0 +} PACKED; + FIG0_6::FIG0_6(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false) diff --git a/src/fig/FIG0_6.h b/src/fig/FIG0_6.h index e7c81c5..4fd7fd1 100644 --- a/src/fig/FIG0_6.h +++ b/src/fig/FIG0_6.h @@ -29,8 +29,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { /* TODO diff --git a/src/fig/FIG0_8.cpp b/src/fig/FIG0_8.cpp index 2d25547..8d69a1d 100644 --- a/src/fig/FIG0_8.cpp +++ b/src/fig/FIG0_8.cpp @@ -23,11 +23,40 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_8.h" #include "utils.h" namespace FIC { +struct FIGtype0_8_short { + uint8_t SCIdS:4; + uint8_t rfa_1:3; + uint8_t ext:1; + uint8_t Id:6; + uint8_t MscFic:1; + uint8_t LS:1; + uint8_t rfa_2; +} PACKED; + +struct FIGtype0_8_long { + uint8_t SCIdS:4; + uint8_t rfa_1:3; + uint8_t ext:1; + uint8_t SCId_high:4; + uint8_t rfa:3; + uint8_t LS:1; + uint8_t SCId_low; + uint8_t rfa_2; + void setSCId(uint16_t id) { + SCId_high = id >> 8; + SCId_low = id & 0xff; + } + uint16_t getSCid() { + return (SCId_high << 8) | SCId_low; + } +} PACKED; + FIG0_8::FIG0_8(FIGRuntimeInformation *rti) : m_rti(rti), m_initialised(false), diff --git a/src/fig/FIG0_8.h b/src/fig/FIG0_8.h index 600f386..81d00ea 100644 --- a/src/fig/FIG0_8.h +++ b/src/fig/FIG0_8.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/8 diff --git a/src/fig/FIG0_9.cpp b/src/fig/FIG0_9.cpp index 00c2995..06f2125 100644 --- a/src/fig/FIG0_9.cpp +++ b/src/fig/FIG0_9.cpp @@ -23,11 +23,27 @@ along with ODR-DabMux. If not, see . */ +#include "fig/FIG0structs.h" #include "fig/FIG0_9.h" #include "utils.h" namespace FIC { +struct FIGtype0_9 { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; + + uint8_t ensembleLto:6; + uint8_t rfa1:1; + uint8_t ext:1; + uint8_t ensembleEcc; + uint8_t tableId; +} PACKED; + FIG0_9::FIG0_9(FIGRuntimeInformation *rti) : m_rti(rti) {} diff --git a/src/fig/FIG0_9.h b/src/fig/FIG0_9.h index 57b2f7b..d5714b8 100644 --- a/src/fig/FIG0_9.h +++ b/src/fig/FIG0_9.h @@ -28,8 +28,6 @@ #include #include -#include "fig/FIG0structs.h" - namespace FIC { // FIG type 0/9 diff --git a/src/fig/FIG0structs.h b/src/fig/FIG0structs.h index ac2f233..d022dc4 100644 --- a/src/fig/FIG0structs.h +++ b/src/fig/FIG0structs.h @@ -31,333 +31,6 @@ #include "fig/FIG.h" -#ifdef _WIN32 -# pragma pack(push) -#endif - -struct FIGtype0 { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; -} PACKED; - - -struct FIGtype0_0 { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; - - uint16_t EId; - uint8_t CIFcnt_hight:5; - uint8_t Al:1; - uint8_t Change:2; - uint8_t CIFcnt_low:8; -} PACKED; - - -struct FIGtype0_2 { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; -} PACKED; - - -struct FIGtype0_2_Service { - uint16_t SId; - uint8_t NbServiceComp:4; - uint8_t CAId:3; - uint8_t Local_flag:1; -} PACKED; - - -struct FIGtype0_2_Service_data { - uint32_t SId; - uint8_t NbServiceComp:4; - uint8_t CAId:3; - uint8_t Local_flag:1; -} PACKED; - - -struct FIGtype0_2_audio_component { - uint8_t ASCTy:6; - uint8_t TMid:2; - uint8_t CA_flag:1; - uint8_t PS:1; - uint8_t SubChId:6; -} PACKED; - - -struct FIGtype0_2_data_component { - uint8_t DSCTy:6; - uint8_t TMid:2; - uint8_t CA_flag:1; - uint8_t PS:1; - uint8_t SubChId:6; -} PACKED; - - -struct FIGtype0_2_packet_component { - uint8_t SCId_high:6; - uint8_t TMid:2; - uint8_t CA_flag:1; - uint8_t PS:1; - uint8_t SCId_low:6; - void setSCId(uint16_t SCId) { - SCId_high = SCId >> 6; - SCId_low = SCId & 0x3f; - } -} PACKED; - - -/* Warning: When bit SCCA_flag is unset(0), the multiplexer R&S does not send - * the SCCA field. But, in the Factum ETI analyzer, if this field is not there, - * it is an error. - */ -struct FIGtype0_3 { - uint8_t SCId_high; - uint8_t SCCA_flag:1; - uint8_t rfa:3; - uint8_t SCId_low:4; - uint8_t DSCTy:6; - uint8_t rfu:1; - uint8_t DG_flag:1; - uint8_t Packet_address_high:2; - uint8_t SubChId:6; - uint8_t Packet_address_low; - uint16_t SCCA; - void setSCId(uint16_t SCId) { - SCId_high = SCId >> 4; - SCId_low = SCId & 0xf; - } - void setPacketAddress(uint16_t address) { - Packet_address_high = address >> 8; - Packet_address_low = address & 0xff; - } -} PACKED; - -struct FIGtype0_5_short { - uint8_t SubChId:6; - uint8_t rfu:1; - uint8_t LS:1; - - uint8_t language; -} PACKED; - -struct FIGtype0_6 { - uint8_t LSN_high:4; // Linkage Set Number - uint8_t ILS:1; // 0=national / 1=international - uint8_t SH:1; // 0=Soft link / 1=Hard link - uint8_t LA:1; // Linkage actuator - uint8_t IdListFlag:1; // Marks the presence of the list - - uint8_t LSN_low; // Linkage Set Number - - void setLSN(uint16_t LSN) { - LSN_high = LSN >> 8; - LSN_low = LSN & 0xff; - } -} PACKED; - -#define FIG0_6_IDLQ_DAB 0x0 -#define FIG0_6_IDLQ_RDS 0x1 -#define FIG0_6_IDLQ_DRM_AMSS 0x3 - -struct FIGtype0_6_header { - uint8_t num_ids:4; // number of Ids to follow in the list - uint8_t rfa:1; // must be 0 - uint8_t IdLQ:2; // Identifier List Qualifier, see above defines - uint8_t rfu:1; // must be 0 -} PACKED; - -struct FIGtype0_8_short { - uint8_t SCIdS:4; - uint8_t rfa_1:3; - uint8_t ext:1; - uint8_t Id:6; - uint8_t MscFic:1; - uint8_t LS:1; - uint8_t rfa_2; -} PACKED; - - -struct FIGtype0_8_long { - uint8_t SCIdS:4; - uint8_t rfa_1:3; - uint8_t ext:1; - uint8_t SCId_high:4; - uint8_t rfa:3; - uint8_t LS:1; - uint8_t SCId_low; - uint8_t rfa_2; - void setSCId(uint16_t id) { - SCId_high = id >> 8; - SCId_low = id & 0xff; - } - uint16_t getSCid() { - return (SCId_high << 8) | SCId_low; - } -} PACKED; - - -struct FIGtype0_9 { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; - - uint8_t ensembleLto:6; - uint8_t rfa1:1; - uint8_t ext:1; - uint8_t ensembleEcc; - uint8_t tableId; -} PACKED; - - -struct FIGtype0_10_LongForm { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; - - uint8_t MJD_high:7; - uint8_t RFU:1; - - uint8_t MJD_med; - - uint8_t Hours_high:3; - uint8_t UTC:1; - uint8_t ConfInd:1; - uint8_t LSI:1; - uint8_t MJD_low:2; - - uint8_t Minutes:6; - uint8_t Hours_low:2; - - uint8_t Milliseconds_high:2; - uint8_t Seconds:6; - - uint8_t Milliseconds_low; - - void setMJD(uint32_t date) { - MJD_high = (date >> 10) & 0x7f; - MJD_med = (date >> 2) & 0xff; - MJD_low = date & 0x03; - } - void setHours(uint16_t hours) { - Hours_high = (hours >> 2) & 0x07; - Hours_low = hours & 0x03; - } - - void setMilliseconds(uint16_t ms) { - Milliseconds_high = (ms >> 8) & 0x03; - Milliseconds_low = ms & 0xFF; - } -} PACKED; - - -struct FIGtype0_17 { - uint16_t SId; - - uint8_t rfa2_high:4; - uint8_t rfu1:2; - uint8_t rfa1:1; - uint8_t SD:1; // Static/Dynamic - - uint8_t IntCode:5; - uint8_t rfu2:1; - uint8_t rfa2_low:2; -} PACKED; - -struct FIGtype0_18 { - uint16_t SId; - uint16_t ASu; - uint8_t NumClusters:5; - uint8_t Rfa:3; - /* Followed by uint8_t Cluster IDs */ -} PACKED; - -struct FIGtype0_19 { - uint8_t ClusterId; - uint16_t ASw; - uint8_t SubChId:6; - uint8_t RegionFlag:1; // shall be zero - uint8_t NewFlag:1; - // Region and RFa not supported -} PACKED; - -struct FIGtype0_1 { - uint8_t Length:5; - uint8_t FIGtypeNumber:3; - uint8_t Extension:5; - uint8_t PD:1; - uint8_t OE:1; - uint8_t CN:1; -} PACKED; - - -struct FIG_01_SubChannel_ShortF { - uint8_t StartAdress_high:2; - uint8_t SubChId:6; - uint8_t StartAdress_low:8; - uint8_t TableIndex:6; - uint8_t TableSwitch:1; - uint8_t Short_Long_form:1; -} PACKED; - - -struct FIG_01_SubChannel_LongF { - uint8_t StartAdress_high:2; - uint8_t SubChId:6; - uint8_t StartAdress_low:8; - uint8_t Sub_ChannelSize_high:2; - uint8_t ProtectionLevel:2; - uint8_t Option:3; - uint8_t Short_Long_form:1; - uint8_t Sub_ChannelSize_low:8; -} PACKED; - - -// See EN 300 401, Clause 8.1.20 for the FIG0_13 description -struct FIG0_13_shortAppInfo { - uint16_t SId; - uint8_t No:4; - uint8_t SCIdS:4; -} PACKED; - - -struct FIG0_13_longAppInfo { - uint32_t SId; - uint8_t No:4; - uint8_t SCIdS:4; -} PACKED; - - -struct FIG0_13_app { - uint8_t typeHigh; - uint8_t length:5; - uint8_t typeLow:3; - void setType(uint16_t type) { - typeHigh = type >> 3; - typeLow = type & 0x1f; - } - uint16_t xpad; -} PACKED; - - #define FIG0_13_APPTYPE_SLIDESHOW 0x2 #define FIG0_13_APPTYPE_WEBSITE 0x3 #define FIG0_13_APPTYPE_TPEG 0x4 @@ -368,30 +41,12 @@ struct FIG0_13_app { #define FIG0_13_APPTYPE_JOURNALINE 0x441 -struct FIGtype0_21_header { - uint16_t rfa:11; - uint16_t length_fi:5; -} PACKED; - -struct FIGtype0_21_fi_list_header { - uint16_t id; - uint8_t range_modulation:4; - uint8_t continuity:1; - uint8_t length_freq_list:3; -} PACKED; - -struct FIGtype0_21_fi_dab_entry { - uint8_t control_field:5; - uint8_t freqHigh:3; - uint16_t freqLow; - - void setFreq(uint32_t freq) { - freqHigh = (freq >> 16) & 0x7; - freqLow = freq & 0xffff; - } +struct FIGtype0 { + uint8_t Length:5; + uint8_t FIGtypeNumber:3; + uint8_t Extension:5; + uint8_t PD:1; + uint8_t OE:1; + uint8_t CN:1; } PACKED; -#ifdef _WIN32 -# pragma pack(pop) -#endif - -- cgit v1.2.3