parent
be803ca069
commit
fdedb6f1df
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 by Thomas Early N7TAE
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <csignal>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "KRBase.h"
|
||||||
|
|
||||||
|
std::atomic<bool> CKRBase::keep_running(true);
|
||||||
|
|
||||||
|
CKRBase::CKRBase()
|
||||||
|
{
|
||||||
|
std::signal(SIGINT, CKRBase::SigHandler);
|
||||||
|
std::signal(SIGHUP, CKRBase::SigHandler);
|
||||||
|
std::signal(SIGTERM, CKRBase::SigHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CKRBase::IsRunning()
|
||||||
|
{
|
||||||
|
return keep_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CKRBase::SetState(bool state)
|
||||||
|
{
|
||||||
|
keep_running = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CKRBase::SigHandler(int sig)
|
||||||
|
{
|
||||||
|
switch (sig) {
|
||||||
|
case SIGINT:
|
||||||
|
case SIGHUP:
|
||||||
|
case SIGTERM:
|
||||||
|
keep_running = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
std::cerr << "caught an unexpected signal=" << sig << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 by Thomas Early N7TAE
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// base class for all modems
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
class CKRBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CKRBase();
|
||||||
|
bool IsRunning();
|
||||||
|
void SetState(bool state);
|
||||||
|
protected:
|
||||||
|
static std::atomic<bool> keep_running;
|
||||||
|
static void SigHandler(int sig);
|
||||||
|
};
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018,2020 by Thomas A. Early N7TAE
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "KRBase.h"
|
||||||
|
|
||||||
|
using SDVAP_ACK_ARG = struct davp_ack_arg_tag {
|
||||||
|
char mycall[8];
|
||||||
|
float ber;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CQnetDVAP : public CKRBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool Init(const char *file, const int amod);
|
||||||
|
void Run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool ReadConfig(const char *file);
|
||||||
|
void ReadFromGateway();
|
||||||
|
void calcPFCS(unsigned char *packet, unsigned char *pfcs);
|
||||||
|
void ReadDVAPThread();
|
||||||
|
void RptrAckThread(SDVAP_ACK_ARG *parg);
|
||||||
|
|
||||||
|
|
||||||
|
// classes
|
||||||
|
CDStarDecode decode;
|
||||||
|
CDVAPDongle dongle;
|
||||||
|
CRandom Random;
|
||||||
|
|
||||||
|
// data
|
||||||
|
int assigned_module;
|
||||||
|
|
||||||
|
// unix sockets
|
||||||
|
std::string togate;
|
||||||
|
CUnixPacketClient ToGate;
|
||||||
|
/* Default configuration data */
|
||||||
|
std::string RPTR;
|
||||||
|
std::string OWNER;
|
||||||
|
char RPTR_MOD;
|
||||||
|
std::string MODULE_SERIAL_NUMBER; /* APxxxxxx */
|
||||||
|
int MODULE_FREQUENCY; /* between 144000000 and 148000000 */
|
||||||
|
int MODULE_POWER; /* between -12 and 10 */
|
||||||
|
int MODULE_SQUELCH; /* between -128 and -45 */
|
||||||
|
int MODULE_OFFSET; /* between -2000 and 2000 */
|
||||||
|
int MODULE_PACKET_WAIT; /* wait 25 ms in reading from local G2 */
|
||||||
|
int TIMING_TIMEOUT_REMOTE_G2; /* 1 second */
|
||||||
|
int TIMING_PLAY_DELAY;
|
||||||
|
int TIMING_PLAY_WAIT;
|
||||||
|
bool MODULE_ACKNOWLEDGE;
|
||||||
|
double TIMING_TIMEOUT_LOCAL_RPTR;
|
||||||
|
bool LOG_DEBUG;
|
||||||
|
bool LOG_QSO;
|
||||||
|
int inactiveMax = 25;
|
||||||
|
|
||||||
|
/* helper data */
|
||||||
|
unsigned char SND_TERM_ID;
|
||||||
|
char RPTR_and_G[9];
|
||||||
|
char RPTR_and_MOD[9];
|
||||||
|
int serfd = -1;
|
||||||
|
bool busy20000 = false;
|
||||||
|
|
||||||
|
unsigned int space = 0;
|
||||||
|
};
|
||||||
@ -0,0 +1,135 @@
|
|||||||
|
#pragma once
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 by Thomas Early N7TAE
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "UnixPacketSock.h"
|
||||||
|
#include "DStarDecode.h"
|
||||||
|
#include "QnetTypeDefs.h"
|
||||||
|
#include "KRBase.h"
|
||||||
|
|
||||||
|
using tambevoicefec = unsigned char[9];
|
||||||
|
using tambevoice = unsigned char[6];
|
||||||
|
|
||||||
|
#define interleaveambe12(bp) { bp+=12; if (bp>71) bp -= 71; }
|
||||||
|
#define CALL_SIZE 8
|
||||||
|
#define GORLAY_X22 0x00400000 // vector representation of X^{22}
|
||||||
|
#define GORLAY_X11 0x00000800 // vector representation of X^{11}
|
||||||
|
#define GORLAY_MASK12 0xfffff800 // auxiliary vector for testing
|
||||||
|
#define GORLAY_GENPOL 0x00000c75 // generator polinomial, g(x)
|
||||||
|
|
||||||
|
class CQnetDVRPTR : public CKRBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool Init(const char *file, int assigned_module);
|
||||||
|
void Run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CDStarDecode decode;
|
||||||
|
bool ReadConfig(const char *cfgFile);
|
||||||
|
void readFrom20000();
|
||||||
|
bool check_serial();
|
||||||
|
void CleanCall(std::string &callsign);
|
||||||
|
void ambefec_deinterleave(tambevoicefec result, const tambevoicefec voice);
|
||||||
|
void ambefec_interleave(tambevoicefec result, const tambevoicefec raw_voice);
|
||||||
|
void ambefec_regenerate(tambevoicefec voice);
|
||||||
|
uint32_t get_syndrome_23127(uint32_t pattern);
|
||||||
|
unsigned int gorlay_decode23127(unsigned int code);
|
||||||
|
unsigned int gorlay_encode24128(unsigned int data);
|
||||||
|
unsigned int gorlay_decode24128(unsigned int code);
|
||||||
|
void calcPFCS(unsigned char *packet);
|
||||||
|
char *cleanstr(char *Text);
|
||||||
|
int open_port(char *dvrptr_device);
|
||||||
|
int read_port(int *fd_ser, unsigned char *buffera);
|
||||||
|
void send_ack(char *a_call, float ber);
|
||||||
|
/*** BER stuff ***/
|
||||||
|
int ber_data[3];
|
||||||
|
int ber_errs;
|
||||||
|
int num_dv_frames;
|
||||||
|
int num_bit_errors;
|
||||||
|
|
||||||
|
short block = 0;
|
||||||
|
short old_seq_no = 0;
|
||||||
|
|
||||||
|
short seq_no1 = 1;
|
||||||
|
short seq_no2 = 1;
|
||||||
|
short seq_no3 = 0;
|
||||||
|
int fd_ser = -1;
|
||||||
|
bool busy20000 = false;
|
||||||
|
|
||||||
|
int rqst_count = 6;
|
||||||
|
unsigned short streamid = 0x0;
|
||||||
|
unsigned char start_Header[8]= {0xD0,0x03,0x00,0x16,0x01,0x00,0x00,0x00};
|
||||||
|
unsigned char ptt_off[8]= {0xD0,0x03,0x00,0x1A,0x01,0xff,0x00,0x00};
|
||||||
|
|
||||||
|
|
||||||
|
SDSVT Send_Network_Header;
|
||||||
|
SDSVT Send_Network_Audio;
|
||||||
|
|
||||||
|
int inactiveMax = 3200;
|
||||||
|
|
||||||
|
unsigned char Send_Modem_Header[52];
|
||||||
|
|
||||||
|
unsigned char writevoice[24];
|
||||||
|
unsigned char writevoice1[24];
|
||||||
|
|
||||||
|
// Modem INIT
|
||||||
|
unsigned char Modem_Init0[6]= {0xD0,0x01,0x00,0x11,0x00,0x00};
|
||||||
|
unsigned char Modem_Init1[7]= {0xD0,0x02,0x00,0x10,0x03,0x00,0x00}; // RX TX Enable
|
||||||
|
unsigned char Modem_Init2[12]= {0xD0,0x07,0x00,0x14,0xC0,0x04,0x00,0x57,0x53,0x00,0x00,0x00}; // Modem Init
|
||||||
|
unsigned char Modem_STATUS[6]= {0xD0,0x01,0x00,0x10,0x00,0x00}; // Status Abfragr
|
||||||
|
unsigned char Modem_SERIAL[6]= {0xD0,0x01,0x00,0x12,0x00,0x00};
|
||||||
|
|
||||||
|
int assigned_module;
|
||||||
|
std::string togate;
|
||||||
|
CUnixPacketClient ToGate;
|
||||||
|
|
||||||
|
std::string DVRPTR_SERIAL;
|
||||||
|
char DVCALL[CALL_SIZE + 1];
|
||||||
|
char RPTR[CALL_SIZE + 1];
|
||||||
|
char DVRPTR_MOD = 'B';
|
||||||
|
int RF_AUDIO_Level = 10;
|
||||||
|
bool DUPLEX = true;
|
||||||
|
int ACK_DELAY = 200000;
|
||||||
|
int DELAY_BETWEEN = 20000;
|
||||||
|
bool RPTR_ACK = false;
|
||||||
|
char ENABLE_RF[CALL_SIZE + 1];
|
||||||
|
char DISABLE_RF[CALL_SIZE + 1];
|
||||||
|
bool IS_ENABLED = true;
|
||||||
|
bool RX_Inverse = true;
|
||||||
|
bool TX_Inverse = true;
|
||||||
|
int TX_DELAY; /* in milliseconds */
|
||||||
|
unsigned char SND_TERM_ID = 0x00;
|
||||||
|
char DVCALL_and_G[9];
|
||||||
|
char DVCALL_and_MOD[9];
|
||||||
|
int REMOTE_TIMEOUT = 1; /* 1 second */
|
||||||
|
int RQST_COUNT = 6;
|
||||||
|
u_int16_t streamid_raw = 0;
|
||||||
|
char myRPT2[10]; //RX from HF RPT2
|
||||||
|
char myRPT1[10]; //RX from HF RPT1
|
||||||
|
char myUR[10];
|
||||||
|
char myCall[10];
|
||||||
|
char myCall2[10];
|
||||||
|
|
||||||
|
char cbuf[250];
|
||||||
|
|
||||||
|
SDSVT recv_buf;
|
||||||
|
int InitCount;
|
||||||
|
};
|
||||||
Loading…
Reference in new issue