From 826c99d563a4788969a169f41e881dc5053b7807 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Tue, 20 Dec 2022 21:15:37 -0500 Subject: [PATCH] Minor CSBK/CC Freq Tweak; Literature Tweak; --- README.md | 4 ++-- src/dmr_csbk.c | 35 +++++++++++++++++------------------ src/dsd_main.c | 6 +++--- src/dsd_ncurses.c | 8 ++++---- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index d837664..813a750 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ RTL-SDR options: WARNING! Old CLI Switch Handling has been depreciated in favor of rtl: Usage: rtl:dev:freq:gain:ppm:bw:sq:udp dev RTL-SDR Device Index Number - freq RTL-SDR Frequency + freq RTL-SDR Frequency (851800000 or 851.8M) gain RTL-SDR Device Gain (0-49) (default = 26)(0 = Hardware AGC, not recommended) ppm RTL-SDR PPM Error (default = 0) bw RTL-SDR VFO Bandwidth kHz (default = 12)(6, 8, 12, 24) @@ -163,7 +163,7 @@ Trunking Note1: All samples above can also be run with the RTL input method and Trunking Note2: CQPSK Phase 1 and Phase 2 Systems are subceptible to LSM distortion issues, but seem to do okay, but require really good signal. Some CRC issues still occur with Phase 2 TDMA LCCH Mac Signal that can affect reliability, I believe this issue is ultimately caused by the PSK demodulation inside of FME. I also don't believe this will work on 8-level PSK, but I cannot determine that at the moment. Update: I have improved the LCCH Mac Signal decoding my increasing the QPSK decision point buffers to their maximum values. -Trunking Note3: DMR Trunking has been coded, and some testing and tweaks have been carried out. Cap+, Con+, and TIII systems seem to do well with trunking now. Placing the frequency for the control channel at channel map 0 in your channel_map.csv file is not required now if using RIGCTL, RIGCTL can poll the VFO for the current frequency if it believes its on a control channel, but using channel 0 as the control channel will be required when using the rtl dongle. If you need to map out your channels for TIII, you can observe the console output and look for channel numbers. For conveniece I have included the DSDPlus channel numbering (as best as I can figure it) into the console print so it will make it easier for users from DSDPlus to map frequencies into the channel_map.csv file. Make sure your channel numbers are the Cd (channel decimal) values from the log, and not the C+ (dsdplus) values. Notice: TIII Site ID value needs work to determine proper DMRLA values for system area and sub area. +Trunking Note3: DMR Trunking has been coded, and some testing and tweaks have been carried out. Cap+, Con+, and TIII systems seem to do well with trunking now. Placing the frequency for the control channel at channel map 0 in your channel_map.csv file is not required now if using RIGCTL or the RTL Input, both can poll the VFO for the current frequency if it believes its on a control channel, but using channel 0 as the control channel will hardset that frequency to the control channel. If you need to map out your channels for TIII, you can observe the console output and look for channel numbers. For conveniece I have included the DSDPlus channel numbering (as best as I can figure it) into the console print so it will make it easier for users from DSDPlus to map frequencies into the channel_map.csv file. Make sure your channel numbers are the Cd (channel decimal) values from the log, and not the C+ (dsdplus) values. Notice: TIII Site ID value needs work to determine proper DMRLA values for system area and sub area. ``` Talkgroup Voice Channel Grant (TV_GRANT) - Logical diff --git a/src/dmr_csbk.c b/src/dmr_csbk.c index 07d317b..e49d613 100644 --- a/src/dmr_csbk.c +++ b/src/dmr_csbk.c @@ -41,7 +41,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 if (csbk_fid != 0) state->dmr_mfid = csbk_fid; //TIII standard with fid of 0 - (opcodes in decimal) - if (0 == 0) //standard feature set for TIII //csbk_fid == 0 + if (0 == 0) //some non-standard fid values (0x58 - tait, 0x68 - hytera, 0x10-motcapmax) also use a good chunk of these { @@ -51,9 +51,9 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 if (csbk_o > 47 && csbk_o < 55 ) { - //users will need to import the cc frequency as channel 0 for now - if (state->trunk_chan_map[0] != 0) state->p25_cc_freq = state->trunk_chan_map[0]; - + //maintain this to allow users to hardset the cc freq as map[0]; otherwise, set from rigctl or rtl freq at c_aloha_sys_parms + // if (state->p25_cc_freq == 0 && state->trunk_chan_map[0] != 0) state->p25_cc_freq = state->trunk_chan_map[0]; + //initial line break fprintf (stderr, "\n"); @@ -141,9 +141,6 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 //if not a data channel grant (only tuning to voice channel grants) if (csbk_o == 48 || csbk_o == 49 || csbk_o == 50 || csbk_o == 53) //48, 49, 50 are voice grants, 51 and 52 are data grants, 53 Duplex Private Voice, 54 Duplex Private Data { - //shim in chan map 0 as the cc frequency, user will need to specify it in the channel map file - if (state->p25_cc_freq != 0 && state->trunk_chan_map[0] != 0) state->p25_cc_freq = state->trunk_chan_map[0]; - //shim in here for ncurses freq display when not trunking (playback, not live) if (opts->p25_trunk == 0 && freq != 0) { @@ -166,7 +163,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 } } - if (state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0)) + if (state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0) && (strcmp(mode, "DE") != 0)) { if (freq != 0) //if we have a valid frequency { @@ -308,15 +305,16 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 if (n != 0) sprintf (state->dmr_site_parms, "TIII - %s %d-%d.%d ", model_str, net+1, (site>>n)+1, (site & sub_mask)+1 ); else sprintf (state->dmr_site_parms, "TIII - %s %d-%d ", model_str, net, site); - //if using rigctl we can set an unknown cc frequency by polling rigctl for the current frequency - if (opts->use_rigctl == 1 && state->p25_cc_freq == 0) //if not set from channel map 0 + //if using rigctl we can set an unknown or updated cc frequency + //by polling rigctl for the current frequency + if (opts->use_rigctl == 1 && opts->p25_is_tuned == 0) //&& state->p25_cc_freq == 0 { ccfreq = GetCurrentFreq (opts->rigctl_sockfd); if (ccfreq != 0) state->p25_cc_freq = ccfreq; } //if using rtl input, we can ask for the current frequency tuned - if (opts->audio_in_type == 3 && state->p25_cc_freq == 0) + if (opts->audio_in_type == 3 && opts->p25_is_tuned == 0) //&& state->p25_cc_freq == 0 { ccfreq = (long int)opts->rtlsdr_center_freq; if (ccfreq != 0) state->p25_cc_freq = ccfreq; @@ -622,7 +620,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 //no more 0 reporting, that was some bad code that caused that issue //without priority, this will tune the first one it finds (if group isn't blocked) - if (t_tg[j] != 0 && state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0)) + if (t_tg[j] != 0 && state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0) && (strcmp(mode, "DE") != 0)) { if (state->trunk_chan_map[j+1] != 0) //if we have a valid frequency { @@ -658,8 +656,8 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 if (csbk_fid == 0x06) { - //users need to set channel 0 to their current cc frequency for now - if (state->trunk_chan_map[0] != 0) state->p25_cc_freq = state->trunk_chan_map[0]; + //maintain this to allow users to hardset the cc freq as map[0]; otherwise, set from rigctl or rtl freq + // if (state->p25_cc_freq == 0 && state->trunk_chan_map[0] != 0) state->p25_cc_freq = state->trunk_chan_map[0]; if (csbk_o == 0x01) { @@ -695,15 +693,16 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 sprintf (state->dmr_branding, "%s", "Motorola"); sprintf(state->dmr_branding_sub, "Con+ "); - //if using rigctl we can set an unknown cc frequency by polling rigctl for the current frequency - if (opts->use_rigctl == 1 && state->p25_cc_freq == 0) //if not set from channel map 0 + //if using rigctl we can set an unknown or updated cc frequency + //by polling rigctl for the current frequency + if (opts->use_rigctl == 1 && opts->p25_is_tuned == 0) //&& state->p25_cc_freq == 0 { ccfreq = GetCurrentFreq (opts->rigctl_sockfd); if (ccfreq != 0) state->p25_cc_freq = ccfreq; } //if using rtl input, we can ask for the current frequency tuned - if (opts->audio_in_type == 3 && state->p25_cc_freq == 0) + if (opts->audio_in_type == 3 && opts->p25_is_tuned == 0) //&& state->p25_cc_freq == 0 { ccfreq = (long int)opts->rtlsdr_center_freq; if (ccfreq != 0) state->p25_cc_freq = ccfreq; @@ -732,7 +731,7 @@ void dmr_cspdu (dsd_opts * opts, dsd_state * state, uint8_t cs_pdu_bits[], uint8 if ( (time(NULL) - state->last_vc_sync_time > 2) ) { - if (state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0)) + if (state->p25_cc_freq != 0 && opts->p25_trunk == 1 && (strcmp(mode, "B") != 0) && (strcmp(mode, "DE") != 0) ) { if (state->trunk_chan_map[lcn] != 0) //if we have a valid frequency { diff --git a/src/dsd_main.c b/src/dsd_main.c index d482f96..b4b10b6 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -862,10 +862,10 @@ usage () printf (" WARNING! Old CLI Switch Handling has been depreciated in favor of rtl:\n"); printf (" Usage: rtl:dev:freq:gain:ppm:bw:sq:udp\n"); printf (" dev RTL-SDR Device Index Number\n"); - printf (" freq RTL-SDR Frequency\n"); - printf (" gain RTL-SDR Device Gain (0-49) (default = 0 Auto Gain)\n"); + printf (" freq RTL-SDR Frequency (851800000 or 851.8M) \n"); + printf (" gain RTL-SDR Device Gain (0-49)(default = 26)(0 = Hardware AGC, not recommended)\n"); printf (" ppm RTL-SDR PPM Error (default = 0)\n"); - printf (" bw RTL-SDR VFO Bandwidth kHz (default = 26)(0 = Hardware AGC, not recommended) \n"); + printf (" bw RTL-SDR VFO Bandwidth kHz (default = 12)(6, 8, 12, 24) \n"); printf (" sq RTL-SDR Squelch Level (0 - Open, 25 - Little, 50 - Higher)\n"); // printf (" -V RTL-SDR Sample Gain Multiplier (default = 1)\n"); printf (" udp RTL-SDR UDP Remote Port (default = 6020)\n"); diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 798db65..794a3c5 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -2459,7 +2459,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } //LRRP - if(state->dmrburstL != 16) //only during data + if(state->dmrburstL != 16 && opts->p25_trunk == 0) //only during data and no trunking { attron(COLOR_PAIR(4)); printw ("%s", state->dmr_lrrp_gps[0]); @@ -2472,7 +2472,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) { if (state->group_array[k].groupNumber == state->lasttg) { - attron(COLOR_PAIR(5)); + attron(COLOR_PAIR(4)); printw (" [%s]", state->group_array[k].groupName); printw ("[%s] ", state->group_array[k].groupMode); if (state->carrier == 1) @@ -2650,7 +2650,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } //LRRP - if(state->dmrburstR != 16) //only during data + if(state->dmrburstR != 16 && opts->p25_trunk == 0) //only during data and no trunking { attron(COLOR_PAIR(4)); printw ("%s", state->dmr_lrrp_gps[1]); @@ -2663,7 +2663,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) { if (state->group_array[k].groupNumber == state->lasttgR) { - attron(COLOR_PAIR(5)); + attron(COLOR_PAIR(4)); printw (" [%s]", state->group_array[k].groupName); printw ("[%s] ", state->group_array[k].groupMode); }