D868UV: Print and parse id, name and intro strings.
Write image works correctly.
This commit is contained in:
parent
0ca967d411
commit
39b28f6026
52
d868uv.c
52
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);
|
||||
}
|
||||
|
16
gd77.c
16
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);
|
||||
|
16
rd5r.c
16
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);
|
||||
|
3
serial.c
3
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;
|
||||
|
||||
|
32
util.c
32
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:
|
||||
|
3
util.h
3
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
|
||||
|
Loading…
Reference in New Issue
Block a user