dvrptr compiles

pull/12/head
Tom Early 7 years ago
parent 7a71f6ac7f
commit d67be9ce72

@ -26,6 +26,7 @@
#include "Random.h" #include "Random.h"
#include "UnixDgramSocket.h" #include "UnixDgramSocket.h"
#include "QnetConfigure.h" #include "QnetConfigure.h"
#include "QnetTypeDefs.h"
#define DVRPTR_VERSION "QnetDVRPTR-6.0.3" #define DVRPTR_VERSION "QnetDVRPTR-6.0.3"
@ -50,23 +51,20 @@ short seq_no3 = 0;
int fd_ser = -1; int fd_ser = -1;
bool busy20000 = false; bool busy20000 = false;
static unsigned char S_packet[26];
static time_t S_ctrl_msg_time = 0;
static int rqst_count = 6; static int rqst_count = 6;
static unsigned streamid[2] = {0x00, 0x00}; static unsigned short streamid = 0x0;
static unsigned char start_Header[8]= {0xD0,0x03,0x00,0x16,0x01,0x00,0x00,0x00}; static unsigned char start_Header[8]= {0xD0,0x03,0x00,0x16,0x01,0x00,0x00,0x00};
static unsigned char ptt_off[8]= {0xD0,0x03,0x00,0x1A,0x01,0xff,0x00,0x00}; static unsigned char ptt_off[8]= {0xD0,0x03,0x00,0x1A,0x01,0xff,0x00,0x00};
static bool read_config(const char *cfgFile); static bool ReadConfig(const char *cfgFile);
static void readFrom20000(); static void readFrom20000();
static bool check_serial(); static bool check_serial();
static unsigned char Send_Network_Header[58]; SDSVT Send_Network_Header;
static unsigned char Send_Network_Audio [29]; SDSVT Send_Network_Audio;
static int inactiveMax = 3200; static int inactiveMax = 3200;
static unsigned short C_COUNTER = 0;
static unsigned char Send_Modem_Header[52]; static unsigned char Send_Modem_Header[52];
static unsigned char writevoice[24]; static unsigned char writevoice[24];
@ -112,64 +110,18 @@ static char myUR[10];
static char myCall[10]; static char myCall[10];
static char myCall2[10]; static char myCall2[10];
char Ergebnis[250]; char cbuf[250];
struct hdr {
unsigned char flags[3];
unsigned char rpt2[8];
unsigned char rpt1[8];
unsigned char urcall[8];
unsigned char mycall[8];
unsigned char sfx[4];
unsigned char pfcs[2];
};
struct icm {
unsigned char icm_id;
unsigned char dst_rptr_id;
unsigned char snd_rptr_id;
unsigned char snd_term_id;
unsigned char streamid[2];
unsigned char ctrl;
};
struct voice_and_text {
unsigned char voice[8];
unsigned char text[2];
};
struct nettext {
unsigned char net_text[20];
};
struct audio {
unsigned char buff[sizeof(struct hdr)];
};
struct pkt {
unsigned char pkt_id[4];
unsigned char nothing1[2];
unsigned char flags[2];
unsigned char nothing2[2];
struct icm myicm;
union {
struct audio rf_audio;
struct hdr rf_hdr;
struct nettext net_text;
struct voice_and_text vat;
};
};
static struct pkt recv_buf;
typedef unsigned int U32;
static SDSVT recv_buf;
//! 32-bit union. //! 32-bit union.
typedef union { typedef union {
U32 u32 ; uint32_t u32;
unsigned short u16[2]; uint16_t u16[2];
unsigned char u8[4]; uint8_t u8[4];
} Union32; } Union32;
static const U32 ENCODING_TABLE_23127[] = { static const uint32_t ENCODING_TABLE_23127[] = {
0x000000U, 0x0018EAU, 0x00293EU, 0x0031D4U, 0x004A96U, 0x00527CU, 0x0063A8U, 0x007B42U, 0x008DC6U, 0x00952CU, 0x000000U, 0x0018EAU, 0x00293EU, 0x0031D4U, 0x004A96U, 0x00527CU, 0x0063A8U, 0x007B42U, 0x008DC6U, 0x00952CU,
0x00A4F8U, 0x00BC12U, 0x00C750U, 0x00DFBAU, 0x00EE6EU, 0x00F684U, 0x010366U, 0x011B8CU, 0x012A58U, 0x0132B2U, 0x00A4F8U, 0x00BC12U, 0x00C750U, 0x00DFBAU, 0x00EE6EU, 0x00F684U, 0x010366U, 0x011B8CU, 0x012A58U, 0x0132B2U,
0x0149F0U, 0x01511AU, 0x0160CEU, 0x017824U, 0x018EA0U, 0x01964AU, 0x01A79EU, 0x01BF74U, 0x01C436U, 0x01DCDCU, 0x0149F0U, 0x01511AU, 0x0160CEU, 0x017824U, 0x018EA0U, 0x01964AU, 0x01A79EU, 0x01BF74U, 0x01C436U, 0x01DCDCU,
@ -582,7 +534,7 @@ static const U32 ENCODING_TABLE_23127[] = {
0xFFAD82U, 0xFFB568U, 0xFFCE2AU, 0xFFD6C0U, 0xFFE714U, 0xFFFFFEU 0xFFAD82U, 0xFFB568U, 0xFFCE2AU, 0xFFD6C0U, 0xFFE714U, 0xFFFFFEU
}; };
static const U32 ENCODING_TABLE_24128[] = { static const uint32_t ENCODING_TABLE_24128[] = {
0x000000U, 0x0018EBU, 0x00293EU, 0x0031D5U, 0x004A97U, 0x00527CU, 0x0063A9U, 0x007B42U, 0x008DC6U, 0x00952DU, 0x000000U, 0x0018EBU, 0x00293EU, 0x0031D5U, 0x004A97U, 0x00527CU, 0x0063A9U, 0x007B42U, 0x008DC6U, 0x00952DU,
0x00A4F8U, 0x00BC13U, 0x00C751U, 0x00DFBAU, 0x00EE6FU, 0x00F684U, 0x010367U, 0x011B8CU, 0x012A59U, 0x0132B2U, 0x00A4F8U, 0x00BC13U, 0x00C751U, 0x00DFBAU, 0x00EE6FU, 0x00F684U, 0x010367U, 0x011B8CU, 0x012A59U, 0x0132B2U,
0x0149F0U, 0x01511BU, 0x0160CEU, 0x017825U, 0x018EA1U, 0x01964AU, 0x01A79FU, 0x01BF74U, 0x01C436U, 0x01DCDDU, 0x0149F0U, 0x01511BU, 0x0160CEU, 0x017825U, 0x018EA1U, 0x01964AU, 0x01A79FU, 0x01BF74U, 0x01C436U, 0x01DCDDU,
@ -996,7 +948,7 @@ static const U32 ENCODING_TABLE_24128[] = {
}; };
static const U32 DECODING_TABLE_23127[] = { static const uint32_t DECODING_TABLE_23127[] = {
0x000000U, 0x000001U, 0x000002U, 0x000003U, 0x000004U, 0x000005U, 0x000006U, 0x000007U, 0x000008U, 0x000009U, 0x000000U, 0x000001U, 0x000002U, 0x000003U, 0x000004U, 0x000005U, 0x000006U, 0x000007U, 0x000008U, 0x000009U,
0x00000AU, 0x00000BU, 0x00000CU, 0x00000DU, 0x00000EU, 0x024020U, 0x000010U, 0x000011U, 0x000012U, 0x000013U, 0x00000AU, 0x00000BU, 0x00000CU, 0x00000DU, 0x00000EU, 0x024020U, 0x000010U, 0x000011U, 0x000012U, 0x000013U,
0x000014U, 0x000015U, 0x000016U, 0x412000U, 0x000018U, 0x000019U, 0x00001AU, 0x180800U, 0x00001CU, 0x200300U, 0x000014U, 0x000015U, 0x000016U, 0x412000U, 0x000018U, 0x000019U, 0x00001AU, 0x180800U, 0x00001CU, 0x200300U,
@ -1219,9 +1171,9 @@ static const U32 DECODING_TABLE_23127[] = {
* obtain its syndrome in decoding. * obtain its syndrome in decoding.
*/ */
static U32 get_syndrome_23127(U32 pattern) static uint32_t get_syndrome_23127(uint32_t pattern)
{ {
U32 aux = GORLAY_X22; uint32_t aux = GORLAY_X22;
if (pattern >= GORLAY_X11) { if (pattern >= GORLAY_X11) {
while (pattern & GORLAY_MASK12) { while (pattern & GORLAY_MASK12) {
while ((aux & pattern)==0) aux >>= 1; while ((aux & pattern)==0) aux >>= 1;
@ -1239,8 +1191,8 @@ __inline unsigned int gorlay_encode23127(unsigned int data)
unsigned int gorlay_decode23127(unsigned int code) unsigned int gorlay_decode23127(unsigned int code)
{ {
U32 syndrome = get_syndrome_23127(code); uint32_t syndrome = get_syndrome_23127(code);
U32 error_pattern = DECODING_TABLE_23127[syndrome]; uint32_t error_pattern = DECODING_TABLE_23127[syndrome];
code ^= error_pattern; code ^= error_pattern;
return code >> 11; return code >> 11;
} }
@ -1255,7 +1207,7 @@ __inline unsigned int gorlay_decode24128(unsigned int code)
return gorlay_decode23127(code >> 1); return gorlay_decode23127(code >> 1);
} }
static const U32 PRNG_TABLE[] = { static const uint32_t PRNG_TABLE[] = {
0x42CC47U, 0x19D6FEU, 0x304729U, 0x6B2CD0U, 0x60BF47U, 0x39650EU, 0x7354F1U, 0xEACF60U, 0x819C9FU, 0xDE25CEU, 0x42CC47U, 0x19D6FEU, 0x304729U, 0x6B2CD0U, 0x60BF47U, 0x39650EU, 0x7354F1U, 0xEACF60U, 0x819C9FU, 0xDE25CEU,
0xD7B745U, 0x8CC8B8U, 0x8D592BU, 0xF71257U, 0xBCA084U, 0xA5B329U, 0xEE6AFAU, 0xF7D9A7U, 0xBCC21CU, 0x4712D9U, 0xD7B745U, 0x8CC8B8U, 0x8D592BU, 0xF71257U, 0xBCA084U, 0xA5B329U, 0xEE6AFAU, 0xF7D9A7U, 0xBCC21CU, 0x4712D9U,
0x4F2922U, 0x14FA37U, 0x5D43ECU, 0x564115U, 0x299A92U, 0x20A9EBU, 0x7B707DU, 0x3BE3A4U, 0x20D95BU, 0x6B085AU, 0x4F2922U, 0x14FA37U, 0x5D43ECU, 0x564115U, 0x299A92U, 0x20A9EBU, 0x7B707DU, 0x3BE3A4U, 0x20D95BU, 0x6B085AU,
@ -1676,7 +1628,7 @@ typedef unsigned char tambevoice[6];
static void ambefec_deinterleave(tambevoicefec result, const tambevoicefec voice) static void ambefec_deinterleave(tambevoicefec result, const tambevoicefec voice)
{ {
U32 bitpos, bytcnt; uint32_t bitpos, bytcnt;
memset(result, 0, sizeof(tambevoicefec)); // init result memset(result, 0, sizeof(tambevoicefec)); // init result
bitpos = 0; bitpos = 0;
for (bytcnt = 0; bytcnt < sizeof(tambevoicefec); bytcnt++) { for (bytcnt = 0; bytcnt < sizeof(tambevoicefec); bytcnt++) {
@ -1702,7 +1654,7 @@ static void ambefec_deinterleave(tambevoicefec result, const tambevoicefec voice
static void ambefec_interleave(tambevoicefec result, const tambevoicefec raw_voice) static void ambefec_interleave(tambevoicefec result, const tambevoicefec raw_voice)
{ {
U32 bitpos, bytcnt; uint32_t bitpos, bytcnt;
bitpos = 0; bitpos = 0;
for (bytcnt = 0; bytcnt < sizeof(tambevoicefec); bytcnt++) { for (bytcnt = 0; bytcnt < sizeof(tambevoicefec); bytcnt++) {
char voice_dsr = (raw_voice[bitpos>>3] & (0x80 >> (bitpos&7)))?0x80:0x00; char voice_dsr = (raw_voice[bitpos>>3] & (0x80 >> (bitpos&7)))?0x80:0x00;
@ -1728,7 +1680,7 @@ static void ambefec_interleave(tambevoicefec result, const tambevoicefec raw_voi
void ambefec_regenerate(tambevoicefec voice) void ambefec_regenerate(tambevoicefec voice)
{ {
tambevoicefec decoded; tambevoicefec decoded;
U32 data, datb, encoded_dat; uint32_t data, datb, encoded_dat;
ambefec_deinterleave(decoded, voice); ambefec_deinterleave(decoded, voice);
data = gorlay_decode24128((decoded[0]<<16) | (decoded[1]<<8) | decoded[2]); data = gorlay_decode24128((decoded[0]<<16) | (decoded[1]<<8) | decoded[2]);
encoded_dat = gorlay_encode24128(data); encoded_dat = gorlay_encode24128(data);
@ -1809,7 +1761,7 @@ static void calcPFCS(unsigned char packet[58])//Netzwerk CRC
} }
/* process configuration file */ /* process configuration file */
static bool read_config(const char *cfgFile) static bool ReadConfig(const char *cfgFile)
{ {
CQnetConfigure cfg; CQnetConfigure cfg;
@ -1914,26 +1866,24 @@ static bool read_config(const char *cfgFile)
char *cleanstr (char *Text) char *cleanstr (char *Text)
{ {
unsigned int x = 0; static char cbuf[250];
strcpy (Ergebnis,""); memset(cbuf, 0U, 250U);
for (x = 0; x < strlen (Text); x++) { for (unsigned int x=0; x < strlen(Text); x++) {
if ((Text[x] > 0x1F) && (Text[x] < 0x7F)) { if ((Text[x] > 0x1F) && (Text[x] < 0x7F)) {
if (Text[x] == 0x27) { if (Text[x] == '\'') {
strncat (Ergebnis,"\\",1); strncat(cbuf, "\\", 1);
} }
strncat (Ergebnis,&Text[x],1); strncat(cbuf, &Text[x], 1);
} }
} }
for (x = 0; x < strlen(Ergebnis); x++) { for (unsigned int x=0; x < strlen(cbuf); x++) {
if (!isdigit(Ergebnis[x]) && if (!isdigit(cbuf[x]) && !isupper(cbuf[x]) && (cbuf[x] != '/'))
!isupper(Ergebnis[x]) && cbuf[x] = ' ';
(Ergebnis[x] != '/'))
Ergebnis[x] = ' ';
} }
return (Ergebnis); return (cbuf);
} }
int open_port(char *dvrptr_device) int open_port(char *dvrptr_device)
@ -2169,46 +2119,43 @@ static void readFrom20000()
FD_SET (fd, &readfd); FD_SET (fd, &readfd);
select(fd + 1, &readfd, NULL, NULL, &tv); select(fd + 1, &readfd, NULL, NULL, &tv);
if (FD_ISSET(fd, &readfd)) { if (FD_ISSET(fd, &readfd)) {
len = Gate2Modem.Read(recv_buf.pkt_id, 58); len = Gate2Modem.Read(recv_buf.title, 56);
if (len == 58) { if (len == 56) {
if (busy20000) { if (busy20000) {
FD_CLR (fd, &readfd); FD_CLR (fd, &readfd);
continue; continue;
} }
/* check the module and gateway */ /* check the module and gateway */
if (recv_buf.rf_hdr.rpt2[7] != DVRPTR_MOD) { if (recv_buf.hdr.rpt2[7] != DVRPTR_MOD) {
FD_CLR (fd, &readfd); FD_CLR (fd, &readfd);
break; break;
} }
memcpy(recv_buf.rf_hdr.rpt1, DVCALL_and_G, 8); memcpy(recv_buf.hdr.rpt1, DVCALL_and_G, 8);
if (memcmp(RPTR, DVCALL, CALL_SIZE) != 0) { if (memcmp(RPTR, DVCALL, CALL_SIZE) != 0) {
memcpy(recv_buf.rf_hdr.rpt1, RPTR, 7); memcpy(recv_buf.hdr.rpt1, RPTR, 7);
memcpy(recv_buf.rf_hdr.rpt2, RPTR, 7); memcpy(recv_buf.hdr.rpt2, RPTR, 7);
/* /*
Do not change the user callsign if it is NOT an ack back from g2, Do not change the user callsign if it is NOT an ack back from g2,
because we want to know who is talking on remote net because we want to know who is talking on remote net
*/ */
if (memcmp(recv_buf.rf_hdr.mycall, DVCALL, 7) == 0) if (memcmp(recv_buf.hdr.mycall, DVCALL, 7) == 0)
memcpy(recv_buf.rf_hdr.mycall, RPTR, 7); memcpy(recv_buf.hdr.mycall, RPTR, 7);
} }
if ((recv_buf.rf_hdr.flags[0] != 0x00) && if ((recv_buf.hdr.flag[0] != 0x00) &&
(recv_buf.rf_hdr.flags[0] != 0x01) && (recv_buf.hdr.flag[0] != 0x01) &&
(recv_buf.rf_hdr.flags[0] != 0x08) && (recv_buf.hdr.flag[0] != 0x08) &&
(recv_buf.rf_hdr.flags[0] != 0x20) && (recv_buf.hdr.flag[0] != 0x20) &&
(recv_buf.rf_hdr.flags[0] != 0x28) && (recv_buf.hdr.flag[0] != 0x28) &&
(recv_buf.rf_hdr.flags[0] != 0x40)) { (recv_buf.hdr.flag[0] != 0x40)) {
FD_CLR (fd, &readfd); FD_CLR (fd, &readfd);
break; break;
} }
if ((memcmp(recv_buf.pkt_id, "DSTR", 4) != 0) || if ((memcmp(recv_buf.title, "DSVT", 4) != 0) || (recv_buf.id != 0x20)) {
(recv_buf.flags[0] != 0x73) ||
(recv_buf.flags[1] != 0x12) ||
(recv_buf.myicm.icm_id != 0x20)) {
FD_CLR (fd, &readfd); FD_CLR (fd, &readfd);
break; break;
} }
@ -2218,8 +2165,7 @@ static void readFrom20000()
ctrl_in = 0x80; ctrl_in = 0x80;
written_to_q = true; written_to_q = true;
streamid[0] = recv_buf.myicm.streamid[0]; streamid = recv_buf.streamid;
streamid[1] = recv_buf.myicm.streamid[1];
Send_Modem_Header[0] =0xd0; Send_Modem_Header[0] =0xd0;
Send_Modem_Header[1] =0x2f; Send_Modem_Header[1] =0x2f;
@ -2230,27 +2176,25 @@ static void readFrom20000()
Send_Modem_Header[6] =0x00; Send_Modem_Header[6] =0x00;
Send_Modem_Header[7] =0x00; Send_Modem_Header[7] =0x00;
if (recv_buf.rf_hdr.flags[0] != 0x01) { if (recv_buf.hdr.flag[0] != 0x1U) {
if (recv_buf.rf_hdr.flags[0] == 0x00) if (recv_buf.hdr.flag[0] == 0x0U)
recv_buf.rf_hdr.flags[0] = 0x40; recv_buf.hdr.flag[0] = 0x40U;
else if (recv_buf.rf_hdr.flags[0] == 0x08) else if (recv_buf.hdr.flag[0] == 0x8U)
recv_buf.rf_hdr.flags[0] = 0x48; recv_buf.hdr.flag[0] = 0x48U;
else if (recv_buf.rf_hdr.flags[0] == 0x20) else if (recv_buf.hdr.flag[0] == 0x20U)
recv_buf.rf_hdr.flags[0] = 0x60; recv_buf.hdr.flag[0] = 0x60U;
else if (recv_buf.rf_hdr.flags[0] == 0x28) else if (recv_buf.hdr.flag[0] == 0x28U)
recv_buf.rf_hdr.flags[0] = 0x68; recv_buf.hdr.flag[0] = 0x68U;
else else
recv_buf.rf_hdr.flags[0] = 0x40; recv_buf.hdr.flag[0] = 0x40U;
} }
recv_buf.rf_hdr.flags[1] = 0x00; recv_buf.hdr.flag[1] = recv_buf.hdr.flag[2] = 0x0;
recv_buf.rf_hdr.flags[2] = 0x00; memcpy(Send_Modem_Header + 8, recv_buf.hdr.flag, 3);
memcpy(Send_Modem_Header + 11, recv_buf.hdr.rpt1, 8);
memcpy(Send_Modem_Header + 8, recv_buf.rf_hdr.flags, 3); memcpy(Send_Modem_Header + 19, recv_buf.hdr.rpt2, 8);
memcpy(Send_Modem_Header + 11, recv_buf.rf_hdr.rpt1, 8); memcpy(Send_Modem_Header + 27, recv_buf.hdr.urcall, 8);
memcpy(Send_Modem_Header + 19, recv_buf.rf_hdr.rpt2, 8); memcpy(Send_Modem_Header + 35, recv_buf.hdr.mycall, 8);
memcpy(Send_Modem_Header + 27, recv_buf.rf_hdr.urcall, 8); memcpy(Send_Modem_Header + 43, recv_buf.hdr.sfx, 4);
memcpy(Send_Modem_Header + 35, recv_buf.rf_hdr.mycall, 8);
memcpy(Send_Modem_Header + 43, recv_buf.rf_hdr.sfx, 4);
Send_Modem_Header[47] =0xE1; Send_Modem_Header[47] =0xE1;
Send_Modem_Header[48] =0x00; Send_Modem_Header[48] =0x00;
Send_Modem_Header[49] =0x00; Send_Modem_Header[49] =0x00;
@ -2259,11 +2203,7 @@ static void readFrom20000()
// printf("\nNetwork Header ID: %2.2x\n",seq_no2); // printf("\nNetwork Header ID: %2.2x\n",seq_no2);
block = 0; block = 0;
printf("From G2: streamid=%d,%d, flags=%02x:%02x:%02x, myCall=%.8s/%.4s, yrCall=%.8s, rpt1=%.8s, rpt2=%.8s\n", printf("From G2: streamid=%04x, flags=%02x:%02x:%02x, myCall=%.8s/%.4s, yrCall=%.8s, rpt1=%.8s, rpt2=%.8s\n", ntohs(recv_buf.streamid), recv_buf.hdr.flag[0], recv_buf.hdr.flag[1], recv_buf.hdr.flag[2], recv_buf.hdr.mycall, recv_buf.hdr.sfx, recv_buf.hdr.urcall, recv_buf.hdr.rpt2, recv_buf.hdr.rpt1);
recv_buf.myicm.streamid[0], recv_buf.myicm.streamid[1],
recv_buf.rf_hdr.flags[0], recv_buf.rf_hdr.flags[1], recv_buf.rf_hdr.flags[2],
recv_buf.rf_hdr.mycall, recv_buf.rf_hdr.sfx, recv_buf.rf_hdr.urcall,
recv_buf.rf_hdr.rpt2, recv_buf.rf_hdr.rpt1);
ptt_off[4] = seq_no2; ptt_off[4] = seq_no2;
start_Header[4]=seq_no2; start_Header[4]=seq_no2;
@ -2275,8 +2215,8 @@ static void readFrom20000()
write(fd_ser, Send_Modem_Header, sizeof (Send_Modem_Header)); write(fd_ser, Send_Modem_Header, sizeof (Send_Modem_Header));
inactive = 0; inactive = 0;
seq_no = 0; seq_no = 0;
} else if (len == 29) { } else if (len == 27) {
seq_no = recv_buf.myicm.ctrl & 0x1f; seq_no = recv_buf.ctrl & 0x1f;
if ((seq_no < 3) && (old_seq_no > 17)) { if ((seq_no < 3) && (old_seq_no > 17)) {
block ++; block ++;
if (block >= 12) if (block >= 12)
@ -2286,12 +2226,12 @@ static void readFrom20000()
seq_no = block * 21 + seq_no; seq_no = block * 21 + seq_no;
if (busy20000) { if (busy20000) {
if ((recv_buf.myicm.streamid[0] == streamid[0]) && (recv_buf.myicm.streamid[1] == streamid[1])) { if (recv_buf.streamid == streamid) {
if ((recv_buf.myicm.ctrl <= ctrl_in) && (ctrl_in != 0x80)) { if ((recv_buf.ctrl <= ctrl_in) && (ctrl_in != 0x80)) {
/* do not update written_to_q, ctrl_in */ /* do not update written_to_q, ctrl_in */
; // printf("dup\n"); ; // printf("dup\n");
} else { } else {
ctrl_in = recv_buf.myicm.ctrl; ctrl_in = recv_buf.ctrl;
if (ctrl_in == 0x14) if (ctrl_in == 0x14)
ctrl_in = 0x80; ctrl_in = 0x80;
@ -2305,8 +2245,8 @@ static void readFrom20000()
writevoice[5] =seq_no; writevoice[5] =seq_no;
writevoice[6] =0x00; writevoice[6] =0x00;
writevoice[7] =0x00; writevoice[7] =0x00;
ambefec_regenerate((recv_buf.rf_audio.buff)); ambefec_regenerate(recv_buf.vasd.voice);
memcpy(writevoice + 8, recv_buf.rf_audio.buff, 12); memcpy(writevoice + 8, recv_buf.vasd.voice, 12);
writevoice[20] =0x00; writevoice[20] =0x00;
writevoice[21] =0x00; writevoice[21] =0x00;
writevoice[22] =0x00; writevoice[22] =0x00;
@ -2316,15 +2256,14 @@ static void readFrom20000()
write(fd_ser, writevoice, sizeof (writevoice)); write(fd_ser, writevoice, sizeof (writevoice));
inactive = 1; inactive = 1;
if ((recv_buf.myicm.ctrl & 0x40) != 0) { if ((recv_buf.ctrl & 0x40) != 0) {
printf("End G2: streamid=%d,%d\n",recv_buf.myicm.streamid[0], recv_buf.myicm.streamid[1]); printf("End G2: streamid=%04x\n",ntohs(recv_buf.streamid));
ptt_off[4] = Send_Modem_Header[4]; ptt_off[4] = Send_Modem_Header[4];
write(fd_ser, ptt_off, 8); write(fd_ser, ptt_off, 8);
busy20000 = false; busy20000 = false;
streamid[0] = 0x00; streamid = 0x0U;
streamid[1] = 0x00;
inactive = 0; inactive = 0;
FD_CLR (fd, &readfd); FD_CLR (fd, &readfd);
@ -2357,8 +2296,7 @@ static void readFrom20000()
write(fd_ser, ptt_off, 8); write(fd_ser, ptt_off, 8);
busy20000 = false; busy20000 = false;
streamid[0] = 0x00; streamid = 0x0U;
streamid[1] = 0x00;
inactive = 0; inactive = 0;
break; break;
@ -2533,7 +2471,7 @@ int main(int argc, const char **argv)
return 1; return 1;
} }
if (read_config(argv[1])) { if (ReadConfig(argv[1])) {
fprintf(stderr, "Failed to process config file %s\n", argv[2]); fprintf(stderr, "Failed to process config file %s\n", argv[2]);
return 1; return 1;
} }
@ -2553,11 +2491,11 @@ int main(int argc, const char **argv)
} }
if (DVRPTR_MOD == 'A') if (DVRPTR_MOD == 'A')
SND_TERM_ID = 0x03; SND_TERM_ID = 0x3;
else if (DVRPTR_MOD == 'B') else if (DVRPTR_MOD == 'B')
SND_TERM_ID = 0x01; SND_TERM_ID = 0x1;
else if (DVRPTR_MOD == 'C') else if (DVRPTR_MOD == 'C')
SND_TERM_ID = 0x02; SND_TERM_ID = 0x2;
strcpy(DVCALL_and_G, DVCALL); strcpy(DVCALL_and_G, DVCALL);
DVCALL_and_G[7] = 'G'; DVCALL_and_G[7] = 'G';
@ -2580,14 +2518,6 @@ int main(int argc, const char **argv)
Modem_Init2[6]=0x02; Modem_Init2[6]=0x02;
} }
memcpy(S_packet, "DSTR", 4);
S_packet[4] = 0x00;
S_packet[5] = 0x00;
S_packet[6] = 0x73;
S_packet[7] = 0x21;
S_packet[8] = 0x00;
S_packet[9] = 0x10;
dstar_dv_init(); dstar_dv_init();
time(&tNow); time(&tNow);
@ -2611,19 +2541,6 @@ int main(int argc, const char **argv)
} }
} }
/* send the S packet if needed */
if ((tNow - S_ctrl_msg_time) > 60) {
S_packet[5] = (unsigned char)(C_COUNTER & 0xff);
S_packet[4] = ((C_COUNTER >> 8) & 0xff);
memcpy(S_packet + 10, DVCALL, 8);
S_packet[17] = 'S';
memcpy(S_packet + 18, DVCALL, 8);
S_packet[25] = 'S';
Modem2Gate.Write(S_packet, sizeof(S_packet));
C_COUNTER ++;
S_ctrl_msg_time = tNow;
}
// init Modem // init Modem
if (InitCount == 4 ) { if (InitCount == 4 ) {
write(fd_ser, Modem_STATUS, sizeof (Modem_STATUS)); write(fd_ser, Modem_STATUS, sizeof (Modem_STATUS));
@ -2808,19 +2725,6 @@ int main(int argc, const char **argv)
} }
} }
S_packet[5] = (unsigned char)(C_COUNTER & 0xff);
S_packet[4] = ((C_COUNTER >> 8) & 0xff);
memcpy(S_packet + 10, myCall, 8);
memcpy(S_packet + 18, DVCALL, 8);
S_packet[25] = DVRPTR_MOD;
if (ok) {
if (IS_ENABLED) {
Modem2Gate.Write(S_packet, sizeof(S_packet));
C_COUNTER ++;
}
}
/* /*
Before we send the data to the local gateway, Before we send the data to the local gateway,
set RPT1, RPT2 to be the local gateway set RPT1, RPT2 to be the local gateway
@ -2829,48 +2733,41 @@ int main(int argc, const char **argv)
if (myRPT2[7] != ' ') if (myRPT2[7] != ' ')
memcpy(myRPT2, DVCALL, 7); memcpy(myRPT2, DVCALL, 7);
memcpy(Send_Network_Header , "DSTR", 4); memcpy(Send_Network_Header.title , "DSVT", 4);
Send_Network_Header[4] = ((C_COUNTER >> 8) & 0xff); Send_Network_Header.config = 0x10U;
Send_Network_Header[5] = (unsigned char)(C_COUNTER & 0xff); memset(Send_Network_Header.flaga, 0U, 3U);
Send_Network_Header[6] = 0x73; Send_Network_Header.id = 0x20U;
Send_Network_Header[7] = 0x12; Send_Network_Header.flagb[0] = 0x0U;
Send_Network_Header[8] = 0x00; Send_Network_Header.flagb[1] = 0x1U;
Send_Network_Header[9] = 0x30; Send_Network_Header.flagb[2] = SND_TERM_ID;
Send_Network_Header[10] = 0x20;
Send_Network_Header[11] = 0x00;
Send_Network_Header[12] = 0x01;
Send_Network_Header[13] = SND_TERM_ID;
streamid_raw = Random.NewStreamID(); streamid_raw = Random.NewStreamID();
Send_Network_Header[14] = streamid_raw / 256U; Send_Network_Header.streamid = streamid_raw;
Send_Network_Header[15] = streamid_raw % 256U; Send_Network_Header.ctrl = 0x80U;
Send_Network_Header[16] = 0x80;
seq_no = 0; seq_no = 0;
if (puffer[8] == 0x40) if (puffer[8] == 0x40U)
Send_Network_Header[17] = 0x00; Send_Network_Header.hdr.flag[0] = 0x0U;
else if (puffer[8] == 0x48) else if (puffer[8] == 0x48U)
Send_Network_Header[17] = 0x08; Send_Network_Header.hdr.flag[0] = 0x8U;
else if (puffer[8] == 0x60) else if (puffer[8] == 0x60U)
Send_Network_Header[17] = 0x20; Send_Network_Header.hdr.flag[0] = 0x20U;
else if (puffer[8] == 0x68) else if (puffer[8] == 0x68U)
Send_Network_Header[17] = 0x28; Send_Network_Header.hdr.flag[0] = 0x28U;
else else
Send_Network_Header[17] = 0x00; Send_Network_Header.hdr.flag[0] = 0x00;
Send_Network_Header[18] = puffer[9]; Send_Network_Header.hdr.flag[1] = puffer[9];
Send_Network_Header[19] = puffer[10]; Send_Network_Header.hdr.flag[2] = puffer[10];
memcpy(Send_Network_Header + 20, myRPT2, 8); memcpy(Send_Network_Header.hdr.rpt1, myRPT2, 8);
memcpy(Send_Network_Header + 28, myRPT1, 8); memcpy(Send_Network_Header.hdr.rpt2, myRPT1, 8);
memcpy(Send_Network_Header + 36, myUR, 8); memcpy(Send_Network_Header.hdr.urcall, myUR, 8);
memcpy(Send_Network_Header + 44, myCall, 8); memcpy(Send_Network_Header.hdr.mycall, myCall, 8);
memcpy(Send_Network_Header + 52, myCall2, 4); memcpy(Send_Network_Header.hdr.sfx, myCall2, 4);
calcPFCS(Send_Network_Header); calcPFCS(Send_Network_Header.title);
if (ok) { if (ok) {
if (IS_ENABLED) { if (IS_ENABLED)
Modem2Gate.Write(Send_Network_Header, 58); Modem2Gate.Write(Send_Network_Header.title, 56);
C_COUNTER++;
}
} }
seq_no3 = 0; seq_no3 = 0;
@ -2917,28 +2814,22 @@ int main(int argc, const char **argv)
if (last_RF_time > 0) if (last_RF_time > 0)
time(&last_RF_time); time(&last_RF_time);
memcpy(Send_Network_Audio , "DSTR", 4); memcpy(Send_Network_Audio.title , "DSVT", 4);
Send_Network_Audio[4] = ((C_COUNTER >> 8) & 0xff); Send_Network_Audio.config = 0x20U;
Send_Network_Audio[5] = (unsigned char)(C_COUNTER & 0xff); memset(Send_Network_Audio.flaga, 0U, 3U);
Send_Network_Audio[6] = 0X73; Send_Network_Audio.id = 0x20U;
Send_Network_Audio[7] = 0X12; Send_Network_Audio.flagb[0] = 0X00;
Send_Network_Audio[8] = 0X00; Send_Network_Audio.flagb[1] = 0X01;
Send_Network_Audio[9] = 0X13; Send_Network_Audio.flagb[2] = SND_TERM_ID;
Send_Network_Audio[10] = 0X20; Send_Network_Audio.streamid = streamid_raw;
Send_Network_Audio[11] = 0X00; Send_Network_Audio.ctrl = seq_no;
Send_Network_Audio[12] = 0X01; memcpy(Send_Network_Audio.vasd.voice , puffer + 8, 12);
Send_Network_Audio[13] = SND_TERM_ID;
Send_Network_Audio[14] = streamid_raw / 256U;
Send_Network_Audio[15] = streamid_raw % 256U;
Send_Network_Audio[16] = seq_no;
memcpy(Send_Network_Audio + 17 , puffer + 8, 12);
if (IS_ENABLED) { if (IS_ENABLED) {
Modem2Gate.Write(Send_Network_Audio, 29); Modem2Gate.Write(Send_Network_Audio.title, 27);
ber_errs = dstar_dv_decode((unsigned char *)&Send_Network_Audio + 17, ber_data); ber_errs = dstar_dv_decode(Send_Network_Audio.vasd.voice, ber_data);
num_bit_errors += ber_errs; num_bit_errors += ber_errs;
num_dv_frames++; num_dv_frames++;
C_COUNTER++;
} }
seq_no ++; seq_no ++;
@ -2989,10 +2880,7 @@ int main(int argc, const char **argv)
} }
} }
if ((puffer[0] == 0xD0) && if ((puffer[0] == 0xD0) && (puffer[1] == 0x17) && (puffer[2] == 0x00) && (puffer[3] == 0x91)) {
(puffer[1] == 0x17) &&
(puffer[2] == 0x00) &&
(puffer[3] == 0x91)) {
rqst_count = RQST_COUNT; rqst_count = RQST_COUNT;
printf("DVRPTR Hardware ver: %.20s\n",puffer+6 ); printf("DVRPTR Hardware ver: %.20s\n",puffer+6 );
@ -3011,10 +2899,7 @@ int main(int argc, const char **argv)
puffer[1] = 0x00; puffer[1] = 0x00;
} }
if ((puffer[0] == 0xD0) && if ((puffer[0] == 0xD0) && ((puffer[1] == 0x07) || (puffer[1] == 0x08)) && (puffer[2] == 0x00) && (puffer[3] == 0x90)) {
((puffer[1] == 0x07) || (puffer[1] == 0x08)) &&
(puffer[2] == 0x00) &&
(puffer[3] == 0x90)) {
rqst_count = RQST_COUNT; rqst_count = RQST_COUNT;
printf("\n------- STATUS READ FROM MODEM ---------\n"); printf("\n------- STATUS READ FROM MODEM ---------\n");
@ -3030,10 +2915,7 @@ int main(int argc, const char **argv)
} }
/* serial */ /* serial */
if ((puffer[0] == 0xD0) && if ((puffer[0] == 0xD0) && (puffer[1] == 0x05) && (puffer[2] == 0x00) && (puffer[3] == 0x92)) {
(puffer[1] == 0x05) &&
(puffer[2] == 0x00) &&
(puffer[3] == 0x92)) {
rqst_count = RQST_COUNT; rqst_count = RQST_COUNT;
puffer[1] = 0x00; puffer[1] = 0x00;
} }
@ -3046,49 +2928,40 @@ int main(int argc, const char **argv)
/* If an RF user TXed and disappeared after that */ /* If an RF user TXed and disappeared after that */
if ((last_RF_time > 0) && ((tNow - last_RF_time) > 1)) { if ((last_RF_time > 0) && ((tNow - last_RF_time) > 1)) {
printf("End RF(Timeout), ber=%.02f\n", printf("End RF(Timeout), ber=%.02f\n",
(num_dv_frames == 0)?0.00:100.00 * ((float)num_bit_errors / (float)(num_dv_frames * 24.00)) ); (num_dv_frames == 0) ? 0.0 : 100.0 * ((float)num_bit_errors / (float)(num_dv_frames * 24.0)) );
ptt_off[4] = Send_Modem_Header[4]; ptt_off[4] = Send_Modem_Header[4];
write(fd_ser, ptt_off, 8); write(fd_ser, ptt_off, 8);
} }
if ( ((puffer[0] == 0xD0) && if ( ((puffer[0] == 0xD0) && (puffer[1] == 0x03) && (puffer[2] == 0x00) && (puffer[3] == 0x1A)) || ((last_RF_time > 0) && ((tNow - last_RF_time) > 1)) ) {
(puffer[1] == 0x03) &&
(puffer[2] == 0x00) &&
(puffer[3] == 0x1A)) ||
((last_RF_time > 0) && ((tNow - last_RF_time) > 1)) ) {
puffer[0] = 0x00; puffer[0] = 0x00;
if (last_RF_time > 0) { if (last_RF_time > 0) {
memcpy(Send_Network_Header , "DSTR", 4); const unsigned char silence[12] = { 0x9EU,0x8DU,0x32U,0x88U,0x26U,0x1AU,0x3FU,0x61U,0xE8U,0x70U,0x4FU,0x93U };
Send_Network_Header[4] = ((C_COUNTER >> 8) & 0xff); const unsigned char silsync[12] = { 0x9EU,0x8DU,0x32U,0x88U,0x26U,0x1AU,0x3FU,0x61U,0xE8U,0x55U,0x2DU,0x16U };
Send_Network_Header[5] = (unsigned char)(C_COUNTER & 0xff); memcpy(Send_Network_Audio.title , "DSVT", 4);
Send_Network_Header[6] = 0x73; Send_Network_Audio.config = 0x20U;
Send_Network_Header[7] = 0x12; memset(Send_Network_Audio.flaga, 0U, 3U);
Send_Network_Header[8] = 0x00; Send_Network_Audio.id = 0x20U;
Send_Network_Header[9] = 0x13; Send_Network_Audio.flagb[0] = 0x0U;
Send_Network_Header[10] = 0x20; Send_Network_Audio.flagb[1] = 0x1U;
Send_Network_Header[11] = 0x00; Send_Network_Audio.flagb[2] = SND_TERM_ID;
Send_Network_Header[12] = 0x01; Send_Network_Audio.ctrl = seq_no | 0x40U;
Send_Network_Header[13] = 0x01; memcpy(Send_Network_Audio.vasd.voice, seq_no ? silsync : silence, 12U);
Send_Network_Header[16] = seq_no | 0x40;
Send_Network_Header[17] = 0x40;
Send_Network_Header[18] = 0x55;
Send_Network_Header[19] = 0xc8;
if (ok) { if (ok) {
if (IS_ENABLED) { if (IS_ENABLED) {
Modem2Gate.Write(Send_Network_Header, 29); Modem2Gate.Write(Send_Network_Audio.title, 27);
C_COUNTER++;
} }
} }
ptt_off[4] = Send_Modem_Header[4]; ptt_off[4] = Send_Modem_Header[4];
write(fd_ser, ptt_off, 8); write(fd_ser, ptt_off, 8);
printf("End RF, ber=%.02f\n", (num_dv_frames == 0) ? 0.00 : 100.00 * ((float)num_bit_errors / (float)(num_dv_frames * 24.00)) ); printf("End RF, ber=%.02f\n", (num_dv_frames == 0) ? 0.0 : 100.0 * ((float)num_bit_errors / (float)(num_dv_frames * 24.0)) );
last_RF_time = 0; last_RF_time = 0;
if (IS_ENABLED && RPTR_ACK) if (IS_ENABLED && RPTR_ACK)
send_ack(ok ? myCall : RPTR, (num_dv_frames == 0) ? 0.00 : 100.00 * ((float)num_bit_errors / (float)(num_dv_frames * 24.00)) ); send_ack(ok ? myCall : RPTR, (num_dv_frames == 0) ? 0.0 : 100.0 * ((float)num_bit_errors / (float)(num_dv_frames * 24.0)) );
ok = false; ok = false;
} }
} }

@ -70,7 +70,7 @@ typedef struct dsvt_tag {
unsigned char config; // 4 0x10 is hdr 0x20 is vasd unsigned char config; // 4 0x10 is hdr 0x20 is vasd
unsigned char flaga[3]; // 5 zeros unsigned char flaga[3]; // 5 zeros
unsigned char id; // 8 0x20 unsigned char id; // 8 0x20
unsigned char flagb[3]; // 9 0x0 0x1 0x1 unsigned char flagb[3]; // 9 0x0 0x1 (A:0x3 B:0x1 C:0x2)
unsigned short streamid;// 12 unsigned short streamid;// 12
unsigned char ctrl; // 14 hdr: 0x80 vsad: framecounter (mod 21) unsigned char ctrl; // 14 hdr: 0x80 vsad: framecounter (mod 21)
union { union {

Loading…
Cancel
Save

Powered by TurnKey Linux.