qtsoundmodem/ARDOPC.h

771 lines
20 KiB
C
Raw Normal View History

2023-09-04 19:06:44 +01:00
#ifndef ARDOPCHEADERDEFINED
#define ARDOPCHEADERDEFINED
#ifdef CONST
#undef CONST
#endif
#define CONST const // for building sample arrays
extern const char ProductName[];
extern const char ProductVersion[];
//#define USE_SOUNDMODEM
#define UseGUI // Enable GUI Front End Support
#ifndef TEENSY
#ifdef UseGUI
// Constellation and Waterfall for GUI interface
//#define PLOTCONSTELLATION
//#define PLOTWATERFALL
//#define PLOTSPECTRUM
#define ConstellationHeight 90
#define ConstellationWidth 90
#define WaterfallWidth 205
#define WaterfallHeight 64
#define SpectrumWidth 205
#define SpectrumHeight 64
#define PLOTRADIUS 42
#define WHITE 0
#define Tomato 1
#define Gold 2
#define Lime 3
#define Yellow 4
#define Orange 5
#define Khaki 6
#define Cyan 7
#define DeepSkyBlue 8
#define RoyalBlue 9
#define Navy 10
#define Black 11
#define Goldenrod 12
#define Fuchsia 13
#endif
#endif
// Sound interface buffer size
#define SendSize 1200 // 100 mS for now
#define ReceiveSize 240 // try 100 mS for now
#define NumberofinBuffers 4
#define MAXCAR 43 // Max OFDM Carriers
#define DATABUFFERSIZE 11000
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE
#ifndef WIN32
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
#endif
#ifdef WIN32
typedef void *HANDLE;
#else
#define HANDLE int
#endif
void txSleep(int mS);
unsigned int getTicks();
//#ifdef WIN32
//#define round(x) floorf(x + 0.5f);
//#endif
#define Now getTicks()
// DebugLog Severity Levels
#define LOGEMERGENCY 0
#define LOGALERT 1
#define LOGCRIT 2
#define LOGERROR 3
#define LOGWARNING 4
#define LOGNOTICE 5
#define LOGINFO 6
#define LOGDEBUG 7
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//#include <math.h>
#ifdef M_PI
#undef M_PI
#endif
#define M_PI 3.1415926f
#ifndef TEENSY
#ifndef WIN32
#define LINUX
#endif
#endif
#ifdef __ARM_ARCH
#ifndef TEENSY
#define ARMLINUX
#endif
#endif
#include "ecc.h" // RS Constants
typedef int BOOL;
typedef unsigned char UCHAR;
#define VOID void
#define FALSE 0
#define TRUE 1
#define False 0
#define True 1
// TEENSY Interface board equates
#ifdef TEENSY
#ifdef PIBOARD
#define ISSLED LED0
#else
#define ISSLED LED1
#endif
#define IRSLED LED1
#define TRAFFICLED LED2
#else
#define ISSLED 1
#define IRSLED 2
#define TRAFFICLED 3
#define PKTLED 4
#endif
BOOL KeyPTT(BOOL State);
UCHAR FrameCode(char * strFrameName);
BOOL FrameInfo(UCHAR bytFrameType, int * blnOdd, int * intNumCar, char * strMod,
int * intBaud, int * intDataLen, int * intRSLen, UCHAR * bytQualThres, char * strType);
void ClearDataToSend();
int EncodeFSKData(UCHAR bytFrameType, UCHAR * bytDataToSend, int Length, unsigned char * bytEncodedBytes);
int EncodePSKData(UCHAR bytFrameType, UCHAR * bytDataToSend, int Length, unsigned char * bytEncodedBytes);
int EncodeOFDMData(UCHAR bytFrameType, UCHAR * bytDataToSend, int Length, unsigned char * bytEncodedBytes);
int Encode4FSKIDFrame(char * Callsign, char * Square, unsigned char * bytreturn, UCHAR SessionID);
int EncodeDATAACK(int intQuality, UCHAR bytSessionID, UCHAR * bytreturn);
int EncodeDATANAK(int intQuality , UCHAR bytSessionID, UCHAR * bytreturn);
void Mod4FSKDataAndPlay(unsigned char * bytEncodedBytes, int Len, int intLeaderLen, int Chan);
void ModPSKDataAndPlay(unsigned char * bytEncodedBytes, int Len, int intLeaderLen, int Chan);
BOOL IsDataFrame(UCHAR intFrameType);
BOOL CheckValidCallsignSyntax(char * strTargetCallsign);
void StartCodec(char * strFault);
void StopCodec(char * strFault);
BOOL SendARQConnectRequest(char * strMycall, char * strTargetCall);
void AddDataToDataToSend(UCHAR * bytNewData, int Len);
BOOL StartFEC(UCHAR * bytData, int Len, char * strDataMode, int intRepeats, BOOL blnSendID);
void SendID(BOOL blnEnableCWID);
BOOL CheckGSSyntax(char * GS);
//void SetARDOPProtocolState(int value);
unsigned int GenCRC16(unsigned char * Data, unsigned short length);
void SendCommandToHost(char * Cmd);
void TCPSendCommandToHost(char * Cmd);
void SCSSendCommandToHost(char * Cmd);
void SendCommandToHostQuiet(char * Cmd);
void TCPSendCommandToHostQuiet(char * Cmd);
void SCSSendCommandToHostQuiet(char * Cmd);
void UpdateBusyDetector(short * bytNewSamples);
int UpdatePhaseConstellation(short * intPhases, short * intMags, int intPSKPhase, BOOL blnQAM, BOOL OFDM);
void SetARDOPProtocolState(int value);
BOOL BusyDetect3(float * dblMag, int intStart, int intStop);
void SendLogToHost(char * Msg, int len);
VOID Gearshift_2(int intAckNakValue, BOOL blnInit);
void displayState(const char * State);
void displayCall(int dirn, char * call);
void SampleSink(int LR, short Sample);
void SoundFlush();
void StopCapture();
void StartCapture();
void DiscardOldSamples();
void ClearAllMixedSamples();
void SetFilter(void * Filter());
void AddTrailer();
void CWID(char * strID, short * intSamples, BOOL blnPlay);
void sendCWID(char * Call, BOOL Play, int Chan);
UCHAR ComputeTypeParity(UCHAR bytFrameType);
void GenCRC16FrameType(char * Data, int Length, UCHAR bytFrameType);
BOOL CheckCRC16FrameType(unsigned char * Data, int Length, UCHAR bytFrameType);
char * strlop(char * buf, char delim);
void QueueCommandToHost(char * Cmd);
void SCSQueueCommandToHost(char * Cmd);
void TCPQueueCommandToHost(char * Cmd);
void SendReplyToHost(char * strText);
void TCPSendReplyToHost(char * strText);
void SCSSendReplyToHost(char * strText);
void LogStats();
int GetNextFrameData(int * intUpDn, UCHAR * bytFrameTypeToSend, UCHAR * strMod, BOOL blnInitialize);
void SendData();
int ComputeInterFrameInterval(int intRequestedIntervalMS);
VOID EncodeAndSend4FSKControl(UCHAR bytFrameType, UCHAR bytSessionID, int LeaderLength);
VOID WriteExceptionLog(const char * format, ...);
void SaveQueueOnBreak();
VOID Statsprintf(const char * format, ...);
VOID CloseDebugLog();
VOID CloseStatsLog();
void Abort();
void SetLED(int LED, int State);
VOID ClearBusy();
VOID CloseCOMPort(HANDLE fd);
VOID COMClearRTS(HANDLE fd);
VOID COMClearDTR(HANDLE fd);
//#ifdef WIN32
void ProcessNewSamples(short * Samples, int nSamples);
VOID Debugprintf(const char * format, ...);
VOID WriteDebugLog(const char * format, ...);
void ardopmain();
BOOL GetNextFECFrame();
void GenerateFSKTemplates();
void printtick(char * msg);
void InitValidFrameTypes();
//#endif
extern void Generate50BaudTwoToneLeaderTemplate();
extern BOOL blnDISCRepeating;
BOOL DemodDecode4FSKID(UCHAR bytFrameType, char * strCallID, char * strGridSquare);
void DeCompressCallsign(char * bytCallsign, char * returned);
void DeCompressGridSquare(char * bytGS, char * returned);
int RSEncode(UCHAR * bytToRS, UCHAR * RSBytes, int DataLen, int RSLen);
BOOL RSDecode(UCHAR * bytRcv, int Length, int CheckLen, BOOL * blnRSOK);
void ProcessRcvdFECDataFrame(int intFrameType, UCHAR * bytData, BOOL blnFrameDecodedOK);
void ProcessUnconnectedConReqFrame(int intFrameType, UCHAR * bytData);
void ProcessRcvdARQFrame(UCHAR intFrameType, UCHAR * bytData, int DataLen, BOOL blnFrameDecodedOK);
void InitializeConnection();
void AddTagToDataAndSendToHost(UCHAR * Msg, char * Type, int Len);
void TCPAddTagToDataAndSendToHost(UCHAR * Msg, char * Type, int Len);
void SCSAddTagToDataAndSendToHost(UCHAR * Msg, char * Type, int Len);
void RemoveDataFromQueue(int Len);
void RemodulateLastFrame();
void GetSemaphore();
void FreeSemaphore();
const char * Name(UCHAR bytID);
const char * shortName(UCHAR bytID);
void InitSound();
void initFilter(int Width, int centerFreq, int Chan);
void FourierTransform(int NumSamples, short * RealIn, float * RealOut, float * ImagOut, int InverseTransform);
VOID ClosePacketSessions();
VOID LostHost();
VOID ProcessPacketHostBytes(UCHAR * RXBuffer, int Len);
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
VOID ProcessDEDModeFrame(UCHAR * rxbuffer, unsigned int Length);
BOOL CheckForPktMon();
BOOL CheckForPktData();
void ModOFDMDataAndPlay(unsigned char * bytEncodedBytes, int Len, int intLeaderLen, int Chan);
void GetOFDMFrameInfo(int OFDMMode, int * intDataLen, int * intRSLen, int * Mode, int * Symbols);
void ClearOFDMVariables();
VOID EncodeAndSendOFDMACK(UCHAR bytSessionID, int LeaderLength, int Chan);
int ProcessOFDMAck(int AckType);
void ProcessOFDMNak(int AckType);
int SendtoGUI(char Type, unsigned char * Msg, int Len);
void DrawRXFrame(int State, const char * Frame);
void DrawTXFrame(const char * Frame);
void mySetPixel(unsigned char x, unsigned char y, unsigned int Colour);
void clearDisplay();
void DrawDecode(char * Decode);
extern int WaterfallActive;
extern int SpectrumActive;
extern unsigned int PKTLEDTimer;
extern char stcLastPingstrSender[10];
extern char stcLastPingstrTarget[10];
extern int stcLastPingintRcvdSN;
extern int stcLastPingintQuality;
extern time_t stcLastPingdttTimeReceived;
enum _ReceiveState // used for initial receive testing...later put in correct protocol states
{
SearchingForLeader,
AcquireSymbolSync,
AcquireFrameSync,
AcquireFrameType,
DecodeFrameType,
AcquireFrame,
DecodeFramestate
};
extern enum _ReceiveState State;
enum _ARQBandwidth
{
XB200,
XB500,
XB2500,
UNDEFINED
};
extern enum _ARQBandwidth ARQBandwidth;
extern const char ARQBandwidths[9][12];
enum _ARDOPState
{
OFFLINE,
DISC,
ISS,
IRS,
IDLE, // ISS in quiet state ...no transmissions)
IRStoISS, // IRS during transition to ISS waiting for ISS's ACK from IRS's BREAK
FECSend,
FECRcv
};
extern enum _ARDOPState ProtocolState;
extern const char ARDOPStates[8][9];
// Enum of ARQ Substates
enum _ARQSubStates
{
None,
ISSConReq,
ISSConAck,
ISSData,
ISSId,
IRSConAck,
IRSData,
IRSBreak,
IRSfromISS,
DISCArqEnd
};
extern enum _ARQSubStates ARQState;
enum _ProtocolMode
{
Undef,
FEC,
ARQ
};
extern enum _ProtocolMode ProtocolMode;
extern const char ARDOPModes[3][6];
extern enum _ARQSubStates ARQState;
struct SEM
{
unsigned int Flag;
int Clashes;
int Gets;
int Rels;
};
extern struct SEM Semaphore;
#define DataNAK 0x00
#define DataNAKLoQ 0x01
#define ConRejBusy 0x02
#define ConRejBW 0x03
#define ConAck 0x04
#define DISCFRAME 0x05
#define BREAK 0x06
#define END 0x07
#define IDLEFRAME 0x08
#define ConReq200 0x09
#define ConReq500 0x0A
#define ConReq2500 0x0B
#define IDFRAME 0x0C
#define PINGACK 0x0D
#define PING 0x0E
#define CQ_de 0x0F
// 200 Hz Bandwidth
// 1 Car modes
#define D4PSK_200_50_E 0x10
#define D4PSK_200_50_O 0x11
#define D4PSK_200_100_E 0x12
#define D4PSK_200_100_O 0x13
#define D16QAM_200_100_E 0x14
#define D16QAM_200_100_O 0x15
// 500 Hz bandwidth Data
// 1 Car 4FSK Data mode 500 Hz, 50 baud tones spaced @ 100 Hz
#define D4FSK_500_50_E 0x1A
#define D4FSK_500_50_O 0x1B
#define D4PSK_500_50_E 0x1C
#define D4PSK_500_50_O 0x1D
#define D4PSK_500_100_E 0x1E
#define D4PSK_500_100_O 0x1F
// 2 Car 16QAM Data Modes 100 baud
#define D16QAMR_500_100_E 0x20
#define D16QAMR_500_100_O 0x21
#define D16QAM_500_100_E 0x22
#define D16QAM_500_100_O 0x23
// OFDM modes
#define DOFDM_500_55_E 0x24
#define DOFDM_500_55_O 0x25
#define DOFDM_200_55_E 0x26
#define DOFDM_200_55_O 0x27
#define OConReq500 0x18
#define OConReq2500 0x19
// 1 Khz Bandwidth Data Modes
// 2 Car 4FSK Data mode 1000 Hz, 50 baud tones spaced @ 100 Hz
#define D4FSK_1000_50_E 0x28
#define D4FSK_1000_50_O 0x29
// 2500 bandwidth modes
// 10 Car PSK Data Modes 50 baud
#define D4PSKR_2500_50_E 0x2A
#define D4PSKR_2500_50_O 0x2B
#define D4PSK_2500_50_E 0x2C
#define D4PSK_2500_50_O 0x2D
// 10 Car PSK Data Modes 100 baud
#define D4PSK_2500_100_E 0x2E
#define D4PSK_2500_100_O 0x2F
// 10 Car 10 Car 16QAMRobust (duplicated carriers)
#define D16QAMR_2500_100_E 0x30
#define D16QAMR_2500_100_O 0x31
// 10 Car 16QAM Data modes 100 baud
#define D16QAM_2500_100_E 0x32
#define D16QAM_2500_100_O 0x33
// OFDM modes
#define DOFDM_2500_55_E 0x34
#define DOFDM_2500_55_O 0x35
#define PktFrameHeader 0x3A // Variable length frame Header
#define PktFrameData 0x3B // Variable length frame Data (Virtual Frsme Type)
#define OFDMACK 0x3D
#define DataACK 0x3E
#define DataACKHiQ 0x3F
extern CONST short int50BaudTwoToneLeaderTemplate[240]; // holds just 1 symbol (20 ms) of the leader
//The actual templates over 11 carriers for 16QAM in a 8-8 circular constellation. First 4 symbols only
// (only positive Phase values are in the table, sign reversal is used to get the negative phase values) This reduces the template size to 5280 integers
extern CONST short intQAM50bdCarTemplate[11][4][120];
extern CONST short intFSK50bdCarTemplate[12][240]; // Template for 4FSK carriers spaced at 50 Hz, 50 baud
extern CONST short intFSK100bdCarTemplate[4][120];
extern CONST short intOFDMTemplate[MAXCAR][8][216];
// Config Params
extern char GridSquare[9];
extern char Callsign[10];
extern BOOL wantCWID;
extern BOOL CWOnOff;
extern int LeaderLength;
extern int TrailerLength;
extern unsigned int ARQTimeout;
extern int TuningRange;
extern int TXLevel;
extern int RXLevel;
extern int autoRXLevel;
extern BOOL DebugLog;
extern int ARQConReqRepeats;
extern BOOL CommandTrace;
extern char strFECMode[];
extern char CaptureDevice[];
extern char PlaybackDevice[];
extern int port;
extern char HostPort[80];
extern int pktport;
extern BOOL RadioControl;
extern BOOL SlowCPU;
extern BOOL AccumulateStats;
extern BOOL Use600Modes;
extern BOOL UseOFDM;
extern BOOL EnableOFDM;
extern BOOL FSKOnly;
extern BOOL fastStart;
extern BOOL ConsoleLogLevel;
extern BOOL FileLogLevel;
extern BOOL EnablePingAck;
extern BOOL NegotiateBW;
extern int dttLastPINGSent;
extern BOOL blnPINGrepeating;
extern BOOL blnFramePending;
extern int intPINGRepeats;
extern BOOL gotGPIO;
extern BOOL useGPIO;
extern int pttGPIOPin;
extern HANDLE hCATDevice; // port for Rig Control
extern char CATPort[80];
extern int CATBAUD;
extern int EnableHostCATRX;
extern HANDLE hPTTDevice; // port for PTT
extern char PTTPort[80]; // Port for Hardware PTT - may be same as control port.
extern int PTTBAUD;
#define PTTRTS 1
#define PTTDTR 2
#define PTTCI_V 4
extern UCHAR PTTOnCmd[];
extern UCHAR PTTOnCmdLen;
extern UCHAR PTTOffCmd[];
extern UCHAR PTTOffCmdLen;
extern int PTTMode; // PTT Control Flags.
extern char * CaptureDevices;
extern char * PlaybackDevices;
extern int dttCodecStarted;
extern int dttStartRTMeasure;
extern int intCalcLeader; // the computed leader to use based on the reported Leader Length
extern const char strFrameType[64][18];
extern const char shortFrameType[64][12];
extern BOOL Capturing;
extern int SoundIsPlaying;
extern int blnLastPTT;
extern BOOL blnAbort;
extern BOOL blnClosing;
extern BOOL blnCodecStarted;
extern BOOL blnInitializing;
extern BOOL blnARQDisconnect;
extern int DriveLevel;
extern int FECRepeats;
extern BOOL FECId;
extern int Squelch;
extern int BusyDet;
extern BOOL blnEnbARQRpt;
extern unsigned int dttNextPlay;
extern UCHAR bytDataToSend[];
extern int bytDataToSendLength;
extern BOOL blnListen;
extern BOOL Monitor;
extern BOOL AutoBreak;
extern BOOL BusyBlock;
extern int DecodeCompleteTime;
extern BOOL AccumulateStats;
extern unsigned char bytEncodedBytes[4500];
extern int EncLen;
extern char AuxCalls[10][10];
extern int AuxCallsLength;
extern int bytValidFrameTypesLength;
extern int bytValidFrameTypesLengthALL;
extern int bytValidFrameTypesLengthISS;
extern BOOL blnTimeoutTriggered;
extern int intFrameRepeatInterval;
extern int extraDelay;
extern BOOL PlayComplete;
extern const UCHAR bytValidFrameTypesALL[];
extern const UCHAR bytValidFrameTypesISS[];
extern const UCHAR * bytValidFrameTypes;
extern const char strAllDataModes[][16];
extern int strAllDataModesLen;
extern const short Rate[64]; // Data Rate (in bits/sec) by Frame Type
extern BOOL newStatus;
// RS Variables
extern int MaxCorrections;
// Stats counters
extern int SessBytesSent;
extern int SessBytesReceived;
extern int intLeaderDetects;
extern int intLeaderSyncs;
extern int intAccumLeaderTracking;
extern float dblFSKTuningSNAvg;
extern int intGoodFSKFrameTypes;
extern int intFailedFSKFrameTypes;
extern int intAccumFSKTracking;
extern int intFSKSymbolCnt;
extern int intGoodFSKFrameDataDecodes;
extern int intFailedFSKFrameDataDecodes;
extern int intAvgFSKQuality;
extern int intFrameSyncs;
extern int intGoodPSKSummationDecodes;
extern int intGoodFSKSummationDecodes;
extern int intGoodOFDMSummationDecodes;
extern float dblLeaderSNAvg;
extern int intAccumPSKLeaderTracking;
extern float dblAvgPSKRefErr;
extern int intPSKTrackAttempts;
extern int intAccumPSKTracking;
extern int intQAMTrackAttempts;
extern int intAccumQAMTracking;
extern int intOFDMTrackAttempts;
extern int intAccumOFDMTracking;
extern int intPSKSymbolCnt;
extern int intQAMSymbolCnt;
extern int intOFDMSymbolCnt;
extern int intGoodPSKFrameDataDecodes;
extern int intFailedPSKFrameDataDecodes;
extern int intAvgPSKQuality;
extern int intGoodOFDMFrameDataDecodes;
extern int intFailedOFDMFrameDataDecodes;
extern int intAvgOFDMQuality;
extern float dblAvgDecodeDistance;
extern int intDecodeDistanceCount;
extern int intShiftUPs;
extern int intShiftDNs;
extern unsigned int dttStartSession;
extern int intLinkTurnovers;
extern int intEnvelopeCors;
extern float dblAvgCorMaxToMaxProduct;
extern int intConReqSN;
extern int intConReqQuality;
extern int int4FSKQuality;
extern int int4FSKQualityCnts;
extern int int8FSKQuality;
extern int int8FSKQualityCnts;
extern int int16FSKQuality;
extern int int16FSKQualityCnts;
extern int intFSKSymbolsDecoded;
extern int intPSKQuality[2];
extern int intPSKQualityCnts[2];
extern int intPSKSymbolsDecoded;
extern int intOFDMQuality[8];
extern int intOFDMQualityCnts[8];
extern int intOFDMSymbolsDecoded;
extern int intQAMQuality;
extern int intQAMQualityCnts;
extern int intQAMSymbolsDecoded;
extern int intQAMSymbolCnt;
extern int intOFDMSymbolCnt;
extern int intGoodQAMFrameDataDecodes;
extern int intFailedQAMFrameDataDecodes;
extern int intGoodQAMSummationDecodes;
extern int dttLastBusyOn;
extern int dttLastBusyOff;
extern int dttLastLeaderDetect;
extern int LastBusyOn;
extern int LastBusyOff;
extern int dttLastLeaderDetect;
extern int pktDataLen;
extern int pktRSLen;
extern const char pktMod[16][12];
extern int pktMode;
extern int pktModeLen;
extern const int pktBW[16];
extern const int pktCarriers[16];
extern const int defaultPacLen[16];
extern const BOOL pktFSK[16];
extern int pktMaxFrame;
extern int pktMaxBandwidth;
extern int pktPacLen;
extern int initMode; // 0 - 4PSK 1 - 8PSK 2 = 16QAM
extern UCHAR UnackedOFDMBlocks[128];
extern int NextOFDMBlock;
extern BOOL SerialMode; // Set if using SCS Mode, Unset ofr TCP Mode
// Has to follow enum defs
BOOL EncodeARQConRequest(char * strMyCallsign, char * strTargetCallsign, enum _ARQBandwidth ARQBandwidth, UCHAR * bytReturn);
// OFDM Modes
#define PSK2 0
#define PSK4 1
#define PSK8 2
#define QAM16 3
#define PSK16 4 // Experimental - is it better than 16QAM?
#define QAM32 5
#define PSK4S 6 // Special shorter frame for short messages
extern int OFDMMode; // OFDM can use various modulation modes and redundancy levels
extern int LastSentOFDMMode; // For retries
extern int LastSentOFDMType; // For retries
extern int SavedOFDMMode; // used if we switch to a more robust mode cos we don't have much to send
extern int SavedFrameType;
extern const char OFDMModes[8][6];
#endif