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