diff --git a/d868uv.c b/d868uv.c index 5596960..77ad752 100644 --- a/d868uv.c +++ b/d868uv.c @@ -92,8 +92,19 @@ typedef struct { // TODO: verify the general settings with official CPS // typedef struct { - // Bytes 0-0x5ff. - uint8_t _unused0[0x600]; + // Bytes 0-5. + uint8_t _unused0[6]; + + // Bytes 6-7. + uint8_t power_on; // Power-on Interface +#define PWON_DEFAULT 0 // Default +#define PWON_CUST_CHAR 1 // Custom Char +#define PWON_CUST_PICT 2 // Custom Picture + + uint8_t _unused7; + + // Bytes 8-0x5ff. + uint8_t _unused8[0x5f8]; // Bytes 0x600-0x61f uint8_t intro_line1[16]; // Up to 14 characters @@ -194,10 +205,11 @@ static void d868uv_download(radio_device_t *radio) static void d868uv_upload(radio_device_t *radio, int cont_flag) { fragment_t *f; - unsigned file_offset = 0; + unsigned file_offset; unsigned last_printed = 0; // Skip first region. + file_offset = region_map[0].length; for (f=region_map+1; f->length; f++) { unsigned addr = f->address; unsigned nbytes = f->length; @@ -345,7 +357,39 @@ static channel_t *get_bank(int i) // static void d868uv_parse_parameter(radio_device_t *radio, char *param, char *value) { - //TODO + if (strcasecmp("Radio", param) == 0) { + if (!radio_is_compatible(value)) { + fprintf(stderr, "Incompatible model: %s\n", value); + exit(-1); + } + return; + } + + radioid_t *ri = GET_RADIOID(); + if (strcasecmp ("Name", param) == 0) { + ascii_decode(ri->name, value, 16, 0); + return; + } + if (strcasecmp ("ID", param) == 0) { + uint32_t id = strtoul(value, 0, 0); + ri->id[0] = ((id / 10000000) << 4) | ((id / 1000000) % 10); + ri->id[1] = ((id / 100000 % 10) << 4) | ((id / 10000) % 10); + ri->id[2] = ((id / 1000 % 10) << 4) | ((id / 100) % 10); + ri->id[3] = ((id / 10 % 10) << 4) | (id % 10); + return; + } + + general_settings_t *gs = GET_SETTINGS(); + if (strcasecmp ("Intro Line 1", param) == 0) { + ascii_decode_uppercase(gs->intro_line1, value, 14, 0); + gs->power_on = PWON_CUST_CHAR; + return; + } + if (strcasecmp ("Intro Line 2", param) == 0) { + ascii_decode_uppercase(gs->intro_line2, value, 14, 0); + gs->power_on = PWON_CUST_CHAR; + return; + } fprintf(stderr, "Unknown parameter: %s = %s\n", param, value); exit(-1); } diff --git a/gd77.c b/gd77.c index b401727..93b130b 100644 --- a/gd77.c +++ b/gd77.c @@ -419,7 +419,7 @@ static void setup_zone(int index, const char *name) zonetab_t *zt = GET_ZONETAB(); zone_t *z = &zt->zone[index]; - ascii_decode(z->name, name, sizeof(z->name)); + ascii_decode(z->name, name, sizeof(z->name), 0xff); memset(z->member, 0, sizeof(z->member)); // Set valid bit. @@ -483,7 +483,7 @@ static void setup_scanlist(int index, const char *name, scanlist_t *sl = &st->scanlist[index]; memset(sl, 0, 88); - ascii_decode(sl->name, name, sizeof(sl->name)); + ascii_decode(sl->name, name, sizeof(sl->name), 0xff); sl->priority_ch1 = prio1; sl->priority_ch2 = prio2; @@ -571,7 +571,7 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt ct->ring_style = 0; // TODO ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff; - ascii_decode(ct->name, name, 16); + ascii_decode(ct->name, name, 16, 0xff); } // @@ -593,7 +593,7 @@ static void setup_grouplist(int index, const char *name) grouptab_t *gt = GET_GROUPTAB(); grouplist_t *gl = >->grouplist[index]; - ascii_decode(gl->name, name, sizeof(gl->name)); + ascii_decode(gl->name, name, sizeof(gl->name), 0xff); // Enable grouplist. gt->nitems1[index] = 1; @@ -712,7 +712,7 @@ static void setup_channel(int i, int mode, char *name, double rx_mhz, double tx_ ch->ctcss_dcs_receive = rxtone; ch->ctcss_dcs_transmit = txtone; - ascii_decode(ch->name, name, sizeof(ch->name)); + ascii_decode(ch->name, name, sizeof(ch->name), 0xff); // Set valid bit. b->bitmap[i % 128 / 8] |= 1 << (i & 7); @@ -1475,7 +1475,7 @@ static void gd77_parse_parameter(radio_device_t *radio, char *param, char *value general_settings_t *gs = GET_SETTINGS(); if (strcasecmp ("Name", param) == 0) { - ascii_decode(gs->radio_name, value, 8); + ascii_decode(gs->radio_name, value, 8, 0xff); return; } if (strcasecmp ("ID", param) == 0) { @@ -1497,11 +1497,11 @@ static void gd77_parse_parameter(radio_device_t *radio, char *param, char *value intro_text_t *it = GET_INTRO(); if (strcasecmp ("Intro Line 1", param) == 0) { - ascii_decode(it->intro_line1, value, 16); + ascii_decode(it->intro_line1, value, 16, 0xff); return; } if (strcasecmp ("Intro Line 2", param) == 0) { - ascii_decode(it->intro_line2, value, 16); + ascii_decode(it->intro_line2, value, 16, 0xff); return; } fprintf(stderr, "Unknown parameter: %s = %s\n", param, value); diff --git a/rd5r.c b/rd5r.c index e1cc553..9c670f0 100644 --- a/rd5r.c +++ b/rd5r.c @@ -419,7 +419,7 @@ static void setup_zone(int index, const char *name) zonetab_t *zt = GET_ZONETAB(); zone_t *z = &zt->zone[index]; - ascii_decode(z->name, name, sizeof(z->name)); + ascii_decode(z->name, name, sizeof(z->name), 0xff); memset(z->member, 0, sizeof(z->member)); // Set valid bit. @@ -483,7 +483,7 @@ static void setup_scanlist(int index, const char *name, scanlist_t *sl = &st->scanlist[index]; memset(sl, 0, 88); - ascii_decode(sl->name, name, sizeof(sl->name)); + ascii_decode(sl->name, name, sizeof(sl->name), 0xff); sl->priority_ch1 = prio1; sl->priority_ch2 = prio2; @@ -571,7 +571,7 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt ct->ring_style = 0; // TODO ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff; - ascii_decode(ct->name, name, 16); + ascii_decode(ct->name, name, 16, 0xff); } // @@ -593,7 +593,7 @@ static void setup_grouplist(int index, const char *name) grouptab_t *gt = GET_GROUPTAB(); grouplist_t *gl = >->grouplist[index]; - ascii_decode(gl->name, name, sizeof(gl->name)); + ascii_decode(gl->name, name, sizeof(gl->name), 0xff); // Enable grouplist. gt->nitems1[index] = 1; @@ -716,7 +716,7 @@ static void setup_channel(int i, int mode, char *name, double rx_mhz, double tx_ ch->ctcss_dcs_receive = rxtone; ch->ctcss_dcs_transmit = txtone; - ascii_decode(ch->name, name, sizeof(ch->name)); + ascii_decode(ch->name, name, sizeof(ch->name), 0xff); // Set valid bit. b->bitmap[i % 128 / 8] |= 1 << (i & 7); @@ -1479,7 +1479,7 @@ static void rd5r_parse_parameter(radio_device_t *radio, char *param, char *value general_settings_t *gs = GET_SETTINGS(); if (strcasecmp ("Name", param) == 0) { - ascii_decode(gs->radio_name, value, 8); + ascii_decode(gs->radio_name, value, 8, 0xff); return; } if (strcasecmp ("ID", param) == 0) { @@ -1501,11 +1501,11 @@ static void rd5r_parse_parameter(radio_device_t *radio, char *param, char *value intro_text_t *it = GET_INTRO(); if (strcasecmp ("Intro Line 1", param) == 0) { - ascii_decode(it->intro_line1, value, 16); + ascii_decode(it->intro_line1, value, 16, 0xff); return; } if (strcasecmp ("Intro Line 2", param) == 0) { - ascii_decode(it->intro_line2, value, 16); + ascii_decode(it->intro_line2, value, 16, 0xff); return; } fprintf(stderr, "Unknown parameter: %s = %s\n", param, value); diff --git a/serial.c b/serial.c index 4b2d7e8..1462378 100644 --- a/serial.c +++ b/serial.c @@ -696,7 +696,8 @@ again: void serial_write_region(int addr, unsigned char *data, int nbytes) { - static const int DATASZ = 64; + //static const int DATASZ = 64; + static const int DATASZ = 16; unsigned char ack, cmd[8 + DATASZ]; int n, i; diff --git a/util.c b/util.c index 27816ea..357e2b7 100644 --- a/util.c +++ b/util.c @@ -334,7 +334,7 @@ void utf8_decode(unsigned short *dst, const char *src, unsigned nsym) // Replace underscore by space. // Fill the rest with 0xff. // -void ascii_decode(unsigned char *dst, const char *src, unsigned nsym) +void ascii_decode(unsigned char *dst, const char *src, unsigned nsym, unsigned fill) { if (src[0] == '-' && src[1] == 0) src = ""; @@ -345,7 +345,7 @@ void ascii_decode(unsigned char *dst, const char *src, unsigned nsym) if (ch == 0) { // Clear the remaining bytes. while (nsym-- > 0) - *dst++ = 0xff; + *dst++ = fill; break; } if (ch == '_') @@ -355,6 +355,34 @@ void ascii_decode(unsigned char *dst, const char *src, unsigned nsym) } } +// +// Copy ASCII string, at most nsym characters. +// Replace underscore by space. +// Fill the rest with 0xff. +// +void ascii_decode_uppercase(unsigned char *dst, const char *src, unsigned nsym, unsigned fill) +{ + if (src[0] == '-' && src[1] == 0) + src = ""; + + for (; nsym > 0; nsym--) { + int ch = *src++; + + if (ch == 0) { + // Clear the remaining bytes. + while (nsym-- > 0) + *dst++ = fill; + break; + } + if (ch == '_') + ch = ' '; + else if (ch >= 'a' && ch <= 'z') + ch += 'A' - 'a'; + + *dst++ = ch; + } +} + // // Convert tone string to BCD format. // Four possible formats: diff --git a/util.h b/util.h index 037bbfa..f3b33d5 100644 --- a/util.h +++ b/util.h @@ -162,7 +162,8 @@ void utf8_decode(unsigned short *dst, const char *src, unsigned nsym); // Copy ASCII string, at most nsym characters. // Replace underscore by space. // -void ascii_decode(unsigned char *dst, const char *src, unsigned nsym); +void ascii_decode(unsigned char *dst, const char *src, unsigned nsym, unsigned fill); +void ascii_decode_uppercase(unsigned char *dst, const char *src, unsigned nsym, unsigned fill); // // Get local time in format: YYYYMMDDhhmmss