diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-02-14 11:14:41 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-02-14 11:14:41 +0100 |
commit | 6b9857cb1b2ab6b58e6e42df4b0cce54448b10a0 (patch) | |
tree | a59216616d9fd1d0c6468bdc300f9b6c9b6a04e1 /src/MuxElements.cpp | |
parent | 00f1d412ad410eca7e4032686b907c5e8f7915ec (diff) | |
download | dabmux-6b9857cb1b2ab6b58e6e42df4b0cce54448b10a0.tar.gz dabmux-6b9857cb1b2ab6b58e6e42df4b0cce54448b10a0.tar.bz2 dabmux-6b9857cb1b2ab6b58e6e42df4b0cce54448b10a0.zip |
improve handling of labels
Diffstat (limited to 'src/MuxElements.cpp')
-rw-r--r-- | src/MuxElements.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/MuxElements.cpp b/src/MuxElements.cpp index aa5a401..3ac63e3 100644 --- a/src/MuxElements.cpp +++ b/src/MuxElements.cpp @@ -42,6 +42,92 @@ const unsigned short Sub_Channel_SizeTable[64] = { using namespace std; +int DabLabel::setLabel(const std::string& text) +{ + int len = text.length(); + if (len > 16) + return -3; + + memset(m_text, 0, 16); + memcpy(m_text, text.c_str(), len); + + return 0; +} + +int DabLabel::setLabel(const std::string& text, const std::string& short_label) +{ + DabLabel newlabel; + + memset(newlabel.m_text, 0, 16); + int len = text.length(); + if (len > 16) + return -3; + memcpy(newlabel.m_text, text.c_str(), len); + + /* First check if we can actually create the short label */ + int flag = newlabel.setShortLabel(short_label); + if (flag < 0) + return flag; + + // short label is valid. + memcpy(this->m_text, newlabel.m_text, len); + this->m_flag = flag & 0xFFFF; + + return 0; +} + +/* The label.flag is a 16bit mask that tells which label + * characters are to be used for the short label + * + * From EN 300 401, clause 5.2.2.2.1: + * + * Character flag field: this 16-bit flag field shall indicate which of the + * characters of the character field are to be + * displayed in an abbreviated form of the label, as follows: + * bi: (i = 0, ... ,15); + * 0: not to be displayed in abbreviated label; + * 1: to be displayed in abbreviated label. + * NOTE: Not more than 8 of the bi may be set to "1". + * + * returns: the flag (16 bits) on success + * -1 if the short_label is not a representable + * -2 if the short_label is too long + */ +int DabLabel::setShortLabel(const std::string& slabel) +{ + char* end; + const char* lab; + uint16_t flag; + flag = strtoul(slabel.c_str(), &end, 0); + if (*end != 0) { + lab = slabel.c_str(); + flag = 0; + for (int i = 0; i < 32; ++i) { + if (*lab == this->m_text[i]) { + flag |= 0x8000 >> i; + if (*(++lab) == 0) { + break; + } + } + } + if (*lab != 0) { + return -1; + } + } + int count = 0; + for (int i = 0; i < 16; ++i) { + if (flag & (1 << i)) { + ++count; + } + } + if (count > 8) { + return -2; + } + + return flag; +} + + vector<dabSubchannel*>::iterator getSubchannel( vector<dabSubchannel*>& subchannels, int id) { |