|
|
|
@ -124,19 +124,34 @@ REPLY_TYPE CDVAPDongle::GetReply(SDVAP_REGISTER &dr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
dr.header = dr.param.control = 0;
|
|
|
|
dr.header = dr.param.control = 0;
|
|
|
|
unsigned int off = 2;
|
|
|
|
unsigned int off = 2;
|
|
|
|
int rc = read_from_dvp(&dr.header, 2);
|
|
|
|
int rc = read_from_dvp(&dr.header, 2); // read the header
|
|
|
|
if (rc == 0)
|
|
|
|
if (rc == 0)
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
if (rc != 2)
|
|
|
|
if (rc != 2)
|
|
|
|
return RT_ERR;
|
|
|
|
return RT_ERR;
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t len = dr.header & 0x1fff;
|
|
|
|
switch (dr.header) {
|
|
|
|
if (len > 50) {
|
|
|
|
case 0x5u:
|
|
|
|
if (syncit())
|
|
|
|
case 0x6u:
|
|
|
|
return RT_ERR;
|
|
|
|
case 0x7u:
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
case 0x8u:
|
|
|
|
|
|
|
|
case 0xcu:
|
|
|
|
|
|
|
|
case 0xdu:
|
|
|
|
|
|
|
|
case 0x10u:
|
|
|
|
|
|
|
|
case 0x2005u:
|
|
|
|
|
|
|
|
case 0x2007u:
|
|
|
|
|
|
|
|
case 0x602fu:
|
|
|
|
|
|
|
|
case 0xa02fu:
|
|
|
|
|
|
|
|
case 0xc012u:
|
|
|
|
|
|
|
|
break; // these are all expected headers
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
traceit("unknown header=0x%d\n", (unsigned)dr.header);
|
|
|
|
|
|
|
|
if (syncit())
|
|
|
|
|
|
|
|
return RT_ERR;
|
|
|
|
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// read the rest of the register
|
|
|
|
|
|
|
|
uint16_t len = dr.header & 0x1fff;
|
|
|
|
while (off < len) {
|
|
|
|
while (off < len) {
|
|
|
|
uint8_t *ptr = (uint8_t *)&dr;
|
|
|
|
uint8_t *ptr = (uint8_t *)&dr;
|
|
|
|
rc = read_from_dvp(ptr + off, len - off);
|
|
|
|
rc = read_from_dvp(ptr + off, len - off);
|
|
|
|
@ -145,46 +160,74 @@ REPLY_TYPE CDVAPDongle::GetReply(SDVAP_REGISTER &dr)
|
|
|
|
if (rc > 0)
|
|
|
|
if (rc > 0)
|
|
|
|
off += rc;
|
|
|
|
off += rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// okay, now we'll parse the register and return its type
|
|
|
|
if (0x2007u==dr.header && 0x90u==dr.param.control)
|
|
|
|
switch (dr.header) {
|
|
|
|
return RT_STS;
|
|
|
|
case 0x5u:
|
|
|
|
else if (0xc012u==dr.header)
|
|
|
|
switch (dr.param.control) {
|
|
|
|
return RT_DAT;
|
|
|
|
case 0x18u:
|
|
|
|
else if (0xa02fu==dr.header)
|
|
|
|
if (dr.param.byte)
|
|
|
|
return RT_HDR;
|
|
|
|
return RT_START;
|
|
|
|
else if (0x602fu==dr.header)
|
|
|
|
else
|
|
|
|
return RT_HDR_ACK;
|
|
|
|
return RT_STOP;
|
|
|
|
else if (0x2005u==dr.header && 0x118u==dr.param.control)
|
|
|
|
case 0x28u:
|
|
|
|
return RT_PTT;
|
|
|
|
if (0x1u==dr.param.ustr[0])
|
|
|
|
else if (0x5u==dr.header && 0x18u==dr.param.control && 0x1==dr.param.byte)
|
|
|
|
return RT_MODU;
|
|
|
|
return RT_START;
|
|
|
|
break;
|
|
|
|
else if (0x5u==dr.header && 0x18u==dr.param.control && 0x0==dr.param.byte)
|
|
|
|
case 0x80u:
|
|
|
|
return RT_STOP;
|
|
|
|
return RT_SQL;
|
|
|
|
else if (0x6u==dr.header && 0x400u==dr.param.control)
|
|
|
|
case 0x2au:
|
|
|
|
return RT_OFF;
|
|
|
|
if (0x0u==dr.param.ustr[0])
|
|
|
|
else if (0x10u==dr.header && 0x1u==dr.param.control)
|
|
|
|
return RT_MODE;
|
|
|
|
return RT_NAME;
|
|
|
|
break;
|
|
|
|
else if (0xdu==dr.header && 0x2u==dr.param.control)
|
|
|
|
}
|
|
|
|
return RT_SER;
|
|
|
|
break;
|
|
|
|
else if (0x7u==dr.header && 0x4u==dr.param.control && 0x1u==dr.param.ustr[0])
|
|
|
|
case 0x6u:
|
|
|
|
return RT_FW;
|
|
|
|
switch (dr.param.control) {
|
|
|
|
else if (0x8u==dr.header && 0x220u==dr.param.control)
|
|
|
|
case 0x138u:
|
|
|
|
return RT_FREQ;
|
|
|
|
return RT_PWR;
|
|
|
|
else if (0xcu==dr.header && 0x230u==dr.param.control)
|
|
|
|
case 0x140u:
|
|
|
|
return RT_FREQ_LIMIT;
|
|
|
|
return RT_OFF;
|
|
|
|
else if (0x5u==dr.header && 0x28u==dr.param.control && 0x1u==dr.param.ustr[0])
|
|
|
|
}
|
|
|
|
return RT_MODU;
|
|
|
|
break;
|
|
|
|
else if (0x5u==dr.header && 0x2au==dr.param.control && 0x0u==dr.param.ustr[0])
|
|
|
|
case 0x7u:
|
|
|
|
return RT_MODE;
|
|
|
|
if (0x4u==dr.param.control && 0x1u==dr.param.ustr[0])
|
|
|
|
else if (0x6u==dr.header && 0x138u==dr.param.control)
|
|
|
|
return RT_FW;
|
|
|
|
return RT_PWR;
|
|
|
|
break;
|
|
|
|
else if (0x5u== dr.header && 0x80u==dr.param.control)
|
|
|
|
case 0x8u:
|
|
|
|
return RT_SQL;
|
|
|
|
if (0x220u==dr.param.control)
|
|
|
|
else {
|
|
|
|
return RT_FREQ;
|
|
|
|
if (syncit())
|
|
|
|
break;
|
|
|
|
return RT_ERR;
|
|
|
|
case 0xcu:
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
if (0x230u==dr.param.control)
|
|
|
|
|
|
|
|
return RT_FREQ_LIMIT;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0xdu:
|
|
|
|
|
|
|
|
if (0x2u==dr.param.control)
|
|
|
|
|
|
|
|
return RT_SER;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x10u:
|
|
|
|
|
|
|
|
if (0x1u==dr.param.control)
|
|
|
|
|
|
|
|
return RT_NAME;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x2005u:
|
|
|
|
|
|
|
|
if (0x118u==dr.param.control)
|
|
|
|
|
|
|
|
return RT_PTT;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x2007u:
|
|
|
|
|
|
|
|
if (0x90u==dr.param.control)
|
|
|
|
|
|
|
|
return RT_STS;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x602fu:
|
|
|
|
|
|
|
|
return RT_HDR_ACK;
|
|
|
|
|
|
|
|
case 0xa02fu:
|
|
|
|
|
|
|
|
return RT_HDR;
|
|
|
|
|
|
|
|
case 0xc012u:
|
|
|
|
|
|
|
|
return RT_DAT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
traceit("Unrecognized data from dvap: header=%#x control=%#x\n", (unsigned)dr.header, (unsigned)dr.param.control);
|
|
|
|
|
|
|
|
if (syncit())
|
|
|
|
|
|
|
|
return RT_ERR;
|
|
|
|
|
|
|
|
return RT_TIMEOUT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDVAPDongle::syncit()
|
|
|
|
bool CDVAPDongle::syncit()
|
|
|
|
|