mirror of
https://github.com/lwvmobile/dsd-fme.git
synced 2026-11-14 09:47:30 -05:00
commit 833e0173f24b12a12ff80f9a35fb43107d355cc3 Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 22:51:02 2024 -0400 Fix Slot Preference Depending on Build; commit 716577ab09c0cee68bca3bcdcbaaa7cfa3be4f97 Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 22:27:24 2024 -0400 M17 - Voice Playback Only If Enabled; Misc; commit c0f9818cf38ce7f127370f19ec4afa2457cef19a Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 17:39:34 2024 -0400 Add DMR/P25p2 Stereo Channel Patch; commit 1a0baf0a17ccf8cc0eb0a01a809269354480d1d1 Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 17:37:46 2024 -0400 Add DMR Cap+ Faster Rest Patch; commit 9f5b52aa8f20bfe3eab5413f2c3fa41003d53b3c Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 17:36:24 2024 -0400 Disable EDACS Analog Debug; commit 7dd0de67b602f0acd111200f838fbb1a0541a8bf Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 17:36:04 2024 -0400 Squashed commit of the following: commit 95d46fb35d6cb6fb0a9825084f4c2accf8edad4a Author: lwvmobile <lwvmobile@gmail.com> Date: Mon Mar 25 17:48:57 2024 -0400 Enable HPF_D by default; Increase manual analog gain to 50; commit 1f37837664e16760b5cbf5653fc4d829ee6cce83 Author: lwvmobile <lwvmobile@gmail.com> Date: Mon Mar 25 08:43:17 2024 -0400 Enable HPF_D on M17 Voice; commit9bbe4de7fdAuthor: lwvmobile <lwvmobile@gmail.com> Date: Sun Mar 24 16:08:16 2024 -0400 EDACS: Digitize Analog For Analysis of 'Data Burst' Like Behavior; commit9249b7a943Author: lwvmobile <lwvmobile@gmail.com> Date: Sun Mar 24 12:28:26 2024 -0400 Simply Mono Short Playback; commit89ad0f17e3Author: lwvmobile <lwvmobile@gmail.com> Date: Sat Mar 23 21:12:44 2024 -0400 Add HPF to SS4, SS3, and SS Audio Methods; commite8184c7fbdAuthor: lwvmobile <lwvmobile@gmail.com> Date: Sat Mar 23 17:13:44 2024 -0400 RTL - Add The Sample / Volume Multiplier as a user configurable option; commitee04d11116Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 23:15:04 2024 -0400 Fix HPF_D so it actually works correctly; commite549b21497Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 20:11:34 2024 -0400 Make Analog Auto Gain Control Mostly Tolerable; commit2f9e0525feAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 18:20:38 2024 -0400 User Toggle HPF on Digital; commitff58d3a6faAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 18:10:15 2024 -0400 User Toggles and Displays for Filters; commitb6fc17c506Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 15:55:09 2024 -0400 More Analog Manual Audio Gain Tweaks; commit076b9fbf04Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 06:26:10 2024 -0400 Add SQL Hit on EDACS if Colors Disabled; commit59fe47ef05Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 02:23:08 2024 -0400 Disable HPF Test on Digital Voice; commit4a63068ce1Author: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 23:39:43 2024 -0400 Misc Code Organizing; audio_gainA Tweaks; commit3585e7e594Author: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 13:18:31 2024 -0400 Test Tweak to RTL Sample Multiplier; commitfa5b25283fAuthor: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 13:18:07 2024 -0400 Adjust Manual Mic Gain on M17 Encoder; Ncurses Display; commitc985fea035Author: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 12:34:01 2024 -0400 Misc Notes on using raw_rms values during testing; commitb273e5b7beAuthor: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 12:31:33 2024 -0400 Bugfix for EDACS Analog Segfault when using the digitize function for an extended period; commiteadf3fdf23Author: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 10:12:04 2024 -0400 Analog Gain Has Own Variable; Ncurses Keys; Misc; commit0debcc647eAuthor: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 08:49:51 2024 -0400 Filtering Misc Cleanup; commit98e10b2627Author: lwvmobile <lwvmobile@gmail.com> Date: Thu Mar 21 00:02:21 2024 -0400 Automatic Gain On Analog WIP; Manual Gain Control; commit89736ae543Author: lwvmobile <lwvmobile@gmail.com> Date: Wed Mar 20 10:22:20 2024 -0400 Passband Filter Testing on Raw Analog / EDACS / M17 Encoder; commit43f6218129Author: lwvmobile <lwvmobile@gmail.com> Date: Wed Mar 20 09:03:02 2024 -0400 Passband and Notch Filter Setup; Debug Output; commit35a1b53867Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 22:35:36 2024 -0400 HPF: Only Use On RTL Input when M17 Encoder Uses It; commitb9949f0d80Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 17:31:59 2024 -0400 Disable LFP on EDACS Analog Out; commit3666740674Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 13:42:07 2024 -0400 Test HPF On Digital Voice Out; commitef13343925Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 12:46:27 2024 -0400 RTL_FM Input for Analog/M17 Encoder; commit2b7de90474Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 11:03:55 2024 -0400 New Analog Audio Filters WIP; commit 3b9f9f5a3befb295da284379262323fad7d69c7a Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 26 17:33:34 2024 -0400 Squashed commit of the following: commit a5c5be3b955a82cc72f1486ff87d7c1b4893295f Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Tue Mar 26 17:28:35 2024 -0400 EDACS: Standard display rewrite, parsing/RE fixes, tune i-calls and all-calls (#246) * EDACS EA: Fix reversed TDMA/data calls * EDACS: deduplicate ncurses printing logic * EDACS: pass call state via new state struct field * EDACS: RE some differences from Standard spec * EDACS: show state for data calls * EDACS: tune individual calls on Standard * EDACS: tune all-calls on Standard * EDACS: properly identify emergency on channel updates * EDACS: fix build break * EDACS: fix conditions for refreshing the display source * EDACS EA: Identify calls as voice for display * EDACS: voice channel update emergency refactor * EDACS: Show interconnect calls in call log * EDACS EA: show unknown data channel assignments in log * EDACS: check LCN is not 0 before assigning it * EDACS: C operator precedence is dumb * Initialize edacs_vc_call_type * use j and not i in call_matrix for call history; --------- Co-authored-by: lwvmobile <lwvmobile@gmail.com> commitc8d00846b1Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sun Mar 24 17:48:46 2024 -0400 EDACS: Display cached call source on Standard, tune group calls on assignment (#241) * Trim trailing whitespace * EDACS: Display cached call source on Standard The logic in `edacs-fme.c` didn't work, in retrospect, because it would have depended on getting back-to-back messages for the same call. In practice, that is unlikely even on an idle system as system state gets displayed. Instead, cache on the display end, for a "better" user experience. * EDACS: Pad channel freq to "000.000000 MHz" * EDACS: Process/tune group calls on assignment commit8d432e8b3eAuthor: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sun Mar 24 12:29:22 2024 -0400 EDACS: ESK fixes, RE of standard channel assignments, cleanups (#238) * EDACS: Make i-calls very obvious on standard * EDACS: abstract target for Interconnect Channel Assignment * EDACS: little shortcut example updates * EDACS: Apply ESK to both FR1 and FR4 * EDACS: Group channel assignment by mode * EDACS: Merge MT-A 0/1 and 2/3 cases commit0440dea1deAuthor: lwvmobile <lwvmobile@gmail.com> Date: Sun Mar 24 02:47:09 2024 -0400 EDACS: Fix Call History For Standard Maybe; commit208f188e55Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 23 21:35:42 2024 -0400 EDACS: Speculative RE of MT-A value 0, pretty colours (#231) * EDACS: fix log formatting * EDACS: Speculative RE of MT-A value 0 * EDACS: CC message pretty colours * EDACS: little formatting * EDACS: eh make interconnect magenta commit36f76a7e21Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 23 17:35:45 2024 -0400 EDACS: Fix copy/paste error (#230) I went through by hand and I'm confident this is the last of the `get_lcn_status_string()` errors. commit4bc73d8c68Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 23 17:24:32 2024 -0400 EDACS: Rewrite Standard/Networked parsing per TIA/EIA TSB 69.3 (#229) * EDACS EA: refactor log messages for consistency * EDACS: Log LCN status values * EDACS EA: channel assignment vs update * EDACS: Implement TIA/EIA TSB 69.3 * EDACS: clean up Site ID message * EDACS: Actually process call for Channel Update * EDACS: Update display for Standard calls * EDACS: Format of Voice Group Channel Assignment * EDACS Standard: Log LCN status values * EDACS: Rebase and fix some issues * EDACS: Fix copy/paste error commit03507055a4Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 23 16:05:09 2024 -0400 EDACS: add EA messages / start mass Standard refactor (#226) * EDACS EA: refactor log messages for consistency * EDACS EA: channel assignment command (unknown data) * EDACS EA: status/message command * EDACS Standard: Refactor variable declarations * EDACS Standard: log raw payloads for debugging * EDACS: Fix typing * EDACS EA: update status/message CC command * EDACS: Log LCN status values * EDACS: String format * EDACS EA: channel assignment vs update * EDACS: fix syntax error * EDACS: change string for reserved LCN status commitfbe5fd2093Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Fri Mar 22 15:26:50 2024 -0400 EDACS EA: emergency calls, MT1 fixes, logging improvements (#221) * EDACS EA: Fix i-call MT1 after ESK changes * EDACS EA: Fix all-call ncurses display * EDACS EA: Make detailed log slightly more readable * EDACS EA: Improve colours in logs * EDACS EA: Space in logs for consistency * EDACS EA: Fix MT1 for analog group voice after ESK change * EDACS EA: add parsing for emergency calls commit413e5f76a2Merge:de9127c388a57dAuthor: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Fri Mar 22 06:59:31 2024 -0400 Merge pull request #220 from lwvmobile/edacs_manual_modes Edacs manual modes commit388a57d8fcAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 05:28:11 2024 -0400 EDACS: Re-enable the -9 switch to maintain user compatability; Fix Missing Bracket on non color mode; commit058099f1aaAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 03:24:57 2024 -0400 EDACS: Tweak Mode Toggle Display; Add Frame Dump on No Mode Set; commit68aa6b018eAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 02:19:38 2024 -0400 EDACS: Update Docs to Reflect Changes; commitc404f3c48cAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 02:01:09 2024 -0400 EDACS: Ncurses Display Working Mode Tweaks; commitb2d1608eb7Author: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 01:08:28 2024 -0400 EDACS: Toggle Keys A and S for Mode Selection; commita4553a0a0aAuthor: lwvmobile <lwvmobile@gmail.com> Date: Fri Mar 22 00:45:37 2024 -0400 EDACS: Remove Auto Detect Code; Make CLI Switches; commitde9127cfb4Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Thu Mar 21 21:02:53 2024 -0400 EDACS: support for EA system all-calls (#214) * Refactor debug printing a bit * Clean up group call logic * Minor changes to debug printing * EDACS EA: support for system all-calls * EDACS: split out MT1 for TDMA call since we can't decode it anyway * Refactor identifying call mode (digital/analog) * Maintain consistent indentation for all MT1 * EDACS: Fix Compiler Error. Had an extra right bracket on line 383 --------- Co-authored-by: lwvmobile <59371473+lwvmobile@users.noreply.github.com> commitc85dd60399Author: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 17:38:30 2024 -0400 EDACS: NET/STD LCN > 0 Check; commitbed766a86eAuthor: lwvmobile <lwvmobile@gmail.com> Date: Tue Mar 19 09:34:10 2024 -0400 EDACS: STD/NET Don't Tune Unless CC LCN Set; commit69f532a022Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Mon Mar 18 11:41:58 2024 -0400 EDACS: EA I-Call decoding improvements (#205) * EDACS: formatting nit * EDACS: add name to credits * EDACS: Handle initial grant vs grant update for i-call * EDACS: consistency for group vs i-call * EDACS: file naming for i-call recordings * EDACS: EA refactor when MT1 is 0x1F * EDACS: check we know CC LCN before leaving it * EDACS: fix breaking change for Standard Revert mistake inf68367c4f3* Fix patent number * EDACS: Fix Compiler Error 1; Fix Rogue Copy Paste * EDACS: Add MT1, MT2, and FR1 and FR4 Dumps on Payload; --------- Co-authored-by: lwvmobile <59371473+lwvmobile@users.noreply.github.com> commita7de24c47bAuthor: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Mon Mar 18 07:47:34 2024 -0400 EDACS: fixes and improvements to EA analog and i-call parsing (#204) * Fix MT1 math given esk_mask value is 0xA0 * EDACS: Clean up formatting for I-Calls * EDACS: typo, fix the TGID for group calls Fix copy-pasta * EDACS: Fix MT2 for I-Calls Incorrectly copied decimal values as hex - obviously MT2 is only 4 bits so it cannot be greater than 15. * EDACS: check LCN is > 0 before trying to tune An EA CC sometimes includes commands that parse as LCN 0 - but otherwise valid - analog call voice grants for TG 1. Since LCN 0 is not valid, ensure that we don't try to tune to them while we try to figure out what they're about. * EDACS: Process "login" message on CC Log "login" messages sent on the CC. Verified behaviour against UniTrunker. commit10eacd99ccAuthor: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sun Mar 17 18:56:41 2024 -0400 EDACS: Clean up formatting for I-Calls (#203) * Fix MT1 math given esk_mask value is 0xA0 * EDACS: Clean up formatting for I-Calls commitebe6e8fc65Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sun Mar 17 18:02:12 2024 -0400 Fix MT1 math given esk_mask value is 0xA0 (#202) commit8619612b76Author: lwvmobile <lwvmobile@gmail.com> Date: Sat Mar 16 22:42:44 2024 -0400 EDACS: Setup Analog Calls and WAVs on EA and ICALL; commit9ac1573f0bAuthor: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 16 17:17:14 2024 -0400 EDACS: Add MT1 value / logging for analog group calls (#198) * Add MT1 value / logging for analog group calls * Respect user preference for tuning to group calls * Revert "Respect user preference for tuning to group calls" This reverts commit83ac8feab7. commit0aa01a45efAuthor: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 16 17:16:52 2024 -0400 EDACS: Respect user preference for tuning to group calls (#201) commitf68367c4f3Author: ilyacodes <33097525+ilyacodes@users.noreply.github.com> Date: Sat Mar 16 17:16:20 2024 -0400 EDACS: Add parsing for individual calls (#200) * EDACS: Add parsing for individual calls This change adds parsing for I-Calls on EA systems. Both analog and ProVoice modes are parsed and processed. See related issue for discussion. * Respect user preference for tuning to private calls * EDACS: Respect user preference for tuning to private calls * EDACS: Handle i-call target in ProVoice logging * EDACS: Show i-calls distinctly from group calls
582 lines
22 KiB
C
582 lines
22 KiB
C
/*
|
|
* Copyright (C) 2010 DSD Author
|
|
* GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0)
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#include "dsd.h"
|
|
#include "p25p1_const.h"
|
|
|
|
#include "p25p1_ldu.h"
|
|
#include "p25p1_check_ldu.h"
|
|
#include "p25p1_hdu.h"
|
|
|
|
|
|
void
|
|
processLDU1 (dsd_opts* opts, dsd_state* state)
|
|
{
|
|
// extracts IMBE frames from LDU frame
|
|
int i;
|
|
uint8_t lcformat[9], mfid[9], lcinfo[57];
|
|
char lsd1[9], lsd2[9];
|
|
uint8_t lsd_hex1, lsd_hex2; uint8_t lowspeeddata[32]; memset (lowspeeddata, 0, sizeof(lowspeeddata));
|
|
int status_count; int lsd1_okay, lsd2_okay = 0;
|
|
|
|
char hex_data[12][6]; // Data in hex-words (6 bit words). A total of 12 hex words.
|
|
char hex_parity[12][6]; // Parity of the data, again in hex-word format. A total of 12 parity hex words.
|
|
|
|
int irrecoverable_errors;
|
|
|
|
AnalogSignal analog_signal_array[12*(3+2)+12*(3+2)];
|
|
int analog_signal_index;
|
|
|
|
|
|
analog_signal_index = 0;
|
|
|
|
// we skip the status dibits that occur every 36 symbols
|
|
// the first IMBE frame starts 14 symbols before next status
|
|
// so we start counter at 36-14-1 = 21
|
|
status_count = 21;
|
|
|
|
if (opts->errorbars == 1)
|
|
{
|
|
//fprintf (stderr, "e:");
|
|
}
|
|
|
|
// IMBE 1
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '0';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// IMBE 2
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '1';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 2
|
|
read_and_correct_hex_word (opts, state, &(hex_data[11][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[10][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 9][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 8][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[0*5].sequence_broken = 1;
|
|
|
|
// IMBE 3
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '2';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 3
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 7][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 6][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 5][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 4][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[4*5].sequence_broken = 1;
|
|
|
|
// IMBE 4
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '3';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 4
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 3][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 2][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 1][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_data[ 0][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[8*5].sequence_broken = 1;
|
|
|
|
// IMBE 5
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '4';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 5
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[11][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[10][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 9][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 8][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[12*5].sequence_broken = 1;
|
|
|
|
// IMBE 6
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '5';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 6
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 7][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 6][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 5][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 4][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[16*5].sequence_broken = 1;
|
|
|
|
// IMBE 7
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '6';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 7
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 3][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 2][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 1][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
read_and_correct_hex_word (opts, state, &(hex_parity[ 0][0]), &status_count, analog_signal_array, &analog_signal_index);
|
|
analog_signal_array[20*5].sequence_broken = 1;
|
|
|
|
// IMBE 8
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '7';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
// Read data after IMBE 8: LSD (low speed data)
|
|
{
|
|
char lsd[8];
|
|
char cyclic_parity[8];
|
|
|
|
for (i=0; i<=6; i+=2)
|
|
{
|
|
read_dibit(opts, state, lsd+i, &status_count, NULL, NULL);
|
|
}
|
|
for (i=0; i<=6; i+=2)
|
|
{
|
|
read_dibit(opts, state, cyclic_parity+i, &status_count, NULL, NULL);
|
|
}
|
|
lsd_hex1 = 0;
|
|
for (i=0; i<8; i++)
|
|
{
|
|
lsd_hex1 = lsd_hex1 << 1;
|
|
lsd1[i] = lsd[i] + '0';
|
|
lsd_hex1 |= (uint8_t)lsd[i];
|
|
lowspeeddata[i+0] = (uint8_t)lsd1[i];
|
|
lowspeeddata[i+8] = (uint8_t)cyclic_parity[i];
|
|
}
|
|
|
|
for (i=0; i<=6; i+=2)
|
|
{
|
|
read_dibit(opts, state, lsd+i, &status_count, NULL, NULL);
|
|
}
|
|
for (i=0; i<=6; i+=2)
|
|
{
|
|
read_dibit(opts, state, cyclic_parity+i, &status_count, NULL, NULL);
|
|
}
|
|
lsd_hex2 = 0;
|
|
for (i=0; i<8; i++)
|
|
{
|
|
lsd_hex2 = lsd_hex2 << 1;
|
|
lsd2[i] = lsd[i] + '0';
|
|
lsd_hex2 |= (uint8_t)lsd[i];
|
|
lowspeeddata[i+16] = (uint8_t)lsd2[i];
|
|
lowspeeddata[i+24] = (uint8_t)cyclic_parity[i];
|
|
}
|
|
|
|
// TODO: error correction of the LSD bytes... <--THIS!
|
|
// TODO: do something useful with the LSD bytes... <--THIS!
|
|
|
|
state->dropL += 2; //need to skip 2 here for the LSD bytes
|
|
}
|
|
|
|
// IMBE 9
|
|
#ifdef TRACE_DSD
|
|
state->debug_prefix_2 = '8';
|
|
#endif
|
|
process_IMBE (opts, state, &status_count);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceMS(opts, state);
|
|
if (opts->floating_point == 0 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceSS(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 1)
|
|
playSynthesizedVoiceFM(opts, state);
|
|
if (opts->floating_point == 1 && opts->pulse_digi_out_channels == 2)
|
|
playSynthesizedVoiceFS(opts, state);
|
|
|
|
if (opts->errorbars == 1)
|
|
{
|
|
fprintf (stderr, "\n");
|
|
}
|
|
|
|
if (opts->p25status == 1)
|
|
{
|
|
fprintf (stderr, "lsd1: %s lsd2: %s\n", lsd1, lsd2);
|
|
}
|
|
|
|
// trailing status symbol
|
|
{
|
|
int status;
|
|
status = getDibit (opts, state) + '0';
|
|
// TODO: do something useful with the status bits...
|
|
UNUSED(status);
|
|
}
|
|
|
|
// Error correct the hex_data using Reed-Solomon hex_parity
|
|
irrecoverable_errors = check_and_fix_reedsolomon_24_12_13((char*)hex_data, (char*)hex_parity);
|
|
if (irrecoverable_errors == 1)
|
|
{
|
|
state->debug_header_critical_errors++;
|
|
|
|
// We can correct (13-1)/2 = 6 errors. If we failed, it means that there were more than 6 errors in
|
|
// these 12+12 words. But take into account that each hex word was already error corrected with
|
|
// Hamming(10,6,3), which can correct 1 bits on each sequence of (6+4) bits. We could say that there
|
|
// were 7 errors of 2 bits.
|
|
update_error_stats(&state->p25_heuristics, 12*6+12*6, 7*2);
|
|
}
|
|
else
|
|
{
|
|
// Same comments as in processHDU. See there.
|
|
|
|
char fixed_parity[12*6];
|
|
|
|
// Correct the dibits that we read according with hex_data values
|
|
correct_hamming_dibits((char*)hex_data, 12, analog_signal_array);
|
|
|
|
// Generate again the Reed-Solomon parity
|
|
encode_reedsolomon_24_12_13((char*)hex_data, fixed_parity);
|
|
|
|
// Correct the dibits that we read according with the fixed parity values
|
|
correct_hamming_dibits(fixed_parity, 12, analog_signal_array+12*(3+2));
|
|
|
|
// Once corrected, contribute this information to the heuristics module
|
|
contribute_to_heuristics(state->rf_mod, &(state->p25_heuristics), analog_signal_array, 12*(3+2)+12*(3+2));
|
|
}
|
|
|
|
#ifdef HEURISTICS_DEBUG
|
|
fprintf (stderr, "(audio errors, header errors, critical header errors) (%i,%i,%i)\n",
|
|
state->debug_audio_errors, state->debug_header_errors, state->debug_header_critical_errors);
|
|
#endif
|
|
|
|
// Now put the corrected data into the DSD structures
|
|
|
|
lcformat[8] = 0;
|
|
mfid[8] = 0;
|
|
lcinfo[56] = 0;
|
|
lsd1[8] = 0;
|
|
lsd2[8] = 0;
|
|
|
|
lcformat[0] = hex_data[11][0] + '0';
|
|
lcformat[1] = hex_data[11][1] + '0';
|
|
lcformat[2] = hex_data[11][2] + '0';
|
|
lcformat[3] = hex_data[11][3] + '0';
|
|
lcformat[4] = hex_data[11][4] + '0';
|
|
lcformat[5] = hex_data[11][5] + '0';
|
|
|
|
lcformat[6] = hex_data[10][0] + '0';
|
|
lcformat[7] = hex_data[10][1] + '0';
|
|
mfid[0] = hex_data[10][2] + '0';
|
|
mfid[1] = hex_data[10][3] + '0';
|
|
mfid[2] = hex_data[10][4] + '0';
|
|
mfid[3] = hex_data[10][5] + '0';
|
|
|
|
mfid[4] = hex_data[ 9][0] + '0';
|
|
mfid[5] = hex_data[ 9][1] + '0';
|
|
mfid[6] = hex_data[ 9][2] + '0';
|
|
mfid[7] = hex_data[ 9][3] + '0';
|
|
lcinfo[0] = hex_data[ 9][4] + '0';
|
|
lcinfo[1] = hex_data[ 9][5] + '0';
|
|
|
|
lcinfo[2] = hex_data[ 8][0] + '0';
|
|
lcinfo[3] = hex_data[ 8][1] + '0';
|
|
lcinfo[4] = hex_data[ 8][2] + '0';
|
|
lcinfo[5] = hex_data[ 8][3] + '0';
|
|
lcinfo[6] = hex_data[ 8][4] + '0';
|
|
lcinfo[7] = hex_data[ 8][5] + '0';
|
|
|
|
lcinfo[8] = hex_data[ 7][0] + '0';
|
|
lcinfo[9] = hex_data[ 7][1] + '0';
|
|
lcinfo[10] = hex_data[ 7][2] + '0';
|
|
lcinfo[11] = hex_data[ 7][3] + '0';
|
|
lcinfo[12] = hex_data[ 7][4] + '0';
|
|
lcinfo[13] = hex_data[ 7][5] + '0';
|
|
|
|
lcinfo[14] = hex_data[ 6][0] + '0';
|
|
lcinfo[15] = hex_data[ 6][1] + '0';
|
|
lcinfo[16] = hex_data[ 6][2] + '0';
|
|
lcinfo[17] = hex_data[ 6][3] + '0';
|
|
lcinfo[18] = hex_data[ 6][4] + '0';
|
|
lcinfo[19] = hex_data[ 6][5] + '0';
|
|
|
|
lcinfo[20] = hex_data[ 5][0] + '0';
|
|
lcinfo[21] = hex_data[ 5][1] + '0';
|
|
lcinfo[22] = hex_data[ 5][2] + '0';
|
|
lcinfo[23] = hex_data[ 5][3] + '0';
|
|
lcinfo[24] = hex_data[ 5][4] + '0';
|
|
lcinfo[25] = hex_data[ 5][5] + '0';
|
|
|
|
lcinfo[26] = hex_data[ 4][0] + '0';
|
|
lcinfo[27] = hex_data[ 4][1] + '0';
|
|
lcinfo[28] = hex_data[ 4][2] + '0';
|
|
lcinfo[29] = hex_data[ 4][3] + '0';
|
|
lcinfo[30] = hex_data[ 4][4] + '0';
|
|
lcinfo[31] = hex_data[ 4][5] + '0';
|
|
|
|
lcinfo[32] = hex_data[ 3][0] + '0';
|
|
lcinfo[33] = hex_data[ 3][1] + '0';
|
|
lcinfo[34] = hex_data[ 3][2] + '0';
|
|
lcinfo[35] = hex_data[ 3][3] + '0';
|
|
lcinfo[36] = hex_data[ 3][4] + '0';
|
|
lcinfo[37] = hex_data[ 3][5] + '0';
|
|
|
|
lcinfo[38] = hex_data[ 2][0] + '0';
|
|
lcinfo[39] = hex_data[ 2][1] + '0';
|
|
lcinfo[40] = hex_data[ 2][2] + '0';
|
|
lcinfo[41] = hex_data[ 2][3] + '0';
|
|
lcinfo[42] = hex_data[ 2][4] + '0';
|
|
lcinfo[43] = hex_data[ 2][5] + '0';
|
|
|
|
lcinfo[44] = hex_data[ 1][0] + '0';
|
|
lcinfo[45] = hex_data[ 1][1] + '0';
|
|
lcinfo[46] = hex_data[ 1][2] + '0';
|
|
lcinfo[47] = hex_data[ 1][3] + '0';
|
|
lcinfo[48] = hex_data[ 1][4] + '0';
|
|
lcinfo[49] = hex_data[ 1][5] + '0';
|
|
|
|
lcinfo[50] = hex_data[ 0][0] + '0';
|
|
lcinfo[51] = hex_data[ 0][1] + '0';
|
|
lcinfo[52] = hex_data[ 0][2] + '0';
|
|
lcinfo[53] = hex_data[ 0][3] + '0';
|
|
lcinfo[54] = hex_data[ 0][4] + '0';
|
|
lcinfo[55] = hex_data[ 0][5] + '0';
|
|
|
|
int j;
|
|
uint8_t LCW_bytes[9];
|
|
uint8_t LCW_bits[72];
|
|
memset (LCW_bytes, 0, sizeof(LCW_bytes));
|
|
memset (LCW_bits, 0, sizeof(LCW_bits));
|
|
|
|
//load array above into byte form first
|
|
LCW_bytes[0] = (uint8_t) ConvertBitIntoBytes(&lcformat[0], 8);
|
|
LCW_bytes[1] = (uint8_t) ConvertBitIntoBytes(&mfid[0], 8);
|
|
for (i = 0; i < 7; i++) LCW_bytes[i+2] = (uint8_t) ConvertBitIntoBytes(&lcinfo[i*8], 8);
|
|
|
|
//load as bit array next (easier to process data in bit form)
|
|
for(i = 0, j = 0; i < 9; i++, j+=8)
|
|
{
|
|
LCW_bits[j + 0] = (LCW_bytes[i] >> 7) & 0x01;
|
|
LCW_bits[j + 1] = (LCW_bytes[i] >> 6) & 0x01;
|
|
LCW_bits[j + 2] = (LCW_bytes[i] >> 5) & 0x01;
|
|
LCW_bits[j + 3] = (LCW_bytes[i] >> 4) & 0x01;
|
|
LCW_bits[j + 4] = (LCW_bytes[i] >> 3) & 0x01;
|
|
LCW_bits[j + 5] = (LCW_bytes[i] >> 2) & 0x01;
|
|
LCW_bits[j + 6] = (LCW_bytes[i] >> 1) & 0x01;
|
|
LCW_bits[j + 7] = (LCW_bytes[i] >> 0) & 0x01;
|
|
}
|
|
|
|
//send to new P25 LCW function
|
|
if (irrecoverable_errors == 0)
|
|
{
|
|
fprintf (stderr, "%s", KYEL);
|
|
p25_lcw (opts, state, LCW_bits, 0);
|
|
fprintf (stderr, "%s", KNRM);
|
|
}
|
|
else
|
|
{
|
|
fprintf (stderr, "%s",KRED);
|
|
fprintf (stderr, " LCW FEC ERR ");
|
|
fprintf (stderr, "%s\n", KNRM);
|
|
}
|
|
|
|
//NOTE: LSD is also encrypted if voice is encrypted, so let's just zip it for now
|
|
if (state->payload_algid != 0x80)
|
|
{
|
|
lsd_hex1 = 0;
|
|
lsd_hex2 = 0;
|
|
}
|
|
|
|
//WIP: LSD FEC
|
|
lsd1_okay = p25p1_lsd_fec (lowspeeddata+0);
|
|
lsd2_okay = p25p1_lsd_fec (lowspeeddata+16);
|
|
|
|
if (opts->payload == 1)
|
|
{
|
|
fprintf (stderr, "%s",KCYN);
|
|
fprintf (stderr, " P25 LCW Payload ");
|
|
for (i = 0; i < 9; i++)
|
|
{
|
|
fprintf (stderr, "[%02X]", LCW_bytes[i]);
|
|
}
|
|
|
|
#ifdef SOFTID
|
|
//view Low Speed Data
|
|
fprintf (stderr, "%s",KCYN);
|
|
fprintf (stderr, " LSD: %02X %02X ", lsd_hex1, lsd_hex2);
|
|
if ( (lsd_hex1 > 0x19) && (lsd_hex1 < 0x7F) && (lsd1_okay == 1) ) fprintf (stderr, "(%c", lsd_hex1);
|
|
else fprintf (stderr, "( ");
|
|
if ( (lsd_hex2 > 0x19) && (lsd_hex2 < 0x7F) && (lsd2_okay == 1) ) fprintf (stderr, "%c)", lsd_hex2);
|
|
else fprintf (stderr, " )");
|
|
if (lsd1_okay == 0) fprintf (stderr, " L1 ERR");
|
|
if (lsd2_okay == 0) fprintf (stderr, " L2 ERR");
|
|
#endif
|
|
fprintf (stderr, "%s\n", KNRM);
|
|
}
|
|
#ifdef SOFTID
|
|
//TEST: Store LSD into array if 0x02 0x08 (opcode and len?)
|
|
int k = 0;
|
|
if (state->dmr_alias_format[0] == 0x02)
|
|
{
|
|
k = state->data_block_counter[0];
|
|
if ( (lsd_hex1 > 0x19) && (lsd_hex1 < 0x7F) && (lsd1_okay == 1) )
|
|
state->dmr_alias_block_segment[0][0][k/4][k%4] = (char)lsd_hex1;
|
|
// else state->dmr_alias_block_segment[0][0][k/4][k%4] = 0x20;
|
|
k++;
|
|
if ( (lsd_hex2 > 0x19) && (lsd_hex2 < 0x7F) && (lsd2_okay == 1) )
|
|
state->dmr_alias_block_segment[0][0][k/4][k%4] = (char)lsd_hex2;
|
|
// else state->dmr_alias_block_segment[0][0][k/4][k%4] = 0x20;
|
|
k++;
|
|
state->data_block_counter[0] = k;
|
|
}
|
|
|
|
//reset format, len, counter.
|
|
if (lsd_hex1 == 0x02 && lsd1_okay == 1 && lsd2_okay == 1)
|
|
{
|
|
state->dmr_alias_format[0] = 0x02;
|
|
if (lsd_hex2 > 8) lsd_hex2 = 8; //sanity check
|
|
state->dmr_alias_len[0] = lsd_hex2;
|
|
state->data_block_counter[0] = 0;
|
|
}
|
|
|
|
if ( (k >= state->dmr_alias_len[0]) && (state->dmr_alias_format[0] == 0x02) )
|
|
{
|
|
//storage for completed string
|
|
char str[16]; int wr = 0; int tsrc = state->lastsrc; int z = 0; k = 0;
|
|
for (i = 0; i < 16; i++) str[i] = 0;
|
|
|
|
//print out what we've gathered
|
|
fprintf (stderr, "%s",KCYN);
|
|
fprintf (stderr, " LSD Soft ID: ");
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
for (int j = 0; j < 4; j++)
|
|
{
|
|
fprintf (stderr, "%c", state->dmr_alias_block_segment[0][0][i][j]);
|
|
if (state->dmr_alias_block_segment[0][0][i][j] != 0) str[k++] = state->dmr_alias_block_segment[0][0][i][j];
|
|
}
|
|
}
|
|
|
|
//debug
|
|
// fprintf (stderr, " STR: %s", str);
|
|
|
|
//assign to tg name string, but only if not trunking (this could clash with ENC LO functionality)
|
|
if (tsrc != 0) //&& opts->p25_trunk == 0 //should never get here if enc, should be zeroed out, but could potentially slip if HDU is missed and offchance of 02 opcode
|
|
{
|
|
for (int x = 0; x < state->group_tally; x++)
|
|
{
|
|
if (state->group_array[x].groupNumber == tsrc)
|
|
{
|
|
wr = 1; //already in there, so no need to assign it
|
|
z = x;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//if not already in there, so save it there now
|
|
if (wr == 0)
|
|
{
|
|
state->group_array[state->group_tally].groupNumber = tsrc;
|
|
if (state->payload_algid != 0x80 && opts->trunk_tune_enc_calls == 0 && state->R == 0)
|
|
sprintf (state->group_array[state->group_tally].groupMode, "%s", "DE");
|
|
else
|
|
sprintf (state->group_array[state->group_tally].groupMode, "%s", "D");
|
|
sprintf (state->group_array[state->group_tally].groupName, "%s", str);
|
|
state->group_tally++;
|
|
}
|
|
|
|
//if its in there, but doesn't match (bad/partial decode)
|
|
else if (strcmp(str, state->group_array[z].groupName) != 0)
|
|
{
|
|
state->group_array[z].groupNumber = tsrc;
|
|
if (state->payload_algid != 0x80 && opts->trunk_tune_enc_calls == 0 && state->R == 0)
|
|
sprintf (state->group_array[state->group_tally].groupMode, "%s", "DE");
|
|
else
|
|
sprintf (state->group_array[state->group_tally].groupMode, "%s", "D");
|
|
sprintf (state->group_array[z].groupName, "%s", str);
|
|
}
|
|
|
|
}
|
|
|
|
fprintf (stderr, "%s",KNRM);
|
|
fprintf (stderr, "\n");
|
|
}
|
|
#else
|
|
UNUSED2(lsd1_okay, lsd2_okay);
|
|
#endif //SOFTID
|
|
|
|
}
|