GNU Radio's HERMESLITE2 Package
HermesProxy.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2013-2015 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
33#include <gnuradio/io_signature.h>
34
35#include <semaphore.h>
36
37#ifndef HermesProxy_H
38#define HermesProxy_H
39
40#define NUMRXIQBUFS 512 // 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 512 // 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
57typedef float* IQBuf_t; // IQ buffer type (IQ samples as floats)
58typedef unsigned char* RawBuf_t; // Raw transmit buffer type
59
60enum { PTTOff, // PTT disabled
61 PTTVox, // PTT vox mode (examines TxFrame to decide whether to Tx)
62 PTTOn }; // PTT force Tx on
63
65{
66
67private:
68
69 IQBuf_t RxIQBuf[NUMRXIQBUFS]; // ReceiveIQ buffers
70 unsigned RxWriteCounter; // Which Rx buffer to write to
71 unsigned RxReadCounter; // Which Rx buffer to read from
72 unsigned RxWriteFill; // Fill level of the RxWrite buffer
73 bool TxHoldOff; // Transmit buffer holdoff flag
74
75 RawBuf_t TxBuf[NUMTXBUFS]; // Transmit buffers
76 unsigned TxWriteCounter; // Which Tx buffer to write to
77 unsigned TxReadCounter; // Which Tx buffer to read from
78 unsigned TxControlCycler; // Which Tx control register set to send
79 unsigned TxFrameIdleCount; // How long we've gone since sending a TxFrame
80
81 unsigned long LostRxBufCount; // Lost-buffer counter for packets we actually got
82 unsigned long TotalRxBufCount; // Total buffer count (may roll over)
83 unsigned long LostTxBufCount; //
84 unsigned long TotalTxBufCount; //
85 unsigned long CorruptRxCount; //
86 unsigned long LostEthernetRx; //
87 unsigned long CurrentEthSeqNum; // Diagnostic
88 bool FirstEthSeq;
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 sem_t rx_sem; // RX semaphore
94
95
96public:
97
98 unsigned Receive0Frequency; // 1st rcvr. Corresponds to out0 in gnuradio
99 unsigned Receive1Frequency; // 2nd rcvr. Corresponds to out1 in gnuradio
100 unsigned Receive2Frequency; // 3rd rcvr. Corresponds to out2 in gnuradio
101 unsigned Receive3Frequency; // 4th rcvr. Corresponds to out3 in gnuradio
102 unsigned Receive4Frequency; // 5th rcvr. Corresponds to out4 in gnuradio
103 unsigned Receive5Frequency; // 6th rcvr. Corresponds to out5 in gnuradio
104 unsigned Receive6Frequency; // 7th rcvr. Corresponds to out6 in gnuradio
105 unsigned Receive7Frequency; // 8th rcvr. Corresponds to out7 in gnuradio
109
110 unsigned char TxDrive;
111
114 bool Duplex;
115 bool HardwareAGC; // HL2 Hardware AGC
116 int LNAGain; // HL2 LNA Gain
117 bool OnboardPA; // HL2 Onboard PA
118 bool Q5Switch; // HL2 Q5 switch external PTT in low power mode
119
120 unsigned char HermesVersion;
121 unsigned int AIN1, AIN2, AIN3, AIN4, AIN5, AIN6; // Analog inputs to Hermes
122 unsigned int AlexRevPwr;
123 unsigned int SlowCount;
125
126 bool TxStop;
127 bool PTTOffMutesTx; // PTT Off mutes the transmitter
128 bool PTTOnMutesRx; // PTT On receiver
129 char interface[16];
130
131 char mactarget[18]; // Requested target's MAC address as string
132 // "HH:HH:HH:HH:HH:HH" HH is hexadecimal string.
133 unsigned int metis_entry; // Index into Metis_card MAC table
134
135
136 HermesProxy(int RxFreq0, int RxFreq1, int RxFreq2, int RxFreq3, int RxFreq4,
137 int RxFreq5, int RxFreq6, int RxFreq7, int TxFreq,
138 int PTTModeSel, bool PTTTxMute, bool PTTRxMute,
139 unsigned char TxDr, int RxSmp, const char* Intfc,
140 int Verbose, int NumRx,
141 const char* MACAddr, bool AGC, int LNAG, bool PA, bool Q5); // constructor
142
143 ~HermesProxy(); // destructor
144
145 void Stop(); // stop ethernet I/O
146 void Start(); // start rx stream
147
148 void SendTxIQ(); // send an IQ buffer to Hermes transmit hardware
149 void BuildControlRegs(unsigned, RawBuf_t); // fill in the 8 byte sync+control registers from RegNum
150 int PutTxIQ(const gr_complex *, /*const gr_complex *,*/ int); // post a transmit TxIQ buffer
151 void ScheduleTxFrame(unsigned long); // Schedule a Tx frame
152 RawBuf_t GetNextTxBuf(); // get an empty Tx Buffer
153
154 void UpdateHermes(); // update control registers in Hermes without any Tx data
155
156 void ReceiveRxIQ(unsigned char *); // receive an IQ buffer from Hermes hardware via metis.cc thread
157 IQBuf_t GetRxIQ(); // Gnuradio pickup a received RxIQ buffer if available (next readable Rx buffer)
158 IQBuf_t GetNextRxBuf(); // get an empty output buffer, NULL if no new one available (next writable Rx buffer)
159 float Unpack2C(const unsigned char* inptr); // unpack 2's complement to float
161
162 void PrintRawBuf(RawBuf_t); // for debugging
163
164 // Not yet implemented
165
166 void ReceiveMicLR(); // receive an LR audio bufer from Hermes hardware
167
168};
169
170#endif // #ifndef HermesProxy_H
171
@ PTTOff
Definition HermesProxy.h:60
@ PTTOn
Definition HermesProxy.h:62
@ PTTVox
Definition HermesProxy.h:61
#define NUMTXBUFS
Definition HermesProxy.h:46
#define NUMRXIQBUFS
Definition HermesProxy.h:40
unsigned char * RawBuf_t
Definition HermesProxy.h:58
#define MAXRECEIVERS
Definition HermesProxy.h:55
float * IQBuf_t
Definition HermesProxy.h:57
Definition HermesProxy.h:65
unsigned Receive7Frequency
Definition HermesProxy.h:105
bool TxStop
Definition HermesProxy.h:126
int PTTMode
Definition HermesProxy.h:112
void BuildControlRegs(unsigned, RawBuf_t)
char mactarget[18]
Definition HermesProxy.h:131
unsigned int AIN6
Definition HermesProxy.h:121
void ReceiveMicLR()
int RxSampleRate
Definition HermesProxy.h:108
unsigned Receive2Frequency
Definition HermesProxy.h:100
bool Q5Switch
Definition HermesProxy.h:118
int LNAGain
Definition HermesProxy.h:116
void Start()
unsigned char HermesVersion
Definition HermesProxy.h:120
bool HardwareAGC
Definition HermesProxy.h:115
unsigned Receive0Frequency
Definition HermesProxy.h:98
unsigned Receive4Frequency
Definition HermesProxy.h:102
int PutTxIQ(const gr_complex *, int)
unsigned int AIN1
Definition HermesProxy.h:121
bool OnboardPA
Definition HermesProxy.h:117
bool PTTOnMutesRx
Definition HermesProxy.h:128
bool ADCoverload
Definition HermesProxy.h:113
unsigned int AIN3
Definition HermesProxy.h:121
unsigned int AIN2
Definition HermesProxy.h:121
bool Duplex
Definition HermesProxy.h:114
unsigned char TxDrive
Definition HermesProxy.h:110
IQBuf_t GetNextRxBuf()
unsigned TransmitFrequency
Definition HermesProxy.h:106
void PrintRawBuf(RawBuf_t)
unsigned int AIN4
Definition HermesProxy.h:121
unsigned Receive5Frequency
Definition HermesProxy.h:103
unsigned Receive3Frequency
Definition HermesProxy.h:101
void UpdateHermes()
unsigned int AIN5
Definition HermesProxy.h:121
char interface[16]
Definition HermesProxy.h:129
void ScheduleTxFrame(unsigned long)
void ReceiveRxIQ(unsigned char *)
float Unpack2C(const unsigned char *inptr)
RawBuf_t GetNextTxBuf()
HermesProxy(int RxFreq0, int RxFreq1, int RxFreq2, int RxFreq3, int RxFreq4, int RxFreq5, int RxFreq6, int RxFreq7, int TxFreq, int PTTModeSel, bool PTTTxMute, bool PTTRxMute, unsigned char TxDr, int RxSmp, const char *Intfc, int Verbose, int NumRx, const char *MACAddr, bool AGC, int LNAG, bool PA, bool Q5)
IQBuf_t GetRxIQ()
unsigned int metis_entry
Definition HermesProxy.h:133
int NumReceivers
Definition HermesProxy.h:107
int Verbose
Definition HermesProxy.h:124
unsigned int SlowCount
Definition HermesProxy.h:123
unsigned int USBRowCount[MAXRECEIVERS]
Definition HermesProxy.h:160
unsigned Receive1Frequency
Definition HermesProxy.h:99
void SendTxIQ()
unsigned int AlexRevPwr
Definition HermesProxy.h:122
unsigned Receive6Frequency
Definition HermesProxy.h:104
bool PTTOffMutesTx
Definition HermesProxy.h:127