libdrmconf 0.15.0
A library to program DMR radios.
Loading...
Searching...
No Matches
openrtx_link.hh
1#ifndef OPENRTXLINK_HH
2#define OPENRTXLINK_HH
3
4#include <QObject>
5#include <QHash>
6#include <QIODevice>
7#include "packetstream.hh"
8
9// Forward declaration
10class OpenRTXLink;
13class OpenRTXCAT;
14
15
36class OpenRTXLink: public QObject
37{
38 Q_OBJECT
39
40protected:
42 enum class Protocol {
43 Stdio = 0, CAT = 1, FMP = 2, XMODEM = 3
44 };
45
46public:
50 explicit OpenRTXLink(PacketStream *link, QObject *parent = nullptr);
51 virtual ~OpenRTXLink();
52
53 virtual bool isOpen() const;
54 virtual void close();
55
57 OpenRTXLinkStream *stdio() const;
59 OpenRTXCAT *cat() const;
61 OpenRTXLinkDatagram *fmp() const;
64
66 unsigned int timeout() const;
67
68protected:
70 bool receive(Protocol proto, QByteArray &data, int timeout=-1, const ErrorStack &err=ErrorStack());
72 bool send(Protocol proto, const QByteArray &data, int timeout=-1, const ErrorStack &err=ErrorStack());
73
74 static uint16_t crc16(const QByteArray &data);
75
76protected:
79 QHash<unsigned int, QList<QByteArray>> _inBuffers;
80 OpenRTXLinkStream *_stdio;
81 OpenRTXCAT *_cat;
82 OpenRTXLinkDatagram *_fmp;
83 OpenRTXLinkStream *_xmodem;
84 unsigned int _timeout;
85
86 friend class OpenRTXLinkStream;
87 friend class OpenRTXLinkDatagram;
88 friend class OpenRTXCAT;
89};
90
91
93class OpenRTXLinkStream: public QIODevice
94{
95 Q_OBJECT
96
97protected:
98 OpenRTXLinkStream(OpenRTXLink::Protocol proto, OpenRTXLink *link);
99
100protected:
101 qint64 writeData(const char *data, qint64 len);
102 qint64 readData(char *data, qint64 maxlen);
103
104protected:
106 QByteArray _inBuffer;
107 OpenRTXLink *_link;
108
109 friend class OpenRTXLink;
110};
111
112
113class OpenRTXLinkDatagram: public PacketStream
114{
115 Q_OBJECT
116
117protected:
118 OpenRTXLinkDatagram(OpenRTXLink::Protocol proto, OpenRTXLink *link);
119
120public:
121 bool isOpen() const override;
122 void close() override;
123 bool receive(QByteArray &buffer, int timeout, const ErrorStack &err) override;
124 bool send(const QByteArray &buffer, int timeout, const ErrorStack &err) override;
125
126protected:
128 OpenRTXLink *_link;
129
130 friend class OpenRTXLink;
131};
132
133
135class OpenRTXCAT: public OpenRTXLinkDatagram
136{
137 Q_OBJECT
138
139protected:
142 explicit OpenRTXCAT(OpenRTXLink *link);
143
144public:
145 QByteArray info(const ErrorStack &err=ErrorStack());
146 bool enterFMPMode(const ErrorStack &err=ErrorStack());
147
148protected:
149 friend class OpenRTXLink;
150};
151
152#endif // OPENRTXLINK_HH
Implements a stack of error messages to provide a pretty formatted error traceback.
Definition errorstack.hh:43
Implements the CAT interface to OpenRTX devices.
Definition openrtx_link.hh:136
OpenRTXCAT(OpenRTXLink *link)
Hidden constrcutor.
Definition openrtx_link.cc:84
Definition openrtx_link.hh:114
void close() override
Closes the stream.
Definition openrtx_link.cc:66
bool isOpen() const override
Returns true if the stream is open.
Definition openrtx_link.cc:61
bool send(const QByteArray &buffer, int timeout, const ErrorStack &err) override
Receives a datagram.
Definition openrtx_link.cc:76
bool receive(QByteArray &buffer, int timeout, const ErrorStack &err) override
Receives a datagram.
Definition openrtx_link.cc:71
An abstract stream encapsulated within OpenRTXLink.
Definition openrtx_link.hh:94
Defines an interface for a datagram socket.
Definition packetstream.hh:13
PacketStream(QObject *parent=nullptr)
Hidden constructor.
Definition packetstream.cc:8