15
15
#include " Utils.h"
16
16
#include " Sync.h"
17
17
#include " Log.h"
18
+ #include " SMeter.h"
18
19
19
20
#include < cstdio>
20
21
#include < cassert>
@@ -37,7 +38,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my)
37
38
38
39
// #define DUMP_DSTAR
39
40
40
- CDStarControl::CDStarControl (const std::string& callsign, const std::string& module , bool selfOnly, bool ackReply, unsigned int ackTime, bool ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
41
+ CDStarControl::CDStarControl (const std::string& callsign, const std::string& module , bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
41
42
m_callsign(NULL ),
42
43
m_gateway(NULL ),
43
44
m_selfOnly(selfOnly),
@@ -139,9 +140,9 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
139
140
unsigned char n,
140
141
bool blank_dtmf,
141
142
unsigned char * voice_sync_data,
142
- unsigned int * voice_sync_data_len,
143
- bool * next_frame_is_fast_data,
144
- unsigned int * skip_dtmf_blanking_frames
143
+ unsigned int & voice_sync_data_len,
144
+ bool & next_frame_is_fast_data,
145
+ unsigned int & skip_dtmf_blanking_frames
145
146
)
146
147
{
147
148
unsigned int errors = 0U ;
@@ -151,37 +152,40 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
151
152
152
153
if (n == 0U ) {
153
154
::memcpy (voice_sync_data, data, DSTAR_MODEM_DATA_LEN);
154
- * voice_sync_data_len = len;
155
+ voice_sync_data_len = len;
155
156
} else if ((n % 2U != 0U ) &&
156
157
((mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA01) ||
157
158
(mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA16))) {
158
- * next_frame_is_fast_data = true ;
159
+ next_frame_is_fast_data = true ;
159
160
if (blank_dtmf)
160
- * skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
161
+ skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
161
162
if (n == 1U )
162
- LogDebug (" D-Star, %s fastdata sequence no. 0" , log_prefix);
163
+ LogDebug (" D-Star, %s fastdata sequence no. 0" , log_prefix);
163
164
LogDebug (" D-Star, %s fastdata sequence no. %2u" , log_prefix, n);
164
- } else if (* next_frame_is_fast_data == true ) {
165
- * next_frame_is_fast_data = false ;
165
+ } else if (next_frame_is_fast_data) {
166
+ next_frame_is_fast_data = false ;
166
167
if (blank_dtmf)
167
- * skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
168
+ skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES;
168
169
LogDebug (" D-Star, %s fastdata sequence no. %2u" , log_prefix, n);
169
170
} else {
170
171
bool voice_sync_data_is_null_ambe_data = false ;
171
172
bool data_is_null_ambe_data = false ;
173
+
172
174
if ((n == 1U ) && (::memcmp (voice_sync_data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0 ))
173
175
voice_sync_data_is_null_ambe_data = true ;
176
+
174
177
if (::memcmp (data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0 )
175
178
data_is_null_ambe_data = true ;
176
179
177
180
if ((n == 1U ) && !voice_sync_data_is_null_ambe_data)
178
181
voice_sync_errors += m_fec.regenerateDStar (voice_sync_data + offset);
182
+
179
183
if (!data_is_null_ambe_data)
180
184
errors += m_fec.regenerateDStar (data + offset);
181
185
182
- if (blank_dtmf && (* skip_dtmf_blanking_frames > 0U ) ) {
183
- (* skip_dtmf_blanking_frames) --;
184
- } else if (blank_dtmf && (* skip_dtmf_blanking_frames == 0U ) ) {
186
+ if (blank_dtmf && skip_dtmf_blanking_frames > 0U ) {
187
+ skip_dtmf_blanking_frames--;
188
+ } else if (blank_dtmf && skip_dtmf_blanking_frames == 0U ) {
185
189
if ((n == 1U ) && !voice_sync_data_is_null_ambe_data)
186
190
blankDTMF (voice_sync_data + offset);
187
191
if (!data_is_null_ambe_data)
@@ -190,17 +194,16 @@ unsigned int CDStarControl::maybeFixupVoiceFrame(
190
194
191
195
if (n == 1U ) {
192
196
if (voice_sync_data_is_null_ambe_data)
193
- LogDebug (" D-Star, %s nullaudio sequence no. 0" , log_prefix);
197
+ LogDebug (" D-Star, %s nullaudio sequence no. 0" , log_prefix);
194
198
else
195
- LogDebug (" D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)" , log_prefix, voice_sync_errors,
196
- float (voice_sync_errors) / 0 .48F );
199
+ LogDebug (" D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)" , log_prefix, voice_sync_errors, float (voice_sync_errors) / 0 .48F );
197
200
}
201
+
198
202
if (data_is_null_ambe_data)
199
203
LogDebug (" D-Star, %s nullaudio sequence no. %2u" , log_prefix, n);
200
204
else
201
- LogDebug (" D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)" , log_prefix, n, errors,
202
- float (errors) / 0 .48F );
203
- }
205
+ LogDebug (" D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)" , log_prefix, n, errors, float (errors) / 0 .48F );
206
+ }
204
207
205
208
return voice_sync_errors + errors;
206
209
}
@@ -455,8 +458,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
455
458
456
459
unsigned int errors = 0U ;
457
460
if (!m_rfHeader.isDataPacket ()) {
458
- errors = maybeFixupVoiceFrame (data, len, 1U , " RF" , m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen,
459
- &m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames);
461
+ errors = maybeFixupVoiceFrame (data, len, 1U , " RF" , m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames);
460
462
m_display->writeDStarBER (float (errors) / 0 .48F );
461
463
m_rfErrs += errors;
462
464
}
@@ -588,8 +590,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
588
590
589
591
unsigned int errors = 0U ;
590
592
if (!m_rfHeader.isDataPacket ()) {
591
- errors = maybeFixupVoiceFrame (data, len, 1U , " RF" , m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen,
592
- &m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames);
593
+ errors = maybeFixupVoiceFrame (data, len, 1U , " RF" , m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames);
593
594
m_rfErrs += errors;
594
595
}
595
596
@@ -789,8 +790,7 @@ void CDStarControl::writeNetwork()
789
790
790
791
unsigned int errors = 0U ;
791
792
if (!m_netHeader.isDataPacket ())
792
- errors = maybeFixupVoiceFrame (data, length, 2U , " Net" , n, true , m_netVoiceSyncData, &m_netVoiceSyncDataLen,
793
- &m_netNextFrameIsFastData, &m_netSkipDTMFBlankingFrames);
793
+ errors = maybeFixupVoiceFrame (data, length, 2U , " Net" , n, true , m_netVoiceSyncData, m_netVoiceSyncDataLen, m_netNextFrameIsFastData, m_netSkipDTMFBlankingFrames);
794
794
795
795
// Insert silence and reject if in the past
796
796
bool ret = insertSilence (data + 1U , n);
@@ -1182,18 +1182,33 @@ void CDStarControl::sendAck()
1182
1182
m_network->getStatus (status, reflector);
1183
1183
1184
1184
char text[40U ];
1185
- if (m_ackMessage && m_rssi != 0 ) {
1185
+ if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0 ) {
1186
+ if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
1187
+ CUtils::removeChar (reflector, ' ' );// remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
1188
+ ::sprintf (text, " %-8.8s %.1f%% -%udBm " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1189
+ } else {
1190
+ ::sprintf (text, " BER:%.1f%% -%udBm " , float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1191
+ }
1192
+ } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0 ) {
1193
+ unsigned int signal, plus;
1194
+ char signalText[10U ];
1195
+ CSMeter::getSignal (m_aveRSSI / m_rssiCount, signal, plus);
1196
+ if (plus != 0U )
1197
+ ::sprintf (signalText, " S%u+%02u" , signal, plus);
1198
+ else
1199
+ ::sprintf (signalText, " S%u" , signal);
1200
+
1186
1201
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
1187
- ::sprintf (text, " %-8.8s -%udBm " , reflector, m_aveRSSI / m_rssiCount );
1202
+ ::sprintf (text, " %-8.8s %.1f%% %s " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits), signalText );
1188
1203
else
1189
- ::sprintf (text, " BER:%.1f%% -%udBm " , float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1190
- }
1191
- else {
1204
+ ::sprintf (text, " BER:%.1f%% %s " , float (m_rfErrs * 100U ) / float(m_rfBits), signalText);
1205
+ } else {
1192
1206
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
1193
1207
::sprintf (text, " %-8.8s BER: %.1f%% " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits));
1194
1208
else
1195
1209
::sprintf (text, " BER: %.1f%% " , float (m_rfErrs * 100U ) / float(m_rfBits));
1196
1210
}
1211
+
1197
1212
m_slowData.setText (text);
1198
1213
1199
1214
::memcpy (data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U );
@@ -1232,18 +1247,33 @@ void CDStarControl::sendError()
1232
1247
m_network->getStatus (status, reflector);
1233
1248
1234
1249
char text[40U ];
1235
- if (m_ackMessage && m_rssi != 0 ) {
1250
+ if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0 ) {
1251
+ if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
1252
+ CUtils::removeChar (reflector, ' ' );// remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
1253
+ ::sprintf (text, " %-8.8s %.1f%% -%udBm " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1254
+ } else {
1255
+ ::sprintf (text, " BER:%.1f%% -%udBm " , float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1256
+ }
1257
+ } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0 ) {
1258
+ unsigned int signal, plus;
1259
+ char signalText[10U ];
1260
+ CSMeter::getSignal (m_aveRSSI / m_rssiCount, signal, plus);
1261
+ if (plus != 0U )
1262
+ ::sprintf (signalText, " S%u+%02u" , signal, plus);
1263
+ else
1264
+ ::sprintf (signalText, " S%u" , signal);
1265
+
1236
1266
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
1237
- ::sprintf (text, " %-8.8s -%udBm " , reflector, m_aveRSSI / m_rssiCount );
1267
+ ::sprintf (text, " %-8.8s %.1f%% %s " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits), signalText );
1238
1268
else
1239
- ::sprintf (text, " BER:%.1f%% -%udBm " , float (m_rfErrs * 100U ) / float(m_rfBits), m_aveRSSI / m_rssiCount);
1240
- }
1241
- else {
1269
+ ::sprintf (text, " BER:%.1f%% %s " , float (m_rfErrs * 100U ) / float(m_rfBits), signalText);
1270
+ } else {
1242
1271
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
1243
1272
::sprintf (text, " %-8.8s BER: %.1f%% " , reflector, float (m_rfErrs * 100U ) / float(m_rfBits));
1244
1273
else
1245
1274
::sprintf (text, " BER: %.1f%% " , float (m_rfErrs * 100U ) / float(m_rfBits));
1246
1275
}
1276
+
1247
1277
m_slowData.setText (text);
1248
1278
1249
1279
::memcpy (data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U );
0 commit comments