From 05da854addac962e20ff9f1e7bdad3cbacb66905 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Fri, 22 Nov 2013 19:12:30 +0100 Subject: Add AFPacket and a few TagItems --- src/dabOutput/edi/AFPacket.cpp | 45 ++++++++++++++ src/dabOutput/edi/AFPacket.h | 60 +++++++++++++++++++ src/dabOutput/edi/TagItems.cpp | 132 +++++++++++++++++++++++++++++++++++++++++ src/dabOutput/edi/TagItems.h | 116 ++++++++++++++++++++++++++++++++++++ 4 files changed, 353 insertions(+) create mode 100644 src/dabOutput/edi/AFPacket.cpp create mode 100644 src/dabOutput/edi/AFPacket.h create mode 100644 src/dabOutput/edi/TagItems.cpp create mode 100644 src/dabOutput/edi/TagItems.h diff --git a/src/dabOutput/edi/AFPacket.cpp b/src/dabOutput/edi/AFPacket.cpp new file mode 100644 index 0000000..f690b92 --- /dev/null +++ b/src/dabOutput/edi/AFPacket.cpp @@ -0,0 +1,45 @@ +/* + Copyright (C) 2013 Matthias P. Braendli + http://mpb.li + + EDI output. + This implements an AF Packet as defined ETSI TS 102 821. + Also see ETSI TS 102 693 + + */ +/* + This file is part of CRC-DabMux. + + CRC-DabMux is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + CRC-DabMux is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CRC-DabMux. If not, see . + */ +#include "config.h" +#include "AFPacket.h" +#include +#include +#include + +std::vector AFPacket::Assemble() +{ + header.sync = 'A' << 8 | 'F'; + header.seq = 0; + header.ar_cf = 0; + header.ar_maj = 1; + header.ar_min = 0; + header.pt = 'T'; + + std::string pack_data("Nothingyetpleasecomelater"); + std::vector packet(pack_data.begin(), pack_data.end()); + return packet; +} + diff --git a/src/dabOutput/edi/AFPacket.h b/src/dabOutput/edi/AFPacket.h new file mode 100644 index 0000000..c4f33bf --- /dev/null +++ b/src/dabOutput/edi/AFPacket.h @@ -0,0 +1,60 @@ +/* + Copyright (C) 2013 Matthias P. Braendli + http://mpb.li + + EDI output. + This implements an AF Packet as defined ETSI TS 102 821. + Also see ETSI TS 102 693 + + */ +/* + This file is part of CRC-DabMux. + + CRC-DabMux is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + CRC-DabMux is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CRC-DabMux. If not, see . + */ + +#ifndef _AFPACKET_H_ +#define _AFPACKET_H_ + +#include "config.h" +#include +#include +#define PACKED __attribute__ ((packed)) + +// ETSI TS 102 821, 6.1 AF packet structure +struct AFHeader +{ + uint16_t sync; + uint32_t len; + uint16_t seq; + uint8_t ar_cf:1; + uint8_t ar_maj:3; + uint8_t ar_min:4; + uint8_t pt; +} PACKED; + +class AFPacket +{ + public: + AFPacket(); + + std::vector Assemble(); + + private: + AFHeader header; + std::vector packet_; +}; + +#endif + diff --git a/src/dabOutput/edi/TagItems.cpp b/src/dabOutput/edi/TagItems.cpp new file mode 100644 index 0000000..b83c1bf --- /dev/null +++ b/src/dabOutput/edi/TagItems.cpp @@ -0,0 +1,132 @@ +/* + Copyright (C) 2013 Matthias P. Braendli + http://mpb.li + + EDI output. + This defines a few TAG items as defined ETSI TS 102 821 and + ETSI TS 102 693 + + */ +/* + This file is part of CRC-DabMux. + + CRC-DabMux is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + CRC-DabMux is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CRC-DabMux. If not, see . + */ + +#ifndef _AFPACKET_H_ +#define _AFPACKET_H_ + +#include "config.h" +#include "TagItems.h" +#include +#include +#include + +std::vector TagStarPTR::Assemble() +{ + std::string pack_data("*ptr\0\0\0\100DETI"); + std::vector packet(pack_data.begin(), pack_data.end()); + return packet; +} + +std::vector TagDETI::Assemble() +{ + std::string pack_data("deti\0\0\0\0"); + std::vector packet(pack_data.begin(), pack_data.end()); + packet.reserve(256); + + uint16_t detiHeader = dflc | (rfudf << 13) | (ficf << 14) | (atstf << 15); + packet.push_back(detiHeader >> 8); + packet.push_back(detiHeader & 0xFF); + + uint32_t etiHeader = mnsc | (rfu << 16) | (rfa << 17) | + (fp << 19) | (mid << 22) | (stat << 24); + packet.push_back((etiHeader >> 24) & 0xFF); + packet.push_back((etiHeader >> 16) & 0xFF); + packet.push_back((etiHeader >> 8) & 0xFF); + packet.push_back(etiHeader & 0xFF); + + if (atstf) { + packet.push_back(utco); + + packet.push_back((seconds >> 24) & 0xFF); + packet.push_back((seconds >> 16) & 0xFF); + packet.push_back((seconds >> 8) & 0xFF); + packet.push_back(seconds & 0xFF); + + packet.push_back((tsta >> 16) & 0xFF); + packet.push_back((tsta >> 8) & 0xFF); + packet.push_back(tsta & 0xFF); + } + + if (ficf) { + for (size_t i = 0; i < fic_length; i++) { + packet.push_back(fic_data[i]); + } + } + + if (rfudf) { + packet.push_back((rfud >> 16) & 0xFF); + packet.push_back((rfud >> 8) & 0xFF); + packet.push_back(rfud & 0xFF); + } + + // calculate and update size + // remove TAG name and TAG length fields and convert to bits + uint32_t taglength = (packet.size() - 8) * 8; + + // write length into packet + packet[4] = (taglength >> 24) & 0xFF; + packet[5] = (taglength >> 16) & 0xFF; + packet[6] = (taglength >> 8) & 0xFF; + packet[7] = taglength & 0xFF; + + dflc = (dflc+1) % 5000; + + return packet; +} + + +std::vector TagESTn::Assemble() +{ + std::string pack_data("estN\0\0\0\0"); + std::vector packet(pack_data.begin(), pack_data.end()); + + packet[3] = id_; // replace the N in estN above + + packet.reserve(mst_length*8 + 16); + + uint32_t sstc = (scid << 18) | (sad << 8) | (tpl << 2) | rfa; + packet.push_back((sstc >> 16) & 0xFF); + packet.push_back((sstc >> 8) & 0xFF); + packet.push_back(sstc & 0xFF); + + for (size_t i = 0; i < mst_length; i++) { + packet.push_back(mst_data[i]); + } + + // calculate and update size + // remove TAG name and TAG length fields and convert to bits + uint32_t taglength = (packet.size() - 8) * 8; + + // write length into packet + packet[4] = (taglength >> 24) & 0xFF; + packet[5] = (taglength >> 16) & 0xFF; + packet[6] = (taglength >> 8) & 0xFF; + packet[7] = taglength & 0xFF; + + return packet; +} +#endif + diff --git a/src/dabOutput/edi/TagItems.h b/src/dabOutput/edi/TagItems.h new file mode 100644 index 0000000..c0e863a --- /dev/null +++ b/src/dabOutput/edi/TagItems.h @@ -0,0 +1,116 @@ +/* + Copyright (C) 2013 Matthias P. Braendli + http://mpb.li + + EDI output. + This defines a few TAG items as defined ETSI TS 102 821 and + ETSI TS 102 693 + + */ +/* + This file is part of CRC-DabMux. + + CRC-DabMux is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + CRC-DabMux is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CRC-DabMux. If not, see . + */ + +#ifndef _TAGITEMS_H_ +#define _TAGITEMS_H_ + +#include "config.h" +#include "Eti.h" +#include +#include +#include +#define PACKED __attribute__ ((packed)) + +class TagItem +{ + public: + virtual std::vector Assemble() = 0; +}; + +// ETSI TS 102 693, 5.1.1 Protocol type and revision +class TagStarPTR : public TagItem +{ + public: + std::vector Assemble(); +}; + +// ETSI TS 102 693, 5.1.3 DAB ETI(LI) Management (deti) +class TagDETI : public TagItem +{ + public: + TagDETI() + { + // set optional fields to "not present" + atstf = 0; + rfudf = 0; + ficf = 0; + + dflc = 0; // counter + } + std::vector Assemble(); + + /***** DATA in intermediary format ****/ + // For the ETI Header: must be defined ! + uint8_t stat; + uint8_t mid; + uint8_t fp; + uint8_t rfa; + uint8_t rfu; + uint8_t mnsc; + + // ATST (optional) + bool atstf; // presence of atst data + uint8_t utco; + uint32_t seconds; + uint32_t tsta; + + // the FIC (optional) + bool ficf; + const char* fic_data; + size_t fic_length; + + // rfu + bool rfudf; + uint32_t rfud; + + private: + uint32_t dflc; //modulo 5000 counter for each eti frame + +}; + +// ETSI TS 102 693, 5.1.5 ETI Sub-Channel Stream +class TagESTn : public TagItem +{ + public: + TagESTn(uint8_t id) : id_(id) {} ; + + std::vector Assemble(); + + // SSTCn + uint8_t scid; + uint8_t sad; + uint8_t tpl; + uint8_t rfa; + + // Pointer to MSTn data + uint8_t* mst_data; + size_t mst_length; // STLn * 8 bytes + + private: + uint8_t id_; +}; +#endif + -- cgit v1.2.3