aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/DriveLoop.h
AgeCommit message (Collapse)AuthorFilesLines
2013-06-24transceiver: mcbts: remove unused call in drive loopThomas Tsou1-3/+0
Inside the drive loop addRadioVector() is duplicate call that was not removed from the previous separation of the main loop and transceiver instances. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
2013-06-24multi-arfcn: refactor to match upstream GSM coreThomas Tsou1-13/+20
This patch aligns the multicarrier (MC) USRP code with released GSM core changes that accommodate the MC RAD1. Primary changes are: 1. Runtime setting of number of channelizer paths 2. Matching channelizer path to ARFCN mapping of GSM core 3. Use a single clock update socket on the drive loop 4. Match transceiver data and control socket ports Setting of channelizer paths (or width) was previously fixed at compile time. In either case, channelizer width is limited by the sample rate of the device and channel spacing of the maximally decimated filterbank. Available settings are 1, 5, and 10 channels, which accommodate any number of ARFCN's in between. Also add the frequency offsets to handle the effective shift in setting RF frequency. Previous assumption was to place C0 at the center frequency, but RAD1 assumes C0 at the leftmost carrier, so adjust accordingly. The rest is general consolidation to mostly match the RAD1 interaction with GSM core. There is some loss of flexibility to run, say, multiple independent instances of OpenBTS through a single bank of channelized transceivers. But, the better compatibility and reduction in code is the appropriate tradeoff. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
2013-06-24multi-arfcn, trx: fix infinite energy threshold bugThomas Tsou1-0/+3
This fixes a bug where the energy threshold may reach infinity. The transceiver energy detection threshold increase is dependent on elapsed frames and the previous false detection time. If we assume a (0,0) start time with the actual start time - randomly determined - it's possible to get very large elapsed frame counts at start. Once the threshold hits 'inf' further calculations are impossible and transceiver is locked out from use. Use the actual start time for initializing variables so we avoid this scenario. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
2013-06-24multi-arfcn, trx: handle thread exiting on shutdownThomas Tsou1-0/+5
Previous approach was to allow stack unwinding to take care shutdown and thread ending, which was unpredictable and occasionally segfault. Attempt to shutdown more gracefully. There are thread cancellation points in the transceiver code using pthread_testcancel(), but the thread abstraction library does not allow direct access to the pthread variables. This prevents thread shutdown through pthread_cancel(). To get around this, use boolean status values in the receive socket service loops and main drive loop. The socket read calls will block indefinitly, so shutdown may cause the socket implementation to throw a SocketError exception. Use of timeout values with reads does not seem to work correctly or reliably, so catch the exception and ignore if it occurs on shutdown. The following error may appear as the socket is shutdown while the Transceiver is blocking on read(). DatagramSocket::read() failed: Bad file descriptor So be it; the API doesn't allow us to do any more. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
2013-06-24multi-arfcn, trx: remove unused reset() call in drive loopThomas Tsou1-2/+0
This call is a remnant of the Transceiver / DriveLoop split. The empty call is never used. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
2013-06-24multi-arfcn, trx: split transceiver to handle multiple channelsThomas Tsou1-0/+185
This patch separates the 'Transceiver' into a multi-channel I/O component and single channel component. The latter may may have multiple instances. The receive FIFO is converted to a thread-safe queue. The 'TransceiverIO' continuously drives the receive and transmit loops. In this process, bursts are driven into thread-safe FIFO's and read from the priority queues. Filler bursts are inserted if no transmit data is available. Each 'Transceiver' instance attaches to the I/O object and creates its own threads and sockets, which include blocking on the receive FIFO for the attached channel. Each instance also handles its own control loop and clock indications. Signed-off-by: Thomas Tsou <ttsou@vt.edu>