From 5b994f5129cbfc5ce17dce9c020ed8bd47c12596 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Wed, 18 Jan 2023 12:18:56 -0500 Subject: [PATCH] NXDN Multi-Key CSV Import; Example Updt; --- .gitignore | 3 +-- examples/Example_Usage.md | 6 +---- examples/nxdn_chan_map.csv | 8 +++++++ examples/nxdn_sc_key.csv | 5 +++++ include/dsd.h | 7 +++++- src/dsd_import.c | 45 ++++++++++++++++++++++++++++++++++++++ src/dsd_main.c | 15 +++++++++++-- src/nxdn_element.c | 3 +++ 8 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 examples/nxdn_chan_map.csv create mode 100644 examples/nxdn_sc_key.csv diff --git a/.gitignore b/.gitignore index 019a9fb..cf8616f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ *.dylib build *.sh -*.csv -examples + diff --git a/examples/Example_Usage.md b/examples/Example_Usage.md index a0ce575..5163db1 100644 --- a/examples/Example_Usage.md +++ b/examples/Example_Usage.md @@ -1,7 +1,3 @@ -## Notice - -These examples will need to be modified to run on the 'lite' branch, or any precompiled Windows binaries released. (i.e. dsd-fme to dsd-fme-lite.exe, -i pulse -o pulse, etc) - ### Example Usage and Notes! `dsd-fme` is all you need to run for pulse input, pulse output, and auto detect for DMR BS/MS, and P25 (1 and 2) . To use other decoding methods which cannot be auto detected, please use the following command line switches. Make sure to route audio into and out of DSD-FME using pavucontrol and virtual sinks as needed. @@ -125,7 +121,7 @@ For Connect Plus, enumerate your list from 1 to the last channel and add the fre Currently uncoded/unknown DMR trunking systems include Hytera XPT. -Trunking Note4: NXDN Trunking may also require a channel map file, depending on the system. If it uses a custom range (above 800), then channels will need to be mapped. If channels do not require mapping (have channels below 800) but you are not tuning properly, then please use a channel_map and please report the issue in the issues along with the channels you are tuning and the actual rf frequency so corrections can be made. +Trunking Note4: NXDN TRunking will require a channel map. Please see the example folder for an appropriate channel map. ~NXDN Trunking may also require a channel map file, depending on the system. If it uses a custom range (above 800), then channels will need to be mapped. If channels do not require mapping (have channels below 800) but you are not tuning properly, then please use a channel_map and please report the issue in the issues along with the channels you are tuning and the actual rf frequency so corrections can be made.~ Channel Map and Group CSV Note: Leave the top line of the channel_map.csv and group.csv as the label, do not delete the line, if no line is there, dsd_import skips the first line so it will not import the first channel or first group in those files if there is something there that isn't a label. diff --git a/examples/nxdn_chan_map.csv b/examples/nxdn_chan_map.csv new file mode 100644 index 0000000..1ad99ba --- /dev/null +++ b/examples/nxdn_chan_map.csv @@ -0,0 +1,8 @@ +channel(dec), freq(Hz) +141,423862500 +142,424337500 +143,424912500 +203,424100000 +204,424625000 +271,422650000 +302,423287500 \ No newline at end of file diff --git a/examples/nxdn_sc_key.csv b/examples/nxdn_sc_key.csv new file mode 100644 index 0000000..8591b8e --- /dev/null +++ b/examples/nxdn_sc_key.csv @@ -0,0 +1,5 @@ +key(dec), value(dec), load any single keys as key 0 +0,23466 +1,12345 +2,32700 +63,32767 diff --git a/include/dsd.h b/include/dsd.h index 37f29fe..e92a287 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -330,7 +330,8 @@ typedef struct //csv import filenames char group_in_file[1024]; char lcn_in_file[1024]; - char chan_in_file[1024]; + char chan_in_file[1024]; + char key_in_file[1024]; //end import filenames //reverse mute @@ -648,6 +649,9 @@ typedef struct uint32_t nxdn_location_sys_code; uint16_t nxdn_location_site_code; + //multi-key array for nxdn keys + unsigned long long int rkey_array[0x1FF]; + //dmr late entry mi uint64_t late_entry_mi_fragment[2][7][3]; @@ -1025,6 +1029,7 @@ unsigned long long int edacs_bch (unsigned long long int message); int csvGroupImport(dsd_opts * opts, dsd_state * state); int csvLCNImport(dsd_opts * opts, dsd_state * state); int csvChanImport(dsd_opts * opts, dsd_state * state); +int csvKeyImport(dsd_opts * opts, dsd_state * state); #ifdef __cplusplus extern "C" { diff --git a/src/dsd_import.c b/src/dsd_import.c index 8d6e826..da7839c 100644 --- a/src/dsd_import.c +++ b/src/dsd_import.c @@ -145,3 +145,48 @@ int csvChanImport(dsd_opts * opts, dsd_state * state) //channel map import fclose(fp); return 0; } + +int csvKeyImport(dsd_opts * opts, dsd_state * state) //multi-key support for NXDN +{ + char filename[1024] = "filename.csv"; + sprintf (filename, "%s", opts->key_in_file); + + char buffer[BSIZE]; + FILE * fp; + fp = fopen(filename, "r"); + if (fp == NULL) { + printf("Unable to open file '%s'\n", filename); + exit(1); + } + int row_count = 0; + int field_count = 0; + unsigned long long int keynumber; + + while (fgets(buffer, BSIZE, fp)) { + field_count = 0; + row_count++; + if (row_count == 1) + continue; //don't want labels + char * field = strtok(buffer, ","); //seperate by comma + while (field) { + + if (field_count == 0) + { + sscanf (field, "%lld", &keynumber); + } + + if (field_count == 1) + { + sscanf (field, "%lld", &state->rkey_array[keynumber]); + } + + field = strtok(NULL, ","); + field_count++; + } + fprintf (stderr, "Key [%03lld] [%05lld]", keynumber, state->rkey_array[keynumber]); + fprintf (stderr, "\n"); + + } + fclose(fp); + return 0; +} diff --git a/src/dsd_main.c b/src/dsd_main.c index 9f6a0e4..772de79 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -393,6 +393,7 @@ initOpts (dsd_opts * opts) opts->group_in_file[0] = 0; opts->lcn_in_file[0] = 0; opts->chan_in_file[0] = 0; + opts->key_in_file[0] = 0; //end import filenames opts->szNumbers[0] = 0; opts->symbol_out_f = NULL; @@ -815,7 +816,10 @@ initState (dsd_state * state) //site/srv/cch info state->nxdn_location_site_code = 0; state->nxdn_location_sys_code = 0; - sprintf (state->nxdn_location_category, "%s", " "); + sprintf (state->nxdn_location_category, "%s", " "); + + //multi-key array + memset (state->rkey_array, 0, sizeof(state->rkey_array)); //Remus DMR End Call Alert Beep state->dmr_end_alert[0] = 0; @@ -976,6 +980,7 @@ usage () printf (" -H '20029736A5D91042 C923EB0697484433 005EFC58A1905195 E28E9C7836AA2DB8' \n"); printf ("\n"); printf (" -R Manually Enter dPMR or NXDN EHR Scrambler Key Value (Decimal Value)\n"); + printf (" -k Import NXDN Scrambler Key List from csv file.\n"); printf (" \n"); printf (" -4 Force Privacy Key over FID and SVC bits \n"); printf ("\n"); @@ -1212,7 +1217,7 @@ main (int argc, char **argv) exitflag = 0; // signal (SIGINT, sigfun); - while ((c = getopt (argc, argv, "haepPqs:t:v:z:i:o:d:c:g:nw:B:C:R:f:m:u:x:A:S:M:G:D:L:VU:Y:K:H:X:NQ:WrlZTF01:2:345:6:7:89:E")) != -1) + while ((c = getopt (argc, argv, "haepPqs:t:v:z:i:o:d:c:g:nw:B:C:R:f:m:u:x:A:S:M:G:D:L:VU:Y:K:H:X:NQ:WrlZTF01:2:345:6:7:89:Ek:")) != -1) { opterr = 0; switch (c) @@ -1230,6 +1235,12 @@ main (int argc, char **argv) //Disabled the Serial Port Dev and Baud Rate, etc, If somebody uses that function, sorry... + case 'k': //NXDN multi-key loader + strncpy(opts.key_in_file, optarg, 1023); + opts.key_in_file[1023] = '\0'; + csvKeyImport(&opts, &state); + break; + case 'Q': //'DSP' Structured Output file for OKDMRlib sprintf (wav_file_directory, "./DSP"); wav_file_directory[1023] = '\0'; diff --git a/src/nxdn_element.c b/src/nxdn_element.c index 3368bac..fcff734 100644 --- a/src/nxdn_element.c +++ b/src/nxdn_element.c @@ -667,6 +667,9 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) fprintf (stderr, "%s", KNRM); } + //check the rkey array for a scrambler key value + if (state->rkey_array[KeyID] != 0) state->R = state->rkey_array[KeyID]; + if (state->nxdn_cipher_type == 0x01 && state->R > 0) //scrambler key value { fprintf (stderr, "%s", KYEL);