[hamradio-commits] [cubicsdr] 01/08: New upstream version 0.2.2+dfsg
Andreas E. Bombe
aeb at moszumanska.debian.org
Mon Aug 21 19:45:10 UTC 2017
This is an automated email from the git hooks/post-receive script.
aeb pushed a commit to branch master
in repository cubicsdr.
commit 1bd0f6b90c79716d98ab6cddf0b8b254ab0b8c8c
Author: Andreas Bombe <aeb at debian.org>
Date: Wed Aug 9 00:03:39 2017 -0400
New upstream version 0.2.2+dfsg
---
CMakeLists.txt | 45 +-
external/rs232/README | 29 ++
external/rs232/README.md | 13 +
external/rs232/rs232-linux.cpp | 261 ++++++++++
external/rs232/rs232-win.cpp | 253 ++++++++++
external/rs232/rs232.h | 156 ++++++
src/AppConfig.cpp | 4 +
src/AppFrame.cpp | 81 +++-
src/AppFrame.h | 12 +-
src/BookmarkMgr.cpp | 88 ++--
src/BookmarkMgr.h | 27 +-
src/CubicSDR.cpp | 2 +-
src/demod/DemodulatorInstance.cpp | 8 +-
src/demod/DemodulatorMgr.cpp | 30 +-
src/demod/DemodulatorMgr.h | 5 +
src/forms/Bookmark/BookmarkPanel.cpp | 24 +-
src/forms/Bookmark/BookmarkPanel.fbp | 10 +-
src/forms/Bookmark/BookmarkPanel.h | 4 +-
src/forms/Bookmark/BookmarkView.cpp | 202 +++-----
src/forms/Bookmark/BookmarkView.h | 4 +-
src/forms/Dialog/AboutDialog.fbp | 500 ++++++++++++++++++-
src/forms/Dialog/AboutDialogBase.cpp | 24 +
src/forms/Dialog/AboutDialogBase.h | 6 +
src/forms/Dialog/PortSelectorDialog.cpp | 39 ++
src/forms/Dialog/PortSelectorDialog.fbp | 727 ++++++++++++++++++++++++++++
src/forms/Dialog/PortSelectorDialog.h | 11 +
src/forms/Dialog/PortSelectorDialogBase.cpp | 78 +++
src/forms/Dialog/PortSelectorDialogBase.h | 58 +++
src/modules/modem/analog/ModemLSB.cpp | 17 -
src/modules/modem/analog/ModemLSB.h | 6 -
src/modules/modem/analog/ModemUSB.cpp | 17 -
src/modules/modem/analog/ModemUSB.h | 5 -
src/util/GLFont.cpp | 5 -
src/visual/PrimaryGLContext.cpp | 6 +-
src/visual/ScopeContext.cpp | 2 +-
35 files changed, 2464 insertions(+), 295 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 355ccfa..6a65c6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
SET(CUBICSDR_VERSION_MAJOR "0")
SET(CUBICSDR_VERSION_MINOR "2")
SET(CUBICSDR_VERSION_PATCH "2")
-SET(CUBICSDR_VERSION_SUFFIX "-alpha")
+SET(CUBICSDR_VERSION_SUFFIX "")
SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}")
SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}")
@@ -27,6 +27,8 @@ IF(CUSTOM_BUILD)
# feature flags
SET (CUBICSDR_ENABLE_VIEW_DEMOD ON CACHE BOOL "Enable Second Demodulator Spectrum/Waterfall view.")
SET (CUBICSDR_ENABLE_VIEW_SCOPE ON CACHE BOOL "Enable Demodulator Scope/Spectrum view.")
+ SET (CUBICSDR_ENABLE_ABOUT_DIALOG ON CACHE BOOL "Enable About Dialog.")
+ SET (CUBICSDR_DEFAULT_HIDE_BOOKMARKS OFF CACHE BOOL "Hide Bookmarks by Default.")
SET (CUBICSDR_MODEM_EXCLUDE CACHE "" "Comma-separated list of modems to exclude.")
IF (NOT CUBICSDR_HEADER_IMAGE STREQUAL "")
@@ -52,8 +54,10 @@ ELSE()
SET (CUBICSDR_HEADER_IMAGE "")
SET (CUBICSDR_HEADER_BG "")
# feature flags
- SET (CUBICSDR_ENABLE_VIEW_DEMOD TRUE)
- SET (CUBICSDR_ENABLE_VIEW_SCOPE TRUE)
+ SET (CUBICSDR_ENABLE_VIEW_DEMOD ON)
+ SET (CUBICSDR_ENABLE_VIEW_SCOPE ON)
+ SET (CUBICSDR_DEFAULT_HIDE_BOOKMARKS OFF)
+ SET (CUBICSDR_ENABLE_ABOUT_DIALOG ON)
SET (CUBICSDR_EXCLUDE_MODEM "")
ENDIF()
@@ -65,6 +69,14 @@ IF(CUBICSDR_ENABLE_VIEW_SCOPE)
ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_SCOPE=1 )
ENDIF()
+IF(CUBICSDR_DEFAULT_HIDE_BOOKMARKS)
+ ADD_DEFINITIONS( -DCUBICSDR_DEFAULT_HIDE_BOOKMARKS=1 )
+ENDIF()
+
+IF(CUBICSDR_ENABLE_ABOUT_DIALOG)
+ ADD_DEFINITIONS( -DCUBICSDR_ENABLE_ABOUT_DIALOG=1 )
+ENDIF()
+
ADD_DEFINITIONS(
-DCUBICSDR_INSTALL_NAME="${CUBICSDR_INSTALL_NAME}"
-DCUBICSDR_VERSION="${CUBICSDR_VERSION}"
@@ -528,12 +540,33 @@ ENDIF()
IF (USE_HAMLIB)
SET (cubicsdr_headers
${cubicsdr_headers}
+ src/forms/Dialog/PortSelectorDialogBase.h
+ src/forms/Dialog/PortSelectorDialog.h
src/rig/RigThread.h
+ external/rs232/rs232.h
)
SET (cubicsdr_sources
${cubicsdr_sources}
+ src/forms/Dialog/PortSelectorDialogBase.cpp
+ src/forms/Dialog/PortSelectorDialog.cpp
src/rig/RigThread.cpp
)
+
+ IF(WIN32)
+ SET (cubicsdr_sources
+ ${cubicsdr_sources}
+ external/rs232/rs232-win.cpp
+ )
+ ELSE()
+ SET (cubicsdr_sources
+ ${cubicsdr_sources}
+ external/rs232/rs232-linux.cpp
+ )
+ ENDIF()
+
+ include_directories (
+ external/rs232/
+ )
ENDIF()
@@ -571,6 +604,7 @@ SOURCE_GROUP("Forms\\Dialog" REGULAR_EXPRESSION "src/forms/Dialog/${REG_EXT}")
SOURCE_GROUP("SDR" REGULAR_EXPRESSION "src/sdr/${REG_EXT}")
IF(USE_HAMLIB)
SOURCE_GROUP("Rig" REGULAR_EXPRESSION "src/rig/${REG_EXT}")
+ SOURCE_GROUP("_ext-RS-232" REGULAR_EXPRESSION "external/rs232/${REG_EXT}")
ENDIF()
SOURCE_GROUP("Demodulator" REGULAR_EXPRESSION "src/demod/${REG_EXT}")
SOURCE_GROUP("Modem" REGULAR_EXPRESSION "src/modules/modem/${REG_EXT}")
@@ -733,9 +767,10 @@ IF (APPLE AND BUNDLE_APP)
IF (BUNDLE_SOAPY_MODS)
message(STATUS "SOAPY_ROOT: ${SOAPY_SDR_ROOT}")
- SET(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/${SOAPY_SDR_ABI_VERSION}")
+ SET(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}")
+ message(STATUS "SOAPY_SDR_MOD_PATH: ${SOAPY_SDR_MOD_PATH}")
- file(GLOB SOAPY_MODS ${SOAPY_MOD_PATH}/*.so)
+ file(GLOB SOAPY_MODS ${SOAPY_SDR_MOD_PATH}/*.so)
FOREACH(SOAPY_MOD_FILE ${SOAPY_MODS})
INSTALL( FILES "${SOAPY_MOD_FILE}"
diff --git a/external/rs232/README b/external/rs232/README
new file mode 100644
index 0000000..6cac813
--- /dev/null
+++ b/external/rs232/README
@@ -0,0 +1,29 @@
+Cross-platform serial / RS232 library
+Version 0.21, 11/10/2015
+The MIT License (MIT)
+
+Supported platforms:
+- Windows (XP / Win7, possibly 8 and 10)
+- Linux
+- MacOS X
+
+Copyright (c) 2007 - 2015 Fr�d�ric Meslin
+Contact: fredericmeslin at hotmail.com, @marzacdev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/external/rs232/README.md b/external/rs232/README.md
new file mode 100644
index 0000000..2a38508
--- /dev/null
+++ b/external/rs232/README.md
@@ -0,0 +1,13 @@
+# rs232
+C / C++ RS232 cross-platform serial library
+Version 0.21, 11/10/2015
+
+Supported platforms:
+- Windows (XP / Win7, possibly 8 and 10)
+- Linux
+- MacOS X
+
+Copyright (c) 2013-2015 Fr�d�ric Meslin
+Email: fredericmeslin at hotmail.com
+Website: www.fredslab.net
+Twitter: @marzacdev
diff --git a/external/rs232/rs232-linux.cpp b/external/rs232/rs232-linux.cpp
new file mode 100644
index 0000000..c8e629a
--- /dev/null
+++ b/external/rs232/rs232-linux.cpp
@@ -0,0 +1,261 @@
+/*
+ Cross-platform serial / RS232 library
+ Version 0.21, 11/10/2015
+ -> LINUX and MacOS implementation
+ -> rs232-linux.c
+
+ The MIT License (MIT)
+
+ Copyright (c) 2013-2015 Frédéric Meslin, Florent Touchard
+ Email: fredericmeslin at hotmail.com
+ Website: www.fredslab.net
+ Twitter: @marzacdev
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+*/
+
+#if defined(__unix__) || defined(__unix) || \
+ defined(__APPLE__) && defined(__MACH__)
+
+#define _DARWIN_C_SOURCE
+
+#include "rs232.h"
+
+#include <unistd.h>
+#define __USE_MISC // For CRTSCTS
+#include <termios.h>
+#include <fcntl.h>
+#include <dirent.h>
+
+#define __USE_SVID // For strdup
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/*****************************************************************************/
+/** Base name for COM devices */
+#if defined(__APPLE__) && defined(__MACH__)
+ static const char * devBases[] = {
+ "tty."
+ };
+ static int noBases = 1;
+#else
+ static const char * devBases[] = {
+ "ttyACM", "ttyUSB", "rfcomm", "ttyS"
+ };
+ static int noBases = 4;
+#endif
+
+/*****************************************************************************/
+typedef struct {
+ char * port;
+ int handle;
+} COMDevice;
+
+#define COM_MAXDEVICES 64
+static COMDevice comDevices[COM_MAXDEVICES];
+static int noDevices = 0;
+
+/*****************************************************************************/
+/** Private functions */
+void _AppendDevices(const char * base);
+int _BaudFlag(int BaudRate);
+
+/*****************************************************************************/
+int comEnumerate()
+{
+ for (int i = 0; i < noDevices; i++) {
+ if (comDevices[i].port) free(comDevices[i].port);
+ comDevices[i].port = NULL;
+ }
+ noDevices = 0;
+ for (int i = 0; i < noBases; i++)
+ _AppendDevices(devBases[i]);
+ return noDevices;
+}
+
+void comTerminate()
+{
+ comCloseAll();
+ for (int i = 0; i < noDevices; i++) {
+ if (comDevices[i].port) free(comDevices[i].port);
+ comDevices[i].port = NULL;
+ }
+}
+
+int comGetNoPorts()
+{
+ return noDevices;
+}
+
+/*****************************************************************************/
+int comFindPort(const char * name)
+{
+ int p;
+ for (p = 0; p < noDevices; p++)
+ if (strcmp(name, comDevices[p].port) == 0)
+ return p;
+ return -1;
+}
+
+const char * comGetInternalName(int index)
+{
+ #define COM_MAXNAME 128
+ static char name[COM_MAXNAME];
+ if (index >= noDevices || index < 0)
+ return NULL;
+ sprintf(name, "/dev/%s", comDevices[index].port);
+ return name;
+}
+
+const char * comGetPortName(int index) {
+ if (index >= noDevices || index < 0)
+ return NULL;
+ return comDevices[index].port;
+}
+
+/*****************************************************************************/
+int comOpen(int index, int baudrate)
+{
+ if (index >= noDevices || index < 0)
+ return 0;
+// Close if already open
+ COMDevice * com = &comDevices[index];
+ if (com->handle >= 0) comClose(index);
+// Open port
+ printf("Try %s \n", comGetInternalName(index));
+ int handle = open(comGetInternalName(index), O_RDWR | O_NOCTTY | O_NDELAY);
+ if (handle < 0)
+ return 0;
+ printf("Open %s \n", comGetInternalName(index));
+// General configuration
+ struct termios config;
+ memset(&config, 0, sizeof(config));
+ tcgetattr(handle, &config);
+ config.c_iflag &= ~(INLCR | ICRNL);
+ config.c_iflag |= IGNPAR | IGNBRK;
+ config.c_oflag &= ~(OPOST | ONLCR | OCRNL);
+ config.c_cflag &= ~(PARENB | PARODD | CSTOPB | CSIZE | CRTSCTS);
+ config.c_cflag |= CLOCAL | CREAD | CS8;
+ config.c_lflag &= ~(ICANON | ISIG | ECHO);
+ int flag = _BaudFlag(baudrate);
+ cfsetospeed(&config, flag);
+ cfsetispeed(&config, flag);
+// Timeouts configuration
+ config.c_cc[VTIME] = 1;
+ config.c_cc[VMIN] = 0;
+ //fcntl(handle, F_SETFL, FNDELAY);
+// Validate configuration
+ if (tcsetattr(handle, TCSANOW, &config) < 0) {
+ close(handle);
+ return 0;
+ }
+ com->handle = handle;
+ return 1;
+}
+
+void comClose(int index)
+{
+ if (index >= noDevices || index < 0)
+ return;
+ COMDevice * com = &comDevices[index];
+ if (com->handle < 0)
+ return;
+ tcdrain(com->handle);
+ close(com->handle);
+ com->handle = -1;
+}
+
+void comCloseAll()
+{
+ for (int i = 0; i < noDevices; i++)
+ comClose(i);
+}
+
+/*****************************************************************************/
+int comWrite(int index, const char * buffer, size_t len)
+{
+ if (index >= noDevices || index < 0)
+ return 0;
+ if (comDevices[index].handle <= 0)
+ return 0;
+ int res = write(comDevices[index].handle, buffer, len);
+ if (res < 0)
+ res = 0;
+ return res;
+}
+
+int comRead(int index, char * buffer, size_t len)
+{
+ if (index >= noDevices || index < 0)
+ return 0;
+ if (comDevices[index].handle <= 0)
+ return 0;
+ int res = read(comDevices[index].handle, buffer, len);
+ if (res < 0)
+ res = 0;
+ return res;
+}
+
+/*****************************************************************************/
+int _BaudFlag(int BaudRate)
+{
+ switch(BaudRate)
+ {
+ case 50: return B50; break;
+ case 110: return B110; break;
+ case 134: return B134; break;
+ case 150: return B150; break;
+ case 200: return B200; break;
+ case 300: return B300; break;
+ case 600: return B600; break;
+ case 1200: return B1200; break;
+ case 1800: return B1800; break;
+ case 2400: return B2400; break;
+ case 4800: return B4800; break;
+ case 9600: return B9600; break;
+ case 19200: return B19200; break;
+ case 38400: return B38400; break;
+ case 57600: return B57600; break;
+ case 115200: return B115200; break;
+ case 230400: return B230400; break;
+ default : return B0; break;
+ }
+}
+
+void _AppendDevices(const char * base)
+{
+ int baseLen = strlen(base);
+ struct dirent * dp;
+// Enumerate devices
+ DIR * dirp = opendir("/dev");
+ while ((dp = readdir(dirp)) && noDevices < COM_MAXDEVICES) {
+ if (strlen(dp->d_name) >= baseLen) {
+ if (memcmp(base, dp->d_name, baseLen) == 0) {
+ COMDevice * com = &comDevices[noDevices ++];
+ com->port = (char *) strdup(dp->d_name);
+ com->handle = -1;
+ }
+ }
+ }
+ closedir(dirp);
+}
+
+#endif // unix
diff --git a/external/rs232/rs232-win.cpp b/external/rs232/rs232-win.cpp
new file mode 100644
index 0000000..d4f4f99
--- /dev/null
+++ b/external/rs232/rs232-win.cpp
@@ -0,0 +1,253 @@
+/*
+ Cross-platform serial / RS232 library
+ Version 0.21, 11/10/2015
+ -> WIN32 implementation
+ -> rs232-win.c
+
+ The MIT License (MIT)
+
+ Copyright (c) 2013-2015 Fr�d�ric Meslin, Florent Touchard
+ Email: fredericmeslin at hotmail.com
+ Website: www.fredslab.net
+ Twitter: @marzacdev
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+#ifdef _WIN32
+
+#include "rs232.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <Windows.h>
+
+/*****************************************************************************/
+
+typedef struct {
+ int port;
+ void * handle;
+} COMDevice;
+
+/*****************************************************************************/
+#define COM_MAXDEVICES 64
+static COMDevice comDevices[COM_MAXDEVICES];
+static int noDevices = 0;
+
+#define COM_MINDEVNAME 16384
+const char * comPtn = "COM???";
+
+/*****************************************************************************/
+const char * findPattern(const char * string, const char * pattern, int * value);
+const char * portInternalName(int index);
+
+/*****************************************************************************/
+int comEnumerate()
+{
+// Get devices information text
+ size_t size = COM_MINDEVNAME;
+ char * list = (char *) malloc(size);
+ SetLastError(0);
+ QueryDosDeviceA(NULL, list, size);
+ while (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ size *= 2;
+ char * nlist = (char *) realloc(list, size);
+ if (!nlist) {
+ free(list);
+ return 0;
+ }
+ list = nlist;
+ SetLastError(0);
+ QueryDosDeviceA(NULL, list, size);
+ }
+// Gather all COM ports
+ int port;
+ const char * nlist = findPattern(list, comPtn, &port);
+ noDevices = 0;
+ while(port > 0 && noDevices < COM_MAXDEVICES) {
+ COMDevice * com = &comDevices[noDevices ++];
+ com->port = port;
+ com->handle = 0;
+ nlist = findPattern(nlist, comPtn, &port);
+ }
+ free(list);
+ return noDevices;
+}
+
+void comTerminate()
+{
+ comCloseAll();
+}
+
+int comGetNoPorts()
+{
+ return noDevices;
+}
+
+/*****************************************************************************/
+const char * comGetPortName(int index)
+{
+ #define COM_MAXNAME 32
+ static char name[COM_MAXNAME];
+ if (index < 0 || index >= noDevices)
+ return 0;
+ sprintf(name, "COM%i", comDevices[index].port);
+ return name;
+}
+
+int comFindPort(const char * name)
+{
+ for (int i = 0; i < noDevices; i++)
+ if (strcmp(name, comGetPortName(i)) == 0)
+ return i;
+ return -1;
+}
+
+const char * comGetInternalName(int index)
+{
+ #define COM_MAXNAME 32
+ static char name[COM_MAXNAME];
+ if (index < 0 || index >= noDevices)
+ return 0;
+ sprintf(name, "//./COM%i", comDevices[index].port);
+ return name;
+}
+
+/*****************************************************************************/
+int comOpen(int index, int baudrate)
+{
+ DCB config;
+ COMMTIMEOUTS timeouts;
+ if (index < 0 || index >= noDevices)
+ return 0;
+// Close if already open
+ COMDevice * com = &comDevices[index];
+ if (com->handle) comClose(index);
+// Open COM port
+ void * handle = CreateFileA(comGetInternalName(index), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if (handle == INVALID_HANDLE_VALUE)
+ return 0;
+ com->handle = handle;
+// Prepare read / write timeouts
+ SetupComm(handle, 64, 64);
+ timeouts.ReadIntervalTimeout = MAXDWORD;
+ timeouts.ReadTotalTimeoutConstant = 0;
+ timeouts.WriteTotalTimeoutConstant = 0;
+ timeouts.ReadTotalTimeoutMultiplier = 0;
+ timeouts.WriteTotalTimeoutMultiplier = 0;
+ SetCommTimeouts(handle, &timeouts);
+// Prepare serial communication format
+ GetCommState(handle, &config);
+ config.BaudRate = baudrate;
+ config.fBinary = true;
+ config.fParity = 0;
+ config.fErrorChar = 0;
+ config.fNull = 0;
+ config.fAbortOnError = 0;
+ config.ByteSize = 8;
+ config.Parity = 0;
+ config.StopBits = 0;
+ config.EvtChar = '\n';
+// Set the port state
+ if (SetCommState(handle, &config) == 0) {
+ CloseHandle(handle);
+ return 0;
+ }
+ return 1;
+}
+
+void comClose(int index)
+{
+ if (index < 0 || index >= noDevices)
+ return;
+ COMDevice * com = &comDevices[index];
+ if (!com->handle)
+ return;
+ CloseHandle(com->handle);
+ com->handle = 0;
+}
+
+void comCloseAll()
+{
+ for (int i = 0; i < noDevices; i++)
+ comClose(i);
+}
+
+/*****************************************************************************/
+int comWrite(int index, const char * buffer, size_t len)
+{
+ if (index < 0 || index >= noDevices)
+ return 0;
+ COMDevice * com = &comDevices[index];
+ uint32_t bytes = 0;
+ WriteFile(com->handle, buffer, len, (LPDWORD)&bytes, NULL);
+ return bytes;
+}
+
+int comRead(int index, char * buffer, size_t len)
+{
+ if (index < 0 || index >= noDevices)
+ return 0;
+ COMDevice * com = &comDevices[index];
+ uint32_t bytes = 0;
+ ReadFile(com->handle, buffer, len, (LPDWORD)&bytes, NULL);
+ return bytes;
+}
+
+/*****************************************************************************/
+const char * findPattern(const char * string, const char * pattern, int * value)
+{
+ char c, n = 0;
+ const char * sp = string;
+ const char * pp = pattern;
+// Check for the string pattern
+ while (1) {
+ c = *sp ++;
+ if (c == '\0') {
+ if (*pp == '?') break;
+ if (*sp == '\0') break;
+ n = 0;
+ pp = pattern;
+ }else{
+ if (*pp == '?') {
+ // Expect a digit
+ if (c >= '0' && c <= '9') {
+ n = n * 10 + (c - '0');
+ if (*pp ++ == '\0') break;
+ }else{
+ n = 0;
+ pp = comPtn;
+ }
+ }else{
+ // Expect a character
+ if (c == *pp) {
+ if (*pp ++ == '\0') break;
+ }else{
+ n = 0;
+ pp = comPtn;
+ }
+ }
+ }
+ }
+// Return the value
+ * value = n;
+ return sp;
+}
+
+#endif // _WIN32
diff --git a/external/rs232/rs232.h b/external/rs232/rs232.h
new file mode 100644
index 0000000..0b1d00c
--- /dev/null
+++ b/external/rs232/rs232.h
@@ -0,0 +1,156 @@
+/*
+ Cross-platform serial / RS232 library
+ Version 0.21, 11/10/2015
+ -> All platforms header
+ -> rs232.h
+
+ The MIT License (MIT)
+
+ Copyright (c) 2013-2015 Fr�d�ric Meslin, Florent Touchard
+ Email: fredericmeslin at hotmail.com
+ Website: www.fredslab.net
+ Twitter: @marzacdev
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+#ifndef RS232_H
+#define RS232_H
+
+// TODO: convert to C++ class
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
+
+ #include <stdint.h>
+ #include <stdlib.h>
+
+/*****************************************************************************/
+ /* Doxywizard specific */
+ /**
+ * \mainpage RS232
+ * \section intro_sec C / C++ RS232 cross-platform serial library
+ * <b>Version 0.21 - 11/10/2015</b>
+ *
+ * Supported platforms:
+ * - Windows (XP / Win7, possibly 8 and 10)
+ * - Linux
+ * - MacOS X
+ *
+ * Copyright (c) 2013-2015 Frédéric Meslin, Florent Touchard <br>
+ * Email: fredericmeslin at hotmail.com <br>
+ * Website: www.fredslab.net <br>
+ * Twitter: \@marzacdev <br>
+ */
+
+/*****************************************************************************/
+ /**
+ * \fn int comEnumerate()
+ * \brief Enumerate available serial ports (Serial, USB serial, Bluetooth serial)
+ * \return number of enumerated ports
+ */
+ int comEnumerate();
+
+ /**
+ * \fn int comGetNoPorts()
+ * \brief Return the number of enumerated ports
+ * \return number of enumerated ports
+ */
+ int comGetNoPorts();
+
+ /**
+ * \fn int comTerminate()
+ * \brief Release ports and memory resources used by the library
+ */
+ void comTerminate();
+
+ /**
+ * \fn const char * comGetPortName(int index)
+ * \brief Get port user-friendly name
+ * \param[in] index port index
+ * \return null terminated port name
+ */
+ const char * comGetPortName(int index);
+
+ /**
+ * \fn const char * comGetInternalName(int index)
+ * \brief Get port operating-system name
+ * \param[in] index port index
+ * \return null terminated port name
+ */
+ const char * comGetInternalName(int index);
+
+ /**
+ * \fn int comFindPort(const char * name)
+ * \brief Try to find a port given its user-friendly name
+ * \param[in] name port name (case sensitive)
+ * \return index of found port or -1 if not enumerated
+ */
+ int comFindPort(const char * name);
+
+/*****************************************************************************/
+ /**
+ * \fn int comOpen(int index, int baudrate)
+ * \brief Try to open a port at a specific baudrate
+ * \brief (No parity, single stop bit, no hardware flow control)
+ * \param[in] index port index
+ * \param[in] baudrate port baudrate
+ * \return 1 if opened, 0 if not available
+ */
+ int comOpen(int index, int baudrate);
+
+ /**
+ * \fn void comClose(int index)
+ * \brief Close an opened port
+ * \param[in] index port index
+ */
+ void comClose(int index);
+
+ /**
+ * \fn void comCloseAll()
+ * \brief Close all opened ports
+ */
+ void comCloseAll();
+
+/*****************************************************************************/
+ /**
+ * \fn int comWrite(int index, const char * buffer, size_t len)
+ * \brief Write data to the port (non-blocking)
+ * \param[in] index port index
+ * \param[in] buffer pointer to transmit buffer
+ * \param[in] len length of transmit buffer in bytes
+ * \return number of bytes transferred
+ */
+ int comWrite(int index, const char * buffer, size_t len);
+
+ /**
+ * \fn int comRead(int index, const char * buffer, size_t len)
+ * \brief Read data from the port (non-blocking)
+ * \param[in] index port index
+ * \param[in] buffer pointer to receive buffer
+ * \param[in] len length of receive buffer in bytes
+ * \return number of bytes transferred
+ */
+ int comRead(int index, char * buffer, size_t len);
+
+//#ifdef __cplusplus
+//}
+//#endif
+
+#endif // RS232_H
diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp
index eea6539..176838b 100644
--- a/src/AppConfig.cpp
+++ b/src/AppConfig.cpp
@@ -296,7 +296,11 @@ AppConfig::AppConfig() : configName("") {
mainSplit = -1;
visSplit = -1;
bookmarkSplit = 200;
+#ifdef CUBICSDR_DEFAULT_HIDE_BOOKMARKS
+ bookmarksVisible.store(false);
+#else
bookmarksVisible.store(true);
+#endif
#ifdef USE_HAMLIB
rigEnabled.store(false);
diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp
index bd3bdc5..ca5a8c1 100644
--- a/src/AppFrame.cpp
+++ b/src/AppFrame.cpp
@@ -45,6 +45,8 @@ wxEND_EVENT_TABLE()
#ifdef USE_HAMLIB
#include "RigThread.h"
+#include "PortSelectorDialog.h"
+#include "rs232.h"
#endif
@@ -121,7 +123,13 @@ AppFrame::AppFrame() :
for (auto mt_i : modemList) {
demodModeSelector->addChoice(mt_i);
}
+
+#ifdef CUBICSDR_MODEM_EXCLUDE
+ demodModeSelector->setHelpTip("Use buttons to choose modulation type.");
+#else
demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation (Hotkey F), Amplitude Modulation (A) and Lower (L), Upper (U), Double Side-Band and more.");
+#endif
+
demodModeSelector->SetMinSize(wxSize(50,-1));
demodModeSelector->SetMaxSize(wxSize(50,-1));
demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0);
@@ -392,9 +400,11 @@ AppFrame::AppFrame() :
// Make a menubar
menuBar = new wxMenuBar;
wxMenu *menu = new wxMenu;
-#ifndef __APPLE__
+#ifndef __APPLE__
+#ifdef CUBICSDR_ENABLE_ABOUT_DIALOG
menu->Append(wxID_ABOUT_CUBICSDR, "About " CUBICSDR_INSTALL_NAME);
#endif
+#endif
menu->Append(wxID_SDR_DEVICES, "SDR Devices");
menu->AppendSeparator();
menu->Append(wxID_SDR_START_STOP, "Stop / Start Device");
@@ -406,14 +416,16 @@ AppFrame::AppFrame() :
menu->Append(wxID_RESET, "&Reset Session");
#ifndef __APPLE__
- menu->AppendSeparator();
- menu->Append(wxID_CLOSE);
+ menu->AppendSeparator();
+ menu->Append(wxID_CLOSE);
#else
- if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) {
- wxString aboutLabel;
- aboutLabel.Printf(_("About %s"), CUBICSDR_INSTALL_NAME);
- menu->Append( wxApp::s_macAboutMenuItemId, aboutLabel);
- }
+#ifdef CUBICSDR_ENABLE_ABOUT_DIALOG
+ if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) {
+ wxString aboutLabel;
+ aboutLabel.Printf(_("About %s"), CUBICSDR_INSTALL_NAME);
+ menu->Append( wxApp::s_macAboutMenuItemId, aboutLabel);
+ }
+#endif
#endif
menuBar->Append(menu, wxT("&File"));
@@ -544,7 +556,7 @@ AppFrame::AppFrame() :
rigModel = wxGetApp().getConfig()->getRigModel();
rigSerialRate = wxGetApp().getConfig()->getRigRate();
rigPort = wxGetApp().getConfig()->getRigPort();
-
+ rigPortDialog = nullptr;
rigMenu = new wxMenu;
rigEnableMenuItem = rigMenu->AppendCheckItem(wxID_RIG_TOGGLE, wxT("Enable Rig"));
@@ -931,6 +943,31 @@ void AppFrame::disableRig() {
wxGetApp().unlockFrequency();
wxGetApp().getConfig()->setRigEnabled(false);
}
+
+void AppFrame::setRigControlPort(std::string portName) {
+ if (rigPortDialog == nullptr) {
+ return;
+ }
+ if (portName != "") {
+ rigPort = portName;
+
+ wxGetApp().stopRig();
+ wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
+
+ Refresh();
+ }
+ rigPortDialog->EndModal(0);
+ delete rigPortDialog;
+ rigPortDialog = nullptr;
+}
+
+
+void AppFrame::dismissRigControlPortDialog() {
+ rigPortDialog->EndModal(0);
+ delete rigPortDialog;
+ rigPortDialog = nullptr;
+}
+
#endif
bool AppFrame::actionOnMenuDisplay(wxCommandEvent& event) {
@@ -1237,6 +1274,8 @@ bool AppFrame::actionOnMenuAudioSampleRate(wxCommandEvent& event) {
//audioSampleRateMenuItems[menu_id+j];
//std::cout << "Would set audio sample rate on device " << mdevices_i->second.name << " (" << mdevices_i->first << ") to " << (*srate) << "Hz" << std::endl;
AudioThread::setDeviceSampleRate(mdevices_i->first, *srate);
+
+ return true;
}
j++;
@@ -1244,7 +1283,6 @@ bool AppFrame::actionOnMenuAudioSampleRate(wxCommandEvent& event) {
i++;
}
- return true;
}
return false;
@@ -1327,13 +1365,10 @@ bool AppFrame::actionOnMenuRig(wxCommandEvent& event) {
}
if (event.GetId() == wxID_RIG_PORT) {
- wxString stringVal = wxGetTextFromUser("Rig Serial / COM / Address", "Rig Control Port", rigPort);
- std::string rigPortStr = stringVal.ToStdString();
- if (rigPortStr != "") {
- rigPort = rigPortStr;
- resetRig = true;
+ if (rigPortDialog == nullptr) {
+ rigPortDialog = new PortSelectorDialog(this, wxID_ANY, rigPort);
+ rigPortDialog->ShowModal();
}
- bManaged = true;
}
if (event.GetId() == wxID_RIG_TOGGLE) {
@@ -2274,6 +2309,13 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) {
if (!this->IsActive()) {
return -1;
}
+
+#ifdef USE_HAMLIB
+ if (rigPortDialog != nullptr) {
+ return -1;
+ }
+#endif
+
if (modemProps && (modemProps->HasFocus() || modemProps->isMouseInView())) {
return -1;
}
@@ -2388,6 +2430,13 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) {
if (!this->IsActive()) {
return -1;
}
+
+#ifdef USE_HAMLIB
+ if (rigPortDialog != nullptr) {
+ return -1;
+ }
+#endif
+
if (modemProps && (modemProps->HasFocus() || modemProps->isMouseInView())) {
return -1;
}
diff --git a/src/AppFrame.h b/src/AppFrame.h
index eb9cc48..2f656f3 100644
--- a/src/AppFrame.h
+++ b/src/AppFrame.h
@@ -81,6 +81,10 @@
#define wxID_RIG_MODEL_BASE 12000
#endif
+#ifdef USE_HAMLIB
+class PortSelectorDialog;
+#endif
+
// Define a new frame type
class AppFrame: public wxFrame {
public:
@@ -133,6 +137,11 @@ public:
void setStatusText(wxWindow* window, std::string statusText);
void setStatusText(std::string statusText, int value);
+#ifdef USE_HAMLIB
+ void setRigControlPort(std::string portName);
+ void dismissRigControlPortDialog();
+#endif
+
private:
void OnMenu(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
@@ -231,7 +240,6 @@ private:
wxMenuItem *rigFollowMenuItem;
wxMenuItem *rigCenterLockMenuItem;
wxMenuItem *rigFollowModemMenuItem;
- wxMenuItem *sdrIFMenuItem;
std::map<int, wxMenuItem *> rigSerialMenuItems;
std::map<int, wxMenuItem *> rigModelMenuItems;
@@ -241,7 +249,7 @@ private:
std::vector<int> rigSerialRates;
std::string rigPort;
int numRigs;
- bool rigInit;
+ PortSelectorDialog *rigPortDialog;
#endif
wxDECLARE_EVENT_TABLE();
diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp
index 3c7d6ae..7f0770e 100644
--- a/src/BookmarkMgr.cpp
+++ b/src/BookmarkMgr.cpp
@@ -7,10 +7,17 @@
#define BOOKMARK_RECENTS_MAX 25
+BookmarkEntry::~BookmarkEntry() {
+ delete node;
+}
+
BookmarkMgr::BookmarkMgr() {
rangesSorted = false;
}
+//represents an empty BookMarkList that is returned by reference by some functions.
+const BookmarkList BookmarkMgr::emptyResults;
+
void BookmarkMgr::saveToFile(std::string bookmarkFn, bool backup) {
DataTree s("cubicsdr_bookmarks");
DataNode *header = s.rootNode()->newChild("header");
@@ -199,19 +206,18 @@ bool BookmarkMgr::hasBackup(std::string bookmarkFn) {
}
void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
+ //Create a BookmarkEntry from demod data, saving its
+ //characteristics in be->node.
BookmarkEntryPtr be = demodToBookmarkEntry(demod);
-
- //copy settings of demod into be->node
- wxGetApp().getDemodMgr().saveInstance(be->node, demod);
-
+
bmData[group].push_back(be);
bmDataSorted[group] = false;
}
void BookmarkMgr::addBookmark(std::string group, BookmarkEntryPtr be) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
bmData[group].push_back(be);
bmDataSorted[group] = false;
@@ -219,7 +225,7 @@ void BookmarkMgr::addBookmark(std::string group, BookmarkEntryPtr be) {
void BookmarkMgr::removeBookmark(std::string group, BookmarkEntryPtr be) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
std::lock_guard < std::mutex > lockEnt(be->busy_lock);
if (bmData.find(group) == bmData.end()) {
@@ -235,7 +241,7 @@ void BookmarkMgr::removeBookmark(std::string group, BookmarkEntryPtr be) {
}
void BookmarkMgr::removeBookmark(BookmarkEntryPtr be) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
std::lock_guard < std::mutex > lockEnt(be->busy_lock);
for (auto &bmd_i : bmData) {
@@ -247,7 +253,7 @@ void BookmarkMgr::removeBookmark(BookmarkEntryPtr be) {
}
void BookmarkMgr::moveBookmark(BookmarkEntryPtr be, std::string group) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
std::lock_guard < std::mutex > lockEnt(be->busy_lock);
for (auto &bmd_i : bmData) {
@@ -267,7 +273,7 @@ void BookmarkMgr::moveBookmark(BookmarkEntryPtr be, std::string group) {
void BookmarkMgr::addGroup(std::string group) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
if (bmData.find(group) == bmData.end()) {
BookmarkList dummy = bmData[group];
@@ -275,7 +281,7 @@ void BookmarkMgr::addGroup(std::string group) {
}
void BookmarkMgr::removeGroup(std::string group) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
BookmarkMap::iterator i = bmData.find(group);
@@ -290,7 +296,7 @@ void BookmarkMgr::renameGroup(std::string group, std::string ngroup) {
return;
}
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
BookmarkMap::iterator i = bmData.find(group);
BookmarkMap::iterator it = bmData.find(ngroup);
@@ -306,12 +312,11 @@ void BookmarkMgr::renameGroup(std::string group, std::string ngroup) {
}
}
-BookmarkList BookmarkMgr::getBookmarks(std::string group) {
- std::lock_guard < std::mutex > lock(busy_lock);
+const BookmarkList& BookmarkMgr::getBookmarks(std::string group) {
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
if (bmData.find(group) == bmData.end()) {
- BookmarkList results;
- return results;
+ return emptyResults;
}
if (!bmDataSorted[group]) {
@@ -324,7 +329,7 @@ BookmarkList BookmarkMgr::getBookmarks(std::string group) {
void BookmarkMgr::getGroups(BookmarkNames &arr) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) {
arr.push_back(i->first);
@@ -332,7 +337,7 @@ void BookmarkMgr::getGroups(BookmarkNames &arr) {
}
void BookmarkMgr::getGroups(wxArrayString &arr) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) {
arr.push_back(i->first);
@@ -355,7 +360,9 @@ bool BookmarkMgr::getExpandState(std::string groupName) {
void BookmarkMgr::updateActiveList() {
- BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
+
+ BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
if (bmv) {
bmv->updateActiveList();
@@ -364,7 +371,7 @@ void BookmarkMgr::updateActiveList() {
void BookmarkMgr::updateBookmarks() {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
@@ -375,7 +382,7 @@ void BookmarkMgr::updateBookmarks() {
void BookmarkMgr::updateBookmarks(std::string group) {
- std::lock_guard < std::mutex > lockData(busy_lock);
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
@@ -386,7 +393,7 @@ void BookmarkMgr::updateBookmarks(std::string group) {
void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
recents.push_back(demodToBookmarkEntry(demod));
@@ -394,7 +401,7 @@ void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
}
void BookmarkMgr::addRecent(BookmarkEntryPtr be) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
recents.push_back(be);
@@ -404,7 +411,7 @@ void BookmarkMgr::addRecent(BookmarkEntryPtr be) {
void BookmarkMgr::removeRecent(BookmarkEntryPtr be) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
BookmarkList::iterator bm_i = std::find(recents.begin(),recents.end(), be);
@@ -414,14 +421,14 @@ void BookmarkMgr::removeRecent(BookmarkEntryPtr be) {
}
-BookmarkList BookmarkMgr::getRecents() {
- std::lock_guard < std::mutex > lockData(busy_lock);
- return BookmarkList(recents.rbegin(), recents.rend());
+const BookmarkList& BookmarkMgr::getRecents() {
+ std::lock_guard < std::recursive_mutex > lockData(busy_lock);
+ return recents;
}
void BookmarkMgr::clearRecents() {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
recents.clear();
}
@@ -436,7 +443,7 @@ void BookmarkMgr::trimRecents() {
void BookmarkMgr::addRange(BookmarkRangeEntryPtr re) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
ranges.push_back(re);
rangesSorted = false;
@@ -445,7 +452,7 @@ void BookmarkMgr::addRange(BookmarkRangeEntryPtr re) {
void BookmarkMgr::removeRange(BookmarkRangeEntryPtr re) {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
BookmarkRangeList::iterator re_i = std::find(ranges.begin(), ranges.end(), re);
@@ -456,8 +463,8 @@ void BookmarkMgr::removeRange(BookmarkRangeEntryPtr re) {
}
-BookmarkRangeList BookmarkMgr::getRanges() {
- std::lock_guard < std::mutex > lock(busy_lock);
+const BookmarkRangeList& BookmarkMgr::getRanges() {
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
if (!rangesSorted) {
std::sort(ranges.begin(), ranges.end(), BookmarkRangeEntryCompare());
@@ -469,7 +476,7 @@ BookmarkRangeList BookmarkMgr::getRanges() {
void BookmarkMgr::clearRanges() {
- std::lock_guard < std::mutex > lock(busy_lock);
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
ranges.clear();
}
@@ -540,3 +547,18 @@ std::wstring BookmarkMgr::getActiveDisplayName(DemodulatorInstance *demod) {
return activeName;
}
+void BookmarkMgr::removeActive(DemodulatorInstance *demod) {
+
+ std::lock_guard < std::recursive_mutex > lock(busy_lock);
+
+ if (demod == nullptr) {
+ return;
+ }
+
+ //Delete demodulator
+ wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
+ wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false);
+ wxGetApp().removeDemodulator(demod);
+ wxGetApp().getDemodMgr().deleteThread(demod);
+}
+
diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h
index fa1e64b..5f18b69 100644
--- a/src/BookmarkMgr.h
+++ b/src/BookmarkMgr.h
@@ -8,28 +8,26 @@
#include <vector>
#include <set>
#include <memory>
-#include "DataTree.h"
#include "DemodulatorInstance.h"
+class DataNode;
+
class BookmarkEntry {
public:
std::mutex busy_lock;
std::string type;
- std::wstring label;
- std::wstring userLabel;
+ //maps on the Demod user label.
+ std::wstring label;
long long frequency;
int bandwidth;
DataNode *node;
- virtual ~BookmarkEntry() {
- //free node
- delete node;
- }
+ virtual ~BookmarkEntry();
};
@@ -96,7 +94,7 @@ public:
void addGroup(std::string group);
void removeGroup(std::string group);
void renameGroup(std::string group, std::string ngroup);
- BookmarkList getBookmarks(std::string group);
+ const BookmarkList& getBookmarks(std::string group);
void getGroups(BookmarkNames &arr);
void getGroups(wxArrayString &arr);
@@ -110,14 +108,16 @@ public:
void addRecent(DemodulatorInstance *demod);
void addRecent(BookmarkEntryPtr be);
void removeRecent(BookmarkEntryPtr be);
- BookmarkList getRecents();
+ const BookmarkList& getRecents();
void clearRecents();
+ void removeActive(DemodulatorInstance *demod);
+
void addRange(BookmarkRangeEntryPtr re);
void removeRange(BookmarkRangeEntryPtr re);
- BookmarkRangeList getRanges();
+ const BookmarkRangeList& getRanges();
void clearRanges();
-
+
static std::wstring getBookmarkEntryDisplayName(BookmarkEntryPtr bmEnt);
static std::wstring getActiveDisplayName(DemodulatorInstance *demod);
@@ -133,7 +133,10 @@ protected:
BookmarkList recents;
BookmarkRangeList ranges;
bool rangesSorted;
- std::mutex busy_lock;
+ std::recursive_mutex busy_lock;
BookmarkExpandState expandState;
+
+ //represents an empty BookMarkList that is returned by reference by some functions.
+ static const BookmarkList emptyResults;
};
diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp
index a2aa0e8..4e4931c 100644
--- a/src/CubicSDR.cpp
+++ b/src/CubicSDR.cpp
@@ -247,7 +247,7 @@ bool CubicSDR::OnInit() {
#endif
- wxApp::SetAppName("CubicSDR");
+ wxApp::SetAppName(CUBICSDR_INSTALL_NAME);
#ifdef USE_HAMLIB
t_Rig = nullptr;
diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp
index e8661ac..355daa6 100644
--- a/src/demod/DemodulatorInstance.cpp
+++ b/src/demod/DemodulatorInstance.cpp
@@ -442,19 +442,19 @@ float DemodulatorInstance::getGain() {
}
bool DemodulatorInstance::isFollow() {
- return follow;
+ return follow.load();
}
void DemodulatorInstance::setFollow(bool follow) {
- this->follow = follow;
+ this->follow.store(follow);
}
bool DemodulatorInstance::isTracking() {
- return tracking;
+ return tracking.load();
}
void DemodulatorInstance::setTracking(bool tracking) {
- this->tracking = tracking;
+ this->tracking.store(tracking);
}
bool DemodulatorInstance::isDeltaLock() {
diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp
index a2b02d1..4fa9e85 100644
--- a/src/demod/DemodulatorMgr.cpp
+++ b/src/demod/DemodulatorMgr.cpp
@@ -260,6 +260,27 @@ DemodulatorInstance *DemodulatorMgr::getLastActiveDemodulator() {
return lastActiveDemodulator;
}
+DemodulatorInstance *DemodulatorMgr::getLastDemodulatorWith(const std::string& type,
+ const std::wstring& userLabel,
+ long long frequency,
+ int bandwidth) {
+ std::lock_guard < std::recursive_mutex > lock(demods_busy);
+
+ //backwards search:
+ for (std::vector<DemodulatorInstance *>::reverse_iterator it = demods.rbegin(); it != demods.rend(); it++) {
+
+ if ((*it)->getDemodulatorType() == type &&
+ (*it)->getDemodulatorUserLabel() == userLabel &&
+ (*it)->getFrequency() == frequency &&
+ (*it)->getBandwidth() == bandwidth) {
+
+ return (*it);
+ }
+ }
+
+ return nullptr;
+}
+
//Private internal method, no need to protect it with demods_busy
void DemodulatorMgr::garbageCollect() {
if (demods_deleted.size()) {
@@ -414,8 +435,11 @@ void DemodulatorMgr::saveInstance(DataNode *node, DemodulatorInstance *inst) {
}
DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
+
+ std::lock_guard < std::recursive_mutex > lock(demods_busy);
+
DemodulatorInstance *newDemod = nullptr;
-
+
node->rewindAll();
long bandwidth = *node->getNext("bandwidth");
@@ -482,7 +506,7 @@ DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
}
}
- newDemod = wxGetApp().getDemodMgr().newThread();
+ newDemod = newThread();
newDemod->setDemodulatorType(type);
newDemod->setDemodulatorUserLabel(user_label);
@@ -501,12 +525,14 @@ DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
newDemod->setSquelchLevel(squelch_level);
}
+ //Attach to sound output:
bool found_device = false;
std::map<int, RtAudio::DeviceInfo>::iterator i;
for (i = outputDevices.begin(); i != outputDevices.end(); i++) {
if (i->second.name == output_device) {
newDemod->setOutputDevice(i->first);
found_device = true;
+ break;
}
}
diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h
index 41b0945..ca65c22 100644
--- a/src/demod/DemodulatorMgr.h
+++ b/src/demod/DemodulatorMgr.h
@@ -32,6 +32,10 @@ public:
void setActiveDemodulator(DemodulatorInstance *demod, bool temporary = true);
DemodulatorInstance *getActiveDemodulator();
DemodulatorInstance *getLastActiveDemodulator();
+ DemodulatorInstance *getLastDemodulatorWith(const std::string& type,
+ const std::wstring& userLabel,
+ long long frequency,
+ int bandwidth);
int getLastBandwidth() const;
void setLastBandwidth(int lastBandwidth);
@@ -61,6 +65,7 @@ public:
void setOutputDevices(std::map<int,RtAudio::DeviceInfo> devs);
void saveInstance(DataNode *node, DemodulatorInstance *inst);
+
DemodulatorInstance *loadInstance(DataNode *node);
private:
diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp
index 259e76c..cb3efd4 100644
--- a/src/forms/Bookmark/BookmarkPanel.cpp
+++ b/src/forms/Bookmark/BookmarkPanel.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -20,7 +20,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po
m_clearSearchButton = new wxButton( this, wxID_ANY, wxT("Clear Search"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer1->Add( m_clearSearchButton, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
- m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE );
+ m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE );
bSizer1->Add( m_treeView, 1, wxEXPAND, 5 );
m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
@@ -89,16 +89,11 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po
m_searchText->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this );
m_searchText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this );
m_clearSearchButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this );
-
- //VSO: Added m_treeView wxEVT_ENTER_WINDOW/wxEVT_LEAVE_WINDOW that was missing.
- m_treeView->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(BookmarkPanel::onEnterWindow), NULL, this);
- m_treeView->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(BookmarkPanel::onLeaveWindow), NULL, this);
-
- m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
+ m_treeView->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ), NULL, this );
+ m_treeView->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ), NULL, this );
+ m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this );
- m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this );
m_treeView->Connect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this );
- m_treeView->Connect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this );
m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this );
m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this );
m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this );
@@ -121,16 +116,11 @@ BookmarkPanel::~BookmarkPanel()
m_searchText->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this );
m_searchText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this );
m_clearSearchButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this );
-
- //VSO: Added m_treeView wxEVT_ENTER_WINDOW/wxEVT_LEAVE_WINDOW that was missing.
- m_treeView->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(BookmarkPanel::onEnterWindow), NULL, this);
- m_treeView->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(BookmarkPanel::onLeaveWindow), NULL, this);
-
+ m_treeView->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ), NULL, this );
+ m_treeView->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ), NULL, this );
m_treeView->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this );
- m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this );
m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this );
- m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this );
m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this );
m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this );
m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this );
diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp
index 8214f9d..5faf349 100644
--- a/src/forms/Bookmark/BookmarkPanel.fbp
+++ b/src/forms/Bookmark/BookmarkPanel.fbp
@@ -311,7 +311,7 @@
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
- <property name="style">wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE</property>
+ <property name="style">wxTR_DEFAULT_STYLE|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
@@ -319,12 +319,12 @@
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
- <event name="OnEnterWindow"></event>
+ <event name="OnEnterWindow">onEnterWindow</event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
- <event name="OnLeaveWindow"></event>
+ <event name="OnLeaveWindow">onLeaveWindow</event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
@@ -341,11 +341,11 @@
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnTreeBeginDrag">onTreeBeginDrag</event>
- <event name="OnTreeBeginLabelEdit">onTreeBeginLabelEdit</event>
+ <event name="OnTreeBeginLabelEdit"></event>
<event name="OnTreeBeginRDrag"></event>
<event name="OnTreeDeleteItem"></event>
<event name="OnTreeEndDrag">onTreeEndDrag</event>
- <event name="OnTreeEndLabelEdit">onTreeEndLabelEdit</event>
+ <event name="OnTreeEndLabelEdit"></event>
<event name="OnTreeGetInfo"></event>
<event name="OnTreeItemActivated">onTreeActivate</event>
<event name="OnTreeItemCollapsed">onTreeCollapse</event>
diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h
index ecb09cb..f6fd49f 100644
--- a/src/forms/Bookmark/BookmarkPanel.h
+++ b/src/forms/Bookmark/BookmarkPanel.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -57,9 +57,7 @@ class BookmarkPanel : public wxPanel
virtual void onSearchText( wxCommandEvent& event ) { event.Skip(); }
virtual void onClearSearch( wxCommandEvent& event ) { event.Skip(); }
virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); }
- virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); }
virtual void onTreeEndDrag( wxTreeEvent& event ) { event.Skip(); }
- virtual void onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); }
virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); }
virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); }
virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); }
diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp
index 1800cc0..883b813 100644
--- a/src/forms/Bookmark/BookmarkView.cpp
+++ b/src/forms/Bookmark/BookmarkView.cpp
@@ -154,6 +154,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos,
visualDragItem = nullptr;
nextEnt = nullptr;
nextDemod = nullptr;
+ nextGroup = "";
mouseTracker.setTarget(this);
}
@@ -281,6 +282,9 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
groups[gn_i] = group_itm;
if (prevSelCopy != nullptr && prevSelCopy->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP && gn_i == prevSelCopy->groupName) {
bmSelFound = group_itm;
+ } else if (nextGroup != "" && gn_i == nextGroup) {
+ bmSelFound = group_itm;
+ nextGroup = "";
}
}
@@ -295,7 +299,8 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
bool groupExpanded = searchState || wxGetApp().getBookmarkMgr().getExpandState(gn_i);
- BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i);
+ const BookmarkList& bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i);
+
for (auto &bmEnt : bmList) {
std::wstring labelVal = BookmarkMgr::getBookmarkEntryDisplayName(bmEnt);
@@ -304,7 +309,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
std::string bwStr = frequencyToStr(bmEnt->bandwidth);
std::wstring fullText = labelVal +
- L" " + bmEnt->userLabel +
+ L" " + bmEnt->label +
L" " + std::to_wstring(bmEnt->frequency) +
L" " + std::wstring(freqStr.begin(),freqStr.end()) +
L" " + std::wstring(bwStr.begin(),bwStr.end()) +
@@ -393,6 +398,7 @@ void BookmarkView::doUpdateActiveList() {
if (nextDemod != nullptr && nextDemod == demod_i) {
selItem = itm;
+ wxGetApp().getDemodMgr().setActiveDemodulator(nextDemod, false);
nextDemod = nullptr;
} else if (!selItem && activeExpandState && lastActiveDemodulator && lastActiveDemodulator == demod_i) {
selItem = itm;
@@ -401,7 +407,9 @@ void BookmarkView::doUpdateActiveList() {
bool rangeExpandState = searchState?false:expandState["range"];
- BookmarkRangeList bmRanges = wxGetApp().getBookmarkMgr().getRanges();
+ //Ranges
+ const BookmarkRangeList& bmRanges = wxGetApp().getBookmarkMgr().getRanges();
+
m_treeView->DeleteChildren(rangeBranch);
for (auto &re_i: bmRanges) {
@@ -430,7 +438,7 @@ void BookmarkView::doUpdateActiveList() {
bool recentExpandState = searchState || expandState["recent"];
// Recents
- BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents();
+ const BookmarkList& bmRecents = wxGetApp().getBookmarkMgr().getRecents();
m_treeView->DeleteChildren(recentBranch);
for (auto &bmr_i: bmRecents) {
@@ -452,7 +460,6 @@ void BookmarkView::doUpdateActiveList() {
std::string bwStr = frequencyToStr(bmr_i->bandwidth);
std::wstring fullText = labelVal +
- L" " + bmr_i->userLabel +
L" " + std::to_wstring(bmr_i->frequency) +
L" " + std::wstring(freqStr.begin(),freqStr.end()) +
L" " + std::wstring(bwStr.begin(),bwStr.end()) +
@@ -499,72 +506,6 @@ void BookmarkView::doUpdateActiveList() {
}
-void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) {
- TreeViewItem* tvi = dynamic_cast<TreeViewItem*>(m_treeView->GetItemData(event.GetItem()));
-
- //if edition do not work, m_treeView->GetEditControl() may be null...
- if (!tvi || (m_treeView->GetEditControl() == NULL)) {
- event.Veto();
- return;
- }
-
- if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE ||
- tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT ||
- tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK ||
- tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP ||
- tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE)
- {
- event.Allow();
- editingLabel = true;
- } else {
- event.Veto();
- }
-}
-
-
-void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) {
- wxTreeItemId itm = event.GetItem();
- TreeViewItem* tvi = dynamic_cast<TreeViewItem*>(m_treeView->GetItemData(itm));
-
- //if edition do not work, m_treeView->GetEditControl() may be null...
- if (m_treeView->GetEditControl() == NULL) {
- event.Veto();
- return;
- }
-
- std::wstring newText = m_treeView->GetEditControl()->GetValue().ToStdWstring();
-
- editingLabel = false;
-
- if (!tvi) {
- return;
- }
-
- if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) {
- tvi->demod->setDemodulatorUserLabel(newText);
- wxGetApp().getBookmarkMgr().updateActiveList();
- } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) {
- tvi->bookmarkEnt->label = newText;
- tvi->bookmarkEnt->node->child("user_label")->element()->set(newText);
- wxGetApp().getBookmarkMgr().updateActiveList();
- } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) {
- tvi->bookmarkEnt->label = newText;
- tvi->bookmarkEnt->node->child("user_label")->element()->set(newText);
- wxGetApp().getBookmarkMgr().updateBookmarks();
- } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
- std::string newGroup = m_treeView->GetEditControl()->GetValue().ToStdString();
- wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, newGroup);
- wxGetApp().getBookmarkMgr().updateBookmarks();
- } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) {
- std::wstring newName = m_treeView->GetEditControl()->GetValue().ToStdWstring();
- if (newName.length() != 0) {
- tvi->rangeEnt->label = newName;
- wxGetApp().getBookmarkMgr().updateActiveList();
- }
- }
-}
-
-
void BookmarkView::onTreeActivate( wxTreeEvent& event ) {
wxTreeItemId itm = event.GetItem();
@@ -572,10 +513,7 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) {
if (tvi) {
if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) {
- if (!tvi->demod->isActive()) {
-
- wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,true);
- wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false);
+ if (!tvi->demod->isActive()) {
wxGetApp().setFrequency(tvi->demod->getFrequency());
nextDemod = tvi->demod;
}
@@ -780,10 +718,9 @@ void BookmarkView::doMoveBookmark(BookmarkEntryPtr be, std::string group) {
void BookmarkView::doRemoveActive(DemodulatorInstance *demod) {
- wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
- wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false);
- wxGetApp().removeDemodulator(demod);
- wxGetApp().getDemodMgr().deleteThread(demod);
+
+ wxGetApp().getBookmarkMgr().removeActive(demod);
+ wxGetApp().getBookmarkMgr().updateActiveList();
}
@@ -811,7 +748,8 @@ void BookmarkView::updateBookmarkChoices() {
void BookmarkView::addBookmarkChoice(wxWindow *parent) {
updateBookmarkChoices();
- bookmarkChoice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookmarkChoices, wxALL|wxEXPAND, wxDefaultValidator, "Bookmark");
+ bookmarkChoice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookmarkChoices, wxEXPAND, wxDefaultValidator, "Bookmark");
+ bookmarkChoice->Select(0);
bookmarkChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction)&BookmarkView::onBookmarkChoice, nullptr, this);
parent->GetSizer()->Add(bookmarkChoice, 0, wxALL | wxEXPAND);
}
@@ -887,29 +825,42 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) {
void BookmarkView::activateBookmark(BookmarkEntryPtr bmEnt) {
- DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node);
-
- nextDemod = newDemod;
-
- wxTreeItemId selItem = m_treeView->GetSelection();
- if (selItem) {
- m_treeView->SelectItem(selItem, false);
- }
-
- long long freq = newDemod->getFrequency();
- long long currentFreq = wxGetApp().getFrequency();
- long long currentRate = wxGetApp().getSampleRate();
-
- if ( ( abs(freq - currentFreq) > currentRate / 2 ) || ( abs( currentFreq - freq) > currentRate / 2 ) ) {
- wxGetApp().setFrequency(freq);
- }
-
- newDemod->run();
- newDemod->setActive(true);
- wxGetApp().bindDemodulator(newDemod);
-
- //order immediate refresh of the whole tree.
- doUpdateActiveList();
+
+ wxTreeItemId selItem = m_treeView->GetSelection();
+ if (selItem) {
+ m_treeView->SelectItem(selItem, false);
+ }
+
+ //if a matching DemodulatorInstance do not exist yet, create it and activate it, else use
+ //the already existing one:
+ // we search among the list of existing demodulators the one matching
+ //bmEnt and activate it. The search is made backwards, to select the most recently created one.
+ DemodulatorInstance *matchingDemod = wxGetApp().getDemodMgr().getLastDemodulatorWith(
+ bmEnt->type,
+ bmEnt->label,
+ bmEnt->frequency,
+ bmEnt->bandwidth);
+ //not found, create a new demod instance:
+ if (matchingDemod == nullptr) {
+
+ matchingDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node);
+ matchingDemod->run();
+ wxGetApp().bindDemodulator(matchingDemod);
+ }
+
+ matchingDemod->setActive(true);
+
+ long long freq = matchingDemod->getFrequency();
+ long long currentFreq = wxGetApp().getFrequency();
+ long long currentRate = wxGetApp().getSampleRate();
+
+ if ((abs(freq - currentFreq) > currentRate / 2) || (abs(currentFreq - freq) > currentRate / 2)) {
+ wxGetApp().setFrequency(freq);
+ }
+
+ nextDemod = matchingDemod;
+
+ wxGetApp().getBookmarkMgr().updateActiveList();
}
@@ -990,15 +941,14 @@ void BookmarkView::groupSelection(std::string groupName) {
hideProps();
- // m_labelText->SetValue(groupSel);
+ m_labelText->SetValue(groupName);
- // m_labelText->Show();
- // m_labelLabel->Show();
+ m_labelText->Show();
+ m_labelLabel->Show();
addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup ));
- addButton(m_buttonPanel, BOOKMARK_VIEW_STR_RENAME_GROUP, wxCommandEventHandler( BookmarkView::onRenameGroup ));
- // showProps();
+ showProps();
showButtons();
refreshLayout();
@@ -1111,6 +1061,7 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) {
if (tvi->demod->isActive()) {
wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false);
+ tvi->demod->setTracking(true);
}
} else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) {
recentSelection(tvi->bookmarkEnt);
@@ -1151,15 +1102,16 @@ void BookmarkView::onLabelText( wxCommandEvent& /* event */ ) {
} else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) {
curSel->rangeEnt->label = m_labelText->GetValue().ToStdWstring();
wxGetApp().getBookmarkMgr().updateActiveList();
+ } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
+ std::string newGroupName = m_labelText->GetValue().ToStdString();
+
+ if (newGroupName != "" && newGroupName != curSel->groupName) {
+ wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName);
+ nextGroup = newGroupName;
+ wxGetApp().getBookmarkMgr().updateBookmarks();
+ }
}
}
-
- // else if (groupSel != "") {
-// std::string newGroupName = m_labelText->GetValue().ToStdString();
-// wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName);
-// groupSel = newGroupName;
-// wxGetApp().getBookmarkMgr().updateBookmarks();
-// }
}
@@ -1194,7 +1146,6 @@ void BookmarkView::onRemoveActive( wxCommandEvent& /* event */ ) {
return;
}
doRemoveActive(curSel->demod);
- m_treeView->Delete(m_treeView->GetSelection());
}
}
@@ -1283,25 +1234,6 @@ void BookmarkView::onRemoveGroup( wxCommandEvent& /* event */ ) {
}
-void BookmarkView::onRenameGroup( wxCommandEvent& /* event */ ) {
- TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection());
-
- if (!curSel || curSel->type != TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
- return;
- }
-
- wxString stringVal = "";
- stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_RENAME_GROUP, "New Group Name", curSel->groupName);
-
- std::string newGroupName = stringVal.Trim().ToStdString();
-
- if (newGroupName != "") {
- wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName);
- wxGetApp().getBookmarkMgr().updateBookmarks();
- }
-}
-
-
void BookmarkView::onAddRange( wxCommandEvent& /* event */ ) {
BookmarkRangeEntryPtr re = BookmarkView::makeActiveRangeEntry();
diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h
index 04d8e2b..6470bd5 100644
--- a/src/forms/Bookmark/BookmarkView.h
+++ b/src/forms/Bookmark/BookmarkView.h
@@ -106,8 +106,6 @@ protected:
//refresh / rebuild the whole tree item immediatly
void doUpdateActiveList();
- void onTreeBeginLabelEdit( wxTreeEvent& event );
- void onTreeEndLabelEdit( wxTreeEvent& event );
void onTreeActivate( wxTreeEvent& event );
void onTreeCollapse( wxTreeEvent& event );
void onTreeExpanded( wxTreeEvent& event );
@@ -156,7 +154,6 @@ protected:
void onAddGroup( wxCommandEvent& event );
void onRemoveGroup( wxCommandEvent& event );
- void onRenameGroup( wxCommandEvent& event );
void onAddRange( wxCommandEvent& event );
void onRemoveRange( wxCommandEvent& event );
@@ -195,6 +192,7 @@ protected:
BookmarkEntryPtr nextEnt;
BookmarkRangeEntryPtr nextRange;
DemodulatorInstance *nextDemod;
+ std::string nextGroup;
// Search
std::vector<std::wstring> searchKeywords;
diff --git a/src/forms/Dialog/AboutDialog.fbp b/src/forms/Dialog/AboutDialog.fbp
index 596724b..9f9cb8a 100644
--- a/src/forms/Dialog/AboutDialog.fbp
+++ b/src/forms/Dialog/AboutDialog.fbp
@@ -2879,7 +2879,7 @@
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
- <object class="wxBoxSizer" expanded="0">
+ <object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">m_dSizer</property>
<property name="orient">wxVERTICAL</property>
@@ -6036,6 +6036,504 @@
<event name="OnUpdateUI"></event>
</object>
</object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Bob Schatzman</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dBobSchatzman</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Robert Ross</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dRobertRoss</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Roberto Bellotti</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dRobertoBellotti</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Serge Van der Torre</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dSergeVanderTorre</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Dieter Schneider</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dDieterSchneider</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Petrika Janeku</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_dPetrikaJaneku</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
</object>
</object>
</object>
diff --git a/src/forms/Dialog/AboutDialogBase.cpp b/src/forms/Dialog/AboutDialogBase.cpp
index 4d0e350..12ac933 100644
--- a/src/forms/Dialog/AboutDialogBase.cpp
+++ b/src/forms/Dialog/AboutDialogBase.cpp
@@ -341,6 +341,30 @@ AboutDialogBase::AboutDialogBase( wxWindow* parent, wxWindowID id, const wxStrin
m_dKeshavlalPatel->Wrap( -1 );
m_dSizer->Add( m_dKeshavlalPatel, 0, wxALL, 5 );
+ m_dBobSchatzman = new wxStaticText( m_dScroll, wxID_ANY, wxT("Bob Schatzman"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dBobSchatzman->Wrap( -1 );
+ m_dSizer->Add( m_dBobSchatzman, 0, wxALL, 5 );
+
+ m_dRobertRoss = new wxStaticText( m_dScroll, wxID_ANY, wxT("Robert Ross"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dRobertRoss->Wrap( -1 );
+ m_dSizer->Add( m_dRobertRoss, 0, wxALL, 5 );
+
+ m_dRobertoBellotti = new wxStaticText( m_dScroll, wxID_ANY, wxT("Roberto Bellotti"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dRobertoBellotti->Wrap( -1 );
+ m_dSizer->Add( m_dRobertoBellotti, 0, wxALL, 5 );
+
+ m_dSergeVanderTorre = new wxStaticText( m_dScroll, wxID_ANY, wxT("Serge Van der Torre"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dSergeVanderTorre->Wrap( -1 );
+ m_dSizer->Add( m_dSergeVanderTorre, 0, wxALL, 5 );
+
+ m_dDieterSchneider = new wxStaticText( m_dScroll, wxID_ANY, wxT("Dieter Schneider"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dDieterSchneider->Wrap( -1 );
+ m_dSizer->Add( m_dDieterSchneider, 0, wxALL, 5 );
+
+ m_dPetrikaJaneku = new wxStaticText( m_dScroll, wxID_ANY, wxT("Petrika Janeku"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_dPetrikaJaneku->Wrap( -1 );
+ m_dSizer->Add( m_dPetrikaJaneku, 0, wxALL, 5 );
+
m_dBSizer->Add( m_dSizer, 1, wxALL|wxEXPAND, 5 );
diff --git a/src/forms/Dialog/AboutDialogBase.h b/src/forms/Dialog/AboutDialogBase.h
index 7dd8487..6029b1b 100644
--- a/src/forms/Dialog/AboutDialogBase.h
+++ b/src/forms/Dialog/AboutDialogBase.h
@@ -108,6 +108,12 @@ class AboutDialogBase : public wxDialog
wxStaticText* m_dTimothyGatton;
wxStaticText* m_dStephenCuccio;
wxStaticText* m_dKeshavlalPatel;
+ wxStaticText* m_dBobSchatzman;
+ wxStaticText* m_dRobertRoss;
+ wxStaticText* m_dRobertoBellotti;
+ wxStaticText* m_dSergeVanderTorre;
+ wxStaticText* m_dDieterSchneider;
+ wxStaticText* m_dPetrikaJaneku;
wxScrolledWindow* m_stScroll;
wxStaticText* m_stHeader;
wxStaticLine* m_stDivider1;
diff --git a/src/forms/Dialog/PortSelectorDialog.cpp b/src/forms/Dialog/PortSelectorDialog.cpp
new file mode 100644
index 0000000..74d31ab
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.cpp
@@ -0,0 +1,39 @@
+#include "PortSelectorDialog.h"
+
+#include "rs232.h"
+#include "CubicSDR.h"
+
+PortSelectorDialog::PortSelectorDialog( wxWindow* parent, wxWindowID id, std::string defaultPort ) : PortSelectorDialogBase(parent, id) {
+ comEnumerate();
+
+ int nPorts = comGetNoPorts();
+
+ for (int i = 0; i < nPorts; i++) {
+#ifdef WIN32
+ m_portList->Append(comGetPortName(i));
+#else
+ m_portList->Append(comGetInternalName(i));
+#endif
+ }
+
+ comTerminate();
+
+ m_portSelection->SetValue(defaultPort);
+}
+
+void PortSelectorDialog::onListSelect( wxCommandEvent& event ) {
+ int pSelect = m_portList->GetSelection();
+ if (pSelect != -1) {
+ m_portSelection->SetValue(m_portList->GetString(pSelect));
+ }
+}
+
+
+void PortSelectorDialog::onCancelButton( wxCommandEvent& event ) {
+ wxGetApp().getAppFrame()->dismissRigControlPortDialog();
+}
+
+
+void PortSelectorDialog::onOKButton( wxCommandEvent& event ) {
+ wxGetApp().getAppFrame()->setRigControlPort(m_portSelection->GetValue().ToStdString());
+}
diff --git a/src/forms/Dialog/PortSelectorDialog.fbp b/src/forms/Dialog/PortSelectorDialog.fbp
new file mode 100644
index 0000000..13b6b3c
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.fbp
@@ -0,0 +1,727 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<wxFormBuilder_Project>
+ <FileVersion major="1" minor="13" />
+ <object class="Project" expanded="1">
+ <property name="class_decoration"></property>
+ <property name="code_generation">C++</property>
+ <property name="disconnect_events">1</property>
+ <property name="disconnect_mode">source_name</property>
+ <property name="disconnect_php_events">0</property>
+ <property name="disconnect_python_events">0</property>
+ <property name="embedded_files_path">res</property>
+ <property name="encoding">UTF-8</property>
+ <property name="event_generation">connect</property>
+ <property name="file">PortSelectorDialogBase</property>
+ <property name="first_id">1000</property>
+ <property name="help_provider">none</property>
+ <property name="internationalize">0</property>
+ <property name="name">PortSelectorDialog</property>
+ <property name="namespace"></property>
+ <property name="path">.</property>
+ <property name="precompiled_header"></property>
+ <property name="relative_path">1</property>
+ <property name="skip_lua_events">1</property>
+ <property name="skip_php_events">1</property>
+ <property name="skip_python_events">1</property>
+ <property name="ui_table">UI</property>
+ <property name="use_enum">0</property>
+ <property name="use_microsoft_bom">0</property>
+ <object class="Dialog" expanded="1">
+ <property name="aui_managed">0</property>
+ <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+ <property name="bg"></property>
+ <property name="center">wxBOTH</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="enabled">1</property>
+ <property name="event_handler">impl_virtual</property>
+ <property name="extra_style"></property>
+ <property name="fg"></property>
+ <property name="font"></property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="maximum_size"></property>
+ <property name="minimum_size"></property>
+ <property name="name">PortSelectorDialogBase</property>
+ <property name="pos"></property>
+ <property name="size">304,197</property>
+ <property name="style">wxDEFAULT_DIALOG_STYLE</property>
+ <property name="subclass"></property>
+ <property name="title">Select Port</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnActivate"></event>
+ <event name="OnActivateApp"></event>
+ <event name="OnAuiFindManager"></event>
+ <event name="OnAuiPaneButton"></event>
+ <event name="OnAuiPaneClose"></event>
+ <event name="OnAuiPaneMaximize"></event>
+ <event name="OnAuiPaneRestore"></event>
+ <event name="OnAuiRender"></event>
+ <event name="OnChar"></event>
+ <event name="OnClose"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnHibernate"></event>
+ <event name="OnIconize"></event>
+ <event name="OnIdle"></event>
+ <event name="OnInitDialog"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ <object class="wxBoxSizer" expanded="1">
+ <property name="minimum_size"></property>
+ <property name="name">dlgSizer</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND|wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Select a detected port or enter your own</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_staticText1</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL|wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxListBox" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="choices"></property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_portList</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="validator_data_type"></property>
+ <property name="validator_style">wxFILTER_NONE</property>
+ <property name="validator_type">wxDefaultValidator</property>
+ <property name="validator_variable"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnListBox">onListSelect</event>
+ <event name="OnListBoxDClick"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="1">
+ <property name="minimum_size">-1,30</property>
+ <property name="name">bSizer3</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Port</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_staticText2</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <property name="wrap">-1</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND|wxRIGHT</property>
+ <property name="proportion">1</property>
+ <object class="wxTextCtrl" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="maxlength"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_portSelection</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="validator_data_type"></property>
+ <property name="validator_style">wxFILTER_NONE</property>
+ <property name="validator_type">wxDefaultValidator</property>
+ <property name="validator_variable"></property>
+ <property name="value"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnText"></event>
+ <event name="OnTextEnter"></event>
+ <event name="OnTextMaxLen"></event>
+ <event name="OnTextURL"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND | wxALL</property>
+ <property name="proportion">0</property>
+ <object class="wxPanel" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_buttonPanel</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style">wxTAB_TRAVERSAL</property>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ <object class="wxBoxSizer" expanded="1">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer2</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL|wxALIGN_BOTTOM</property>
+ <property name="proportion">0</property>
+ <object class="wxButton" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default">0</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">Cancel</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_cancelButton</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="validator_data_type"></property>
+ <property name="validator_style">wxFILTER_NONE</property>
+ <property name="validator_type">wxDefaultValidator</property>
+ <property name="validator_variable"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnButtonClick">onCancelButton</event>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="spacer" expanded="1">
+ <property name="height">0</property>
+ <property name="permission">protected</property>
+ <property name="width">0</property>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxALL|wxALIGN_BOTTOM</property>
+ <property name="proportion">0</property>
+ <object class="wxButton" expanded="1">
+ <property name="BottomDockable">1</property>
+ <property name="LeftDockable">1</property>
+ <property name="RightDockable">1</property>
+ <property name="TopDockable">1</property>
+ <property name="aui_layer"></property>
+ <property name="aui_name"></property>
+ <property name="aui_position"></property>
+ <property name="aui_row"></property>
+ <property name="best_size"></property>
+ <property name="bg"></property>
+ <property name="caption"></property>
+ <property name="caption_visible">1</property>
+ <property name="center_pane">0</property>
+ <property name="close_button">1</property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="default">0</property>
+ <property name="default_pane">0</property>
+ <property name="dock">Dock</property>
+ <property name="dock_fixed">0</property>
+ <property name="docking">Left</property>
+ <property name="enabled">1</property>
+ <property name="fg"></property>
+ <property name="floatable">1</property>
+ <property name="font"></property>
+ <property name="gripper">0</property>
+ <property name="hidden">0</property>
+ <property name="id">wxID_ANY</property>
+ <property name="label">OK</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min_size"></property>
+ <property name="minimize_button">0</property>
+ <property name="minimum_size"></property>
+ <property name="moveable">1</property>
+ <property name="name">m_okButton</property>
+ <property name="pane_border">1</property>
+ <property name="pane_position"></property>
+ <property name="pane_size"></property>
+ <property name="permission">protected</property>
+ <property name="pin_button">1</property>
+ <property name="pos"></property>
+ <property name="resize">Resizable</property>
+ <property name="show">1</property>
+ <property name="size"></property>
+ <property name="style"></property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="validator_data_type"></property>
+ <property name="validator_style">wxFILTER_NONE</property>
+ <property name="validator_type">wxDefaultValidator</property>
+ <property name="validator_variable"></property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnButtonClick">onOKButton</event>
+ <event name="OnChar"></event>
+ <event name="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></event>
+ <event name="OnKeyDown"></event>
+ <event name="OnKeyUp"></event>
+ <event name="OnKillFocus"></event>
+ <event name="OnLeaveWindow"></event>
+ <event name="OnLeftDClick"></event>
+ <event name="OnLeftDown"></event>
+ <event name="OnLeftUp"></event>
+ <event name="OnMiddleDClick"></event>
+ <event name="OnMiddleDown"></event>
+ <event name="OnMiddleUp"></event>
+ <event name="OnMotion"></event>
+ <event name="OnMouseEvents"></event>
+ <event name="OnMouseWheel"></event>
+ <event name="OnPaint"></event>
+ <event name="OnRightDClick"></event>
+ <event name="OnRightDown"></event>
+ <event name="OnRightUp"></event>
+ <event name="OnSetFocus"></event>
+ <event name="OnSize"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</wxFormBuilder_Project>
diff --git a/src/forms/Dialog/PortSelectorDialog.h b/src/forms/Dialog/PortSelectorDialog.h
new file mode 100644
index 0000000..92687d1
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.h
@@ -0,0 +1,11 @@
+#include "PortSelectorDialogBase.h"
+
+class PortSelectorDialog : public PortSelectorDialogBase {
+public:
+ PortSelectorDialog( wxWindow* parent, wxWindowID id = wxID_ANY, std::string defaultPort = "" );
+
+protected:
+ void onListSelect( wxCommandEvent& event );
+ void onCancelButton( wxCommandEvent& event );
+ void onOKButton( wxCommandEvent& event );
+};
diff --git a/src/forms/Dialog/PortSelectorDialogBase.cpp b/src/forms/Dialog/PortSelectorDialogBase.cpp
new file mode 100644
index 0000000..a8d5bf2
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialogBase.cpp
@@ -0,0 +1,78 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "PortSelectorDialogBase.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PortSelectorDialogBase::PortSelectorDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* dlgSizer;
+ dlgSizer = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText1 = new wxStaticText( this, wxID_ANY, wxT("Select a detected port or enter your own"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1->Wrap( -1 );
+ dlgSizer->Add( m_staticText1, 0, wxEXPAND|wxALL, 5 );
+
+ m_portList = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ dlgSizer->Add( m_portList, 1, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer3;
+ bSizer3 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizer3->SetMinSize( wxSize( -1,30 ) );
+ m_staticText2 = new wxStaticText( this, wxID_ANY, wxT("Port"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText2->Wrap( -1 );
+ bSizer3->Add( m_staticText2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_portSelection = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer3->Add( m_portSelection, 1, wxEXPAND|wxRIGHT, 5 );
+
+
+ dlgSizer->Add( bSizer3, 1, wxEXPAND, 5 );
+
+ m_buttonPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer2;
+ bSizer2 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_cancelButton = new wxButton( m_buttonPanel, wxID_ANY, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer2->Add( m_cancelButton, 0, wxALL|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer2->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_okButton = new wxButton( m_buttonPanel, wxID_ANY, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer2->Add( m_okButton, 0, wxALL|wxALIGN_BOTTOM, 5 );
+
+
+ m_buttonPanel->SetSizer( bSizer2 );
+ m_buttonPanel->Layout();
+ bSizer2->Fit( m_buttonPanel );
+ dlgSizer->Add( m_buttonPanel, 0, wxEXPAND | wxALL, 5 );
+
+
+ this->SetSizer( dlgSizer );
+ this->Layout();
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ m_portList->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( PortSelectorDialogBase::onListSelect ), NULL, this );
+ m_cancelButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onCancelButton ), NULL, this );
+ m_okButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onOKButton ), NULL, this );
+}
+
+PortSelectorDialogBase::~PortSelectorDialogBase()
+{
+ // Disconnect Events
+ m_portList->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( PortSelectorDialogBase::onListSelect ), NULL, this );
+ m_cancelButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onCancelButton ), NULL, this );
+ m_okButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onOKButton ), NULL, this );
+
+}
diff --git a/src/forms/Dialog/PortSelectorDialogBase.h b/src/forms/Dialog/PortSelectorDialogBase.h
new file mode 100644
index 0000000..8e8c2af
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialogBase.h
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef __PORTSELECTORDIALOGBASE_H__
+#define __PORTSELECTORDIALOGBASE_H__
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/string.h>
+#include <wx/stattext.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/listbox.h>
+#include <wx/textctrl.h>
+#include <wx/sizer.h>
+#include <wx/button.h>
+#include <wx/panel.h>
+#include <wx/dialog.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PortSelectorDialogBase
+///////////////////////////////////////////////////////////////////////////////
+class PortSelectorDialogBase : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticText* m_staticText1;
+ wxListBox* m_portList;
+ wxStaticText* m_staticText2;
+ wxTextCtrl* m_portSelection;
+ wxPanel* m_buttonPanel;
+ wxButton* m_cancelButton;
+ wxButton* m_okButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void onListSelect( wxCommandEvent& event ) { event.Skip(); }
+ virtual void onCancelButton( wxCommandEvent& event ) { event.Skip(); }
+ virtual void onOKButton( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ PortSelectorDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Select Port"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 304,197 ), long style = wxDEFAULT_DIALOG_STYLE );
+ ~PortSelectorDialogBase();
+
+};
+
+#endif //__PORTSELECTORDIALOGBASE_H__
diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp
index 140a90a..295a9c4 100644
--- a/src/modules/modem/analog/ModemLSB.cpp
+++ b/src/modules/modem/analog/ModemLSB.cpp
@@ -5,12 +5,7 @@
ModemLSB::ModemLSB() : ModemAnalog() {
// half band filter used for side-band elimination
- // demodAM_LSB = ampmodem_create(0.25, 0.25, LIQUID_AMPMODEM_LSB, 1);
-#ifdef WIN32
- ssbFilt = firfilt_crcf_create_kaiser(23, 0.25, 90.0, 0.01f);
-#else
ssbFilt = iirfilt_crcf_create_lowpass(6, 0.25);
-#endif
ssbShift = nco_crcf_create(LIQUID_NCO);
nco_crcf_set_frequency(ssbShift, (float)((2.0 * M_PI) * 0.25));
c2rFilt = firhilbf_create(5, 90.0);
@@ -26,14 +21,9 @@ std::string ModemLSB::getName() {
}
ModemLSB::~ModemLSB() {
-#ifdef WIN32
- firfilt_crcf_destroy(ssbFilt);
-#else
iirfilt_crcf_destroy(ssbFilt);
-#endif
nco_crcf_destroy(ssbShift);
firhilbf_destroy(c2rFilt);
- // ampmodem_destroy(demodAM_LSB);
}
int ModemLSB::checkSampleRate(long long sampleRate, int /* audioSampleRate */) {
@@ -64,15 +54,8 @@ void ModemLSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a
for (size_t i = 0; i < bufSize; i++) { // Reject upper band
nco_crcf_step(ssbShift);
nco_crcf_mix_up(ssbShift, input->data[i], &x);
-#ifdef WIN32
- firfilt_crcf_push(ssbFilt, x);
- firfilt_crcf_execute(ssbFilt, &y);
-#else
iirfilt_crcf_execute(ssbFilt, x, &y);
-#endif
nco_crcf_mix_down(ssbShift, y, &x);
- // Liquid-DSP AMPModem SSB drifts with strong signals near baseband (like a carrier?)
- // ampmodem_demodulate(demodAM_LSB, y, &demodOutputData[i]);
firhilbf_c2r_execute(c2rFilt, x, &demodOutputData[i]);
}
diff --git a/src/modules/modem/analog/ModemLSB.h b/src/modules/modem/analog/ModemLSB.h
index 8834313..9804edf 100644
--- a/src/modules/modem/analog/ModemLSB.h
+++ b/src/modules/modem/analog/ModemLSB.h
@@ -19,13 +19,7 @@ public:
void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
private:
-#ifdef WIN32
- firfilt_crcf ssbFilt;
-#else
iirfilt_crcf ssbFilt;
-#endif
firhilbf c2rFilt;
nco_crcf ssbShift;
- // firfilt_crcf ssbFilt;
- // ampmodem demodAM_LSB;
};
\ No newline at end of file
diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp
index f221f2c..775fadc 100644
--- a/src/modules/modem/analog/ModemUSB.cpp
+++ b/src/modules/modem/analog/ModemUSB.cpp
@@ -5,12 +5,7 @@
ModemUSB::ModemUSB() : ModemAnalog() {
// half band filter used for side-band elimination
- // demodAM_USB = ampmodem_create(0.25, -0.25, LIQUID_AMPMODEM_USB, 1);
-#ifdef WIN32
- ssbFilt = firfilt_crcf_create_kaiser(23, 0.25, 90.0, 0.01f);
-#else
ssbFilt = iirfilt_crcf_create_lowpass(6, 0.25);
-#endif
ssbShift = nco_crcf_create(LIQUID_NCO);
nco_crcf_set_frequency(ssbShift, (float)((2.0 * M_PI) * 0.25));
c2rFilt = firhilbf_create(5, 90.0);
@@ -26,14 +21,9 @@ std::string ModemUSB::getName() {
}
ModemUSB::~ModemUSB() {
-#ifdef WIN32
- firfilt_crcf_destroy(ssbFilt);
-#else
iirfilt_crcf_destroy(ssbFilt);
-#endif
nco_crcf_destroy(ssbShift);
firhilbf_destroy(c2rFilt);
- // ampmodem_destroy(demodAM_USB);
}
int ModemUSB::checkSampleRate(long long sampleRate, int /* audioSampleRate */) {
@@ -64,15 +54,8 @@ void ModemUSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a
for (size_t i = 0; i < bufSize; i++) { // Reject lower band
nco_crcf_step(ssbShift);
nco_crcf_mix_down(ssbShift, input->data[i], &x);
-#ifdef WIN32
- firfilt_crcf_push(ssbFilt, x);
- firfilt_crcf_execute(ssbFilt, &y);
-#else
iirfilt_crcf_execute(ssbFilt, x, &y);
-#endif
nco_crcf_mix_up(ssbShift, y, &x);
- // Liquid-DSP AMPModem SSB drifts with strong signals near baseband (like a carrier?)
- // ampmodem_demodulate(demodAM_USB, y, &demodOutputData[i]);
firhilbf_c2r_execute(c2rFilt, x, &demodOutputData[i]);
}
diff --git a/src/modules/modem/analog/ModemUSB.h b/src/modules/modem/analog/ModemUSB.h
index e7ae61d..7c86ed3 100644
--- a/src/modules/modem/analog/ModemUSB.h
+++ b/src/modules/modem/analog/ModemUSB.h
@@ -19,12 +19,7 @@ public:
void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
private:
-#ifdef WIN32
- firfilt_crcf ssbFilt;
-#else
iirfilt_crcf ssbFilt;
-#endif
firhilbf c2rFilt;
nco_crcf ssbShift;
-// ampmodem demodAM_USB;
};
\ No newline at end of file
diff --git a/src/util/GLFont.cpp b/src/util/GLFont.cpp
index e3e7e5f..5acf124 100644
--- a/src/util/GLFont.cpp
+++ b/src/util/GLFont.cpp
@@ -633,12 +633,7 @@ void GLFont::drawString(const std::wstring& str, int pxHeight, float xpos, float
void GLFont::drawString(const std::string& str, int pxHeight, float xpos, float ypos, Align hAlign, Align vAlign, int vpx, int vpy, bool cacheable) {
//Displayed string is wstring, so use wxString to do the heavy lifting of converting str...
-#ifdef WIN32
- //try to reuse the memory with thread_local, unsupported on OSX ?
- static thread_local wxString wsTmp;
-#else
wxString wsTmp;
-#endif
wsTmp.assign(str);
diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp
index 510aa79..72f0be5 100644
--- a/src/visual/PrimaryGLContext.cpp
+++ b/src/visual/PrimaryGLContext.cpp
@@ -359,12 +359,8 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBA4f color, long
GLFont::Align demodAlign = GLFont::GLFONT_ALIGN_CENTER;
//Displayed string is wstring, so use wxString to do the heavy lifting of converting getDemodulatorType()...
-#ifdef WIN32
- //try to reuse the memory with thread_local, unsupported on OSX ?
- static thread_local wxString demodStr;
-#else
wxString demodStr;
-#endif
+
demodStr.assign(demod->getDemodulatorType());
demodAlign = GLFont::GLFONT_ALIGN_CENTER;
diff --git a/src/visual/ScopeContext.cpp b/src/visual/ScopeContext.cpp
index 1a5f1f2..f0b0a76 100644
--- a/src/visual/ScopeContext.cpp
+++ b/src/visual/ScopeContext.cpp
@@ -41,7 +41,7 @@ void ScopeContext::DrawTunerTitles(bool ppmMode) {
GLFont::Drawer refDrawingFont = GLFont::getFont(12, GLFont::getScaleFactor());
//better position frequency/bandwith labels according to font scale
- double shiftFactor = GLFont::getScaleFactor();
+ double shiftFactor = GLFont::getScaleFactor()+0.5;
refDrawingFont.drawString(ppmMode?"Device PPM":"Frequency", -0.66f, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true);
refDrawingFont.drawString("Bandwidth", 0.0, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/cubicsdr.git
More information about the pkg-hamradio-commits
mailing list