aboutsummaryrefslogtreecommitdiffstats
path: root/lib/edi/ETIDecoder.hpp
blob: cec284fe7ab396f822014cd5a7bb707d0f25cc9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
   Copyright (C) 2016
   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 <stdint.h>
#include <deque>
#include <string>
#include <vector>
#include "ETIWriter.hpp"
#include "PFT.hpp"

namespace EdiDecoder {

struct decode_state_t {
    decode_state_t(bool _complete, size_t _num_bytes_consumed) :
        complete(_complete), num_bytes_consumed(_num_bytes_consumed) {}
    bool complete;
    size_t num_bytes_consumed;
};

class ETIDecoder {
    public:
        ETIDecoder(ETIWriter& eti_writer);

        /* Push bytes into the decoder. The buf can contain more
         * than a single packet. This is useful when reading from streams
         * (files, TCP)
         */
        void push_bytes(const std::vector<uint8_t> &buf);

        /* Push a complete packet into the decoder. Useful for UDP and other
         * datagram-oriented protocols.
         */
        void push_packet(const std::vector<uint8_t> &buf);

        /* Set the maximum delay in number of AF Packets before we
         * abandon decoding a given pseq.
         */
        void setMaxDelay(int num_af_packets);

    private:
        decode_state_t decode_afpacket(const std::vector<uint8_t> &input_data);
        bool decode_tagpacket(const std::vector<uint8_t> &payload);
        bool decode_starptr(const std::vector<uint8_t> &value);
        bool decode_deti(const std::vector<uint8_t> &value);
        bool decode_estn(const std::vector<uint8_t> &value, uint8_t n);
        bool decode_stardmy(const std::vector<uint8_t> &value);

        ETIWriter& m_eti_writer;

        PFT::PFT m_pft;

        uint16_t m_last_seq;

        std::vector<uint8_t> m_input_data;
};

}