27
27
28
28
const unsigned int BUFFER_LENGTH = 1500U ;
29
29
30
- CFMNetwork::CFMNetwork (const std::string& protocol, const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
30
+ CFMNetwork::CFMNetwork (const std::string& callsign, const std::string& protocol, const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
31
+ m_callsign(callsign),
31
32
m_protocol(FMNP_USRP),
32
33
m_socket(localAddress, localPort),
33
34
m_addr(),
@@ -37,12 +38,18 @@ m_enabled(false),
37
38
m_buffer(2000U , " FM Network" ),
38
39
m_seqNo(0U )
39
40
{
41
+ assert (!callsign.empty ());
40
42
assert (gatewayPort > 0U );
41
43
assert (!gatewayAddress.empty ());
42
44
43
45
if (CUDPSocket::lookup (gatewayAddress, gatewayPort, m_addr, m_addrLen) != 0 )
44
46
m_addrLen = 0U ;
45
47
48
+ // Remove any trailing letters in the callsign
49
+ size_t pos = callsign.find_first_of (' ' );
50
+ if (pos != std::string::npos)
51
+ m_callsign = callsign.substr (0U , pos);
52
+
46
53
// if (protocol == "USRP")
47
54
// m_protocol = FMNP_USRP;
48
55
}
@@ -68,8 +75,14 @@ bool CFMNetwork::writeData(float* data, unsigned int nSamples)
68
75
assert (data != NULL );
69
76
assert (nSamples > 0U );
70
77
71
- unsigned char buffer[1500U ];
72
- ::memset (buffer, 0x00U , 1500U );
78
+ if (m_seqNo == 0U ) {
79
+ bool ret = writeStart ();
80
+ if (!ret)
81
+ return false ;
82
+ }
83
+
84
+ unsigned char buffer[500U ];
85
+ ::memset (buffer, 0x00U , 500U );
73
86
74
87
unsigned int length = 0U ;
75
88
@@ -133,10 +146,10 @@ bool CFMNetwork::writeData(float* data, unsigned int nSamples)
133
146
return m_socket.write (buffer, length, m_addr, m_addrLen);
134
147
}
135
148
136
- bool CFMNetwork::writeEOT ()
149
+ bool CFMNetwork::writeEnd ()
137
150
{
138
- unsigned char buffer[1500U ];
139
- ::memset (buffer, 0x00U , 1500U );
151
+ unsigned char buffer[500U ];
152
+ ::memset (buffer, 0x00U , 500U );
140
153
141
154
unsigned int length = 0U ;
142
155
@@ -184,15 +197,19 @@ bool CFMNetwork::writeEOT()
184
197
buffer[length++] = 0x00U ;
185
198
buffer[length++] = 0x00U ;
186
199
187
- length += 160U * sizeof ( int16_t ) ;
200
+ length += 320U ;
188
201
}
189
202
190
- if (m_debug)
191
- CUtils::dump (1U , " FM Network Data Sent" , buffer, length);
203
+ m_seqNo = 0U ;
192
204
193
- m_seqNo++;
205
+ if (length > 0U ) {
206
+ if (m_debug)
207
+ CUtils::dump (1U , " FM Network Data Sent" , buffer, length);
194
208
195
- return m_socket.write (buffer, length, m_addr, m_addrLen);
209
+ return m_socket.write (buffer, length, m_addr, m_addrLen);
210
+ } else {
211
+ return true ;
212
+ }
196
213
}
197
214
198
215
void CFMNetwork::clock (unsigned int ms)
@@ -280,3 +297,102 @@ void CFMNetwork::enable(bool enabled)
280
297
281
298
m_enabled = enabled;
282
299
}
300
+
301
+ bool CFMNetwork::writeStart ()
302
+ {
303
+ unsigned char buffer[500U ];
304
+ ::memset (buffer, 0x00U , 500U );
305
+
306
+ unsigned int length = 0U ;
307
+
308
+ if (m_protocol == FMNP_USRP) {
309
+ buffer[length++] = ' U' ;
310
+ buffer[length++] = ' S' ;
311
+ buffer[length++] = ' R' ;
312
+ buffer[length++] = ' P' ;
313
+
314
+ // Sequence number
315
+ buffer[length++] = (m_seqNo >> 24 ) & 0xFFU ;
316
+ buffer[length++] = (m_seqNo >> 16 ) & 0xFFU ;
317
+ buffer[length++] = (m_seqNo >> 8 ) & 0xFFU ;
318
+ buffer[length++] = (m_seqNo >> 0 ) & 0xFFU ;
319
+
320
+ buffer[length++] = 0x00U ;
321
+ buffer[length++] = 0x00U ;
322
+ buffer[length++] = 0x00U ;
323
+ buffer[length++] = 0x00U ;
324
+
325
+ // PTT off
326
+ buffer[length++] = 0x00U ;
327
+ buffer[length++] = 0x00U ;
328
+ buffer[length++] = 0x00U ;
329
+ buffer[length++] = 0x00U ;
330
+
331
+ buffer[length++] = 0x00U ;
332
+ buffer[length++] = 0x00U ;
333
+ buffer[length++] = 0x00U ;
334
+ buffer[length++] = 0x00U ;
335
+
336
+ // Type, 2 for metadata
337
+ buffer[length++] = 0x00U ;
338
+ buffer[length++] = 0x00U ;
339
+ buffer[length++] = 0x00U ;
340
+ buffer[length++] = 0x02U ;
341
+
342
+ buffer[length++] = 0x00U ;
343
+ buffer[length++] = 0x00U ;
344
+ buffer[length++] = 0x00U ;
345
+ buffer[length++] = 0x00U ;
346
+
347
+ buffer[length++] = 0x00U ;
348
+ buffer[length++] = 0x00U ;
349
+ buffer[length++] = 0x00U ;
350
+ buffer[length++] = 0x00U ;
351
+
352
+ // TLV TAG for Metadata
353
+ buffer[length++] = 0x08U ;
354
+
355
+ // TLV Length
356
+ buffer[length++] = 3U + 4U + 3U + 1U + 1U + m_callsign.size () + 1U ;
357
+
358
+ // DMR Id
359
+ buffer[length++] = 0x00U ;
360
+ buffer[length++] = 0x00U ;
361
+ buffer[length++] = 0x00U ;
362
+
363
+ // Rpt Id
364
+ buffer[length++] = 0x00U ;
365
+ buffer[length++] = 0x00U ;
366
+ buffer[length++] = 0x00U ;
367
+ buffer[length++] = 0x00U ;
368
+
369
+ // Talk Group
370
+ buffer[length++] = 0x00U ;
371
+ buffer[length++] = 0x00U ;
372
+ buffer[length++] = 0x00U ;
373
+
374
+ // Time Slot
375
+ buffer[length++] = 0x00U ;
376
+
377
+ // Color Code
378
+ buffer[length++] = 0x00U ;
379
+
380
+ // Callsign
381
+ for (std::string::const_iterator it = m_callsign.cbegin (); it != m_callsign.cend (); ++it)
382
+ buffer[length++] = *it;
383
+
384
+ // End of Metadata
385
+ buffer[length++] = 0x00U ;
386
+
387
+ length = 70U ;
388
+ }
389
+
390
+ if (length > 0U ) {
391
+ if (m_debug)
392
+ CUtils::dump (1U , " FM Network Data Sent" , buffer, length);
393
+
394
+ return m_socket.write (buffer, length, m_addr, m_addrLen);
395
+ } else {
396
+ return true ;
397
+ }
398
+ }
0 commit comments