aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/Transceiver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M/Transceiver.cpp')
-rw-r--r--Transceiver52M/Transceiver.cpp49
1 files changed, 38 insertions, 11 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 7b60cd2..ff8c12e 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -87,6 +87,7 @@ Transceiver::Transceiver(int wBasePort,
}
mOn = false;
+ mRunning = false;
mTxFreq = 0.0;
mRxFreq = 0.0;
mPower = -10;
@@ -307,10 +308,17 @@ void Transceiver::pullFIFO()
void Transceiver::start()
{
+ mRunning = true;
mControlServiceLoopThread = new Thread(32768);
mControlServiceLoopThread->start((void * (*)(void*))ControlServiceLoopAdapter,(void*) this);
}
+void Transceiver::shutdown()
+{
+ mOn = false;
+ mRunning = false;
+}
+
void Transceiver::reset()
{
mTransmitPriorityQueue->clear();
@@ -326,10 +334,19 @@ void Transceiver::driveControl()
char buffer[MAX_PACKET_LENGTH];
int msgLen = -1;
buffer[0] = '\0';
-
- msgLen = mControlSocket.read(buffer);
- if (msgLen < 1) {
+ try {
+ msgLen = mControlSocket.read(buffer);
+ if (msgLen < 1) {
+ return;
+ }
+ } catch (...) {
+ /* Ignore the read exception on shutdown */
+ if (!mRunning) {
+ return;
+ }
+
+ LOG(ALERT) << "Caught UHD socket exception";
return;
}
@@ -501,14 +518,24 @@ void Transceiver::driveControl()
bool Transceiver::driveTransmitPriorityQueue()
{
-
char buffer[gSlotLen+50];
- // check data socket
- size_t msgLen = mDataSocket.read(buffer);
+ if (!mOn)
+ return true;
+
+ try {
+ size_t msgLen = mDataSocket.read(buffer);
+ if (msgLen!=gSlotLen+1+4+1) {
+ LOG(ERR) << "badly formatted packet on GSM->TRX interface";
+ return false;
+ }
+ } catch (...) {
+ if (!mOn) {
+ /* Shutdown condition. End the thread. */
+ return true;
+ }
- if (msgLen!=gSlotLen+1+4+1) {
- LOG(ERR) << "badly formatted packet on GSM->TRX interface";
+ LOG(ALERT) << "Caught UHD socket exception";
return false;
}
@@ -579,7 +606,7 @@ void Transceiver::writeClockInterface()
void *FIFOServiceLoopAdapter(Transceiver *transceiver)
{
- while (1) {
+ while (transceiver->on()) {
transceiver->pullFIFO();
pthread_testcancel();
}
@@ -588,7 +615,7 @@ void *FIFOServiceLoopAdapter(Transceiver *transceiver)
void *ControlServiceLoopAdapter(Transceiver *transceiver)
{
- while (1) {
+ while (transceiver->running()) {
transceiver->driveControl();
pthread_testcancel();
}
@@ -597,7 +624,7 @@ void *ControlServiceLoopAdapter(Transceiver *transceiver)
void *TransmitPriorityQueueServiceLoopAdapter(Transceiver *transceiver)
{
- while (1) {
+ while (transceiver->on()) {
bool stale = false;
// Flush the UDP packets until a successful transfer.
while (!transceiver->driveTransmitPriorityQueue()) {