diff --git a/d868uv.c b/d868uv.c index a1a87a1..8208e7d 100644 --- a/d868uv.c +++ b/d868uv.c @@ -49,23 +49,32 @@ // #define OFFSET_BANK1 0x000040 // Channels #define OFFSET_ZONELISTS 0x03e8c0 // Channel lists of zones +#define OFFSET_SCANLISTS 0x05dcc0 // Scanlists +#define OFFSET_MESSAGES 0x069f40 // Messages #define OFFSET_CHAN_MAP 0x070a40 // Bitmap of valid channels #define OFFSET_ZONE_MAP 0x070940 // Bitmap of valid zones +#define OFFSET_SCANL_MAP 0x070980 // Bitmap of valid scanlists #define OFFSET_SETTINGS 0x071600 // General settings #define OFFSET_ZONENAMES 0x071dc0 // Names of zones #define OFFSET_RADIOID 0x073d00 // Table of radio IDs #define OFFSET_CONTACT_MAP 0x080140 // Bitmap of invalid contacts #define OFFSET_CONTACTS 0x080640 // Contacts +#define OFFSET_GLISTS 0x174b00 // RX group lists #define GET_SETTINGS() ((general_settings_t*) &radio_mem[OFFSET_SETTINGS]) #define GET_RADIOID() ((radioid_t*) &radio_mem[OFFSET_RADIOID]) #define GET_ZONEMAP() (&radio_mem[OFFSET_ZONE_MAP]) #define GET_CONTACT_MAP() (&radio_mem[OFFSET_CONTACT_MAP]) +#define GET_SCANL_MAP() (&radio_mem[OFFSET_SCANL_MAP]) #define GET_ZONENAME(i) (&radio_mem[OFFSET_ZONENAMES + (i)*32]) #define GET_ZONELIST(i) ((uint16_t*) &radio_mem[OFFSET_ZONELISTS + (i)*512]) #define GET_CONTACT(i) ((contact_t*) &radio_mem[OFFSET_CONTACTS + (i)*100]) +#define GET_GROUPLIST(i) ((grouplist_t*) &radio_mem[OFFSET_GLISTS + (i)*320]) +#define GET_SCANLIST(i) ((scanlist_t*) &radio_mem[OFFSET_SCANLISTS + (i)*192]) +#define GET_MESSAGE(i) ((uint8_t*) &radio_mem[OFFSET_MESSAGES + (i)*256]) #define VALID_TEXT(txt) (*(txt) != 0 && *(txt) != 0xff) +#define VALID_GROUPLIST(gl) ((gl)->member[0] != 0xffffffff && VALID_TEXT((gl)->name)) // // Size of memory image. @@ -223,9 +232,9 @@ typedef struct { // // General settings: 0x640 bytes at 0x02500000. -// TODO: verify the general settings with official CPS // typedef struct { + // Bytes 0-5. uint8_t _unused0[6]; @@ -254,6 +263,7 @@ typedef struct { // Radio ID table: 250 entries, 0x1f40 bytes at 0x02580000. // typedef struct { + // Bytes 0-3. uint8_t id[4]; // Up to 8 BCD digits #define GET_ID(x) (((x)[0] >> 4) * 10000000 +\ @@ -315,6 +325,66 @@ typedef struct { } contact_t; +// +// Group list data. +// +typedef struct { + + // Bytes 0-255 + uint32_t member[64]; // Contacts: 0=Contact1, 0xffffffff=Empty + + // Bytes 256-319 + uint8_t name[35]; // Group List Name (ASCII) + uint8_t unused[29]; // 0 + +} grouplist_t; + +// +// Scan list data: 192 bytes. +// +typedef struct { + + // Bytes 0-1 + uint8_t _unused0; // 0 + uint8_t prio_ch_select; // Priority Channel Select +#define PRIO_CHAN_OFF 0 // Off +#define PRIO_CHAN_SEL1 1 // Priority Channel Select1 +#define PRIO_CHAN_SEL2 2 // Priority Channel Select2 +#define PRIO_CHAN_SEL12 3 // Priority Channel Select1 + Priority Channel Select2 + + // Bytes 2-5 + uint16_t priority_ch1; // Priority Channel 1: 0=Current Channel, 0xffff=Off + uint16_t priority_ch2; // Priority Channel 2: 0=Current Channel, 0xffff=Off + + // Bytes 6-13 + uint16_t look_back_a; // Look Back Time A, sec*10 + uint16_t look_back_b; // Look Back Time B, sec*10 + uint16_t dropout_delay; // Dropout Delay Time, sec*10 + uint16_t dwell; // Dwell Time, sec*10 + + // Byte 14 + uint8_t revert_channel; // Revert Channel +#define REVCH_SELECTED 0 // Selected +#define REVCH_SEL_TB 1 // Selected + TalkBack +#define REVCH_PRIO_CH1 2 // Priority Channel Select1 +#define REVCH_PRIO_CH2 3 // Priority Channel Select2 +#define REVCH_LAST_CALLED 4 // Last Called +#define REVCH_LAST_USED 5 // Last Used +#define REVCH_PRIO_CH1_TB 6 // Priority Channel Select1 + TalkBack +#define REVCH_PRIO_CH2_TB 7 // Priority Channel Select2 + TalkBack + + // Bytes 15-31 + uint8_t name[16]; // Scan List Name (ASCII) + uint8_t _unused31; // 0 + + // Bytes 32-131 + uint16_t member[50]; // Channels, 0xffff=empty + + // Bytes 132-191 + uint8_t _unused132[60]; // 0 + +} scanlist_t; + static const char *POWER_NAME[] = { "Low", "Mid", "High", "Turbo" }; static const char *DIGITAL_ADMIT_NAME[] = { "-", "Free", "NColor", "Color" }; static const char *ANALOG_ADMIT_NAME[] = { "-", "Tone", "Free", "Free" }; @@ -341,23 +411,7 @@ static const int CTCSS_TONES[NCTCSS] = { // static void d868uv_print_version(radio_device_t *radio, FILE *out) { - //TODO -#if 0 - unsigned char *timestamp = GET_TIMESTAMP(); - static const char charmap[16] = "0123456789:;<=>?"; - - if (*timestamp != 0xff) { - fprintf(out, "Last Programmed Date: %d%d%d%d-%d%d-%d%d", - timestamp[0] >> 4, timestamp[0] & 15, timestamp[1] >> 4, timestamp[1] & 15, - timestamp[2] >> 4, timestamp[2] & 15, timestamp[3] >> 4, timestamp[3] & 15); - fprintf(out, " %d%d:%d%d:%d%d\n", - timestamp[4] >> 4, timestamp[4] & 15, timestamp[5] >> 4, timestamp[5] & 15, - timestamp[6] >> 4, timestamp[6] & 15); - fprintf(out, "CPS Software Version: V%c%c.%c%c\n", - charmap[timestamp[7] & 15], charmap[timestamp[8] & 15], - charmap[timestamp[9] & 15], charmap[timestamp[10] & 15]); - } -#endif + // Empty. } // @@ -644,11 +698,9 @@ static void print_chan_base(FILE *out, channel_t *ch, int cnum) else fprintf(out, "%-4d ", ch->scan_list_index + 1); - //TODO -// if (ch->tot == 0) - fprintf(out, "- "); -// else -// fprintf(out, "%-3d ", ch->tot * 15); + // Transmit timeout timer on D868UV is configured globally, + // not per channel. So we don't print it here. + fprintf(out, "- "); fprintf(out, "%c ", "-+"[ch->rx_only]); } @@ -827,6 +879,21 @@ static int have_zones() return 0; } +// +// Return true when any scanlists are present. +// +static int have_scanlists() +{ + uint8_t *slmap = GET_SCANL_MAP(); + int i; + + for (i=0; i<(NSCANL+7)/8; i++) { + if (slmap[i] != 0) + return 1; + } + return 0; +} + // // Find a zone with given index. // Return false when zone is not valid. @@ -846,7 +913,20 @@ static int get_zone(int i, uint8_t **zname, uint16_t **zlist) } } -static void print_chanlist(FILE *out, uint16_t *unsorted, int nchan) +// +// Get scanlist by index. +// +static scanlist_t *get_scanlist(int i) +{ + uint8_t *slmap = GET_SCANL_MAP(); + + if ((slmap[i / 8] >> (i & 7)) & 1) + return GET_SCANLIST(i); + + return 0; +} + +static void print_chanlist16(FILE *out, uint16_t *unsorted, int nchan) { int last = -1; int range = 0; @@ -880,6 +960,65 @@ static void print_chanlist(FILE *out, uint16_t *unsorted, int nchan) fprintf(out, "-%d", last); } +static void print_chanlist32(FILE *out, uint32_t *unsorted, int nchan) +{ + int last = -1; + int range = 0; + int n; + uint32_t data[nchan]; + + // Sort the list before printing. + memcpy(data, unsorted, nchan * sizeof(uint32_t)); + qsort(data, nchan, sizeof(uint32_t), compare_index_ffffffff); + for (n=0; n 0) + fprintf(out, ","); + fprintf(out, "%d", cnum); + } + last = cnum; + } + if (range) + fprintf(out, "-%d", last); +} + +static int have_grouplists() +{ + int i; + + for (i=0; iname, 16, 1); + + if ((sl->prio_ch_select == PRIO_CHAN_SEL1 || + sl->prio_ch_select == PRIO_CHAN_SEL12) && + sl->priority_ch1 != 0xffff) { + if (sl->priority_ch1 == 0) { + fprintf(out, " Curr "); + } else { + fprintf(out, " %-4d ", sl->priority_ch1); + } + } else { + fprintf(out, " - "); + } + + if ((sl->prio_ch_select == PRIO_CHAN_SEL2 || + sl->prio_ch_select == PRIO_CHAN_SEL12) && + sl->priority_ch2 != 0xffff) { + if (sl->priority_ch2 == 0) { + fprintf(out, "Curr "); + } else { + fprintf(out, "%-4d ", sl->priority_ch2); + } + } else { + fprintf(out, "- "); + } + + if (sl->revert_channel == REVCH_LAST_CALLED) { + fprintf(out, "Last "); + } else { + fprintf(out, "Sel "); + } + + if (sl->member[0] != 0xffff) { + print_chanlist16(out, sl->member, 50); + } else { + fprintf(out, "-"); + } + fprintf(out, "\n"); + } + } // // Contacts. @@ -975,12 +1175,57 @@ static void d868uv_print_config(radio_device_t *radio, FILE *out, int verbose) // // Group lists. // - //TODO + if (have_grouplists()) { + fprintf(out, "\n"); + if (verbose) { + fprintf(out, "# Table of group lists.\n"); + fprintf(out, "# 1) Group list number: 1-%d\n", NGLISTS); + fprintf(out, "# 2) Name: up to 35 characters, use '_' instead of space\n"); + fprintf(out, "# 3) List of contacts: numbers and ranges (N-M) separated by comma\n"); + fprintf(out, "#\n"); + } + fprintf(out, "Grouplist Name Contacts\n"); + for (i=0; iname, 35, 1); + fprintf(out, " "); + print_chanlist32(out, gl->member, 64); + fprintf(out, "\n"); + } + } // // Text messages. // - //TODO + if (have_messages()) { + fprintf(out, "\n"); + if (verbose) { + fprintf(out, "# Table of text messages.\n"); + fprintf(out, "# 1) Message number: 1-%d\n", NMESSAGES); + fprintf(out, "# 2) Text: up to 200 characters\n"); + fprintf(out, "#\n"); + } + fprintf(out, "Message Text\n"); + for (i=0; iscan_list_index != 0) { - scanlist_t *sl = GET_SCANLIST(ch->scan_list_index - 1); + scanlist_t *sl = get_scanlist(ch->scan_list_index - 1); if (!VALID_SCANLIST(sl)) { fprintf(stderr, "Channel %d '", i+1); @@ -1194,9 +1439,9 @@ static int d868uv_verify_config(radio_device_t *radio) // Scanlists: check references to channels. for (i=0; imember[k]; - if (cnum != 0) { - contact_t *ct = get_contact(cnum - 1); + if (cnum != 0xffffffff) { + contact_t *ct = get_contact(cnum); if (!ct) { fprintf(stderr, "Grouplist %d '", i+1); - print_ascii(stderr, gl->name, 16, 0); + print_ascii(stderr, gl->name, 35, 0); fprintf(stderr, "': contact %d not found.\n", cnum); nerrors++; } diff --git a/examples/Makefile b/examples/Makefile index d4eabb7..50b465f 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -17,19 +17,28 @@ CONF = md2017-7-23-2017.conf \ rd5r-factory.conf \ gd77-ver311-W5NOR-Oklahoma.conf \ gd77-empty.conf \ - gd77-factory.conf + gd77-factory.conf \ + d868uv-rmham-2018-10-20.conf \ + d868uv-empty.conf -VPATH = ../../dmrconfig.wiki/files +VPATH = ../../dmrconfig.wiki/files/uv380 \ + ../../dmrconfig.wiki/files/md380 \ + ../../dmrconfig.wiki/files/rd5r \ + ../../dmrconfig.wiki/files/gd77 \ + ../../dmrconfig.wiki/files/d868uv all: $(CONF) clean: rm -f $(CONF) -.SUFFIXES: .conf .rdt .dat +.SUFFIXES: .conf .rdt .dat .img .rdt.conf: dmrconfig $< > $@ .dat.conf: dmrconfig $< > $@ + +.img.conf: + dmrconfig $< > $@ diff --git a/examples/d868uv-empty.conf b/examples/d868uv-empty.conf new file mode 100644 index 0000000..f59b840 --- /dev/null +++ b/examples/d868uv-empty.conf @@ -0,0 +1,103 @@ +# +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# +Radio: Anytone AT-D868UV + +# Table of digital channels. +# 1) Channel number: 1-4000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Receive frequency in MHz +# 4) Transmit frequency or +/- offset in MHz +# 5) Transmit power: High, Mid, Low, Turbo +# 6) Scan list: - or index in Scanlist table +# 7) Transmit timeout timer: (unused) +# 8) Receive only: -, + +# 9) Admit criteria: -, Free, Color, NColor +# 10) Color code: 0, 1, 2, 3... 15 +# 11) Time slot: 1 or 2 +# 12) Receive group list: - or index in Grouplist table +# 13) Contact for transmit: - or index in Contacts table +# +Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot RxGL TxContact + 2 Channel_2 436.325 +0 Turbo 1 - - - 1 1 1 1 # Contact1 + 4 Channel_4 438.875 +0 Turbo 1 - - - 1 1 1 1 # Contact1 + 6 Channel_6 146.325 +0 Turbo 1 - - - 1 1 1 1 # Contact1 + 8 Channel_8 148.875 +0 Turbo 1 - - - 1 1 1 1 # Contact1 + +# Table of analog channels. +# 1) Channel number: 1-4000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Receive frequency in MHz +# 4) Transmit frequency or +/- offset in MHz +# 5) Transmit power: High, Mid, Low, Turbo +# 6) Scan list: - or index +# 7) Transmit timeout timer: (unused) +# 8) Receive only: -, + +# 9) Admit criteria: -, Free, Tone +# 10) Squelch level: Normal (unused) +# 11) Guard tone for receive, or '-' to disable +# 12) Guard tone for transmit, or '-' to disable +# 13) Bandwidth in kHz: 12.5, 25 +# +Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width + 1 Channel_1 435.525 +0 Turbo 1 - - - Normal - - 25 + 3 Channel_3 437.575 +0 Turbo 1 - - - Normal - - 25 + 5 Channel_5 144.525 +0 Turbo 1 - - - Normal - - 25 + 7 Channel_7 147.575 +0 Turbo 1 - - - Normal - - 25 + +# Table of channel zones. +# 1) Zone number: 1-250 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of channels: numbers and ranges (N-M) separated by comma +# +Zone Name Channels + 1 Zone_1 1-8 + +# Table of scan lists. +# 1) Scan list number: 1-250 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Priority channel 1: -, Curr or index +# 4) Priority channel 2: -, Curr or index +# 5) Designated transmit channel: Sel or Last +# 6) List of channels: numbers and ranges (N-M) separated by comma +# +Scanlist Name PCh1 PCh2 TxCh Channels + 1 Scan_List_1 - - Sel 1-8 + +# Table of contacts. +# 1) Contact number: 1-10000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Call type: Group, Private, All +# 4) Call ID: 1...16777215 +# 5) Incoming call alert: -, +, Online +# +Contact Name Type ID RxTone + 1 Contact1 Group 12345678 - + +# Table of group lists. +# 1) Group list number: 1-250 +# 2) Name: up to 35 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma +# +Grouplist Name Contacts + 1 Group_List_1 1 + +# Table of text messages. +# 1) Message number: 1-100 +# 2) Text: up to 200 characters +# +Message Text + 1 Hello! + 2 Welcome! + 3 Thank you! + 4 Good bye! + 5 Happy every day! + +# Unique DMR ID and name of this radio. +ID: 12345678 +Name: My Radio + +# Text displayed when the radio powers up. +Intro Line 1: WELCOM +Intro Line 2: ANYTONE diff --git a/examples/d868uv-rmham-2018-10-20.conf b/examples/d868uv-rmham-2018-10-20.conf new file mode 100644 index 0000000..a5be833 --- /dev/null +++ b/examples/d868uv-rmham-2018-10-20.conf @@ -0,0 +1,355 @@ +# +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# +Radio: Anytone AT-D868UV + +# Table of digital channels. +# 1) Channel number: 1-4000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Receive frequency in MHz +# 4) Transmit frequency or +/- offset in MHz +# 5) Transmit power: High, Mid, Low, Turbo +# 6) Scan list: - or index in Scanlist table +# 7) Transmit timeout timer: (unused) +# 8) Receive only: -, + +# 9) Admit criteria: -, Free, Color, NColor +# 10) Color code: 0, 1, 2, 3... 15 +# 11) Time slot: 1 or 2 +# 12) Receive group list: - or index in Grouplist table +# 13) Contact for transmit: - or index in Contacts table +# +Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot RxGL TxContact + 94 ABQ_Rk_Mtn 442.900 +5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 95 ABQ_South 442.900 +5 High 3 - - NColor 7 2 9 11 # South + 96 Akron_Rk_Mtn 448.175 -5 High 2 - - NColor 7 1 7 9 # Rocky Mountain + 97 Akron_North 448.175 -5 High 2 - - NColor 7 2 8 13 # North + 98 Almagre_Rk_Mtn 446.950 -5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 99 Almagre_South 446.950 -5 High 3 - - NColor 7 2 9 11 # South + 100 Badger_Rk_Mtn 446.7625 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 101 Badger_Central 446.7625 -5 High 1 - - NColor 7 2 10 12 # Central + 102 Boulder_Rk_Mtn 446.9875 -5 High 2 - - NColor 7 1 7 9 # Rocky Mountain + 103 Boulder_North 446.9875 -5 High 2 - - NColor 7 2 8 13 # North + 104 Breck_Rk_Mtn 445.0875 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 105 Breck_Central 445.0875 -5 High 1 - - NColor 7 2 10 12 # Central + 106 Canon_Rk_Mtn 446.7375 -5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 107 Canon_South 446.7375 -5 High 3 - - NColor 7 2 9 11 # South + 108 Cheyenne_Rk_Mtn 449.9375 -5 High 2 - - NColor 7 1 7 9 # Rocky Mountain + 109 Cheyenne_North 449.9375 -5 High 2 - - NColor 7 2 8 13 # North + 110 Devils_South 446.925 -5 High 3 - - NColor 7 1 9 11 # South + 111 Devils_Central 446.925 -5 High 1 - - NColor 7 2 10 12 # Central + 112 Durango_Rk_Mtn 446.7375 -5 High 3 - - NColor 6 1 7 9 # Rocky Mountain + 113 Durango_South 446.7375 -5 High 3 - - NColor 6 2 9 11 # South + 114 Ft_Morgan_Rk_Mtn 448.200 -5 High 2 - - NColor 7 1 7 9 # Rocky Mountain + 115 Ft_Morgan_North 448.200 -5 High 2 - - NColor 7 2 8 13 # North + 116 Genoa_Rk_Mtn 446.7375 -5 High 1 - - NColor 8 1 7 9 # Rocky Mountain + 117 Genoa_Central 446.7375 -5 High 1 - - NColor 8 2 10 12 # Central + 118 Horsetooth_Rk_Mt 446.750 -5 High 2 - - NColor 7 1 7 9 # Rocky Mountain + 119 Horsetooth_North 446.750 -5 High 2 - - NColor 7 2 8 13 # North + 120 Leadville_Rk_Mtn 445.050 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 121 Leadville_Centra 445.050 -5 High 1 - - NColor 7 2 10 12 # Central + 122 Lookout_Local 446.8375 -5 High 1 - - NColor 7 1 11 10 # Lookout Local + 123 Lookout_Central 446.8375 -5 High 1 - - NColor 7 2 10 12 # Central + 124 Pueblo_Rk_Mtn 446.9875 -5 High 3 - - NColor 6 1 7 9 # Rocky Mountain + 125 Pueblo_South 446.9875 -5 High 3 - - NColor 6 2 9 11 # South + 126 Salida_Rk_Mtn 446.8125 -5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 127 Salida_South 446.8125 -5 High 3 - - NColor 7 2 9 11 # South + 128 Squaw_Rk_Mtn 446.9375 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 129 Squaw_Central 446.9375 -5 High 1 - - NColor 7 2 10 12 # Central + 130 Thorodin_Rk_Mtn 446.800 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 131 Thorodin_Central 446.800 -5 High 1 - - NColor 7 2 10 12 # Central + 132 Vail_Rk_Mtn 445.075 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 133 Vail_Central 445.075 -5 High 1 - - NColor 7 2 10 12 # Central + 134 Westcreek_Rk_Mtn 446.875 -5 High 1 - - NColor 6 1 7 9 # Rocky Mountain + 135 Westcreek_Centra 446.875 -5 High 1 - - NColor 6 2 10 12 # Central + 136 Trailer_Rk_Mtn 438.225 -5 High 1 - - NColor 7 1 7 9 # Rocky Mountain + 137 Trailer_North 438.225 -5 High 2 - - NColor 7 2 8 13 # North + 138 Trailer_Central 438.225 -5 High 1 - - NColor 7 2 10 12 # Central + 139 Trailer_South 438.225 -5 High 3 - - NColor 7 2 9 11 # South + 140 446.2000_SX_Dig 446.200 +0 High - - - NColor 1 1 - 25 # All Call + 141 446.2125_SX_Dig 446.2125 +0 High - - - NColor 1 1 - 25 # All Call + 142 446.2250_SX_Dig 446.225 +0 High - - - NColor 1 1 - 25 # All Call + 143 446.2375_SX_Dig 446.2375 +0 High - - - NColor 1 1 - 25 # All Call + 144 446.2500_SX_Dig 446.250 +0 High - - - NColor 1 1 - 25 # All Call + 145 446.2625_SX_Dig 446.2625 +0 High - - - NColor 1 1 - 25 # All Call + 146 446.2750_SX_Dig 446.275 +0 High - - - NColor 1 1 - 25 # All Call + 147 446.2875_SX_Dig 446.2875 +0 High - - - NColor 1 1 - 25 # All Call + 148 446.3000_SX_Dig 446.300 +0 High - - - NColor 1 1 - 25 # All Call + 149 DMR.MARC_Simplex 446.075 +0 High - - - NColor 1 1 6 7 # DMR MARC Simplex + 150 W0CFI_S1 446.625 -5 High - - - NColor 7 1 - 25 # All Call + 151 W0TX_WorldWide 446.7875 -5 High - - - NColor 1 1 - 6 # BM Worldwide + 152 W0TX_USA 446.7875 -5 High - - - NColor 1 1 - 14 # BM USA + 153 W0TX_Mtn_West 446.7875 -5 High - - - NColor 1 1 - 19 # BM MTN West + 154 W0TX_Colorado 446.7875 -5 High - - - NColor 1 1 - 15 # BM Colorado + 155 W0TX_T310 446.7875 -5 High - - - NColor 1 1 - 8 # BM TAC 310 + 156 W0TX_Parrot 446.7875 -5 High - - - NColor 1 1 13 18 # BM Parrot + 157 W0TX_TS1_Unlink 446.7875 -5 High - - - NColor 1 1 - 17 # BM Unlink + 158 W0TX_Local 446.7875 -5 High - - - NColor 1 2 - 20 # BM W0TX Lcl + 159 SlvrH_WorldWide 446.825 -5 High - - - NColor 1 1 - 6 # BM Worldwide + 160 SlvrH_USA 446.825 -5 High - - - NColor 1 1 - 14 # BM USA + 161 SlvrH_Mtn_West 446.825 -5 High - - - NColor 1 1 - 19 # BM MTN West + 162 SlvrH_Colorado 446.825 -5 High - - - NColor 1 1 - 15 # BM Colorado + 163 SlvrH_T310 446.825 -5 High - - - NColor 1 1 - 8 # BM TAC 310 + 164 SlvrH_Parrot 446.825 -5 High - - - NColor 1 1 13 18 # BM Parrot + 165 SlvrH_TS1_Unlink 446.825 -5 High - - - NColor 1 1 - 17 # BM Unlink + 166 SlvrH_ARESDEC 446.825 -5 High - - - NColor 1 2 - 23 # BM ARESDEC + 167 PRA_Worldwide 445.075 -5 High - - - NColor 1 1 - 6 # BM Worldwide + 168 PRA_USA 445.075 -5 High - - - NColor 1 1 - 14 # BM USA + 169 PRA_Mtn_West 445.075 -5 High - - - NColor 1 1 - 19 # BM MTN West + 170 PRA_Colorado 445.075 -5 High - - - NColor 1 1 - 15 # BM Colorado + 171 PRA_T310 445.075 -5 High - - - NColor 1 1 - 8 # BM TAC 310 + 172 PRA_Parrot 445.075 -5 High - - - NColor 1 1 13 18 # BM Parrot + 173 PRA_TS1_Unlink 445.075 -5 High - - - NColor 1 1 - 17 # BM Unlink + 174 PRA_Local 445.075 -5 High - - - NColor 1 2 - 24 # BM PRA Lcl + 175 Lee_Hill_WW 445.050 -5 High - - - NColor 1 1 13 6 # BM Worldwide + 176 Lee_Hill_USA 445.050 -5 High - - - NColor 1 1 13 14 # BM USA + 177 Lee_Hill_MtnWest 445.050 -5 High - - - NColor 1 1 13 19 # BM MTN West + 178 Lee_Hill_Colo 445.050 -5 High - - - NColor 1 1 13 15 # BM Colorado + 179 Lee_Hill_T310 445.050 -5 High - - - NColor 1 1 13 8 # BM TAC 310 + 180 Lee_Hill_Parrot 445.050 -5 High - - - NColor 1 1 13 18 # BM Parrot + 181 Lee_Hill_TS1_UNL 445.050 -5 High - - - NColor 1 1 13 17 # BM Unlink + 182 Lee_Hill_Local 445.050 -5 High - - - NColor 1 2 13 21 # Lee Hill Local + 183 C_Sprgs_WW 445.0625 -5 High - - - NColor 1 1 13 6 # BM Worldwide + 184 C_Sprgs_USA 445.0625 -5 High - - - NColor 1 1 13 14 # BM USA + 185 C_Sprgs_MtnWest 445.0625 -5 High - - - NColor 1 1 13 19 # BM MTN West + 186 C_Sprgs_Colorado 445.0625 -5 High - - - NColor 1 1 13 15 # BM Colorado + 187 C_Sprgs_T310 445.0625 -5 High - - - NColor 1 1 13 8 # BM TAC 310 + 188 C_Sprgs_Parrot 445.0625 -5 High - - - NColor 1 1 13 18 # BM Parrot + 189 C_Sprgs_TS1_UNL 445.0625 -5 High - - - NColor 1 1 13 17 # BM Unlink + 190 C_Sprgs_Local 445.0625 -5 High - - - NColor 1 2 13 22 # C Spgs Local + 191 Mission_Rk_Mtn 445.1375 -5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 192 Mission_South 445.1375 -5 High 3 - - NColor 7 2 9 11 # South + 193 Rangely_Rk_Mtn 445.2625 -5 High 3 - - NColor 7 1 7 9 # Rocky Mountain + 194 Rangely_Central 445.2625 -5 High 1 - - NColor 7 2 10 12 # Central + +# Table of analog channels. +# 1) Channel number: 1-4000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Receive frequency in MHz +# 4) Transmit frequency or +/- offset in MHz +# 5) Transmit power: High, Mid, Low, Turbo +# 6) Scan list: - or index +# 7) Transmit timeout timer: (unused) +# 8) Receive only: -, + +# 9) Admit criteria: -, Free, Tone +# 10) Squelch level: Normal (unused) +# 11) Guard tone for receive, or '-' to disable +# 12) Guard tone for transmit, or '-' to disable +# 13) Bandwidth in kHz: 12.5, 25 +# +Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width + 1 Denver_Thorodin 449.225 -5 High 5 - - - Normal 141.3 141.3 25 + 2 Denver_Squaw 448.225 -5 High 5 - - - Normal 141.3 141.3 25 + 3 Denver_Lookout 449.625 -5 High 5 - - - Normal 141.3 141.3 25 + 4 Denver_Lee_Hill 447.750 -5 High 5 - - - Normal 141.3 141.3 25 + 5 Breckenridge 447.850 -5 High 5 - - - Normal 100.0 100.0 25 + 6 446.000_Simplex 446.000 +0 High - - - - Normal - - 25 + 7 446.000_Smplx_PL 446.000 +0 High - - - - Normal 141.3 141.3 25 + 8 446.025_Simplex 446.025 +0 High - - - - Normal - - 25 + 9 446.025_Smplx_PL 446.025 +0 High - - - - Normal 141.3 141.3 25 + 10 446.050_Simplex 446.050 +0 High - - - - Normal - - 25 + 11 446.050_Smplx_PL 446.050 +0 High - - - - Normal 141.3 141.3 25 + 12 446.075_Simplex 446.075 +0 High - - - - Normal - - 25 + 13 446.075_Smplx_PL 446.075 +0 High - - - - Normal 141.3 141.3 25 + 14 446.100_Simplex 446.100 +0 High - - - - Normal - - 25 + 15 446.100_Smplx_PL 446.100 +0 High - - - - Normal 141.3 141.3 25 + 16 446.125_Simplex 446.125 +0 High - - - - Normal - - 25 + 17 446.125_Smplx_PL 446.125 +0 High - - - - Normal 141.3 141.3 25 + 18 446.150_Simplex 446.150 +0 High - - - - Normal - - 25 + 19 446.150_Smplx_PL 446.150 +0 High - - - - Normal 141.3 141.3 25 + 20 446.175_Simplex 446.175 +0 High - - - - Normal - - 25 + 21 446.175_Smplx_PL 446.175 +0 High - - - - Normal 141.3 141.3 25 + 22 446.200_Simplex 446.200 +0 High - - - - Normal - - 12.5 + 23 446.200_SmplxDCS 446.200 +0 High - - - - Normal D023N D023N 12.5 + 24 446.225_Simplex 446.225 +0 High - - - - Normal - - 12.5 + 25 446.225_SmplxDCS 446.225 +0 High - - - - Normal D023N D023N 12.5 + 26 446.250_Simplex 446.250 +0 High - - - - Normal - - 12.5 + 27 446.250_SmplxDCS 446.250 -0.025 High - - - - Normal D023N D023N 12.5 + 28 446.275_Simplex 446.275 +0 High - - - - Normal - - 12.5 + 29 446.275_SmplxDCS 446.275 +0 High - - - - Normal D023N D023N 12.5 + 30 446.300_Simplex 446.275 +0 High - - - - Normal - - 12.5 + 31 446.300_SmplxDCS 446.275 +0 High - - - - Normal D023N D023N 12.5 + 32 438.225_91.5 438.225 -5 High - - - - Normal 91.5 91.5 25 + 33 447.225_103.5 447.225 -5 High - - - - Normal 103.5 103.5 25 + 34 449.075_141.3 449.075 -5 High - - - - Normal 141.3 141.3 25 + 35 449.100_141.3 449.100 -5 High - - - - Normal 141.3 141.3 25 + 36 447.300_BZZ_Rptr 447.300 -5 High - - - - Normal 141.3 141.3 25 + 37 448.050_K0PWO1 448.050 -5 High - - - - Normal 179.9 179.9 25 + 38 448.050_K0PWO2 448.050 -5 High - - - - Normal D023N D023N 25 + 39 448.325_K0PWO3 448.325 -5 High - - - - Normal 179.9 179.9 25 + 40 448.325_K0PWO4 448.325 -5 High - - - - Normal D023N D023N 25 + 41 447.125_91.5 447.125 -5 High 6 - - - Normal 91.5 91.5 25 + 42 447.150_107.2 447.150 -5 High 6 - - - Normal - 107.2 25 + 43 447.175_186.2 447.175 -5 High 6 - - - Normal - 186.2 25 + 44 447.225_141.3 447.225 -5 High 6 - - - Normal 141.3 141.3 25 + 45 447.275_100.0 447.275 -5.15 High 6 - - - Normal - 100.0 25 + 46 447.350_151.4 447.350 -5 High 6 - - - Normal 151.4 151.4 25 + 47 447.450_123.0 447.450 -5 High 6 - - - Normal - 123.0 25 + 48 447.500_88.5 447.500 -5 High 6 - - - Normal - 88.5 25 + 49 447.650_141.3 447.650 -5 High 6 - - - Normal 141.3 141.3 25 + 50 447.700_100.0 447.700 -5 High 6 - - - Normal 100.0 100.0 25 + 51 447.750_141.3 447.750 -5 High 6 - - - Normal 141.3 141.3 25 + 52 447.825_NB_073 447.825 -5 High 6 - - - Normal D073N D073N 12.5 + 53 447.925_100.0 447.925 -5 High 6 - - - Normal - 100.0 25 + 54 447.975_107.2 447.975 -5 High 6 - - - Normal - 107.2 25 + 55 448.025_100.0 448.025 -5 High 7 - - - Normal - 100.0 25 + 56 448.075_123.0 448.075 -5 High 7 - - - Normal - 123.0 25 + 57 448.125_107.2 448.125 -5 High 7 - - - Normal - 107.2 25 + 58 448.200_NB_023 448.200 -5 High 7 - - - Normal D023N D023N 12.5 + 59 448.200_141.3 448.200 -5 High 7 - - - Normal 141.3 141.3 25 + 60 448.225_141.3 448.225 -5 High 7 - - - Normal - 141.3 25 + 61 448.450_100.0 448.450 -5 High 7 - - - Normal 100.0 100.0 25 + 62 448.475_100.0 448.475 -5 High 7 - - - Normal - 100.0 25 + 63 448.500_100.0 448.500 -5 High 7 - - - Normal - 100.0 25 + 64 448.625_100.0 448.625 -5 High 7 - - - Normal - 100.0 25 + 65 448.675_100.0 448.625 -5 High 7 - - - Normal - 100.0 25 + 66 448.700_146.2 448.700 -5 High 7 - - - Normal - 146.2 25 + 67 448.850_88.5 448.850 -5 High 7 - - - Normal - 88.5 25 + 68 448.900_100.0 448.900 -5 High 7 - - - Normal - 100.0 25 + 69 448.975_123.0 448.975 -5 High 7 - - - Normal - 123.0 25 + 70 448.975_100.0 448.975 -5 High 7 - - - Normal 100.0 100.0 25 + 71 449.050_107.2 449.050 -5 High 8 - - - Normal - 107.2 25 + 72 449.125_103.5 449.125 -5 High 8 - - - Normal - 103.5 25 + 73 449.350_100.0 449.350 -5 High 8 - - - Normal - 100.0 25 + 74 449.450_103.5 449.450 -5 High 8 - - - Normal - 103.5 25 + 75 449.525_100.0 449.525 -5 High 8 - - - Normal - 100.0 25 + 76 449.600_100.0 449.600 -5 High 8 - - - Normal - 100.0 25 + 77 449.625_141.3 449.625 -5 High 8 - - - Normal 141.3 141.3 25 + 78 449.650_136.5 449.650 -5 High 8 - - - Normal - 136.5 25 + 79 449.725_127.3 449.725 -5 High 8 - - - Normal - 127.3 25 + 80 449.750_103.5 449.750 -5 High 8 - - - Normal - 103.5 25 + 81 449.800_123.0 449.800 -5 High 8 - - - Normal - 123.0 25 + 82 449.825_103.5 449.825 -5 High 8 - - - Normal - 103.5 25 + 83 449.850_100.0 449.850 -5 High 8 - - - Normal - 100.0 25 + 84 449.875_103.5 449.875 -5 High 8 - - - Normal - 103.5 25 + 85 Devilshead 448.950 -5 High - - - - Normal 100.0 100.0 25 + 86 Cordova_Pass 449.750 -5 High - - - - Normal 100.0 100.0 25 + 87 Black_Forest 447.625 -5 High - - - - Normal 100.0 100.0 25 + 88 Boone 447.275 -5 High - - - - Normal 100.0 100.0 25 + 89 Pueblo_Salida 449.975 -5 High - - - - Normal 100.0 100.0 25 + 90 Canon_City 447.975 -5 High - - - - Normal 100.0 100.0 25 + 91 Canon_Fremont 447.250 -5 High - - - - Normal 100.0 100.0 25 + 92 DIA_Denver 448.150 -5 High - - - - Normal 141.3 141.3 25 + 93 Pueblo_West 448.975 -5 High - - - - Normal 100.0 100.0 25 + +# Table of channel zones. +# 1) Zone number: 1-250 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) List of channels: numbers and ranges (N-M) separated by comma +# +Zone Name Channels + 1 TRBO_CentralEast 111,116-117,122-123,128-131,134-135 + 2 TRBO_CentralWest 100-101,104-105,120-121,132-133,193-194 + 3 TRBO_North 96-97,102-103,108-109,114-115,118-119,136-137 + 4 TRBO_South 94-95,98-99,106-107,110-113,124-127,191-192 + 5 BM_RMHAM 175-190 + 6 BM_Other_1 151-158 + 7 BM_Other_2 159-174 + 8 RMHAM_Analog 1-5 + 9 Fun_Machines 85-93 + 10 SX_Analog 6-21 + 11 SX_Analog_NB 22-31 + 12 SX_Digital 140-149 + 13 W0CFI_Local 150 + 14 Portable_Rptrs 32-36,39-40,136-137,139 + 15 HAM_447 33,41-54 + 16 Ham_448 55-70 + 17 HAM_449 71-84 + 18 ARES_525 1 + +# Table of scan lists. +# 1) Scan list number: 1-250 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Priority channel 1: -, Curr or index +# 4) Priority channel 2: -, Curr or index +# 5) Designated transmit channel: Sel or Last +# 6) List of channels: numbers and ranges (N-M) separated by comma +# +Scanlist Name PCh1 PCh2 TxCh Channels + 1 TRBO_Central - - Sel 100-102,104-105,111,116-117,120-123,128-135,193-194 + 2 TRBO_North - - Sel 96-97,102-103,108-109,114-115,118-119,136-137 + 3 TRBO_South - - Sel 94-95,98-99,106-107,110-113,124-127,136,139,191-192 + 4 DMR_MARC_RMHAM - - Sel 175 + 5 RMHAM_Analog - - Sel 1-5 + 6 HAM_447 - - Sel 33,41-54 + 7 HAM_448 - - Sel 55-70 + 8 HAM_449 - - Sel 71-84 + +# Table of contacts. +# 1) Contact number: 1-10000 +# 2) Name: up to 16 characters, use '_' instead of space +# 3) Call type: Group, Private, All +# 4) Call ID: 1...16777215 +# 5) Incoming call alert: -, +, Online +# +Contact Name Type ID RxTone + 1 Contact_1 Group 1 - + 2 Local Group 2 - + 3 DMR_MARC_NA Group 3 - + 4 BM_Rflctr Group 9 - + 5 DMR_MARC_WW_Eng Group 13 - + 6 BM_Worldwide Group 91 - + 7 DMR_MARC_Simplex Group 99 - + 8 BM_TAC_310 Group 310 - + 9 Rocky_Mountain Group 700 - + 10 Lookout_Local Group 710 - + 11 South Group 719 - + 12 Central Group 720 - + 13 North Group 721 - + 14 BM_USA Group 3100 - + 15 BM_Colorado Group 3108 - + 16 DMR_MARC_MTN Group 3177 - + 17 BM_Unlink Group 4000 - + 18 BM_Parrot Private 9990 - + 19 BM_MTN_West Group 31062 - + 20 BM_W0TX_Lcl Group 310804 - + 21 Lee_Hill_Local Group 310819 - + 22 C_Spgs_Local Group 310820 - + 23 BM_ARESDEC Group 310842 - + 24 BM_PRA_Lcl Group 310844 - + 25 All_Call All 16777215 - + +# Table of group lists. +# 1) Group list number: 1-250 +# 2) Name: up to 35 characters, use '_' instead of space +# 3) List of contacts: numbers and ranges (N-M) separated by comma +# +Grouplist Name Contacts + 2 DMR_MARC_NA 3 + 3 DMR_MARC_WW_Eng 5 + 4 Local 16 + 5 DMR_MARC_MTN 16 + 6 DMR_MARC_Simplex 7 + 7 Rocky_Mountain 9 + 8 North 13 + 9 South 11 + 10 Central 12 + 11 Lookout_Local 10 + 13 BM_All 2,4,6,8,14-15,17,19-24 + 14 BM_TAC_310 8 + 15 BM_USA 14 + 16 BM_Colorado 15 + 17 BM_MTN_West 19 + 18 BM_Unlink 17 + 20 BM_ARESDEC 23 + 21 BM_Worldwide 6 + 22 BM_W0TX_Lcl 20 + +# Table of text messages. +# 1) Message number: 1-100 +# 2) Text: up to 200 characters +# +Message Text + 1 Hello! + 2 Welcome! + 3 Thank you! + 4 Good bye! + 5 Happy every day! + +# Unique DMR ID and name of this radio. +ID: 54321 +Name: RMHAM Sample + +# Text displayed when the radio powers up. +Intro Line 1: - +Intro Line 2: - diff --git a/examples/gd77-empty.conf b/examples/gd77-empty.conf index e38a9f1..e058a51 100644 --- a/examples/gd77-empty.conf +++ b/examples/gd77-empty.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/10/04 by dmrconfig, -# Version 0.8.127, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Radioddity GD-77 Last Programmed Date: 2018-10-04 21:05 diff --git a/examples/gd77-factory.conf b/examples/gd77-factory.conf index f484437..8ab3361 100644 --- a/examples/gd77-factory.conf +++ b/examples/gd77-factory.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/10/04 by dmrconfig, -# Version 0.8.127, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Radioddity GD-77 Last Programmed Date: 2018-03-23 15:19 diff --git a/examples/gd77-ver311-W5NOR-Oklahoma.conf b/examples/gd77-ver311-W5NOR-Oklahoma.conf index 4c6512a..69c96c8 100644 --- a/examples/gd77-ver311-W5NOR-Oklahoma.conf +++ b/examples/gd77-ver311-W5NOR-Oklahoma.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/10/04 by dmrconfig, -# Version 0.8.127, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Radioddity GD-77 Last Programmed Date: 2018-05-05 01:54 diff --git a/examples/md-uv380-empty.conf b/examples/md-uv380-empty.conf index e3fb7c1..809e03a 100644 --- a/examples/md-uv380-empty.conf +++ b/examples/md-uv380-empty.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Last Programmed Date: 2018-08-20 12:41:08 diff --git a/examples/md-uv380-factory.conf b/examples/md-uv380-factory.conf index 5e5dd0e..402f07c 100644 --- a/examples/md-uv380-factory.conf +++ b/examples/md-uv380-factory.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Last Programmed Date: 2018-07-13 16:02:59 diff --git a/examples/md-uv380_bm_2018-08-07.conf b/examples/md-uv380_bm_2018-08-07.conf index 36f28bc..ecc82b4 100644 --- a/examples/md-uv380_bm_2018-08-07.conf +++ b/examples/md-uv380_bm_2018-08-07.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Last Programmed Date: 2018-08-05 17:54:47 diff --git a/examples/md2017-7-23-2017.conf b/examples/md2017-7-23-2017.conf index 4d8f757..8a68699 100644 --- a/examples/md2017-7-23-2017.conf +++ b/examples/md2017-7-23-2017.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Last Programmed Date: 2017-07-23 19:19:23 diff --git a/examples/md2017-DualHotspot-PNW-2017-07-19.conf b/examples/md2017-DualHotspot-PNW-2017-07-19.conf index 7ce98f2..bb7b04c 100644 --- a/examples/md2017-DualHotspot-PNW-2017-07-19.conf +++ b/examples/md2017-DualHotspot-PNW-2017-07-19.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-UV380 Last Programmed Date: 2017-07-19 07:09:13 diff --git a/examples/md380-baynet-full-codeplug-rev1.conf b/examples/md380-baynet-full-codeplug-rev1.conf index b3c5ca7..30f2289 100644 --- a/examples/md380-baynet-full-codeplug-rev1.conf +++ b/examples/md380-baynet-full-codeplug-rev1.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Last Programmed Date: 2018-03-29 10:33:50 @@ -43,7 +43,7 @@ Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot # 12) Guard tone for transmit, or '-' to disable # 13) Bandwidth in kHz: 12.5, 20, 25 # -Analog Name Receive Transmit Power Scan AS TOT RO Admit Squelch RxTone TxTone Width +Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width 3 Black_FM 443.225 +5 High - - - - Normal 100.0 100.0 25 4 Simplex_446 446.000 +0 High - - - - Normal - - 25 5 Crystal_FM 443.550 +5 High - - - - Normal - 100.0 25 diff --git a/examples/md380-generic-norcal-uhf-20161103b.conf b/examples/md380-generic-norcal-uhf-20161103b.conf index b74a0ce..76b75b1 100644 --- a/examples/md380-generic-norcal-uhf-20161103b.conf +++ b/examples/md380-generic-norcal-uhf-20161103b.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Last Programmed Date: 2016-09-11 21:46:59 @@ -960,7 +960,7 @@ Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot # 12) Guard tone for transmit, or '-' to disable # 13) Bandwidth in kHz: 12.5, 20, 25 # -Analog Name Receive Transmit Power Scan AS TOT RO Admit Squelch RxTone TxTone Width +Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width 323 NatlSmplx_446.0 446.000 +0 High 14 90 - - Normal - - 25 324 w6ash_440.800 440.800 +5 High - 90 - - Normal - 100.0 25 325 wb6led_440.950 440.950 +5 High - 90 - - Normal - 162.2 25 diff --git a/examples/md380-norcal-brandmeister.conf b/examples/md380-norcal-brandmeister.conf index 93251ff..38a30a5 100644 --- a/examples/md380-norcal-brandmeister.conf +++ b/examples/md380-norcal-brandmeister.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/20 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: TYT MD-380 Last Programmed Date: 2016-10-20 17:49:09 diff --git a/examples/rd5r-baden-wuertemburg-codeplug-v3.conf b/examples/rd5r-baden-wuertemburg-codeplug-v3.conf index dbc6685..a5e265d 100644 --- a/examples/rd5r-baden-wuertemburg-codeplug-v3.conf +++ b/examples/rd5r-baden-wuertemburg-codeplug-v3.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-13 13:25 diff --git a/examples/rd5r-bayern-codeplug-v3.conf b/examples/rd5r-bayern-codeplug-v3.conf index 7a57487..b4d8511 100644 --- a/examples/rd5r-bayern-codeplug-v3.conf +++ b/examples/rd5r-bayern-codeplug-v3.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-20 16:52 diff --git a/examples/rd5r-empty.conf b/examples/rd5r-empty.conf index 1dbc94a..a1c0d2d 100644 --- a/examples/rd5r-empty.conf +++ b/examples/rd5r-empty.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 0000-00-00 00:00 diff --git a/examples/rd5r-factory.conf b/examples/rd5r-factory.conf index 4fe4472..2442cc2 100644 --- a/examples/rd5r-factory.conf +++ b/examples/rd5r-factory.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-04-23 15:10 diff --git a/examples/rd5r-s-yorks-codeplug-v3.conf b/examples/rd5r-s-yorks-codeplug-v3.conf index 9d1ea8a..1d95489 100644 --- a/examples/rd5r-s-yorks-codeplug-v3.conf +++ b/examples/rd5r-s-yorks-codeplug-v3.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-16 14:41 diff --git a/examples/rd5r-v21x-Charlotte-NC.conf b/examples/rd5r-v21x-Charlotte-NC.conf index 3c256db..e93ec6b 100644 --- a/examples/rd5r-v21x-Charlotte-NC.conf +++ b/examples/rd5r-v21x-Charlotte-NC.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-12 23:16 diff --git a/examples/rd5r-v21x-Ft-Launderdale-FL.conf b/examples/rd5r-v21x-Ft-Launderdale-FL.conf index 2da38ac..d789739 100644 --- a/examples/rd5r-v21x-Ft-Launderdale-FL.conf +++ b/examples/rd5r-v21x-Ft-Launderdale-FL.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-12 23:16 diff --git a/examples/rd5r-v21x-Los-Angeles-CA.conf b/examples/rd5r-v21x-Los-Angeles-CA.conf index 9b8cc09..1960e62 100644 --- a/examples/rd5r-v21x-Los-Angeles-CA.conf +++ b/examples/rd5r-v21x-Los-Angeles-CA.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-07-05 16:02 diff --git a/examples/rd5r-v21x-Tampa-FL.conf b/examples/rd5r-v21x-Tampa-FL.conf index 4a1c7d6..2884d0f 100644 --- a/examples/rd5r-v21x-Tampa-FL.conf +++ b/examples/rd5r-v21x-Tampa-FL.conf @@ -1,6 +1,6 @@ # -# This configuration was generated 2018/09/24 by dmrconfig, -# Version 0.7.107, Copyright (C) 2018 Serge Vakulenko KK6ABQ +# This configuration was generated 2018/10/27 by dmrconfig, +# Version 0.9.155, Copyright (C) 2018 Serge Vakulenko KK6ABQ # Radio: Baofeng RD-5R Last Programmed Date: 2018-05-12 23:16 diff --git a/serial.c b/serial.c index 6141047..3f0075b 100644 --- a/serial.c +++ b/serial.c @@ -35,6 +35,7 @@ #if defined(__WIN32__) || defined(WIN32) #include + #include #include static void *fd = INVALID_HANDLE_VALUE; static DCB saved_mode; @@ -505,7 +506,67 @@ static char *find_path(int vid, int pid) IOObjectRelease(devices); #else - printf("Don't know how to get the list of CD devices on this system.\n"); + // Prepare a pattern for device name matching. + char pattern[128]; + int pattern_len; + sprintf(pattern, "\\\\?\\usb#vid_%04x&pid_%04x", vid, pid); + pattern_len = strlen(pattern); + + // Get access to serial device information. + static GUID guid = { 0xa5dcbf10, 0x6530, 0x11d2, { 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed } }; + HDEVINFO devinfo = SetupDiGetClassDevs(&guid, NULL, NULL, + DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); + if (devinfo == INVALID_HANDLE_VALUE) { + printf("Cannot get devinfo!\n"); + return 0; + } + + // Loop through available devices with a given GUID. + int index; + SP_INTERFACE_DEVICE_DATA iface; + iface.cbSize = sizeof(iface); + for (index=0; SetupDiEnumDeviceInterfaces(devinfo, NULL, &guid, index, &iface); ++index) { + + // Obtain a required size of device detail structure. + DWORD needed; + SetupDiGetDeviceInterfaceDetail(devinfo, &iface, NULL, 0, &needed, NULL); + + // Allocate the device detail structure. + PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)alloca(needed); + detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); + SP_DEVINFO_DATA did = { sizeof(SP_DEVINFO_DATA) }; + + // Get device information. + if (!SetupDiGetDeviceInterfaceDetail(devinfo, &iface, detail, needed, NULL, &did)) { + //printf("Device %d: cannot get path!\n", index); + continue; + } + //printf("Device %d: path %s\n", index, detail->DevicePath); + + // Check vid/pid. + if (strncmp(detail->DevicePath, pattern, pattern_len) != 0) { + //printf("Wrong vid/pid.\n"); + continue; + } + + // Figure out the COM port name. + HKEY key = SetupDiOpenDevRegKey(devinfo, &did, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + static char comname[128]; + DWORD size = sizeof(comname), type = REG_SZ; + if (ERROR_SUCCESS != RegQueryValueEx(key, "PortName", + NULL, &type, (LPBYTE)comname, &size)) { + //printf("Cannot find 'portname' in registry!\n"); + RegCloseKey(key); + continue; + } + RegCloseKey(key); + //printf("COM port: %s\n", comname); + + // Required device found. + result = comname; + break; + } + SetupDiDestroyDeviceInfoList(devinfo); #endif return result; @@ -585,6 +646,10 @@ void serial_close() { #if defined(__WIN32__) || defined(WIN32) if (fd != INVALID_HANDLE_VALUE) { + unsigned char ack[1]; + + send_recv(CMD_END, 3, ack, 1); + SetCommState(fd, &saved_mode); CloseHandle(fd); fd = INVALID_HANDLE_VALUE; diff --git a/util.c b/util.c index 9da742f..fa435de 100644 --- a/util.c +++ b/util.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -597,6 +598,26 @@ int compare_index_ffff(const void *pa, const void *pb) return 0; } +// +// Compare channel index for qsort(). +// Treat 0xffffffff as empty element. +// +int compare_index_ffffffff(const void *pa, const void *pb) +{ + uint32_t a = *(uint32_t*) pa; + uint32_t b = *(uint32_t*) pb; + + if (a == 0xffffffff) + return (b != 0xffffffff); + if (b == 0xffffffff) + return -1; + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} + // // Print CTSS or DCS tone. // diff --git a/util.h b/util.h index 7b2b8c9..358a065 100644 --- a/util.h +++ b/util.h @@ -194,6 +194,7 @@ void print_offset(FILE *out, unsigned rx_bcd, unsigned tx_bcd); // int compare_index(const void *pa, const void *pb); int compare_index_ffff(const void *pa, const void *pb); +int compare_index_ffffffff(const void *pa, const void *pb); // // Print CTSS or DCS tone.