GNU Radio's HPSDR Package: HermesProxy.h Source File

GNU Radio's HPSDR Package

HermesProxy.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2013-2017 Tom McDermott, N5EG
4 *
5 * This is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3, or (at your option)
8 * any later version.
9 *
10 * This software is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this software; see the file COPYING. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street,
18 * Boston, MA 02110-1301, USA.
19 */
20
21// HermesProxy.h
22//
23// Proxy for Hermes board. Each HermesNB module communicates with
24// only one hardware module. Multiple hardware modules need to use
25// multiple instantiations of the HermesNB within GNURadio.
26// Note: multiple receivers on one Hermes is not implemented.
27//
28// Version: December 15, 2012
29// July 10, 2013 -- Updates for GRC 3.7
30// December 4, 2013 -- Fix bug in free() on termination.
31// -- Add additional parameters to constructor
32// July 2017 -- Changes supporting up to 8 receivers
33
34
35#include <gnuradio/io_signature.h>
36
37#ifndef HermesProxy_H
38#define HermesProxy_H
39
40#define NUMRXIQBUFS 128 // number of receiver IQ buffers in circular queue.
41 // Must be integral power of 2 (2,4,8,16,32,64, etc.)
42
43#define RXBUFSIZE 256 // number of floats in one RxIQBuf, #complexes is half
44 // Must be integral power of 2 (2,4,8,16,32,64, etc.)
45
46#define NUMTXBUFS 128 // number of transmit buffers in circular queue
47 // Must be integral power of 2
48
49#define TXBUFSIZE 512 // number of bytes in one TxBuf
50
51
52#define TXINITIALBURST 4 // Number of Ethernet frames to holdoff before bursting
53 // to fill hardware TXFIFO
54
55#define MAXRECEIVERS 8 // Maximum number of receivers defined by protocol specification
56
57
58 typedef float* IQBuf_t; // IQ buffer type (IQ samples as floats)
59 typedef unsigned char* RawBuf_t; // Raw transmit buffer type
60
61 enum { PTTOff, // PTT disabled
62 PTTVox, // PTT vox mode (examines TxFrame to decide whether to Tx)
63 PTTOn }; // PTT force Tx on
64
65 class HermesProxy
66{
67
68private:
69
70 IQBuf_t RxIQBuf[NUMRXIQBUFS]; // ReceiveIQ buffers
71 unsigned RxWriteCounter; // Which Rx buffer to write to
72 unsigned RxReadCounter; // Which Rx buffer to read from
73 unsigned RxWriteFill; // Fill level of the RxWrite buffer
74 bool TxHoldOff; // Transmit buffer holdoff flag
75
76 RawBuf_t TxBuf[NUMTXBUFS]; // Transmit buffers
77 unsigned TxWriteCounter; // Which Tx buffer to write to
78 unsigned TxReadCounter; // Which Tx buffer to read from
79 unsigned TxControlCycler; // Which Tx control register set to send
80 unsigned TxFrameIdleCount; // How long we've gone since sending a TxFrame
81
82 unsigned long LostRxBufCount; // Lost-buffer counter for packets we actually got
83 unsigned long TotalRxBufCount; // Total buffer count (may roll over)
84 unsigned long LostTxBufCount; //
85 unsigned long TotalTxBufCount; //
86 unsigned long CorruptRxCount; //
87 unsigned long LostEthernetRx; //
88 unsigned long CurrentEthSeqNum; // Diagnostic
89
90 //pthread_mutex_t mutexRPG; // Rx to Proxy to Gnuradio buffer
91 //pthread_mutex_t mutexGPT; // Gnuradio to Proxy to Tx buffer
92
93
94public:
95
96 unsigned Receive0Frequency; // 1st rcvr. Corresponds to out0 in gnuradio
97 unsigned Receive1Frequency; // 2nd rcvr. Corresponds to out1 in gnuradio
98 unsigned Receive2Frequency; // 3rd rcvr. Corresponds to out2 in gnuradio
99 unsigned Receive3Frequency; // 4th rcvr. Corresponds to out3 in gnuradio
100 unsigned Receive4Frequency; // 5th rcvr. Corresponds to out4 in gnuradio
101 unsigned Receive5Frequency; // 6th rcvr. Corresponds to out5 in gnuradio
102 unsigned Receive6Frequency; // 7th rcvr. Corresponds to out6 in gnuradio
103 unsigned Receive7Frequency; // 8th rcvr. Corresponds to out7 in gnuradio
104
105 unsigned TransmitFrequency;
106 int NumReceivers;
107 int RxSampleRate;
108
109 unsigned char TxDrive;
110 unsigned char RxAtten; // not yet used (requires Hermes firmware V2.0)
111
112 unsigned int ClockSource; // upper 6-bits of clock control register
113
114 unsigned char AlexRxAnt; // Select Alex Receive Antenna or from T/R relay
115 unsigned char AlexTxAnt; // Select Alex Tx Antenna
116 unsigned char AlexRxHPF; // Select Alex Receive High Pass Filter
117 unsigned char AlexTxLPF; // Select Alex Transmit Low Pass Filter
118
119 int PTTMode;
120 bool RxPreamp;
121 bool ADCdither;
122 bool ADCrandom;
123 bool ADCoverload;
124 bool Duplex;
125
126 unsigned char HermesVersion;
127 unsigned int AIN1, AIN2, AIN3, AIN4, AIN5, AIN6; // Analog inputs to Hermes
128 unsigned int AlexRevPwr;
129 unsigned int SlowCount;
130 int Verbose;
131
132 bool TxStop;
133 bool PTTOffMutesTx; // PTT Off mutes the transmitter
134 bool PTTOnMutesRx; // PTT On receiver
135 char interface[16];
136
137 char mactarget[18]; // Requested target's MAC address as string
138 // "HH:HH:HH:HH:HH:HH" HH is hexadecimal string.
139 unsigned int metis_entry; // Index into Metis_card MAC table
140
141
142 HermesProxy(int RxFreq0, int RxFreq1, int RxFreq2, int RxFreq3, int RxFreq4,
143 int RxFreq5, int RxFreq6, int RxFreq7, int TxFreq, int RxPre,
144 int PTTModeSel, int PTTTxMute, int PTTRxMute,
145 unsigned char TxDr, int RxSmp, const char* Intfc,
146 const char * ClkS, int AlexRA, int AlexTA,
147 int AlexHPF, int AlexRPF, int Verbose, int NumRx,
148 const char* MACAddr); // constructor
149
150 ~HermesProxy(); // destructor
151
152 void Stop(); // stop ethernet I/O
153 void Start(); // start rx stream
154
155 void SendTxIQ(); // send an IQ buffer to Hermes transmit hardware
156 void BuildControlRegs(unsigned, RawBuf_t); // fill in the 8 byte sync+control registers from RegNum
157 int PutTxIQ(const gr_complex *, /*const gr_complex *,*/ int); // post a transmit TxIQ buffer
158 void ScheduleTxFrame(unsigned long); // Schedule a Tx frame
159 RawBuf_t GetNextTxBuf(); // get an empty Tx Buffer
160
161 void UpdateHermes(); // update control registers in Hermes without any Tx data
162
163 void ReceiveRxIQ(unsigned char *); // receive an IQ Ethernet frame from Hermes hardware via metis.cc thread
164 IQBuf_t GetRxIQ(); // Gnuradio pickup a received RxIQ buffer if available (next readable Rx buffer)
165 IQBuf_t GetNextRxBuf(); // get an empty output buffer, NULL if no new one available (next writable Rx buffer)
166 float Unpack2C(const unsigned char* inptr); // unpack 2's complement to float
167 unsigned int USBRowCount[MAXRECEIVERS]; // Rows (samples per receiver) for one USB frame.
168
169 void PrintRawBuf(RawBuf_t); // for debugging
170
171 // Not yet implemented
172 void ReceiveMicLR(); // receive an LR audio bufer from Hermes hardware
173
174};
175
176#endif // #ifndef HermesProxy_H
177
NUMTXBUFS
#define NUMTXBUFS
Definition HermesProxy.h:46
PTTOff
@ PTTOff
Definition HermesProxy.h:61
PTTOn
@ PTTOn
Definition HermesProxy.h:63
PTTVox
@ PTTVox
Definition HermesProxy.h:62
NUMRXIQBUFS
#define NUMRXIQBUFS
Definition HermesProxy.h:40
RawBuf_t
unsigned char * RawBuf_t
Definition HermesProxy.h:59
MAXRECEIVERS
#define MAXRECEIVERS
Definition HermesProxy.h:55
IQBuf_t
float * IQBuf_t
Definition HermesProxy.h:58
HermesProxy::Receive7Frequency
unsigned Receive7Frequency
Definition HermesProxy.h:103
HermesProxy::TxStop
bool TxStop
Definition HermesProxy.h:132
HermesProxy::PTTMode
int PTTMode
Definition HermesProxy.h:119
HermesProxy::BuildControlRegs
void BuildControlRegs(unsigned, RawBuf_t)
HermesProxy::~HermesProxy
~HermesProxy()
HermesProxy::mactarget
char mactarget[18]
Definition HermesProxy.h:137
HermesProxy::AIN6
unsigned int AIN6
Definition HermesProxy.h:127
HermesProxy::ReceiveMicLR
void ReceiveMicLR()
HermesProxy::RxSampleRate
int RxSampleRate
Definition HermesProxy.h:107
HermesProxy::Receive2Frequency
unsigned Receive2Frequency
Definition HermesProxy.h:98
HermesProxy::HermesProxy
HermesProxy(int RxFreq0, int RxFreq1, int RxFreq2, int RxFreq3, int RxFreq4, int RxFreq5, int RxFreq6, int RxFreq7, int TxFreq, int RxPre, int PTTModeSel, int PTTTxMute, int PTTRxMute, unsigned char TxDr, int RxSmp, const char *Intfc, const char *ClkS, int AlexRA, int AlexTA, int AlexHPF, int AlexRPF, int Verbose, int NumRx, const char *MACAddr)
HermesProxy::AlexRxAnt
unsigned char AlexRxAnt
Definition HermesProxy.h:114
HermesProxy::Start
void Start()
HermesProxy::HermesVersion
unsigned char HermesVersion
Definition HermesProxy.h:126
HermesProxy::Receive0Frequency
unsigned Receive0Frequency
Definition HermesProxy.h:96
HermesProxy::Receive4Frequency
unsigned Receive4Frequency
Definition HermesProxy.h:100
HermesProxy::PutTxIQ
int PutTxIQ(const gr_complex *, int)
HermesProxy::ADCrandom
bool ADCrandom
Definition HermesProxy.h:122
HermesProxy::AIN1
unsigned int AIN1
Definition HermesProxy.h:127
HermesProxy::PTTOnMutesRx
bool PTTOnMutesRx
Definition HermesProxy.h:134
HermesProxy::ADCoverload
bool ADCoverload
Definition HermesProxy.h:123
HermesProxy::AIN3
unsigned int AIN3
Definition HermesProxy.h:127
HermesProxy::AIN2
unsigned int AIN2
Definition HermesProxy.h:127
HermesProxy::Duplex
bool Duplex
Definition HermesProxy.h:124
HermesProxy::TxDrive
unsigned char TxDrive
Definition HermesProxy.h:109
HermesProxy::GetNextRxBuf
IQBuf_t GetNextRxBuf()
HermesProxy::TransmitFrequency
unsigned TransmitFrequency
Definition HermesProxy.h:105
HermesProxy::PrintRawBuf
void PrintRawBuf(RawBuf_t)
HermesProxy::ADCdither
bool ADCdither
Definition HermesProxy.h:121
HermesProxy::AlexTxAnt
unsigned char AlexTxAnt
Definition HermesProxy.h:115
HermesProxy::AIN4
unsigned int AIN4
Definition HermesProxy.h:127
HermesProxy::Receive5Frequency
unsigned Receive5Frequency
Definition HermesProxy.h:101
HermesProxy::RxPreamp
bool RxPreamp
Definition HermesProxy.h:120
HermesProxy::Receive3Frequency
unsigned Receive3Frequency
Definition HermesProxy.h:99
HermesProxy::UpdateHermes
void UpdateHermes()
HermesProxy::AlexRxHPF
unsigned char AlexRxHPF
Definition HermesProxy.h:116
HermesProxy::AIN5
unsigned int AIN5
Definition HermesProxy.h:127
HermesProxy::AlexTxLPF
unsigned char AlexTxLPF
Definition HermesProxy.h:117
HermesProxy::interface
char interface[16]
Definition HermesProxy.h:135
HermesProxy::ScheduleTxFrame
void ScheduleTxFrame(unsigned long)
HermesProxy::ReceiveRxIQ
void ReceiveRxIQ(unsigned char *)
HermesProxy::Unpack2C
float Unpack2C(const unsigned char *inptr)
HermesProxy::GetNextTxBuf
RawBuf_t GetNextTxBuf()
HermesProxy::GetRxIQ
IQBuf_t GetRxIQ()
HermesProxy::metis_entry
unsigned int metis_entry
Definition HermesProxy.h:139
HermesProxy::RxAtten
unsigned char RxAtten
Definition HermesProxy.h:110
HermesProxy::NumReceivers
int NumReceivers
Definition HermesProxy.h:106
HermesProxy::Verbose
int Verbose
Definition HermesProxy.h:130
HermesProxy::SlowCount
unsigned int SlowCount
Definition HermesProxy.h:129
HermesProxy::Stop
void Stop()
HermesProxy::USBRowCount
unsigned int USBRowCount[MAXRECEIVERS]
Definition HermesProxy.h:167
HermesProxy::Receive1Frequency
unsigned Receive1Frequency
Definition HermesProxy.h:97
HermesProxy::SendTxIQ
void SendTxIQ()
HermesProxy::AlexRevPwr
unsigned int AlexRevPwr
Definition HermesProxy.h:128
HermesProxy::Receive6Frequency
unsigned Receive6Frequency
Definition HermesProxy.h:102
HermesProxy::PTTOffMutesTx
bool PTTOffMutesTx
Definition HermesProxy.h:133
HermesProxy::ClockSource
unsigned int ClockSource
Definition HermesProxy.h:112