diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp
index 94626fbb4..eb28ac70a 100644
--- a/MMDVMHost.cpp
+++ b/MMDVMHost.cpp
@@ -27,6 +27,7 @@
#include "NullDisplay.h"
#include "YSFControl.h"
#include "Nextion.h"
+#include "Thread.h"
#if defined(HD44780)
#include "HD44780.h"
@@ -568,13 +569,8 @@ int CMMDVMHost::run()
m_dmrTXTimer.stop();
}
- if (ms < 5U) {
-#if defined(_WIN32) || defined(_WIN64)
- ::Sleep(5UL); // 5ms
-#else
- ::usleep(5000); // 5ms
-#endif
- }
+ if (ms < 5U)
+ CThread::sleep(5U);
}
LogMessage("MMDVMHost-%s is exiting on receipt of SIGHUP1", VERSION);
diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj
index 1803f8c2d..1fc59127a 100644
--- a/MMDVMHost.vcxproj
+++ b/MMDVMHost.vcxproj
@@ -187,6 +187,7 @@
+
@@ -236,6 +237,7 @@
+
diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters
index b271f5929..cf774a742 100644
--- a/MMDVMHost.vcxproj.filters
+++ b/MMDVMHost.vcxproj.filters
@@ -164,6 +164,9 @@
Header Files
+
+ Header Files
+
@@ -301,5 +304,8 @@
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 830ee3694..9e24b70cd 100644
--- a/Makefile
+++ b/Makefile
@@ -9,8 +9,8 @@ LDFLAGS = -g
OBJECTS = \
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
DMRShortLC.o DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o Log.o MMDVMHost.o Modem.o \
- Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o \
- YSFFICH.o YSFNetwork.o YSFPayload.o
+ Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o \
+ YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost
diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit
index 5ef85b35e..e929fb6d4 100644
--- a/Makefile.Pi.Adafruit
+++ b/Makefile.Pi.Adafruit
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
DMRShortLC.o DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o MMDVMHost.o \
- Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o UDPSocket.o Utils.o YSFControl.o \
+ Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o \
YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost
diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780
index 7ac9e204f..9294eade3 100644
--- a/Makefile.Pi.HD44780
+++ b/Makefile.Pi.HD44780
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
DMRShortLC.o DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o MMDVMHost.o \
- Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o UDPSocket.o Utils.o YSFControl.o \
+ Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o \
YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost
diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED
index bd7df7f33..95298f7f8 100644
--- a/Makefile.Pi.OLED
+++ b/Makefile.Pi.OLED
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
DMRShortLC.o DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o OLED.o Log.o MMDVMHost.o \
- Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o UDPSocket.o Utils.o YSFControl.o \
+ Modem.o Nextion.o NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o \
YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost
diff --git a/Modem.cpp b/Modem.cpp
index a03e5f37c..c16bf4397 100644
--- a/Modem.cpp
+++ b/Modem.cpp
@@ -20,6 +20,7 @@
#include "DMRDefines.h"
#include "YSFDefines.h"
#include "Defines.h"
+#include "Thread.h"
#include "Modem.h"
#include "Utils.h"
#include "Log.h"
@@ -717,11 +718,7 @@ bool CModem::readVersion()
return false;
for (unsigned int count = 0U; count < MAX_RESPONSES; count++) {
-#if defined(_WIN32) || defined(_WIN64)
- ::Sleep(10UL);
-#else
- ::usleep(10000UL);
-#endif
+ CThread::sleep(10U);
RESP_TYPE_MMDVM resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] == MMDVM_GET_VERSION) {
LogInfo("MMDVM protocol version: %u, description: %.*s", m_buffer[3U], m_length - 4U, m_buffer + 4U);
@@ -729,11 +726,7 @@ bool CModem::readVersion()
}
}
-#if defined(_WIN32) || defined(_WIN64)
- ::Sleep(1000UL); // 1s
-#else
- ::sleep(1UL); // 1s
-#endif
+ CThread::sleep(1000U);
}
LogError("Unable to read the firmware version after six attempts");
@@ -802,13 +795,9 @@ bool CModem::setConfig()
unsigned int count = 0U;
RESP_TYPE_MMDVM resp;
do {
-#if defined(_WIN32) || defined(_WIN64)
- ::Sleep(10UL);
-#else
- ::usleep(10000UL);
-#endif
- resp = getResponse();
+ CThread::sleep(10U);
+ resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
count++;
if (count >= MAX_RESPONSES) {
@@ -861,13 +850,9 @@ bool CModem::setFrequency()
unsigned int count = 0U;
RESP_TYPE_MMDVM resp;
do {
-#if defined(_WIN32) || defined(_WIN64)
- ::Sleep(10UL);
-#else
- ::usleep(10000UL);
-#endif
- resp = getResponse();
+ CThread::sleep(10U);
+ resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
count++;
if (count >= MAX_RESPONSES) {
diff --git a/Thread.cpp b/Thread.cpp
new file mode 100644
index 000000000..9f43374ef
--- /dev/null
+++ b/Thread.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "Thread.h"
+
+#if defined(_WIN32) || defined(_WIN64)
+
+CThread::CThread() :
+m_handle()
+{
+}
+
+CThread::~CThread()
+{
+}
+
+bool CThread::run()
+{
+ m_handle = ::CreateThread(NULL, 0, &helper, this, 0, NULL);
+
+ return m_handle != NULL;
+}
+
+
+void CThread::wait()
+{
+ ::WaitForSingleObject(m_handle, INFINITE);
+
+ ::CloseHandle(m_handle);
+}
+
+
+DWORD CThread::helper(LPVOID arg)
+{
+ CThread* p = (CThread*)arg;
+
+ p->entry();
+
+ return 0UL;
+}
+
+void CThread::sleep(unsigned int ms)
+{
+ ::Sleep(ms);
+}
+
+#else
+
+CThread::CThread() :
+m_thread()
+{
+}
+
+CThread::~CThread()
+{
+}
+
+bool CThread::run()
+{
+ return ::pthread_create(&m_thread, NULL, helper, this) == 0;
+}
+
+
+void CThread::wait()
+{
+ ::pthread_join(m_thread, NULL);
+}
+
+
+void* CThread::helper(void* arg)
+{
+ CThread* p = (CThread*)arg;
+
+ p->entry();
+
+ return NULL;
+}
+
+void CThread::sleep(unsigned int ms)
+{
+ ::usleep(ms * 1000);
+}
+
+#endif
diff --git a/Thread.h b/Thread.h
new file mode 100644
index 000000000..8a6843fd2
--- /dev/null
+++ b/Thread.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#if !defined(THREAD_H)
+#define THREAD_H
+
+#if defined(_WIN32) || defined(_WIN64)
+#include
+#else
+#include
+#endif
+
+class CThread
+{
+public:
+ CThread();
+ virtual ~CThread();
+
+ virtual bool run();
+
+ virtual void entry() = 0;
+
+ virtual void wait();
+
+ static void sleep(unsigned int ms);
+
+private:
+#if defined(_WIN32) || defined(_WIN64)
+ HANDLE m_handle;
+#else
+ pthread_t m_thread;
+#endif
+
+#if defined(_WIN32) || defined(_WIN64)
+ static DWORD __stdcall helper(LPVOID arg);
+#else
+ static void* helper(void* arg);
+#endif
+};
+
+#endif