/* Copyright (C) 2019 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org This program 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 2 of the License, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #pragma once #include "common.hpp" #include "STIDecoder.hpp" #include #include #include #include namespace EdiDecoder { struct sti_frame_t { std::vector frame; frame_timestamp_t timestamp; audio_level_data audio_levels; odr_version_data version_data; }; class STIWriter : public STIDataCollector { public: // Tell the ETIWriter what EDI protocol we receive in *ptr. // This is not part of the ETI data, but is used as check virtual void update_protocol( const std::string& proto, uint16_t major, uint16_t minor); virtual void update_stat(uint8_t stat, uint16_t spid); virtual void update_edi_time( uint32_t utco, uint32_t seconds); virtual void update_rfad(std::array rfad); virtual void update_sti_management(const sti_management_data& data); virtual void add_payload(sti_payload_data&& payload); virtual void update_audio_levels(const audio_level_data& data); virtual void update_odr_version(const odr_version_data& data); virtual void assemble(void); // Return the assembled frame or an empty frame if not ready sti_frame_t getFrame(); private: void reinit(void); bool m_proto_valid = false; bool m_management_data_valid = false; sti_management_data m_management_data; bool m_stat_valid = false; uint8_t m_stat = 0; uint16_t m_spid = 0; bool m_time_valid = false; uint32_t m_utco = 0; uint32_t m_seconds = 0; bool m_payload_valid = false; sti_payload_data m_payload; audio_level_data m_audio_levels; odr_version_data m_version_data; sti_frame_t m_stiFrame; }; }