#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 #include #include #include #include //#include #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