File: HermesProxyW.h

package info (click to toggle)
gr-hpsdr 3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 884 kB
  • sloc: python: 9,498; cpp: 2,227; ansic: 26; makefile: 12
file content (151 lines) | stat: -rw-r--r-- 5,235 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* -*- c++ -*- */
/* 
 * Copyright 2013-2015 Tom McDermott, N5EG
 * 
 * This 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 3, or (at your option)
 * any later version.
 * 
 * This software 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 software; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

//
// Proxy for Hermes board wideband mode, communicates with
// only one hardware module.
// Version:  March 21, 2015

#include <gnuradio/io_signature.h>
#include "HermesProxy.h"		// typedefs and enums

#ifndef HermesProxyW_H
#define HermesProxyW_H

#define NUMRXIQBUFS	128		// number of receiver IQ buffers in circular queue.
					// Must be integral power of 2 (2,4,8,16,32,64, etc.)

#define RXBUFSIZE	256		// number of floats in one RxIQBuf, #complexes is half
					// Must be integral power of 2 (2,4,8,16,32,64, etc.)

#define NUMTXBUFS	128		// number of transmit buffers in circular queue
					// Must be integral power of 2

#define TXBUFSIZE	512		// number of bytes in one TxBuf
					


//typedef float* IQBuf_t;			// IQ buffer type (IQ samples as floats)
//typedef unsigned char* RawBuf_t;	// Raw transmit buffer type

//enum {  PTTOff,				// PTT disabled
//	PTTVox,				// PTT vox mode (examines TxFrame to decide whether to Tx)
//	PTTOn };			// PTT force Tx on

class HermesProxyW
{

private:

	IQBuf_t RxIQBuf[NUMRXIQBUFS];	// ReceiveIQ buffers
	unsigned RxWriteCounter;	// Which Rx buffer to write to
	unsigned RxReadCounter;		// Which Rx buffer to read from
	unsigned RxWriteFill;		// Fill level of the RxWrite buffer

	RawBuf_t TxBuf[NUMTXBUFS]; 	// Transmit buffers
	unsigned TxWriteCounter;	// Which Tx buffer to write to
	unsigned TxReadCounter;		// Which Tx buffer to read from
	unsigned TxControlCycler;	// Which Tx control register set to send
	unsigned TxFrameIdleCount;	// How long we've gone since sending a TxFrame

	unsigned long LostRxBufCount;	// Lost-buffer counter for packets we actually got
	unsigned long TotalRxBufCount;	// Total buffer count (may roll over)
	unsigned long LostTxBufCount;	//
	unsigned long TotalTxBufCount;	//
	unsigned long CorruptRxCount;	//
	unsigned long LostEthernetRx;	//
	unsigned long CurrentEthSeqNum;	// Diagnostic

public:

	unsigned Receive0Frequency;	// 1st rcvr. Corresponds to out0 in gnuradio
	unsigned Receive1Frequency;	// 2nd rcvr. Corresponds to out1 in gnuradio
	unsigned TransmitFrequency;
	int NumReceivers;
	int RxSampleRate;

	unsigned char TxDrive;
	unsigned char RxAtten;		// not yet used (requires Hermes firmware V2.0)

	unsigned int ClockSource;	// upper 6-bits of clock control register

	unsigned char AlexRxAnt;	// Select Alex Receive Antenna or from T/R relay
	unsigned char AlexTxAnt;	// Select Alex Tx Antenna
	unsigned char AlexRxHPF;	// Select Alex Receive High Pass Filter
	unsigned char AlexTxLPF;	// Select Alex Transmit Low Pass Filter

	int PTTMode;
	bool RxPreamp;
	bool ADCdither;
	bool ADCrandom;
	bool ADCoverload;
	bool Duplex;

	unsigned char HermesVersion;
	unsigned int AIN1, AIN2, AIN3, AIN4, AIN5, AIN6;  // Analog inputs to Hermes
	unsigned int AlexRevPwr;
	unsigned int SlowCount;
	int Verbose;

	bool TxStop;
	bool PTTOffMutesTx;		// PTT Off mutes the transmitter
	bool PTTOnMutesRx;		// PTT On receiver
	char interface[16];

	char mactarget[18];		// Requested target's MAC address as string
					// "HH:HH:HH:HH:HH:HH" HH is hexadecimal string.
	unsigned int metis_entry;	// Index into Metis_card MAC table


	HermesProxyW(int RxPre, const char* Intfc, const char * ClkS,
			int AlexRA, int AlexTA, int AlexHPF, int AlexRPF,
			const char* MACAddr);	// constructor

	~HermesProxyW();			// destructor

	void Stop();			// stop ethernet I/O
	void Start();			// start rx stream

	void SendTxIQ();		// send an IQ buffer to Hermes transmit hardware
	void BuildControlRegs(unsigned, RawBuf_t);	// fill in the 8 byte sync+control registers from RegNum
	void PutTxIQ();			// post a transmit TxIQ buffer
	void ScheduleTxFrame();    	// Schedule a Tx frame
	RawBuf_t GetNextTxBuf(); 	// get an empty Tx Buffer

	void UpdateHermes();		// update control registers in Hermes without any Tx data

	void ReceiveRxIQ(unsigned char *); // receive an IQ buffer from Hermes hardware via metis.cc thread

	IQBuf_t GetNextRxWriteBuf();	// Used to be named GetRxIQ()  
	IQBuf_t GetNextRxReadBuf();	// Used to be named GetNextRxBuf(IQBuf_t)
	IQBuf_t GetCurrentRxReadBuf();	//
	IQBuf_t GetCurrentRxWriteBuf();	//  
	bool RxReadBufAligned();	// True if the current Rcv Read Buffer is aligned on a 64 buffer boundary
	bool RxWriteBufAligned();	// True if the current Rcv Write Buffer is aligned on a 64 buffer boundary
	int RxBufFillCount();		// how many RxBuffers are filled?

	void PrintRawBuf(RawBuf_t);	// for debugging



};

#endif  // #ifndef HermesProxyW_H