[hamradio-commits] [limesuite] 01/09: New upstream version 17.02.1+dfsg
Andreas E. Bombe
aeb at moszumanska.debian.org
Thu Mar 30 23:19:29 UTC 2017
This is an automated email from the git hooks/post-receive script.
aeb pushed a commit to branch master
in repository limesuite.
commit bae5b9d9af7734d998b9124c21f3be698ab3d002
Author: Andreas Bombe <aeb at debian.org>
Date: Wed Mar 29 14:49:21 2017 +0200
New upstream version 17.02.1+dfsg
---
.travis.yml | 58 +
CMakeLists.txt | 14 +-
Changelog.txt | 46 +
README.md | 5 +
SoapyLMS7/Registration.cpp | 3 +
SoapyLMS7/Settings.cpp | 50 +-
SoapyLMS7/SoapyLMS7.h | 4 +
appveyor.yml | 62 +
cmake/DownloadImages.cmake | 41 +
cmake/Modules/Findlibusb-1.0.cmake | 8 +-
debian/changelog | 31 +
debian/control | 32 +-
debian/copyright | 2 +-
...16.12-1.install => liblimesuite17.02-1.install} | 0
debian/limesuite-images17.02.dirs | 1 +
debian/limesuite-images17.02.postinst | 37 +
debian/limesuite-images17.02.prerm | 12 +
debian/rules | 3 +
docs/Lime_Suite_Compilation_Guide.odt | Bin 0 -> 193085 bytes
docs/Lime_Suite_Compilation_Guide.pdf | Bin 0 -> 415962 bytes
docs/lms7suite_compilation_guide.odt | Bin 282915 -> 0 bytes
docs/lms7suite_compilation_guide.pdf | Bin 358635 -> 0 bytes
mcu_program/common_src/lms7002m_calibrations.c | 3 +-
mcu_program/common_src/lms7002m_controls.c | 1 +
mcu_program/host_src/mcu.c | 11 +-
mcu_program/host_src/spi.cpp | 10 +-
octave/LimeSuite.cc | 60 +-
octave/rx.m | 6 +-
src/ADF4002/ADF4002_wxgui.cpp | 6 +-
src/API/lms7_api.cpp | 67 +-
src/API/lms7_device.cpp | 158 +-
src/API/lms7_device.h | 3 +
src/CMakeLists.txt | 7 +
src/ConnectionNovenaRF7/CMakeLists.txt | 11 +-
.../ConnectionNovenaRF7_streaming.cpp | 2 +-
src/ConnectionNovenaRF7/StreamChannel.cpp | 2 +-
src/ConnectionRegistry/ConnectionHandle.cpp | 19 +-
src/ConnectionRegistry/IConnection.cpp | 11 +-
src/ConnectionRegistry/IConnection.h | 45 +-
src/ConnectionSTREAM/CMakeLists.txt | 1 +
src/ConnectionSTREAM/ConnectionSTREAM.cpp | 187 +-
src/ConnectionSTREAM/ConnectionSTREAM.h | 13 +-
src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp | 136 +-
src/ConnectionSTREAM/ConnectionSTREAMImages.cpp | 190 ++
src/ConnectionSTREAM/ConnectionSTREAMing.cpp | 163 +-
.../ConnectionSTREAM_UNITE.cpp | 4 +-
.../ConnectionSTREAM_UNITE.h | 2 +-
.../ConnectionSTREAM_UNITEEntry.cpp | 44 +-
src/ConnectionXillybus/ConnectionXillybus.cpp | 570 ++--
src/ConnectionXillybus/ConnectionXillybus.h | 28 +-
src/ConnectionXillybus/ConnectionXillybusing.cpp | 197 +-
src/Connection_uLimeSDR/Connection_uLimeSDR.cpp | 144 +-
.../Connection_uLimeSDREntry.cpp | 112 +-
src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp | 111 +-
src/FPGA_common/FPGA_common.cpp | 168 +-
src/FPGA_common/FPGA_common.h | 7 +-
src/GFIR/gfir_lms.c | 2 +-
src/LMS_Programing/LMS_Programing_wxgui.cpp | 42 +-
src/LMS_Programing/LMS_Programing_wxgui.h | 1 +
src/LimeUtil.cpp | 77 +-
src/SystemResources.h | 68 +
src/SystemResources.in.cpp | 205 ++
src/VersionInfo.h | 2 +-
src/boards_wxgui/pnlLimeSDR.cpp | 6 +-
src/boards_wxgui/pnlUltimateEVB.cpp | 154 +
src/boards_wxgui/pnlUltimateEVB.h | 50 +
src/examples/basicRX.cpp | 4 +-
src/examples/dualRXTX.cpp | 14 +-
src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp | 201 +-
src/fftviewer_wxgui/fftviewer_frFFTviewer.h | 9 +-
src/fftviewer_wxgui/fftviewer_wxgui.cpp | 4 +-
src/fftviewer_wxgui/fftviewer_wxgui.fbp | 4 +-
src/lime/LimeSuite.h | 44 +-
src/lms7002_wxgui/CoefficientFileParser.cpp | 26 +-
src/lms7002_wxgui/CoefficientFileParser.h | 8 +-
src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp | 12 +-
src/lms7002_wxgui/lms7002_mainPanel.cpp | 7 +
src/lms7002_wxgui/lms7002_mainPanel.h | 2 +
src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp | 12 +-
src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h | 2 +
src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp | 19 +
src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp | 6 +-
src/lms7002_wxgui/lms7002_pnlR3.cpp | 862 +++++
src/lms7002_wxgui/lms7002_pnlR3.h | 83 +
src/lms7002_wxgui/lms7002_pnlRBB_view.cpp | 2 +-
src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp | 1 +
src/lms7002_wxgui/lms7002_pnlSX_view.cpp | 18 +
src/lms7002_wxgui/lms7002_pnlSX_view.h | 3 +
src/lms7002_wxgui/lms7002_wxgui.cpp | 338 +-
src/lms7002_wxgui/lms7002_wxgui.fbp | 3479 +++++++++++++++++++-
src/lms7002_wxgui/lms7002_wxgui.h | 59 +
src/lms7002_wxgui/pnlBoardControls.cpp | 97 +-
src/lms7002_wxgui/pnlBoardControls.h | 2 +-
src/lms7002m/CalibrationCache.cpp | 25 +-
src/lms7002m/LMS7002M.cpp | 10 +-
src/lms7002m/LMS7002M_RegistersMap.cpp | 4 +-
src/lms7002m/LMS7002M_RxTxCalibrations.cpp | 32 +-
src/lms7002m/LMS7002M_filtersCalibration.cpp | 6 +
src/lms7002m/LMS7002M_parameters.cpp | 153 +-
src/lms7002m/LMS7002M_parameters.h | 96 +-
src/lms7002m_mcu/MCU_BD.cpp | 1 +
src/lms7002m_mcu/MCU_File.h | 2 +-
src/lms7suiteAppFrame.cpp | 6 +-
src/lms7suiteApp_gui.cpp | 2 +-
src/oglGraph/OpenGLGraph.cpp | 4 +-
src/oglGraph/dlgMarkers.cpp | 4 +-
src/protocols/ILimeSDRStreaming.cpp | 51 +-
src/protocols/ILimeSDRStreaming.h | 4 +-
src/protocols/LMS64CProtocol.cpp | 40 +-
src/protocols/LMS64CProtocol.h | 3 +
src/protocols/LMSBoards.h | 124 +-
src/protocols/dataTypes.h | 2 +-
src/protocols/fifo.h | 8 +-
src/utilities_gui/dlgConnectionSettings.cpp | 5 +-
src/windowFunction.cpp | 61 +-
src/windowFunction.h | 2 +-
udev-rules/64-limesuite.rules | 1 +
117 files changed, 8122 insertions(+), 1357 deletions(-)
diff --git a/.travis.yml b/.travis.yml
new file mode 100755
index 0000000..cb2c117
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,58 @@
+########################################################################
+## Travis CI config for LimeSuite
+##
+## * not all components will be configured
+## * the matrix builds Release and Debug
+## * for linux + gcc, and osx + clang
+########################################################################
+
+sudo: required
+dist: trusty
+
+language: cpp
+
+matrix:
+ include:
+ - os: linux
+ compiler: gcc
+ - os: osx
+ compiler: clang
+
+env:
+ global:
+ - INSTALL_PREFIX=/usr/local
+ - SOAPY_SDR_BRANCH=master
+ - BUILD_TYPE=Release
+
+# whitelist
+branches:
+ only:
+ - master
+ - stable
+
+before_install:
+
+ # update after package changes
+ - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi;
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
+
+ # install development dependencies
+ - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -qq libusb-1.0-0-dev cmake libwxbase3.0-dev libwxgtk3.0-dev;fi;
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb wxmac ; fi
+
+install:
+
+ # install SoapySDR from source
+ - git clone https://github.com/pothosware/SoapySDR.git
+ - pushd SoapySDR
+ - git checkout ${SOAPY_SDR_BRANCH}
+ - mkdir build && cd build
+ - cmake ../ -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
+ - make && sudo make install
+ - popd
+
+script:
+ - mkdir temp && cd temp
+ - cmake ../ -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_STREAM_UNITE=ON
+ - make -j2
+ - sudo make install
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ba2abcf..da90ec5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,9 +26,9 @@ endif()
# Manually increment these numbers when creating releases.
# LIME_SUITE_API_VERSION in VersionInfo.h reflects the major/minor,
# and must be set manually when non-patch releases are created.
-set(VERSION_MAJOR 16)
-set(VERSION_MINOR 12)
-set(VERSION_PATCH 0)
+set(VERSION_MAJOR 17)
+set(VERSION_MINOR 02)
+set(VERSION_PATCH 1)
# the ABI compatibility number should be incremented when the ABI changes
# the format is to use the same major and minor, but to have an incrementing
@@ -51,6 +51,13 @@ set(LIME_SUITE_LIBVER "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
set(LIME_SUITE_VERSION "${LIME_SUITE_LIBVER}-${LIME_SUITE_EXTVER}")
string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d")
+#LIME_SUITE_ROOT is compiled into the library to locate the install base.
+#By default, the LIME_SUITE_ROOT is set to the CMAKE_INSTALL_PREFIX.
+#However users may overload this by specifying -DLIME_SUITE_ROOT=<path>.
+set(LIME_SUITE_ROOT "${CMAKE_INSTALL_PREFIX}" CACHE PATH
+ "Installation root for lime::getLimeSuiteRoot()")
+file(TO_CMAKE_PATH "${LIME_SUITE_ROOT}" LIME_SUITE_ROOT)
+
########################################################################
## compiler flags
########################################################################
@@ -172,6 +179,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Build timestamp: ${BUILD_TIMESTAMP}")
message(STATUS "Lime Suite version: ${LIME_SUITE_VERSION}")
message(STATUS "ABI/so version: ${LIME_SUITE_SOVER}")
+include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadImages.cmake)
########################################################################
# uninstall target
diff --git a/Changelog.txt b/Changelog.txt
new file mode 100644
index 0000000..af0cd1e
--- /dev/null
+++ b/Changelog.txt
@@ -0,0 +1,46 @@
+Release 17.02.1 (2017-03-11)
+==========================
+
+- Fix ILimeSDRStreaming fifo size power of two issue
+
+Release 17.02.0 (2017-03-07)
+==========================
+
+- Automatic phase configuration for DIQ clocks
+- Fix FFT avg amplitudes when MIMO is enabled
+- Fix free usb device list for STREAM connection
+- Device handle display and label improvements
+- General fixes for LimeSDR-PCIE support
+- Add gain control with dB value (for RX only)
+
+Release 17.01.1 (2017-02-03)
+==========================
+
+- Updated LimeSDR rev1.4 gateware images to version 2.6
+- LMS7 API: Fix CGEN clock config in LMS_SetClockFreq()
+- Fix debug assertion in FFT viewer wx format string
+- LMS7 API: Fix NCO down/upconvert for new chip rev
+- Fix NCO tuning sign in SoapyLMS7 for LMS7 silicon rev
+- Fixed bug in downloadImageResource() call for windows
+- Updated LimeSDR images for USB enumeration problem fix
+
+Release 17.01.0 (2017-01-22)
+==========================
+
+- Support filter by serial for ConnectionSTREAM
+- Added resource location API and image update API
+- configure LML clock phases based on interface freq
+- LimeSDR: detect reference clock presence on connect
+- Set CMIX setting in calib/tune based on chip version
+
+Release 16.12.1 (2017-01-22)
+==========================
+
+- Minor compilation fixes for OSX/clang (narrowing)
+- Improve cmake check for novena connection i2c support
+- Fix abs() overload for mcu lms7002m calibrations
+
+Release 16.12.0 (2016-12-31)
+==========================
+
+This is the first changelog entry for LimeSuite
diff --git a/README.md b/README.md
index 2a613b3..7de4cb3 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,11 @@ Read more about Lime Suite on the official project page:
* https://myriadrf.org/projects/lime-suite/
+##Build Status
+
+- Travis: [](https://travis-ci.org/myriadrf/LimeSuite)
+- AppVeyor: [](https://ci.appveyor.com/project/myriadrf/limesuite)
+
## Documentation
Find build and install instructions for Lime Suite on the wiki:
diff --git a/SoapyLMS7/Registration.cpp b/SoapyLMS7/Registration.cpp
index 08686bd..08a0c19 100644
--- a/SoapyLMS7/Registration.cpp
+++ b/SoapyLMS7/Registration.cpp
@@ -36,6 +36,9 @@ static SoapySDR::Kwargs handleToArgs(const ConnectionHandle &handle)
if (not handle.serial.empty()) args["serial"] = handle.serial;
if (handle.index != -1) args["index"] = std::to_string(handle.index);
+ //label connection for drop-downs and lists
+ args["label"] = handle.ToString();
+
return args;
}
diff --git a/SoapyLMS7/Settings.cpp b/SoapyLMS7/Settings.cpp
index 5d13373..ddc3308 100644
--- a/SoapyLMS7/Settings.cpp
+++ b/SoapyLMS7/Settings.cpp
@@ -405,6 +405,27 @@ std::vector<std::string> SoapyLMS7::listGains(const int direction, const size_t
return gains;
}
+void SoapyLMS7::setGain(const int direction, const size_t channel, const double value)
+{
+ std::unique_lock<std::recursive_mutex> lock(_accessMutex);
+
+ //Distribute Rx gain from elements in the direction of RFE to RBB
+ //This differs from the default gain distribution in that it
+ //does not scale the gain to the negative range of the PGA.
+ //This keep the PGA in mid-range unless extreme values are used.
+ if (direction == SOAPY_SDR_RX)
+ {
+ double remaining(value);
+ for (const auto &name : this->listGains(direction, channel))
+ {
+ this->setGain(direction, channel, name, remaining);
+ remaining -= this->getGain(direction, channel, name);
+ }
+ }
+
+ else SoapySDR::Device::setGain(direction, channel, value);
+}
+
void SoapyLMS7::setGain(const int direction, const size_t channel, const std::string &name, const double value)
{
std::unique_lock<std::recursive_mutex> lock(_accessMutex);
@@ -494,6 +515,16 @@ double SoapyLMS7::getGain(const int direction, const size_t channel, const std::
else throw std::runtime_error("SoapyLMS7::getGain("+name+") - unknown gain name");
}
+SoapySDR::Range SoapyLMS7::getGainRange(const int direction, const size_t channel) const
+{
+ if (direction == SOAPY_SDR_RX)
+ {
+ //make it so gain of 0.0 sets PGA at its mid-range
+ return SoapySDR::Range(-12.0, 19.0+12.0+30.0);
+ }
+ return SoapySDR::Device::getGainRange(direction, channel);
+}
+
SoapySDR::Range SoapyLMS7::getGainRange(const int direction, const size_t channel, const std::string &name) const
{
if (direction == SOAPY_SDR_RX and name == "LNA") return SoapySDR::Range(0.0, 30.0);
@@ -559,15 +590,17 @@ void SoapyLMS7::setFrequency(const int direction, const size_t channel, const st
if (name == "BB")
{
+ int pos = 0, neg = 1;
switch (direction)
{
case SOAPY_SDR_RX:
+ if (rfic->Get_SPI_Reg_bits(LMS7_MASK, true) != 0) std::swap(pos, neg);
rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), (frequency == 0)?1:0);
- rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), (frequency < 0)?1:0);
+ rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), (frequency < 0)?neg:pos);
break;
case SOAPY_SDR_TX:
rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP), (frequency == 0)?1:0);
- rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP), (frequency < 0)?1:0);
+ rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP), (frequency < 0)?neg:pos);
break;
}
if (rfic->SetNCOFrequency(lmsDir, 0, abs(frequency)) != 0)
@@ -595,7 +628,18 @@ double SoapyLMS7::getFrequency(const int direction, const size_t channel, const
if (name == "BB")
{
- int sign = rfic->Get_SPI_Reg_bits(lmsDir==LMS7002M::Tx?LMS7param(CMIX_SC_TXTSP):LMS7param(CMIX_SC_RXTSP)) == 0 ? 1 : -1;
+ int sign = 0;
+ int pos = 0, neg = 1;
+ switch (direction)
+ {
+ case SOAPY_SDR_RX:
+ if (rfic->Get_SPI_Reg_bits(LMS7_MASK, true) != 0) std::swap(pos, neg);
+ sign = (rfic->Get_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP)) == pos) ? 1 : -1;
+ break;
+ case SOAPY_SDR_TX:
+ sign = (rfic->Get_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP)) == pos) ? 1 : -1;
+ break;
+ }
return rfic->GetNCOFrequency(lmsDir, 0) * sign;
}
diff --git a/SoapyLMS7/SoapyLMS7.h b/SoapyLMS7/SoapyLMS7.h
index 5fdd19a..115f830 100644
--- a/SoapyLMS7/SoapyLMS7.h
+++ b/SoapyLMS7/SoapyLMS7.h
@@ -134,10 +134,14 @@ public:
std::vector<std::string> listGains(const int direction, const size_t channel) const;
+ void setGain(const int direction, const size_t channel, const double value);
+
void setGain(const int direction, const size_t channel, const std::string &name, const double value);
double getGain(const int direction, const size_t channel, const std::string &name) const;
+ SoapySDR::Range getGainRange(const int direction, const size_t channel) const;
+
SoapySDR::Range getGainRange(const int direction, const size_t channel, const std::string &name) const;
/*******************************************************************
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100755
index 0000000..fe38012
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,62 @@
+version: '{build}'
+branches:
+ only:
+ - stable
+ - master
+image: Visual Studio 2015
+clone_folder: c:\projects\limesuite
+environment:
+ WXWIDGETS_ROOT_DIR: C:\projects\deps\wxWidgets
+ FX3_SDK_PATH: C:\projects\deps\FX3SDK
+ CONFIGURATION: RelWithDebInfo
+ matrix:
+ - CMAKE_GENERATOR: Visual Studio 14 2015
+ WXWIDGETS_LIBS_DIR: C:\projects\deps\wxWidgets\lib\vc140_dll
+ WXWIDGETS_LIBS_DOWNLOAD_LINK: https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxMSW-3.1.0_vc140_Dev.7z
+ - CMAKE_GENERATOR: Visual Studio 14 2015 Win64
+ WXWIDGETS_LIBS_DIR: C:\projects\deps\wxWidgets\lib\vc140_x64_dll
+ WXWIDGETS_LIBS_DOWNLOAD_LINK: https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxMSW-3.1.0_vc140_x64_Dev.7z
+install:
+- cmd: >-
+ mkdir C:\projects\deps
+
+ cd C:\projects\deps
+
+ appveyor DownloadFile "%WXWIDGETS_LIBS_DOWNLOAD_LINK%" -FileName wxMSW-3.1.0_Dev.7z
+
+ 7z x wxMSW-3.1.0_Dev.7z -oC:\projects\deps\wxWidgets > nul
+
+ appveyor DownloadFile https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxWidgets-3.1.0-headers.7z wxWidgets-3.1.0-headers.7z
+
+ 7z x wxWidgets-3.1.0-headers.7z -oC:\\projects\\deps\\wxWidgets > nul
+
+ appveyor DownloadFile http://downloads.myriadrf.org/project/limesuite/appveyor/FX3SDK.zip FX3SDK.zip
+
+ 7z x FX3SDK.zip -oC:\projects\deps\FX3SDK > nul
+
+ git clone https://github.com/pothosware/SoapySDR.git
+
+ cd SoapySDR
+
+ mkdir build && cd build
+
+ cmake ../ -G "%CMAKE_GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION%
+
+ cmake --build . --config %CONFIGURATION%
+
+ cmake --build . --config %CONFIGURATION% --target install
+
+
+build_script:
+- cmd: >-
+ cmake --version
+
+ cd c:\projects\limesuite
+
+ mkdir temp
+
+ cd temp
+
+ cmake .. -G "%CMAKE_GENERATOR%" -DCMAKE_PREFIX_PATH="%WXWIDGETS_LIBS_DIR%" -DwxWidgets_LIB_DIR="%WXWIDGETS_LIBS_DIR%" -DwxWidgets_ROOT_DIR="%WXWIDGETS_ROOT_DIR%" -DFX3_SDK_PATH="%FX3_SDK_PATH%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DENABLE_STREAM_UNITE=ON
+
+ cmake --build . --config %CONFIGURATION%
diff --git a/cmake/DownloadImages.cmake b/cmake/DownloadImages.cmake
new file mode 100644
index 0000000..46c390c
--- /dev/null
+++ b/cmake/DownloadImages.cmake
@@ -0,0 +1,41 @@
+########################################################################
+## Download limesuite images upon configure
+## Recommended for source-based build environments
+########################################################################
+if (NOT DOWNLOAD_IMAGES)
+ return()
+endif ()
+
+message(STATUS "")
+message(STATUS "######################################################")
+message(STATUS "## DOWNLOAD_IMAGES=${DOWNLOAD_IMAGES} specified; syncing images...")
+message(STATUS "######################################################")
+
+#download support constants
+set(SOURCE_URL "http://downloads.myriadrf.org/project/limesuite/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(TEMP_DEST "${CMAKE_CURRENT_BINARY_DIR}/images/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(INSTALL_DEST "share/LimeSuite/images/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(HREF_MATCHER "href=\\\"([\\._A-Za-z_0-9-]+)\\\"")
+
+#conditional download when file is missing
+function(DOWNLOAD_URL url file)
+ if (EXISTS ${file})
+ message(STATUS "Already downloaded ${url}")
+ else ()
+ message(STATUS "Downloading ${url}...")
+ file(DOWNLOAD "${url}" "${file}")
+ endif ()
+endfunction(DOWNLOAD_URL)
+
+#get a list of images from the url index
+file(MAKE_DIRECTORY "${TEMP_DEST}")
+DOWNLOAD_URL("${SOURCE_URL}" "${TEMP_DEST}/index.html")
+file(READ "${TEMP_DEST}/index.html" index_html)
+string(REGEX MATCHALL "${HREF_MATCHER}" matches "${index_html}")
+
+#download each image in the index and create install rule
+foreach (match ${matches})
+ string(REGEX MATCHALL "${HREF_MATCHER}" __tmp "${match}")
+ DOWNLOAD_URL("${SOURCE_URL}/${CMAKE_MATCH_1}" "${TEMP_DEST}/${CMAKE_MATCH_1}")
+ install(FILES "${TEMP_DEST}/${CMAKE_MATCH_1}" DESTINATION ${INSTALL_DEST})
+endforeach(match)
diff --git a/cmake/Modules/Findlibusb-1.0.cmake b/cmake/Modules/Findlibusb-1.0.cmake
index ec40055..82f6da1 100644
--- a/cmake/Modules/Findlibusb-1.0.cmake
+++ b/cmake/Modules/Findlibusb-1.0.cmake
@@ -59,9 +59,13 @@ else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS)
libusb-1.0
)
+ set(LIBUSB_1_LIBRARY_NAME usb-1.0)
+ if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+ set(LIBUSB_1_LIBRARY_NAME usb)
+ endif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+
find_library(LIBUSB_1_LIBRARY
- NAMES
- usb-1.0 usb
+ NAMES ${LIBUSB_1_LIBRARY_NAME}
PATHS
/usr/lib
/usr/local/lib
diff --git a/debian/changelog b/debian/changelog
index 16e102c..037f9b5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,34 @@
+limesuite (17.02.1-1) unstable; urgency=low
+
+ * Release 17.02.1 (2017-03-11)
+ * Fix debian packaging for 17.02 ABI
+
+ -- Lime Microsystems <info at limemicro.com> Sat, 11 Mar 2017 15:36:30 -0800
+
+limesuite (17.02.0-1) unstable; urgency=low
+
+ * Release 17.02.0 (2017-03-07)
+
+ -- Lime Microsystems <info at limemicro.com> Tue, 07 Mar 2017 12:57:30 -0800
+
+limesuite (17.01.1-1) unstable; urgency=low
+
+ * Release 17.01.1 (2017-02-03)
+
+ -- Lime Microsystems <info at limemicro.com> Fri, 03 Feb 2017 19:20:52 -0800
+
+limesuite (17.01.0-1) unstable; urgency=low
+
+ * Release 17.01.0 (2017-01-22)
+
+ -- Lime Microsystems <info at limemicro.com> Sun, 22 Jan 2017 13:06:52 -0800
+
+limesuite (16.12.1-1) unstable; urgency=low
+
+ * Release 16.12.1 (2017-01-22)
+
+ -- Lime Microsystems <info at limemicro.com> Sun, 22 Jan 2017 10:50:11 -0800
+
limesuite (16.12.0-1) unstable; urgency=low
* updated debian packaging for 16.12.0 release
diff --git a/debian/control b/debian/control
index 45ff9db..ea7cc7a 100644
--- a/debian/control
+++ b/debian/control
@@ -16,13 +16,13 @@ Homepage: https://myriadrf.org/projects/lime-suite/
Vcs-Git: https://github.com/myriadrf/LimeSuite.git
Vcs-Browser: https://github.com/myriadrf/LimeSuite.git
-Package: liblimesuite16.12-1
+Package: liblimesuite17.02-1
Section: libs
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
Depends: ${shlibs:Depends}, ${misc:Depends}
-Recommends: limesuite-udev
+Recommends: limesuite-udev, limesuite-images
Description: Lime Suite - shared library
Lime Suite application software.
@@ -30,7 +30,7 @@ Package: liblimesuite-dev
Section: libdevel
Architecture: any
Depends:
- liblimesuite16.12-1 (= ${binary:Version}),
+ liblimesuite17.02-1 (= ${binary:Version}),
${misc:Depends}
Description: Lime Suite - development files
Lime Suite application software.
@@ -39,7 +39,7 @@ Package: limesuite
Section: comm
Architecture: any
Depends:
- liblimesuite16.12-1 (= ${binary:Version}),
+ liblimesuite17.02-1 (= ${binary:Version}),
${shlibs:Depends},
${misc:Depends},
xdg-utils
@@ -59,7 +59,7 @@ Section: comm
Architecture: any
Multi-Arch: same
Depends:
- liblimesuite16.12-1 (= ${binary:Version}),
+ liblimesuite17.02-1 (= ${binary:Version}),
${shlibs:Depends},
${misc:Depends},
python, python-soapysdr
@@ -73,3 +73,25 @@ Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends}, udev
Description: Lime Suite - USB rules for udev
Lime Suite application software.
+
+Package: limesuite-images17.02
+Section: libs
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}, wget
+Description: Lime Suite - Install firmware and gateware images
+ Lime Suite application software.
+ .
+ This is dummy package that downloads the images from the web.
+
+Package: limesuite-images
+Section: libs
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}, limesuite-images17.02
+Description: Lime Suite - Install firmware and gateware images
+ Lime Suite application software.
+ .
+ This is an empty dependency package that pulls in the images
+ for the default version of Lime Suite.
+
diff --git a/debian/copyright b/debian/copyright
index f3d7e98..73e056a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -3,7 +3,7 @@ Upstream-Name: limesuite
Source: https://myriadrf.org/projects/lime-suite/
Files: *
-Copyright: 2015-2016 Lime Microsystems <info at limemicro.com>
+Copyright: 2015-2017 Lime Microsystems <info at limemicro.com>
License: Apache-2.0
On Debian systems, the full text of the Apache
License version 2.0 can be found in the file
diff --git a/debian/liblimesuite16.12-1.install b/debian/liblimesuite17.02-1.install
similarity index 100%
rename from debian/liblimesuite16.12-1.install
rename to debian/liblimesuite17.02-1.install
diff --git a/debian/limesuite-images17.02.dirs b/debian/limesuite-images17.02.dirs
new file mode 100644
index 0000000..dfc3841
--- /dev/null
+++ b/debian/limesuite-images17.02.dirs
@@ -0,0 +1 @@
+/usr/share/LimeSuite/images/
diff --git a/debian/limesuite-images17.02.postinst b/debian/limesuite-images17.02.postinst
new file mode 100644
index 0000000..08731da
--- /dev/null
+++ b/debian/limesuite-images17.02.postinst
@@ -0,0 +1,37 @@
+#!/bin/sh
+set -e
+
+RELEASE_NUM="17.02"
+DEST_DIR="/usr/share/LimeSuite/images/${RELEASE_NUM}"
+SOURCE_URL="http://downloads.myriadrf.org/project/limesuite/${RELEASE_NUM}/"
+
+if [ "$1" = "configure" ]; then
+ echo "Downloading ${SOURCE_URL} -> ${DEST_DIR}"
+
+ DOWNLOAD_TMP=$(mktemp --directory)
+ wget \
+ --recursive --level=1 \
+ --no-host-directories \
+ --no-directories \
+ --no-parent \
+ --reject="index.html*" \
+ --directory-prefix="${DOWNLOAD_TMP}" \
+ "${SOURCE_URL}"
+
+ #cleanup and error out when wget fails
+ if [ $? -ne 0 ]; then
+ echo "Download failed!"
+ rm --force --recursive "${DOWNLOAD_TMP}"
+ exit 1
+ fi
+
+ #successful download, move tmp to destination
+ echo "Moving images to ${DEST_DIR}"
+ mv "${DOWNLOAD_TMP}" "${DEST_DIR}"
+
+ #fix permissions since this was a temp dir
+ chmod ug+rwx "${DEST_DIR}"
+ chmod o+rx "${DEST_DIR}"
+fi
+
+#DEBHELPER#
diff --git a/debian/limesuite-images17.02.prerm b/debian/limesuite-images17.02.prerm
new file mode 100644
index 0000000..778d583
--- /dev/null
+++ b/debian/limesuite-images17.02.prerm
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -e
+
+RELEASE_NUM="17.01"
+DEST_DIR="/usr/share/LimeSuite/images/${RELEASE_NUM}"
+
+if [ "$1" = "remove" -o "$1" = "purge" ]; then
+ echo "Removing directory ${DEST_DIR}"
+ rm --force --recursive "${DEST_DIR}"
+fi
+
+#DEBHELPER#
diff --git a/debian/rules b/debian/rules
index 3e7e49a..b35a9a1 100644
--- a/debian/rules
+++ b/debian/rules
@@ -24,3 +24,6 @@ override_dh_auto_configure:
-DUDEV_RULES_PATH=/lib/udev/rules.d \
-DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)" \
-DLIME_SUITE_EXTVER="$(DEB_VERSION_EXTVER)"
+
+override_dh_installchangelogs:
+ dh_installchangelogs Changelog.txt
diff --git a/docs/Lime_Suite_Compilation_Guide.odt b/docs/Lime_Suite_Compilation_Guide.odt
new file mode 100644
index 0000000..6fec71d
Binary files /dev/null and b/docs/Lime_Suite_Compilation_Guide.odt differ
diff --git a/docs/Lime_Suite_Compilation_Guide.pdf b/docs/Lime_Suite_Compilation_Guide.pdf
new file mode 100644
index 0000000..5a1080d
Binary files /dev/null and b/docs/Lime_Suite_Compilation_Guide.pdf differ
diff --git a/docs/lms7suite_compilation_guide.odt b/docs/lms7suite_compilation_guide.odt
deleted file mode 100644
index ec31db5..0000000
Binary files a/docs/lms7suite_compilation_guide.odt and /dev/null differ
diff --git a/docs/lms7suite_compilation_guide.pdf b/docs/lms7suite_compilation_guide.pdf
deleted file mode 100644
index 074de65..0000000
Binary files a/docs/lms7suite_compilation_guide.pdf and /dev/null differ
diff --git a/mcu_program/common_src/lms7002m_calibrations.c b/mcu_program/common_src/lms7002m_calibrations.c
index 10b1351..527271e 100644
--- a/mcu_program/common_src/lms7002m_calibrations.c
+++ b/mcu_program/common_src/lms7002m_calibrations.c
@@ -5,6 +5,7 @@
#include <math.h>
#ifdef __cplusplus
+#include <cstdlib>
#define VERBOSE 1
//#define DRAW_GNU_PLOTS
@@ -65,7 +66,7 @@ static uint8_t toDCOffset(const int8_t offset)
{
if(offset >= 0)
return offset;
- return abs(offset) | 0x40;
+ return (uint8_t)(abs((int)offset) | 0x40);
}
static void FlipRisingEdge(const uint16_t addr, const uint8_t bits)
diff --git a/mcu_program/common_src/lms7002m_controls.c b/mcu_program/common_src/lms7002m_controls.c
index cbc40f1..c2cc184 100644
--- a/mcu_program/common_src/lms7002m_controls.c
+++ b/mcu_program/common_src/lms7002m_controls.c
@@ -6,6 +6,7 @@
#ifdef __cplusplus
#include <cmath>
+#include <cstdlib>
using namespace std;
#include <chrono>
#include <thread>
diff --git a/mcu_program/host_src/mcu.c b/mcu_program/host_src/mcu.c
index 1b8c113..1f29cf1 100644
--- a/mcu_program/host_src/mcu.c
+++ b/mcu_program/host_src/mcu.c
@@ -14,7 +14,12 @@ void MCU_RunProcedure(uint8_t id)
const uint16_t x0002reg = SPI_read(0x0002) & 0xFF;
const uint16_t interupt6 = 0x0008;
const uint16_t addrs[5] = {0x0006, 0x0, 0x0002, 0x0002, 0x0002};
- const uint16_t values[5] = {id != 0, id, x0002reg & ~interupt6, x0002reg | interupt6, x0002reg & ~interupt6};
+ const uint16_t values[5] = {
+ (uint16_t)(id != 0),
+ (uint16_t)(id),
+ (uint16_t)(x0002reg & ~interupt6),
+ (uint16_t)(x0002reg | interupt6),
+ (uint16_t)(x0002reg & ~interupt6)};
SPI_write_batch(addrs, values, 5);
}
@@ -67,10 +72,10 @@ uint8_t MCU_SetParameter(MCU_Parameter param, float value)
uint8_t MCU_UploadProgram(const uint8_t* binImage, const uint16_t len)
{
-#ifdef __cplusplus
+#ifndef NDEBUG
auto timeStart = std::chrono::high_resolution_clock::now();
- const auto timeout = std::chrono::milliseconds(100);
#endif // NDEBUG
+ const auto timeout = std::chrono::milliseconds(100);
uint16_t i;
const uint32_t controlAddr = 0x0002;
const uint32_t statusReg = 0x0003;
diff --git a/mcu_program/host_src/spi.cpp b/mcu_program/host_src/spi.cpp
index 088ce90..b7225b1 100644
--- a/mcu_program/host_src/spi.cpp
+++ b/mcu_program/host_src/spi.cpp
@@ -42,7 +42,7 @@ void Modify_SPI_Reg_bits_WrOnly(const uint16_t SPI_reg_addr, const uint8_t bits,
if(batchActive)
{
bool found = false;
- for(int i=0; i<bAddr.size(); ++i)
+ for(size_t i=0; i<bAddr.size(); ++i)
{
if(bAddr[i] == SPI_reg_addr)
{
@@ -71,7 +71,7 @@ void Modify_SPI_Reg_bits(const uint16_t SPI_reg_addr, const uint8_t bits, const
if(batchActive)
{
bool found = false;
- for(int i=0; i<bAddr.size(); ++i)
+ for(size_t i=0; i<bAddr.size(); ++i)
{
if(bAddr[i] == SPI_reg_addr)
{
@@ -119,7 +119,7 @@ void SPI_write_batch(const uint16_t *addr, const uint16_t *values, uint8_t cnt)
if(batchActive)
{
bool found = false;
- for(int i=0; i<bAddr.size(); ++i)
+ for(size_t i=0; i<bAddr.size(); ++i)
{
if(bAddr[i] == addr[i])
{
@@ -154,9 +154,9 @@ int BeginBatch(const char* name)
void EndBatch()
{
//sort batch
- for(int i=0; i<bAddr.size(); ++i)
+ for(size_t i=0; i<bAddr.size(); ++i)
{
- for(int j=i; j<bAddr.size(); ++j)
+ for(size_t j=i; j<bAddr.size(); ++j)
{
if(bAddr[i] > bAddr[j])
{
diff --git a/octave/LimeSuite.cc b/octave/LimeSuite.cc
index 08b8019..b34ff4c 100644
--- a/octave/LimeSuite.cc
+++ b/octave/LimeSuite.cc
@@ -10,6 +10,7 @@ using namespace std;
void FreeResources();
lms_device_t* lmsDev = NULL;
+lms_stream_t streamConfig;
struct complex16_t
{
@@ -20,15 +21,14 @@ struct complex16_t
bool WFMrunning = false;
const int chCount = 1;
const int samplesMaxCount = 16*1360/chCount;
-complex16_t** rxbuffers = NULL;
-complex16_t** txbuffers = NULL;
+complex16_t* rxbuffers = NULL;
+complex16_t* txbuffers = NULL;
void StopStream()
{
if(lmsDev == NULL)
return;
- LMS_StopStream(lmsDev, false);
- LMS_StopStream(lmsDev, true);
+ LMS_StopStream(&streamConfig);
}
void PrintDeviceInfo(lms_device_t* port)
@@ -86,13 +86,8 @@ DEFUN_DLD (LimeInitialize, args, nargout,
<< nargin << " input arguments and "
<< nargout << " output arguments.\n";
- rxbuffers = new complex16_t*[chCount];
- for(int i=0; i<chCount; ++i)
- rxbuffers[i] = new complex16_t[samplesMaxCount];
-
- txbuffers = new complex16_t*[chCount];
- for(int i=0; i<chCount; ++i)
- txbuffers[i] = new complex16_t[samplesMaxCount];
+ rxbuffers = new complex16_t[samplesMaxCount];
+ txbuffers = new complex16_t[samplesMaxCount];
return octave_value(0);
}
@@ -149,23 +144,18 @@ DEFUN_DLD (LimeStartStreaming, args, nargout,
return octave_value(-1);
}
- lms_stream_conf_t streamConfig;
if(nargin > 0)
streamConfig.fifoSize = args(0).int_value();
else
streamConfig.fifoSize = 1360*64;
- streamConfig.transferSize = 65536;
- streamConfig.numTransfers = 16;
- streamConfig.channels = 1;
- streamConfig.dataFmt = lms_stream_conf_t::LMS_FMT_I16;
- streamConfig.linkFmt = lms_stream_conf_t::LMS_LINK_12BIT;
+ streamConfig.throughputVsLatency = 0.5;
+ streamConfig.channel = 0;
+ streamConfig.dataFmt = lms_stream_t::LMS_FMT_I12;
- if(LMS_SetupStream(lmsDev, streamConfig) != 0)
+ if(LMS_SetupStream(lmsDev, &streamConfig) != 0)
octave_stdout << LMS_GetLastErrorMessage() << endl;
- if(LMS_StartStream(lmsDev, false) != 0)
- octave_stdout << LMS_GetLastErrorMessage() << endl;
- if(LMS_StartStream(lmsDev, true) != 0)
+ if(LMS_StartStream(&streamConfig) != 0)
octave_stdout << LMS_GetLastErrorMessage() << endl;
return octave_value_list();
}
@@ -200,7 +190,7 @@ DEFUN_DLD (LimeReceiveSamples, args, , "wfm = LimeReceiveSamplesLarge( samplesCo
const int timeout_ms = 1000;
lms_stream_meta_t meta;
int samplesCollected = 0;
-
+
while(samplesCollected < samplesToReceive)
{
int samplesToRead = 0;
@@ -208,10 +198,10 @@ DEFUN_DLD (LimeReceiveSamples, args, , "wfm = LimeReceiveSamplesLarge( samplesCo
samplesToRead = samplesMaxCount;
else
samplesToRead = samplesToReceive-samplesCollected;
- int samplesRead = LMS_RecvStream(lmsDev, (void**)rxbuffers, samplesToRead, &meta, timeout_ms);
+ int samplesRead = LMS_RecvStream(&streamConfig, (void*)rxbuffers, samplesToRead, &meta, timeout_ms);
for(int i=0; i<samplesRead; ++i)
{
- iqdata(samplesCollected+i)=Complex(rxbuffers[0][i].i/2048.0,rxbuffers[0][i].q/2048.0);
+ iqdata(samplesCollected+i)=Complex(rxbuffers[i].i/2048.0,rxbuffers[i].q/2048.0);
}
samplesCollected += samplesRead;
}
@@ -238,16 +228,16 @@ DEFUN_DLD (LimeTransmitSamples, args, , "LimeTransmitSamples( wfm, timestamp)")
Complex iqdatum2 = iqdatum.complex_value();
short i_sample = iqdatum2.real(); //
short q_sample = iqdatum2.imag(); //
- txbuffers[0][i].i = i_sample;
- txbuffers[0][i].q = q_sample;
+ txbuffers[i].i = i_sample;
+ txbuffers[i].q = q_sample;
}
const int timeout_ms = 1000;
lms_stream_meta_t meta;
- meta.has_timestamp = false;
+ meta.waitForTimestamp = false;
meta.timestamp = 0;
int samplesWrite = samplesCount;
- samplesWrite = LMS_SendStream(lmsDev, (const void**)txbuffers, samplesCount, &meta, timeout_ms);
+ samplesWrite = LMS_SendStream(&streamConfig, (const void*)txbuffers, samplesCount, &meta, timeout_ms);
return octave_value ();
}
@@ -288,8 +278,8 @@ DEFUN_DLD (LimeLoopWFMStart, args, , "LimeTxLoopWFMStart (wfm)")
wfmBuffers[0][i].q = q_sample;
}
- LMS_StreamStartLoopWFM(lmsDev, (const void**)wfmBuffers, samplesCount);
-
+ LMS_UploadWFM(lmsDev, (const void**)wfmBuffers, 1, samplesCount, 0);
+ LMS_EnableTxWFM(lmsDev,true);
for(int i=0; i<chCount; ++i)
delete wfmBuffers[i];
delete wfmBuffers;
@@ -305,7 +295,7 @@ DEFUN_DLD (LimeLoopWFMStop, args, , "LimeTxLoopWFMStop")
return octave_value(-1);
}
if(WFMrunning)
- LMS_StreamStopLoopWFM(lmsDev);
+ LMS_EnableTxWFM(lmsDev,false);
WFMrunning = false;
return octave_value ();
}
@@ -315,23 +305,19 @@ void FreeResources()
if(lmsDev)
{
if(WFMrunning)
- LMS_StreamStopLoopWFM(lmsDev);
+ LMS_EnableTxWFM(lmsDev,false);
StopStream();
- LMS_DestroyStream(lmsDev);
+ LMS_DestroyStream(lmsDev,&streamConfig);
LMS_Close(lmsDev);
lmsDev = NULL;
}
if(rxbuffers)
{
- for(int i=0; i<chCount; ++i)
- delete rxbuffers[i];
delete rxbuffers;
rxbuffers = NULL;
}
if(txbuffers)
{
- for(int i=0; i<chCount; ++i)
- delete txbuffers[i];
delete txbuffers;
txbuffers = NULL;
}
diff --git a/octave/rx.m b/octave/rx.m
index 7414193..a3abb73 100644
--- a/octave/rx.m
+++ b/octave/rx.m
@@ -2,9 +2,9 @@ LoadLimeSuite
LimeInitialize()
LimeLoadConfig('rxTest.ini');
-samplesToBuffer = 1023*64*10; %octave has array limit around 20M
+samplesToBuffer = 1024*64; %octave has array limit around 20M
-batches = 60;
+batches = 32;
FIFOsize = samplesToBuffer*batches % total number of samples to be buffered inside DLL, they will be contiguous
LimeStartStreaming(FIFOsize);
@@ -25,6 +25,6 @@ end
LimeStopStreaming();
LimeDestroy();
-%plot(real(samplesBatch1));
+plot(real(samplesBatch1));
%plot(real(samplesBatch2));
%plot(real(samplesBatch3));
diff --git a/src/ADF4002/ADF4002_wxgui.cpp b/src/ADF4002/ADF4002_wxgui.cpp
index 5c404be..b59d274 100644
--- a/src/ADF4002/ADF4002_wxgui.cpp
+++ b/src/ADF4002/ADF4002_wxgui.cpp
@@ -421,7 +421,9 @@ void ADF4002_wxgui::Initialize(lms_device_t* pSerPort)
lmsControl = pSerPort;
if (lmsControl != nullptr)
{
- //m_adf4002SpiAddr = serPort->GetDeviceInfo().addrADF4002;
+ double refclk;
+ LMS_GetReferenceClock(lmsControl, &refclk);
+ txtFvco->SetValue(wxString::Format("%f", refclk/1e6));
}
}
@@ -547,7 +549,7 @@ void ADF4002_wxgui::OnbtnUploadClick(wxCommandEvent& event)
config.fRef=-1;
config.fVCO=-1;
-
+
spinNCnt->SetValue(config.nCounter);
spinRCnt->SetValue(config.referenceCounter);
diff --git a/src/API/lms7_api.cpp b/src/API/lms7_api.cpp
index 5fec904..270d13c 100644
--- a/src/API/lms7_api.cpp
+++ b/src/API/lms7_api.cpp
@@ -516,8 +516,6 @@ API_EXPORT int CALL_CONV LMS_SetClockFreq(lms_device_t *device, size_t clk_id, f
case LMS_CLOCK_CGEN:
{
int ret;
- float_type fpgaTxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Tx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
- float_type fpgaRxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Rx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
if (freq <= 0)
{
ret = lms->TuneVCO(lime::LMS7002M::VCO_CGEN);
@@ -534,6 +532,8 @@ API_EXPORT int CALL_CONV LMS_SetClockFreq(lms_device_t *device, size_t clk_id, f
lime::ReportError(EINVAL, "Device not connected");
return -1;
}
+ float_type fpgaTxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Tx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
+ float_type fpgaRxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Rx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
return conn->UpdateExternalDataRate(0,fpgaTxPLL/2,fpgaRxPLL/2);
}
case LMS_CLOCK_RXTSP:
@@ -1081,6 +1081,26 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
return lms->SetNormalizedGain(dir_tx,chan,gain);
}
+API_EXPORT int CALL_CONV LMS_SetGaindB(lms_device_t *device, bool dir_tx,
+ size_t chan,unsigned gain)
+{
+ if (device == nullptr)
+ {
+ lime::ReportError(EINVAL, "Device cannot be NULL.");
+ return -1;
+ }
+
+ LMS7_Device* lms = (LMS7_Device*)device;
+
+ if (chan >= lms->GetNumChannels(dir_tx))
+ {
+ lime::ReportError(EINVAL, "Invalid channel number.");
+ return -1;
+ }
+
+ return lms->SetGain(dir_tx,chan,gain);
+}
+
API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx, size_t chan,float_type *gain)
{
if (device == nullptr)
@@ -1103,6 +1123,28 @@ API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx
return LMS_SUCCESS;
}
+API_EXPORT int CALL_CONV LMS_GetGaindB(lms_device_t *device, bool dir_tx, size_t chan, unsigned *gain)
+{
+ if (device == nullptr)
+ {
+ lime::ReportError(EINVAL, "Device cannot be NULL.");
+ return -1;
+ }
+
+ LMS7_Device* lms = (LMS7_Device*)device;
+
+ if (chan >= lms->GetNumChannels(dir_tx))
+ {
+ lime::ReportError(EINVAL, "Invalid channel number.");
+ return -1;
+ }
+
+ *gain = lms->GetGain(dir_tx,chan);
+ if (gain < 0)
+ return -1;
+ return LMS_SUCCESS;
+}
+
API_EXPORT int CALL_CONV LMS_Calibrate(lms_device_t *device, bool dir_tx, size_t chan, double bw, unsigned flags)
{
if (device == nullptr)
@@ -1440,10 +1482,10 @@ API_EXPORT int CALL_CONV LMS_ReadParam(lms_device_t *device, struct LMS7Paramete
return -1;
}
LMS7_Device* lms = (LMS7_Device*)device;
- bool forceReadFromChip = false; //bypass returning values from cache
+ bool forceReadFromChip = true; //bypass returning values from cache
//registers containing read only registers, which values can change
const uint16_t readOnlyRegs[] = {0,1,2,3,4,5,6, 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F};
- for(int i = 0; i < sizeof(readOnlyRegs) / sizeof(uint16_t); ++i)
+ for(size_t i = 0; i < sizeof(readOnlyRegs) / sizeof(uint16_t); ++i)
{
if(param.address == readOnlyRegs[i])
{
@@ -1537,7 +1579,7 @@ API_EXPORT int CALL_CONV LMS_SetupStream(lms_device_t *device, lms_stream_t *str
LMS7_Device* lms = (LMS7_Device*)device;
lime::StreamConfig config;
- config.bufferLength = 65536;
+ config.bufferLength = stream->fifoSize;
config.channelID = stream->channel;
config.performanceLatency = stream->throughputVsLatency;
switch(stream->dataFmt)
@@ -1633,6 +1675,9 @@ API_EXPORT int CALL_CONV LMS_UploadWFM(lms_device_t *device,
case 2:
fmt = lime::StreamConfig::StreamDataFormat::STREAM_COMPLEX_FLOAT32;
break;
+ default:
+ fmt = lime::StreamConfig::StreamDataFormat::STREAM_12_BIT_COMPRESSED;
+ break;
}
return lms->GetConnection()->UploadWFM(samples, chCount, sample_count, fmt);
}
@@ -1779,6 +1824,18 @@ API_EXPORT int CALL_CONV LMS_ProgramHPM7File(lms_device_t *device, const char *f
return lms->ProgramHPM7(file,mode,callback);
}
+API_EXPORT int CALL_CONV LMS_ProgramUpdate(lms_device_t *device, const bool download, lms_prog_callback_t callback)
+{
+ if (device == nullptr)
+ {
+ lime::ReportError(EINVAL, "Device cannot be NULL.");
+ return -1;
+ }
+
+ LMS7_Device* lms = (LMS7_Device*)device;
+ return lms->ProgramUpdate(download,callback);
+}
+
API_EXPORT int CALL_CONV LMS_ProgramLMSMCU(lms_device_t *device, const char *data,
size_t size, lms_target_t target, lms_prog_callback_t callback)
{
diff --git a/src/API/lms7_device.cpp b/src/API/lms7_device.cpp
index 9ba17f0..bdadd1d 100644
--- a/src/API/lms7_device.cpp
+++ b/src/API/lms7_device.cpp
@@ -384,7 +384,7 @@ int LMS7_Device::SetRate(bool tx, float_type f_Hz, size_t oversample)
}
- if (nco_rx != 0 || nco_rx != 0)
+ if (nco_rx != 0 || nco_tx != 0)
{
retain_nco = true;
min_int = 2+2*(nco_tx-1)/tx_channels[0].sample_rate;
@@ -616,7 +616,12 @@ int LMS7_Device::SetRate(bool tx, float_type f_Hz, size_t oversample)
}
}
- return 0;
+ float_type fpgaTxPLL = GetReferenceClk_TSP(lime::LMS7002M::Tx) /
+ pow(2.0, Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
+ float_type fpgaRxPLL = GetReferenceClk_TSP(lime::LMS7002M::Rx) /
+ pow(2.0, Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
+
+ return this->streamPort->UpdateExternalDataRate(0,fpgaTxPLL/2,fpgaRxPLL/2);
}
@@ -932,30 +937,10 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
else
div = (2<<(ratio));
-
- L = div > 8 ? 8 : div;
- div -= 1;
-
- /*if (filt==LMS_GFIR3)
- {
- if (L*15 < count)
- {
- lime::ReportError(ERANGE, "Too many filter coefficients for current oversampling settings");
- ret = -1;;
- L = 1+(count-1)/15;
- div = L-1;
- }
- }
+ if ((div > 8) || (count == 120) || (count == 40 && filt != LMS_GFIR3))
+ L = 8;
else
- {
- if (L*5 < count)
- {
- lime::ReportError(ERANGE, "Too many filter coefficients for current oversampling settings");
- ret = -1;
- L = 1+(count-1)/5;
- div = L-1;
- }
- }*/
+ L = div;
float_type max=0;
for (int i=0; i< (filt==LMS_GFIR3 ? 120 : 40); i++)
@@ -963,7 +948,9 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
max=fabs(coef[i]);
if (max < 1.0)
- max = 1.0;
+ max = 1.0f;
+ else if (max > 100)
+ max = 32767.0f;
size_t sample = 0;
for(int i=0; i< (filt==LMS_GFIR3 ? 15 : 5); i++)
@@ -982,7 +969,8 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
}
}
- L-=1;
+ div -= 1;
+ L = div > 7 ? 7 : div;
if (tx)
{
@@ -1045,7 +1033,7 @@ int LMS7_Device::GetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, float_type*
for (int i = 0; i < (filt==LMS_GFIR3 ? 120 : 40) ; i++)
{
coef[i] = coef16[i];
- coef[i] /= (1<<15);
+ coef[i] /= (1<<15)-1;
}
}
return (filt==LMS_GFIR3) ? 120 : 40;
@@ -1097,55 +1085,62 @@ int LMS7_Device::SetGFIR(bool tx, size_t chan, lms_gfir_t filt, bool enabled)
int LMS7_Device::SetNormalizedGain(bool dir_tx, size_t chan,double gain)
{
+ const int gain_total = 27 + 12 + 31;
+ if (dir_tx)
+ return SetGain(dir_tx,chan,63*gain+0.49);
+ else
+ return SetGain(dir_tx,chan,gain*gain_total+0.49);
+}
+
+int LMS7_Device::SetGain(bool dir_tx, size_t chan, unsigned gain)
+{
if (Modify_SPI_Reg_bits(LMS7param(MAC),chan+1,true)!=0)
return -1;
if (dir_tx)
{
- int g = (63*gain+0.49);
- if (Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),g,true)!=0)
+ if (gain > 63)
+ gain = 63;
+ if (Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),gain,true)!=0)
return -1;
}
else
{
- const int max_gain_lna = 30;
- const int max_gain_tia = 12;
- const int max_gain_pga = 31;
- const int gain_total = max_gain_lna + max_gain_tia + max_gain_pga;
- int target = gain*gain_total+0.49;
+ if (gain > 70)
+ gain = 70;
unsigned lna = 0, tia = 0, pga = 0;
-
- //adjust tia gain
- if (target >= max_gain_tia)
- {
+ //LNA table
+ const unsigned lnaTbl[71] = {
+ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
+ 6, 6, 7, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14
+ };
+ //PGA table
+ const unsigned pgaTbl[71] = {
+ 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0,
+ 1, 2, 0, 1, 2, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 12, 12, 12, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31
+ };
+
+ //TIA table
+ if (gain > 48)
tia = 2;
- target -= max_gain_tia;
- }
+ else if (gain > 39)
+ tia = 1;
- //adjust lna gain
- if (target >= max_gain_lna)
- {
- lna = 14;
- target -= max_gain_lna;
- }
- else if (target < max_gain_lna-6)
- {
- lna = target/3;
- target -= lna*3;
- }
- else
- {
- lna = (max_gain_lna-6)/3;
- target -= lna*3;
- }
+ lna = lnaTbl[gain];
+ pga = pgaTbl[gain];
- //adjust pga gain
- assert(target <= max_gain_pga);
- pga = target;
+ int rcc_ctl_pga_rbb = (430*(pow(0.65,((double)pga/10)))-110.35)/20.4516+16;
if ((Modify_SPI_Reg_bits(LMS7param(G_LNA_RFE),lna+1,true)!=0)
||(Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE),tia+1,true)!=0)
- ||(Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),pga,true)!=0))
+ ||(Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),pga,true)!=0)
+ ||(Modify_SPI_Reg_bits(LMS7param(RCC_CTL_PGA_RBB),rcc_ctl_pga_rbb,true)!=0))
return -1;
}
return 0;
@@ -1153,22 +1148,30 @@ int LMS7_Device::SetNormalizedGain(bool dir_tx, size_t chan,double gain)
double LMS7_Device::GetNormalizedGain(bool dir_tx, size_t chan)
{
+ const double gain_total = 27 + 12 + 31;
+ double ret = GetGain(dir_tx, chan);
+ if (dir_tx)
+ return ret / 63.0;
+ else
+ return ret / gain_total;
+}
+
+int LMS7_Device::GetGain(bool dir_tx, size_t chan)
+{
if (Modify_SPI_Reg_bits(LMS7param(MAC),chan+1,true)!=0)
return -1;
if (dir_tx)
{
- double ret = Get_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),true);
- ret /= 63.0;
+ int ret = Get_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),true);
return ret;
}
else
{
- const int max_gain_lna = 30;
+ const int max_gain_lna = 27;
const int max_gain_tia = 12;
- const int max_gain_pga = 31;
int pga = Get_SPI_Reg_bits(LMS7param(G_PGA_RBB),true);
- double ret = pga;
+ int ret = pga;
int tia = Get_SPI_Reg_bits(LMS7param(G_TIA_RFE),true);
if (tia == 3)
@@ -1181,9 +1184,8 @@ double LMS7_Device::GetNormalizedGain(bool dir_tx, size_t chan)
if (lna > 8)
ret += (max_gain_lna+lna-15);
else if (lna > 1)
- ret += (lna-1)*3;
+ ret += (lna-2)*3;
- ret /= (max_gain_lna + max_gain_tia + max_gain_pga);
return ret;
}
return 0;
@@ -1313,18 +1315,22 @@ int LMS7_Device::SetNCOFreq(bool tx, size_t ch, const float_type *freq, float_ty
int LMS7_Device::SetNCO(bool tx,size_t ch,size_t ind,bool down)
{
+ if ((!tx) && (Get_SPI_Reg_bits(LMS7_MASK, true) != 0))
+ down = !down;
if (Modify_SPI_Reg_bits(LMS7param(MAC),ch+1,true)!=0)
return -1;
if (ind >= LMS_NCO_VAL_COUNT)
{
if (tx)
{
- if (Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),1,true)!=0)
+ if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),1,true)!=0)
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_TXTSP), 0, true)!=0))
return -1;
}
else
{
- if (Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),1,true)!=0)
+ if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),1,true)!=0)
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 0, true)!=0))
return -1;
}
}
@@ -1334,14 +1340,17 @@ int LMS7_Device::SetNCO(bool tx,size_t ch,size_t ind,bool down)
{
if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),0,true)!=0)
|| (Modify_SPI_Reg_bits(LMS7param(SEL_TX),ind,true)!=0)
- || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP),down,true)!=0))
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP),down,true)!=0)
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_TXTSP), 1, true)!=0))
return -1;
+ ;
}
else
{
if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),0,true)!=0)
|| (Modify_SPI_Reg_bits(LMS7param(SEL_RX),ind,true)!=0)
- || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP),down,true)!=0))
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP),down,true)!=0)
+ || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1, true)!=0))
return -1;
}
}
@@ -1560,6 +1569,11 @@ int LMS7_Device::ProgramHPM7(const char* data, size_t len, int mode,lime::IConne
return streamPort->ProgramWrite(data,len,mode,0,callback);
}
+int LMS7_Device::ProgramUpdate(const bool download,lime::IConnection::ProgrammingCallback callback)
+{
+ return streamPort->ProgramUpdate(download,callback);
+}
+
int LMS7_Device::ProgramHPM7(std::string fname, int mode,lime::IConnection::ProgrammingCallback callback)
{
std::ifstream file(fname);
diff --git a/src/API/lms7_device.h b/src/API/lms7_device.h
index 1269a5a..54f6b5e 100644
--- a/src/API/lms7_device.h
+++ b/src/API/lms7_device.h
@@ -50,6 +50,8 @@ public:
virtual int SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_type* coef,size_t count);
virtual int GetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, float_type* coef);
virtual int SetGFIR(bool tx, size_t chan, lms_gfir_t filt, bool enabled);
+ virtual int SetGain(bool dir_tx, size_t chan,unsigned gain);
+ virtual int GetGain(bool dir_tx, size_t chan);
virtual int SetNormalizedGain(bool dir_tx, size_t chan,float_type gain);
virtual float_type GetNormalizedGain(bool dir_tx, size_t chan);
virtual int SetTestSignal(bool dir_tx, size_t chan,lms_testsig_t sig,int16_t dc_i =0, int16_t dc_q = 0);
@@ -66,6 +68,7 @@ public:
virtual int ProgramFW(std::string name, lms_target_t mode,lime::IConnection::ProgrammingCallback callback);
virtual int ProgramHPM7(const char* data, size_t len, int mode,lime::IConnection::ProgrammingCallback callback);
virtual int ProgramHPM7(std::string fname, int mode,lime::IConnection::ProgrammingCallback callback);
+ virtual int ProgramUpdate(const bool download, lime::IConnection::ProgrammingCallback callback);
virtual int ProgramMCU(const char* data=nullptr, size_t len=0, lms_target_t mode=LMS_TARGET_RAM,lime::IConnection::ProgrammingCallback callback=nullptr);
virtual int DACWrite(uint16_t val);
virtual int DACRead();
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 102da5c..fd03286 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LIME_SUITE_PUBLIC_HEADERS
lime/LimeSuite.h
VersionInfo.h
ErrorReporting.h
+ SystemResources.h
LimeSuiteConfig.h
ADF4002/ADF4002.h
lms7002m_mcu/MCU_BD.h
@@ -88,6 +89,10 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.in.cpp
${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.cpp @ONLY)
list(APPEND LIME_SUITE_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.cpp)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/SystemResources.in.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/SystemResources.cpp @ONLY)
+list(APPEND LIME_SUITE_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/SystemResources.cpp)
+
if(CMAKE_COMPILER_IS_GNUCXX)
list(APPEND LIME_SUITE_LIBRARIES -pthread)
endif(CMAKE_COMPILER_IS_GNUCXX)
@@ -187,6 +192,7 @@ set(LMS7SUITE_GUI_SOURCES
lms7002_wxgui/lms7002_pnlBIAS_view.cpp
lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
lms7002_wxgui/lms7002_pnlTxTSP_view.cpp
+ lms7002_wxgui/lms7002_pnlR3.cpp
LMS_Programing/LMS_Programing_wxgui.cpp
utilities_gui/dlgConnectionSettings.cpp
utilities_gui/pnlMiniLog.cpp
@@ -210,6 +216,7 @@ set(LMS7SUITE_GUI_SOURCES
lms7suiteEvents/lms7suiteEvents.cpp
boards_wxgui/pnlQSpark.cpp
boards_wxgui/pnluLimeSDR.cpp
+ boards_wxgui/pnlUltimateEVB.cpp
kissFFT/kiss_fft.c
windowFunction.cpp
boards_wxgui/pnlLimeSDR.cpp
diff --git a/src/ConnectionNovenaRF7/CMakeLists.txt b/src/ConnectionNovenaRF7/CMakeLists.txt
index e48a44c..d96da6a 100644
--- a/src/ConnectionNovenaRF7/CMakeLists.txt
+++ b/src/ConnectionNovenaRF7/CMakeLists.txt
@@ -16,12 +16,21 @@ set(CMAKE_REQUIRED_DEFINITIONS -DNULL=0)
CHECK_INCLUDE_FILE(linux/spi/spidev.h HAS_SPIDEV_H)
CHECK_INCLUDE_FILE(linux/i2c-dev.h HAS_I2CDEV_H)
+#require a special version of i2c-dev.h that comes with the libi2c-dev package
+if (HAS_I2CDEV_H)
+ include(CheckCSourceCompiles)
+ set(code "#include <linux/i2c-dev.h>\nint main(){struct i2c_msg messages[2]; return 0;}")
+ CHECK_C_SOURCE_COMPILES("${code}" HAS_I2C_MSG)
+else (HAS_I2CDEV_H)
+ set(HAS_I2C_MSG FALSE)
+endif (HAS_I2CDEV_H)
+
########################################################################
## Feature registration
########################################################################
include(FeatureSummary)
include(CMakeDependentOption)
-cmake_dependent_option(ENABLE_NOVENARF7 "Enable NovenaRF7" ON "ENABLE_LIBRARY;HAS_SPIDEV_H;HAS_I2CDEV_H" OFF)
+cmake_dependent_option(ENABLE_NOVENARF7 "Enable NovenaRF7" ON "ENABLE_LIBRARY;HAS_SPIDEV_H;HAS_I2C_MSG" OFF)
add_feature_info(ConnectionNovenaRF7 ENABLE_NOVENARF7 "NovenaRF7 Connection support")
if (NOT ENABLE_NOVENARF7)
return()
diff --git a/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp b/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
index b96a1e1..0ea7c41 100644
--- a/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
+++ b/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
@@ -142,7 +142,7 @@ int fpga_read(unsigned const int addr, unsigned short *buf, const int len)
int readKernelMemory(long offset, int virtualized, int size)
{
#ifdef __linux__
- int result;
+ int result(0);
int *mem_range = (int *)(offset & ~0xFFFF);
if (mem_range != prev_mem_range)
diff --git a/src/ConnectionNovenaRF7/StreamChannel.cpp b/src/ConnectionNovenaRF7/StreamChannel.cpp
index bcb2f97..398487c 100644
--- a/src/ConnectionNovenaRF7/StreamChannel.cpp
+++ b/src/ConnectionNovenaRF7/StreamChannel.cpp
@@ -47,7 +47,7 @@ int ConnectionNovenaRF7::StreamChannel::Write(const void* samples, const uint32_
samplesShort[i] = samplesFloat[i]*2047;
const complex16_t* ptr = (const complex16_t*)samplesShort ;
pushed = fifo->push_samples(ptr, count, 1, meta->timestamp, timeout_ms, meta->flags);
- delete samplesShort;
+ delete[] samplesShort;
}
//else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
else
diff --git a/src/ConnectionRegistry/ConnectionHandle.cpp b/src/ConnectionRegistry/ConnectionHandle.cpp
index 7d4d2de..e7d6c34 100644
--- a/src/ConnectionRegistry/ConnectionHandle.cpp
+++ b/src/ConnectionRegistry/ConnectionHandle.cpp
@@ -67,7 +67,7 @@ ConnectionHandle::ConnectionHandle(void):
ConnectionHandle::ConnectionHandle(const std::string &args):
index(-1)
{
- auto kwmap = argsToMap(args);
+ auto kwmap = argsToMap("name="+args); //append name= since it was stripped in serialize
if (kwmap.count("module") != 0) module = kwmap.at("module");
if (kwmap.count("media") != 0) media = kwmap.at("media");
if (kwmap.count("name") != 0) name = kwmap.at("name");
@@ -80,8 +80,8 @@ std::string ConnectionHandle::serialize(void) const
{
std::string out;
if (not name.empty()) out += name;
- if (not media.empty()) out += ", media="+media;
- if (not module.empty()) out += ", module="+module;
+ if (not media.empty()) out += ", media="+media;
+ if (not module.empty()) out += ", module="+module;
if (not addr.empty()) out += ", addr="+addr;
if (not serial.empty()) out += ", serial="+serial;
if (index != -1) out += ", index="+std::to_string(index);
@@ -91,10 +91,19 @@ std::string ConnectionHandle::serialize(void) const
std::string ConnectionHandle::ToString(void) const
{
- std::string out;
+ //name and media format
+ std::string out(name);
+ if (not media.empty()) out += " [" + media + "]";
- if (not name.empty()) out = name;
+ //remove leading zeros for a displayable serial
+ std::string trimmedSerial(serial);
+ while (not trimmedSerial.empty() and trimmedSerial.at(0) == '0')
+ {
+ trimmedSerial = trimmedSerial.substr(1);
+ }
+ if (not trimmedSerial.empty()) out += " " + trimmedSerial;
+ //backup condition if we are empty somehow
if (out.empty()) out = this->serialize();
return out;
diff --git a/src/ConnectionRegistry/IConnection.cpp b/src/ConnectionRegistry/IConnection.cpp
index 6155fba..c8ed87a 100644
--- a/src/ConnectionRegistry/IConnection.cpp
+++ b/src/ConnectionRegistry/IConnection.cpp
@@ -212,7 +212,7 @@ int IConnection::ReadStreamStatus(const size_t streamID, const long timeout_ms,
int IConnection::UploadWFM(const void * const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)
{
- return ReportError(EPERM, "UploadTxWFM not implemented");
+ return ReportError(EPERM, "UploadTxWFM not implemented");
}
/** @brief Sets callback function which gets called each time data is sent or received
@@ -222,6 +222,10 @@ void IConnection::SetDataLogCallback(std::function<void(bool, const unsigned cha
callback_logData = callback;
}
+int IConnection::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+ return 0;
+}
/***********************************************************************
* Programming API
**********************************************************************/
@@ -321,6 +325,11 @@ int IConnection::ProgramMCU(const uint8_t *buffer, const size_t length,
return 0;
}
+int IConnection::ProgramUpdate(const bool download, ProgrammingCallback callback)
+{
+ return 0;
+}
+
/***********************************************************************
* GPIO API
**********************************************************************/
diff --git a/src/ConnectionRegistry/IConnection.h b/src/ConnectionRegistry/IConnection.h
index ee28105..0a1ccc3 100644
--- a/src/ConnectionRegistry/IConnection.h
+++ b/src/ConnectionRegistry/IConnection.h
@@ -170,14 +170,6 @@ struct LIME_API StreamConfig
class LIME_API IConnection
{
public:
- /*!
- * Callback from programming processes
- * @param bsent number of bytes transferred
- * @param btotal total number of bytes to send
- * @param progressMsg string describing current progress state
- * @return 0-continue programming, 1-abort operation
- */
- typedef std::function<bool(int bsent, int btotal, const char* progressMsg)> ProgrammingCallback;
//! IConnection constructor
IConnection(void);
@@ -444,10 +436,26 @@ public:
*/
virtual int UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format);
+ /** @brief Read raw stream data from device streaming port
+ @param buffer read buffer pointer
+ @param length number of bytes to read
+ @param timeout_ms timeout in milliseconds
+ */
+ virtual int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100);
+
/***********************************************************************
* Programming API
**********************************************************************/
+ /*!
+ * Callback from programming processes
+ * @param bsent number of bytes transferred
+ * @param btotal total number of bytes to send
+ * @param progressMsg string describing current progress state
+ * @return 0-continue programming, 1-abort operation
+ */
+ typedef std::function<bool(int bsent, int btotal, const char* progressMsg)> ProgrammingCallback;
+
/** @brief Uploads program to selected device
@param buffer binary program data
@param length buffer length
@@ -488,6 +496,24 @@ public:
*/
virtual int ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback = 0);
+ /*!
+ * Download up-to-date images files and flash the board when applicable.
+ *
+ * Program update is an implementation specific function that may handle
+ * several different use cases depending upon what options are applicable:
+ *
+ * - If a board relies on certain firmware and gateware images,
+ * these images will be downloaded if not present on the system.
+ *
+ * - If the board has a programmable flash for firmware and gateware,
+ * then up-to-date images will be written to the flash on the board.
+ *
+ * @param download true to enable downloading missing images
+ * @param callback callback for progress reporting or early termination
+ * @return 0-success
+ */
+ virtual int ProgramUpdate(const bool download = true, ProgrammingCallback callback = 0);
+
/***********************************************************************
* GPIO API
**********************************************************************/
@@ -562,7 +588,6 @@ public:
/** @brief Sets callback function which gets called each time data is sent or received
*/
void SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback);
-
protected:
std::function<void(bool, const unsigned char*, const unsigned int)> callback_logData;
bool mSystemBigEndian;
@@ -597,7 +622,7 @@ public:
uint64_t timestamp;
};
IStreamChannel(){};
- IStreamChannel(IConnection* port){};
+ IStreamChannel(IConnection* port, StreamConfig conf){};
virtual int Start() = 0;
virtual int Stop() = 0;
virtual ~IStreamChannel(){};
diff --git a/src/ConnectionSTREAM/CMakeLists.txt b/src/ConnectionSTREAM/CMakeLists.txt
index 3308d69..1638b6d 100644
--- a/src/ConnectionSTREAM/CMakeLists.txt
+++ b/src/ConnectionSTREAM/CMakeLists.txt
@@ -23,6 +23,7 @@ set(CONNECTION_STREAM_SOURCES
${THIS_SOURCE_DIR}/ConnectionSTREAMEntry.cpp
${THIS_SOURCE_DIR}/ConnectionSTREAM.cpp
${THIS_SOURCE_DIR}/ConnectionSTREAMing.cpp
+ ${THIS_SOURCE_DIR}/ConnectionSTREAMImages.cpp
)
set(CONNECTION_STREAM_LIBRARIES
diff --git a/src/ConnectionSTREAM/ConnectionSTREAM.cpp b/src/ConnectionSTREAM/ConnectionSTREAM.cpp
index 3aac10f..3e33c08 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAM.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAM.cpp
@@ -52,7 +52,7 @@ const std::set<uint8_t> ConnectionSTREAM::commandsToBulkCtrlHw2 =
/** @brief Initializes port type and object necessary to communicate to usb device.
*/
-ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vid, const int pid)
+ConnectionSTREAM::ConnectionSTREAM(void *arg, const std::string &vidpid, const std::string &serial, const unsigned index)
{
bulkCtrlAvailable = false;
bulkCtrlInProgress = false;
@@ -69,18 +69,12 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
InCtrlBulkEndPt = nullptr;
OutCtrlBulkEndPt = nullptr;
#else
- dev_handle = 0;
- devs = 0;
+ dev_handle = nullptr;
ctx = (libusb_context *)arg;
#endif
- if (this->Open(index, vid, pid) != 0)
+ if (this->Open(vidpid, serial, index) != 0)
std::cerr << GetLastErrorMessage() << std::endl;
- struct ExpectedVersion
- {
- int hw, fw, gw, gw_rev;
- };
-
commandsToBulkCtrl = commandsToBulkCtrlHw2;
LMSinfo info = this->GetInfo();
@@ -90,75 +84,12 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
commandsToBulkCtrl = commandsToBulkCtrlHw1;
}
- FPGAinfo fpgaInfo = this->GetFPGAInfo();
- //expected version numbers based on HW number
- vector<ExpectedVersion> versionList; //expected HW,FW,GW combinations
- bool correctFWHW = false;
- if (info.device == LMS_DEV_LIMESDR)
- {
- versionList = {
- {4, 2, 2, 2},
- {3, 2, 1, 20},
- {2, 2, 1, 20},
- {1, 6, 1, 20},
- };
- }
- else if(info.device == LMS_DEV_STREAM)
- {
- versionList = {
- {3, 8, 1, 2},
- };
- }
-
- for(auto iter : versionList)
- if(info.hardware == iter.hw
- && info.firmware == iter.fw
- && fpgaInfo.gatewareVersion == iter.gw
- && fpgaInfo.gatewareRevision == iter.gw_rev)
- {
- correctFWHW = true;
- break;
- }
+ this->VersionCheck();
- if(not correctFWHW)
- {
- ExpectedVersion expected = {-1, -1, -1, -1};
- bool knownHardware = false;
- for(auto iter : versionList)
- if(info.hardware == iter.hw)
- {
- knownHardware = true;
- expected = iter;
- break;
- }
- if(not knownHardware)
- std::cerr << "Unsupported hardware connected" << std::endl;
-
- //check and warn about firmware mismatch problems
- if (knownHardware && info.firmware != expected.fw)
- std::cerr << std::endl
- << "########################################################" << std::endl
- << "## !!! Warning: firmware version mismatch !!!" << std::endl
- << "## Expected firmware version " << expected.fw << ", but found version " << info.firmware << std::endl
- << "## Follow the FW and FPGA upgrade instructions:" << std::endl
- << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
- << "########################################################" << std::endl
- << std::endl;
-
- //check and warn about gateware mismatch problems
- if (knownHardware && (fpgaInfo.gatewareVersion != expected.gw
- || fpgaInfo.gatewareRevision != expected.gw_rev))
- std::cerr << std::endl
- << "########################################################" << std::endl
- << "## !!! Warning: gateware version mismatch !!!" << std::endl
- << "## Expected gateware version " << expected.gw << ", revision " << expected.gw_rev << std::endl
- << "## But found version " << fpgaInfo.gatewareVersion << ", revision " << fpgaInfo.gatewareRevision<< std::endl
- << "## Follow the FW and FPGA upgrade instructions:" << std::endl
- << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
- << "########################################################" << std::endl
- << std::endl;
- }
+ if (info.device == LMS_DEV_LIMESDR || info.device == LMS_DEV_LIMESDR_USB_SP || info.device == LMS_DEV_LMS7002M_ULTIMATE_EVB)
+ DetectRefClk();
+ GetChipVersion();
//must configure synthesizer before using LimeSDR
if (info.device == LMS_DEV_LIMESDR && info.hardware < 4)
{
@@ -183,6 +114,64 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
}
}
+double ConnectionSTREAM::DetectRefClk(void)
+{
+ const double fx3Clk = 100e6 * 1.008; //fx3 clock 100MHz (adjusted to 100.8 MHz based on measurement on multiple boards)
+ const double fx3Cnt = 16777210; //fixed fx3 counter in FPGA
+ const double clkTbl[] = { 30.72e6, 38.4e6, 40e6, 52e6 };
+ const uint32_t addr[] = { 0x61, 0x63 };
+ const uint32_t vals[] = { 0x0, 0x0 };
+ if (this->WriteRegisters(addr, vals, 2) != 0)
+ {
+ return -1;
+ }
+ auto start = std::chrono::steady_clock::now();
+ if (this->WriteRegister(0x61, 0x4) != 0)
+ {
+ return -1;
+ }
+
+ while (1) //wait for test to finish
+ {
+ unsigned completed;
+ if (this->ReadRegister(0x65, completed) != 0)
+ {
+ return -1;
+ }
+ if (completed & 0x4)
+ break;
+
+ auto end = std::chrono::steady_clock::now();
+ std::chrono::duration<double> elapsed_seconds = end - start;
+ if (elapsed_seconds.count() > 0.5) //timeout
+ {
+ return -1;
+ }
+ }
+
+ const uint32_t addr2[] = { 0x72, 0x73 };
+ uint32_t vals2[2];
+ if (this->ReadRegisters(addr2, vals2, 2) != 0)
+ {
+ return -1;
+ }
+ double count = (vals2[0] | (vals2[1] << 16)); //cock counter
+ count *= fx3Clk / fx3Cnt; //estimate ref clock based on FX3 Clock
+ printf("Estimated reference clock %1.4f MHz\n", count/1e6);
+ unsigned i = 0;
+ double delta = 100e6;
+
+ while (i < sizeof(clkTbl) / sizeof(*clkTbl))
+ if (delta < fabs(count - clkTbl[i]))
+ break;
+ else
+ delta = fabs(count - clkTbl[i++]);
+
+ this->SetReferenceClockRate(clkTbl[i-1]);
+ printf("Selected reference clock %1.3f MHz\n", clkTbl[i - 1] / 1e6);
+ return clkTbl[i - 1];
+}
+
/** @brief Closes connection to chip and deallocates used memory.
*/
ConnectionSTREAM::~ConnectionSTREAM()
@@ -205,7 +194,7 @@ ConnectionSTREAM::~ConnectionSTREAM()
/** @brief Tries to open connected USB device and find communication endpoints.
@return Returns 0-Success, other-EndPoints not found or device didn't connect.
*/
-int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
+int ConnectionSTREAM::Open(const std::string &vidpid, const std::string &serial, const unsigned index)
{
bulkCtrlAvailable = false;
#ifndef __unix__
@@ -277,7 +266,46 @@ int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
isConnected = true;
return 0;
#else
- dev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
+ const auto splitPos = vidpid.find(":");
+ const auto vid = std::stoi(vidpid.substr(0, splitPos), nullptr, 16);
+ const auto pid = std::stoi(vidpid.substr(splitPos+1), nullptr, 16);
+
+ libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
+ int usbDeviceCount = libusb_get_device_list(ctx, &devs);
+
+ if (usbDeviceCount < 0) {
+ return ReportError(-1, "ConnectionSTREAM: libusb_get_device_list failed: %s", libusb_strerror(libusb_error(usbDeviceCount)));
+ }
+
+ for(int i=0; i<usbDeviceCount; ++i)
+ {
+ libusb_device_descriptor desc;
+ int r = libusb_get_device_descriptor(devs[i], &desc);
+ if(r<0) {
+ printf("failed to get device description\n");
+ continue;
+ }
+ if (desc.idProduct != pid) continue;
+ if (desc.idVendor != vid) continue;
+ if(libusb_open(devs[i], &dev_handle) != 0) continue;
+
+ std::string foundSerial;
+ if (desc.iSerialNumber > 0)
+ {
+ char data[255];
+ r = libusb_get_string_descriptor_ascii(dev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+ if(r<0)
+ printf("failed to get serial number\n");
+ else
+ foundSerial = std::string(data, size_t(r));
+ }
+
+ if (serial == foundSerial) break; //found it
+ libusb_close(dev_handle);
+ dev_handle = nullptr;
+ }
+ libusb_free_device_list(devs, 1);
+
if(dev_handle == nullptr)
return ReportError(-1, "ConnectionSTREAM: libusb_open failed");
if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached
@@ -321,7 +349,6 @@ int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
return 0;
#endif
}
-
/** @brief Closes communication to device.
*/
void ConnectionSTREAM::Close()
@@ -404,7 +431,7 @@ int ConnectionSTREAM::Write(const unsigned char *buffer, const int length, int t
else
len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, timeout_ms);
#endif
- delete wbuffer;
+ delete[] wbuffer;
return len;
}
diff --git a/src/ConnectionSTREAM/ConnectionSTREAM.h b/src/ConnectionSTREAM/ConnectionSTREAM.h
index 96ec7bd..ba93179 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAM.h
+++ b/src/ConnectionSTREAM/ConnectionSTREAM.h
@@ -15,6 +15,7 @@
#include <memory>
#include <thread>
#include "fifo.h"
+#include <ciso646>
#ifndef __unix__
#include "windows.h"
@@ -90,10 +91,11 @@ public:
class ConnectionSTREAM : public ILimeSDRStreaming
{
public:
- ConnectionSTREAM(void* ctx, const unsigned index, const int vid=-1, const int pid=-1);
+ ConnectionSTREAM(void* arg, const std::string &vidpid, const std::string &serial, const unsigned index);
~ConnectionSTREAM(void);
+ void VersionCheck(void);
- int Open(const unsigned index, const int vid, const int pid);
+ int Open(const std::string &vidpid, const std::string &serial, const unsigned index);
void Close();
bool IsOpen();
int GetOpenedIndex();
@@ -106,6 +108,8 @@ public:
//hooks to update FPGA plls when baseband interface data rate is changed
virtual int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
virtual int ProgramWrite(const char *buffer, const size_t length, const int programmingMode, const int device, ProgrammingCallback callback) override;
+ int ProgramUpdate(const bool download, ProgrammingCallback callback);
+ int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100)override;
protected:
virtual void ReceivePacketsLoop(const ThreadData args) override;
virtual void TransmitPacketsLoop(const ThreadData args) override;
@@ -119,9 +123,10 @@ protected:
virtual int WaitForSending(int contextHandle, uint32_t timeout_ms);
virtual int FinishDataSending(const char* buffer, uint32_t length, int contextHandle);
virtual void AbortSending();
-
eConnectionType GetType(void) {return USB_PORT;}
+ double DetectRefClk(void);
+
USBTransferContext contexts[USB_MAX_CONTEXTS];
USBTransferContext contextsToSend[USB_MAX_CONTEXTS];
@@ -140,7 +145,6 @@ protected:
CCyUSBEndPoint* InCtrlBulkEndPt;
CCyUSBEndPoint* OutCtrlBulkEndPt;
#else
- libusb_device** devs; //pointer to pointer of device, used to retrieve a list of devices
libusb_device_handle* dev_handle; //a device handle
libusb_context* ctx; //a libusb session
int read_firmware_image(unsigned char *buf, int len);
@@ -170,6 +174,7 @@ public:
protected:
#ifndef __unix__
std::string DeviceName(unsigned int index);
+ void *ctx; //not used, just for mirroring unix
#else
libusb_context* ctx; //a libusb session
std::thread mUSBProcessingThread;
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp b/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
index cf6a0fc..9ba8300 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
@@ -113,102 +113,88 @@ std::vector<ConnectionHandle> ConnectionSTREAMEntry::enumerate(const ConnectionH
handle.index = i;
std::wstring ws(device.SerialNumber);
handle.serial = std::string(ws.begin(),ws.end());
- handles.push_back(handle);
- device.Close();
+ if (hint.serial.empty() or hint.serial == handle.serial)
+ {
+ handles.push_back(handle); //filter on serial
+ }
+ device.Close();
}
}
#else
libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
int usbDeviceCount = libusb_get_device_list(ctx, &devs);
- if(usbDeviceCount > 0)
+
+ if (usbDeviceCount < 0) {
+ printf("failed to get libusb device list: %s\n", libusb_strerror(libusb_error(usbDeviceCount)));
+ return handles;
+ }
+
+ for(int i=0; i<usbDeviceCount; ++i)
{
libusb_device_descriptor desc;
- for(int i=0; i<usbDeviceCount; ++i)
+ int r = libusb_get_device_descriptor(devs[i], &desc);
+ if(r<0)
+ printf("failed to get device description\n");
+ int pid = desc.idProduct;
+ int vid = desc.idVendor;
+
+ if(vid == 1204 && pid == 34323)
{
- int r = libusb_get_device_descriptor(devs[i], &desc);
- if(r<0)
- printf("failed to get device description\n");
- int pid = desc.idProduct;
- int vid = desc.idVendor;
+ ConnectionHandle handle;
+ handle.media = "USB";
+ handle.name = "DigiGreen";
+ handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+ handles.push_back(handle);
+ }
+ else if((vid == 1204 && pid == 241) || (vid == 1204 && pid == 243) || (vid == 7504 && pid == 24840))
+ {
+ libusb_device_handle *tempDev_handle(nullptr);
+ if(libusb_open(devs[i], &tempDev_handle) != 0 || tempDev_handle == nullptr)
+ continue;
- if(vid == 1204 && pid == 34323)
- {
- ConnectionHandle handle;
+ ConnectionHandle handle;
+
+ //check operating speed
+ int speed = libusb_get_device_speed(devs[i]);
+ if(speed == LIBUSB_SPEED_HIGH)
+ handle.media = "USB 2.0";
+ else if(speed == LIBUSB_SPEED_SUPER)
+ handle.media = "USB 3.0";
+ else
handle.media = "USB";
- handle.name = "DigiGreen";
- handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
- handles.push_back(handle);
- }
- else if((vid == 1204 && pid == 241) || (vid == 1204 && pid == 243) || (vid == 7504 && pid == 24840))
+
+ //read device name
+ char data[255];
+ r = libusb_get_string_descriptor_ascii(tempDev_handle, LIBUSB_CLASS_COMM, (unsigned char*)data, sizeof(data));
+ if(r > 0) handle.name = std::string(data, size_t(r));
+
+ r = std::sprintf(data, "%.4x:%.4x", int(vid), int(pid));
+ if (r > 0) handle.addr = std::string(data, size_t(r));
+
+ if (desc.iSerialNumber > 0)
{
- libusb_device_handle *tempDev_handle;
- tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
- if(tempDev_handle == nullptr)
- continue;
- if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached
- {
- if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
- printf("Kernel Driver Detached!\n");
- }
- if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
- {
- printf("Cannot Claim Interface\n");
- }
-
- std::string fullName;
- //check operating speed
- int speed = libusb_get_device_speed(devs[i]);
- if(speed == LIBUSB_SPEED_HIGH)
- fullName = "USB 2.0";
- else if(speed == LIBUSB_SPEED_SUPER)
- fullName = "USB 3.0";
+ r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+ if(r<0)
+ printf("failed to get serial number\n");
else
- fullName = "USB";
- fullName += " (";
- //read device name
- char data[255];
- memset(data, 0, 255);
- libusb_get_string_descriptor_ascii(tempDev_handle, LIBUSB_CLASS_COMM, (unsigned char*)data, 255);
- if(strlen(data) > 0)
- fullName += data;
- fullName += ")";
-
- ConnectionHandle handle;
- handle.media = "USB";
- handle.name = fullName;
- handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
-
- if (desc.iSerialNumber > 0)
- {
- r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, 255);
- if(r<0)
- printf("failed to get serial number\n");
- else if (strlen(data) > 0)
- handle.serial = std::string((const char*)data);
- }
- libusb_close(tempDev_handle);
+ handle.serial = std::string(data, size_t(r));
+ }
+ libusb_close(tempDev_handle);
+ //add handle conditionally, filter by serial number
+ if (hint.serial.empty() or hint.serial == handle.serial)
+ {
handles.push_back(handle);
}
}
}
- else
- {
- libusb_free_device_list(devs, 1);
- }
+
+ libusb_free_device_list(devs, 1);
#endif
return handles;
}
IConnection *ConnectionSTREAMEntry::make(const ConnectionHandle &handle)
{
-#ifndef __unix__
- return new ConnectionSTREAM(nullptr, handle.index);
-#else
- const auto pidvid = handle.addr;
- const auto splitPos = pidvid.find(":");
- const auto pid = std::stoi(pidvid.substr(0, splitPos));
- const auto vid = std::stoi(pidvid.substr(splitPos+1));
- return new ConnectionSTREAM(ctx, handle.index, vid, pid);
-#endif
+ return new ConnectionSTREAM(ctx, handle.addr, handle.serial, handle.index);
}
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp b/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp
new file mode 100644
index 0000000..c827a45
--- /dev/null
+++ b/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp
@@ -0,0 +1,190 @@
+/**
+ @file ConnectionSTREAMImages.cpp
+ @author Lime Microsystems
+ @brief Image updating and version checking
+*/
+
+#include "ConnectionSTREAM.h"
+#include "ErrorReporting.h"
+#include "SystemResources.h"
+#include "LMS64CProtocol.h"
+#include "LMSBoards.h"
+#include <iostream>
+#include <fstream>
+#include <ciso646>
+
+using namespace lime;
+
+/*!
+ * The entry structure that describes a board revision and its fw/gw images
+ */
+struct ConnectionSTREAMImageEntry
+{
+ eLMS_DEV dev;
+ int hw_rev;
+
+ int fw_ver;
+ const char *fw_img;
+
+ int gw_ver;
+ int gw_rev;
+ const char *gw_rbf;
+};
+
+/*!
+ * Lookup the board information given hardware type and revision.
+ * Edit each entry for supported hardware and image updates.
+ */
+static const ConnectionSTREAMImageEntry &lookupImageEntry(const LMS64CProtocol::LMSinfo &info)
+{
+ static const std::vector<ConnectionSTREAMImageEntry> imageEntries = {
+ ConnectionSTREAMImageEntry({LMS_DEV_UNKNOWN, -1, -1, "Unknown-USB.img", -1, -1, "Unknown-USB.rbf"}),
+ ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 4, 3, "LimeSDR-USB_HW_1.3_r3.0.img", 2, 6, "LimeSDR-USB_HW_1.4_r2.6.rbf"}),
+ ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 3, 3, "LimeSDR-USB_HW_1.3_r3.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+ ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 2, 3, "LimeSDR-USB_HW_1.2_r3.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+ ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 1, 7, "LimeSDR-USB_HW_1.1_r7.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+ ConnectionSTREAMImageEntry({LMS_DEV_STREAM, 3, 8, "STREAM-USB_HW_1.1_r8.0.img", 1, 2, "STREAM-USB_HW_1.3_r1.2.rbf"})};
+
+ for(const auto &iter : imageEntries)
+ {
+ if (info.device == iter.dev and info.hardware == iter.hw_rev)
+ {
+ return iter;
+ }
+ }
+
+ return imageEntries.front(); //the -1 unknown entry
+}
+
+void ConnectionSTREAM::VersionCheck(void)
+{
+ const auto info = this->GetInfo();
+ const auto &entry = lookupImageEntry(info);
+
+ //an entry match was not found
+ if (entry.dev == LMS_DEV_UNKNOWN)
+ {
+ std::cerr << "Unsupported hardware connected: " << GetDeviceName(info.device) << "[HW=" << info.hardware << "]" << std::endl;
+ return;
+ }
+
+ //check and warn about firmware mismatch problems
+ if (info.firmware != entry.fw_ver)
+ std::cerr << std::endl
+ << "########################################################" << std::endl
+ << "## !!! Warning: firmware version mismatch !!!" << std::endl
+ << "## Expected firmware version " << entry.fw_ver << ", but found version " << info.firmware << std::endl
+ << "## Follow the FW and FPGA upgrade instructions:" << std::endl
+ << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
+ << "## Or run update on the command line: LimeUtil --update" << std::endl
+ << "########################################################" << std::endl
+ << std::endl;
+
+ //check and warn about gateware mismatch problems
+ const auto fpgaInfo = this->GetFPGAInfo();
+ if (fpgaInfo.gatewareVersion != entry.gw_ver
+ || fpgaInfo.gatewareRevision != entry.gw_rev)
+ std::cerr << std::endl
+ << "########################################################" << std::endl
+ << "## !!! Warning: gateware version mismatch !!!" << std::endl
+ << "## Expected gateware version " << entry.gw_ver << ", revision " << entry.gw_rev << std::endl
+ << "## But found version " << fpgaInfo.gatewareVersion << ", revision " << fpgaInfo.gatewareRevision<< std::endl
+ << "## Follow the FW and FPGA upgrade instructions:" << std::endl
+ << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
+ << "## Or run update on the command line: LimeUtil --update" << std::endl
+ << "########################################################" << std::endl
+ << std::endl;
+}
+
+static bool programmingCallbackStream(
+ int bsent, int btotal, const char* progressMsg,
+ const std::string &image,
+ IConnection::ProgrammingCallback callback)
+{
+ const auto msg = std::string(progressMsg) + " (" + image + ")";
+ return callback(bsent, btotal, msg.c_str());
+}
+
+int ConnectionSTREAM::ProgramUpdate(const bool download, IConnection::ProgrammingCallback callback)
+{
+ const auto info = this->GetInfo();
+ const auto &entry = lookupImageEntry(info);
+
+ //an entry match was not found
+ if (entry.dev == LMS_DEV_UNKNOWN)
+ {
+ return lime::ReportError("Unsupported hardware connected: %s[HW=%d]", GetDeviceName(info.device), info.hardware);
+ }
+
+ //download images when missing
+ if (download)
+ {
+ const std::vector<std::string> images = {entry.fw_img, entry.gw_rbf};
+ for (const auto &image : images)
+ {
+ if (not lime::locateImageResource(image).empty()) continue;
+ const std::string msg("Downloading: " + image);
+ if (callback) callback(0, 1, msg.c_str());
+ int ret = lime::downloadImageResource(image);
+ if (ret != 0) return ret; //error set by download call
+ if (callback) callback(1, 1, "Done!");
+ }
+ }
+
+ //load firmware into flash
+ {
+ //open file
+ std::ifstream file;
+ const auto path = lime::locateImageResource(entry.fw_img);
+ file.open(path.c_str(), std::ios::in | std::ios::binary);
+ if (not file.good()) return lime::ReportError("Error opening %s", path.c_str());
+
+ //read file
+ std::streampos fileSize;
+ file.seekg(0, std::ios::end);
+ fileSize = file.tellg();
+ file.seekg(0, std::ios::beg);
+ std::vector<char> progData(fileSize, 0);
+ file.read(progData.data(), fileSize);
+
+ int device = LMS64CProtocol::FX3; //FX3
+ int progMode = 2; //Firmware to FLASH
+ using namespace std::placeholders;
+ const auto cb = std::bind(&programmingCallbackStream, _1, _2, _3, path, callback);
+ auto status = this->ProgramWrite(progData.data(), progData.size(), progMode, device, cb);
+ if (status != 0) return status;
+ }
+
+ //load gateware into flash
+ {
+ //open file
+ std::ifstream file;
+ const auto path = lime::locateImageResource(entry.gw_rbf);
+ file.open(path.c_str(), std::ios::in | std::ios::binary);
+ if (not file.good()) return lime::ReportError("Error opening %s", path.c_str());
+
+ //read file
+ std::streampos fileSize;
+ file.seekg(0, std::ios::end);
+ fileSize = file.tellg();
+ file.seekg(0, std::ios::beg);
+ std::vector<char> progData(fileSize, 0);
+ file.read(progData.data(), fileSize);
+
+ int device = LMS64CProtocol::FPGA; //Altera FPGA
+ int progMode = 1; //Bitstream to FLASH
+ using namespace std::placeholders;
+ const auto cb = std::bind(&programmingCallbackStream, _1, _2, _3, path, callback);
+ auto status = this->ProgramWrite(progData.data(), progData.size(), progMode, device, cb);
+ if (status != 0) return status;
+ }
+
+ //Reset FX3, FPGA should be reloaded on boot
+ {
+ int device = LMS64CProtocol::FX3; //FX3
+ auto status = this->ProgramWrite(nullptr, 0, 0, device, nullptr);
+ if (status != 0) return status;
+ }
+
+ return 0;
+}
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMing.cpp b/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
index 7246783..1643e7f 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
@@ -62,6 +62,8 @@ int ConnectionSTREAM::UploadWFM(const void* const* samples, uint8_t chCount, siz
FinishDataSending((char*)&pkt, bToSend , context);
}
delete[] batch;
+ /*Give FX3 some time to load samples to FPGA*/
+ std::this_thread::sleep_for(std::chrono::milliseconds(30));
if(cnt == 0)
return 0;
else
@@ -75,44 +77,169 @@ int ConnectionSTREAM::UpdateExternalDataRate(const size_t channel, const double
std::cout << "ConnectionSTREAM::ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
const float txInterfaceClk = 2 * txRate_Hz;
const float rxInterfaceClk = 2 * rxRate_Hz;
- mExpectedSampleRate = rxRate_Hz;
int status = 0;
- if(txInterfaceClk >= 5e6)
+ uint32_t reg20;
+ const double rxPhC1[] = { 91.08, 89.46 };
+ const double rxPhC2[] = { -1 / 6e6, 1.24e-6 };
+ const double txPhC1[] = { 89.75, 89.61 };
+ const double txPhC2[] = { -3.0e-7, 2.71e-7 };
+
+ const std::vector<uint32_t> spiAddr = {0x0021, 0x0022, 0x0023, 0x0024,
+ 0x0027, 0x002A, 0x0400, 0x040C,
+ 0x040B, 0x0400, 0x040B, 0x0400};
+ const int bakRegCnt = spiAddr.size() - 4;
+ auto info = GetDeviceInfo();
+ const int addrLMS7002M = info.addrsLMS7002M.at(0);
+ bool phaseSearch = false;
+ if (this->chipVersion == 0x3841 && stoi(info.gatewareRevision) >= 7 && stoi(info.gatewareVersion) >= 2) //0x3840 LMS7002Mr2, 0x3841 LMS7002Mr3
+ if(rxInterfaceClk >= 5e6 || txInterfaceClk >= 5e6)
+ phaseSearch = true;
+ mExpectedSampleRate = rxRate_Hz;
+
+ std::vector<uint32_t> dataWr;
+ std::vector<uint32_t> dataRd;
+
+ if (phaseSearch)
+ {
+ dataWr.resize(spiAddr.size());
+ dataRd.resize(spiAddr.size());
+ //backup registers
+ dataWr[0] = (uint32_t(0x0020) << 16);
+ TransactSPI(addrLMS7002M, dataWr.data(), ®20, 1);
+
+ dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | 0xFFFD; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+
+ for (int i = 0; i < bakRegCnt; ++i)
+ dataWr[i] = (spiAddr[i] << 16);
+ TransactSPI(addrLMS7002M, dataWr.data(), dataRd.data(), bakRegCnt);
+ UpdateThreads(true);
+ }
+
+ if(rxInterfaceClk >= 5e6)
{
+ if (phaseSearch)
+ {
+ const std::vector<uint32_t> spiData = { 0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+ 0xE4E4, 0x0086, 0x028D, 0x00FF,
+ 0x5555, 0x02CD, 0xAAAA, 0x02ED};
+ //Load test config
+ const int setRegCnt = spiData.size();
+ for (int i = 0; i < setRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+ }
lime::fpga::FPGA_PLL_clock clocks[2];
clocks[0].bypass = false;
clocks[0].index = 0;
- clocks[0].outFrequency = txInterfaceClk;
+ clocks[0].outFrequency = rxInterfaceClk;
clocks[0].phaseShift_deg = 0;
+ clocks[0].findPhase = false;
clocks[1].bypass = false;
clocks[1].index = 1;
- clocks[1].outFrequency = txInterfaceClk;
- clocks[1].phaseShift_deg = 90;
- status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
+ clocks[1].outFrequency = rxInterfaceClk;
+ if (this->chipVersion == 0x3841)
+ clocks[1].phaseShift_deg = rxPhC1[1] + rxPhC2[1] * rxInterfaceClk;
+ else
+ clocks[1].phaseShift_deg = rxPhC1[0] + rxPhC2[0] * rxInterfaceClk;
+
+ if (phaseSearch)
+ {
+ clocks[1].findPhase = true;
+ }
+ else
+ {
+ clocks[1].findPhase = false;
+ }
+ status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
}
else
- status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
- if(status != 0)
- return status;
+ status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
- if(rxInterfaceClk >= 5e6)
+ if(txInterfaceClk >= 5e6)
{
+ if (phaseSearch)
+ {
+ const std::vector<uint32_t> spiData = {0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+ 0xE4E4, 0x0484};
+ WriteRegister(0x000A, 0x0000);
+ //Load test config
+ const int setRegCnt = spiData.size();
+ for (int i = 0; i < setRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+ }
+
lime::fpga::FPGA_PLL_clock clocks[2];
clocks[0].bypass = false;
clocks[0].index = 0;
- clocks[0].outFrequency = rxInterfaceClk;
+ clocks[0].outFrequency = txInterfaceClk;
clocks[0].phaseShift_deg = 0;
+ clocks[0].findPhase = false;
clocks[1].bypass = false;
clocks[1].index = 1;
- clocks[1].outFrequency = rxInterfaceClk;
- clocks[1].phaseShift_deg = 90;
- status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
+ clocks[1].outFrequency = txInterfaceClk;
+ if (this->chipVersion == 0x3841)
+ clocks[1].phaseShift_deg = txPhC1[1] + txPhC2[1] * txInterfaceClk;
+ else
+ clocks[1].phaseShift_deg = txPhC1[0] + txPhC2[0] * txInterfaceClk;
+
+ if (phaseSearch)
+ {
+ clocks[1].findPhase = true;
+ WriteRegister(0x000A, 0x0200);
+ }
+ else
+ {
+ clocks[1].findPhase = false;
+ }
+ status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
}
else
- status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
+ status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
+
+ if (phaseSearch)
+ {
+ //Restore registers
+ for (int i = 0; i < bakRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | dataRd[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, bakRegCnt);
+ dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | reg20; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+ WriteRegister(0x000A, 0);
+ UpdateThreads();
+ }
+
return status;
}
+int ConnectionSTREAM::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+ fpga::StopStreaming(this);
+ //USB FIFO reset
+ LMS64CProtocol::GenericPacket ctrPkt;
+ ctrPkt.cmd = CMD_USB_FIFO_RST;
+ ctrPkt.outBuffer.push_back(0x00);
+ TransferPacket(ctrPkt);
+
+ WriteRegister(0x0008, 0x0100 | 0x2);
+ WriteRegister(0x0007, 1);
+
+ fpga::StartStreaming(this);
+
+ int handle = BeginDataReading(buffer, length);
+ if (WaitForReading(handle, timeout_ms) == false)
+ {
+ AbortReading();
+ }
+
+ fpga::StopStreaming(this);
+
+ int totalBytesReceived = FinishDataReading(buffer, length, handle);
+
+ return totalBytesReceived;
+}
+
/** @brief Function dedicated for receiving data samples from board
@param rxFIFO FIFO to store received data
@param terminate periodically pooled flag to terminate thread
@@ -303,9 +430,9 @@ void ConnectionSTREAM::ReceivePacketsLoop(const ThreadData args)
t1 = t2;
//total number of bytes sent per second
double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
//each channel sample rate
float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
#endif
samplesReceived[0] = 0;
@@ -447,8 +574,6 @@ void ConnectionSTREAM::TransmitPacketsLoop(const ThreadData args)
{
//total number of bytes sent per second
float dataRate = 1000.0*totalBytesSent / timePeriod;
- //total number of samples from all channels per second
- float sampleRate = 1000.0*samplesSent / timePeriod;
if(dataRate_Bps)
dataRate_Bps->store(dataRate);
m_bufferFailures = 0;
@@ -456,6 +581,8 @@ void ConnectionSTREAM::TransmitPacketsLoop(const ThreadData args)
totalBytesSent = 0;
t1 = t2;
#ifndef NDEBUG
+ //total number of samples from all channels per second
+ float sampleRate = 1000.0*samplesSent / timePeriod;
printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
#endif
}
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
index c64e60a..fac3baa 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
@@ -10,8 +10,8 @@ using namespace std;
namespace lime
{
-ConnectionSTREAM_UNITE::ConnectionSTREAM_UNITE(void* ctx, const unsigned index, const int vid, const int pid, const char* comPortName)
- : ConnectionSTREAM(ctx, index, vid, pid), comPort(nullptr)
+ConnectionSTREAM_UNITE::ConnectionSTREAM_UNITE(void* ctx, const std::string &vidpid, const std::string &serial, const unsigned index, const char* comPortName)
+ : ConnectionSTREAM(ctx, vidpid, serial, index), comPort(nullptr)
{
if(comPortName && strlen(comPortName))
{
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
index 13b4a8d..bdc2dbe 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
@@ -15,7 +15,7 @@ namespace lime
class ConnectionSTREAM_UNITE : public virtual ConnectionSTREAM
{
public:
- ConnectionSTREAM_UNITE(void* ctx, const unsigned index, const int vid=-1, const int pid=-1, const char* comPortName=nullptr);
+ ConnectionSTREAM_UNITE(void* ctx, const std::string &vidpid, const std::string &serial, const unsigned index, const char* comPortName=nullptr);
virtual ~ConnectionSTREAM_UNITE(void);
virtual DeviceInfo GetDeviceInfo(void) override;
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
index ab8d609..daa66a7 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
@@ -141,18 +141,15 @@ std::vector<ConnectionHandle> ConnectionSTREAM_UNITEEntry::enumerate(const Conne
comHandles.push_back(hnd);
}
- int index = 0;
for(auto usb : usbHandles)
{
for(auto com : comHandles)
{
- ConnectionHandle hnd;
+ ConnectionHandle hnd(usb); //copy the usb index and serial
hnd.module = "STREAM+UNITE";
hnd.media = "USB+COM";
hnd.name = usb.name+"+"+com.name;
hnd.addr = usb.addr+"+"+com.addr;
- hnd.serial = "";
- hnd.index = index++;
handles.push_back(hnd);
}
}
@@ -161,35 +158,12 @@ std::vector<ConnectionHandle> ConnectionSTREAM_UNITEEntry::enumerate(const Conne
IConnection *ConnectionSTREAM_UNITEEntry::make(const ConnectionHandle &handle)
{
-#ifndef __unix__
- const auto pidvid = handle.addr;
- const auto comAddrPos = pidvid.find("+");
- std::string comName;
- if(comAddrPos == std::string::npos)
- {
- return new ConnectionSTREAM_UNITE(nullptr, handle.index);
- }
- else
- {
- comName = pidvid.substr(comAddrPos + 1);
- return new ConnectionSTREAM_UNITE(nullptr, handle.index, -1, -1, comName.c_str());
- }
-#else
- const auto pidvid = handle.addr;
- const auto splitPos = pidvid.find(":");
- const auto pid = std::stoi(pidvid.substr(0, splitPos));
- const auto comAddrPos = pidvid.find("+");
- if(comAddrPos == std::string::npos)
- {
- const auto vid = std::stoi(pidvid.substr(splitPos+1));
- return new ConnectionSTREAM_UNITE(ctx, handle.index, vid, pid, nullptr);
- }
- else
- {
- const auto vid = std::stoi(pidvid.substr(splitPos+1, comAddrPos));
- const auto comName = pidvid.substr(comAddrPos+1);
- return new ConnectionSTREAM_UNITE(ctx, handle.index, vid, pid, comName.c_str());
- }
-
-#endif
+ //separate the addr field into usb IDs and com device
+ const auto idsPlusCom = handle.addr;
+ const auto comAddrPos = idsPlusCom.find("+");
+ const auto vidPid = idsPlusCom.substr(0, comAddrPos);
+ const auto comName = idsPlusCom.substr(comAddrPos+1);
+
+ //now make the hybrid connection with com device
+ return new ConnectionSTREAM_UNITE(ctx, vidPid, handle.serial, handle.index, comName.c_str());
}
diff --git a/src/ConnectionXillybus/ConnectionXillybus.cpp b/src/ConnectionXillybus/ConnectionXillybus.cpp
index 18a59c0..50f7e73 100644
--- a/src/ConnectionXillybus/ConnectionXillybus.cpp
+++ b/src/ConnectionXillybus/ConnectionXillybus.cpp
@@ -28,7 +28,7 @@ using namespace std;
using namespace lime;
-/** @brief Initializes port type and object necessary to communicate to usb device.
+/** @brief Initializes port type and object necessary to communicate to usb device.
*/
ConnectionXillybus::ConnectionXillybus(const unsigned index)
{
@@ -51,8 +51,7 @@ ConnectionXillybus::ConnectionXillybus(const unsigned index)
if (this->Open(index) != 0)
std::cerr << GetLastErrorMessage() << std::endl;
- DeviceInfo info = this->GetDeviceInfo();
-
+ GetChipVersion();
std::shared_ptr<Si5351C> si5351module(new Si5351C());
si5351module->Initialize(this);
si5351module->SetPLL(0, 25000000, 0);
@@ -73,84 +72,76 @@ ConnectionXillybus::ConnectionXillybus(const unsigned index)
std::this_thread::sleep_for(std::chrono::milliseconds(10)); //some settle time
}
-/** @brief Closes connection to chip and deallocates used memory.
+/** @brief Closes connection to chip and deallocates used memory.
*/
ConnectionXillybus::~ConnectionXillybus()
{
Close();
}
-/** @brief Tries to open connected USB device and find communication endpoints.
- @return Returns 0-Success, other-EndPoints not found or device didn't connect.
+/** @brief Tries to open connected USB device and find communication endpoints.
+ @return Returns 0-Success, other-EndPoints not found or device didn't connect.
*/
int ConnectionXillybus::Open(const unsigned index)
{
Close();
-
- string writePort;
- string readPort;
-
#ifndef __unix__
- writePort = "\\\\.\\xillybus_write_8";
- readPort = "\\\\.\\xillybus_read_8";
- writeStreamPort = "\\\\.\\xillybus_write_32";
- readStreamPort = "\\\\.\\xillybus_read_32";
+ const char writePort[] = "\\\\.\\xillybus_write_8";
+ const char readPort[] = "\\\\.\\xillybus_read_8";
#else
- writePort = "/dev/xillybus_write_8";
- readPort = "/dev/xillybus_read_8";
- writeStreamPort = "/dev/xillybus_write_32";
- readStreamPort = "/dev/xillybus_read_32";
+ const char writePort[] = "/dev/xillybus_write_8";
+ const char readPort[] = "/dev/xillybus_read_8";
#endif
#ifndef __unix__
- hWrite = CreateFileA(writePort.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
- hRead = CreateFileA(readPort.c_str(), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+ hWrite = CreateFileA(writePort, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+ hRead = CreateFileA(readPort, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
- //hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);;
- //hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
-
- // Check the results
- if (hWrite == INVALID_HANDLE_VALUE || hRead == INVALID_HANDLE_VALUE)
- {
- CloseHandle(hWrite);
+ // Check the results
+ if (hWrite == INVALID_HANDLE_VALUE || hRead == INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(hWrite);
CloseHandle(hRead);
- hWrite = INVALID_HANDLE_VALUE;
+ hWrite = INVALID_HANDLE_VALUE;
hRead = INVALID_HANDLE_VALUE;
- return -1;
- }
+ ReportError("Failed to open Xillybus");
+ return -1;
+ }
#else
- hWrite = open(writePort.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK);
- hRead = open(readPort.c_str(), O_RDONLY | O_NOCTTY | O_NONBLOCK);
+ hWrite = open(writePort, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+ hRead = open(readPort, O_RDONLY | O_NOCTTY | O_NONBLOCK);
if (hWrite == -1 || hRead == -1)
- {
- close(hWrite);
- close(hRead);
- hWrite = -1;
- hRead = -1;
- ReportError(errno);
- return -1;
- }
+ {
+ close(hWrite);
+ close(hRead);
+ hWrite = -1;
+ hRead = -1;
+ ReportError(errno);
+ return -1;
+ }
#endif
return 0;
}
-/** @brief Closes communication to device.
+/** @brief Closes communication to device.
*/
void ConnectionXillybus::Close()
{
isConnected = false;
#ifndef __unix__
- if (hWrite != INVALID_HANDLE_VALUE)
- CloseHandle(hWrite);
- hWrite = INVALID_HANDLE_VALUE;
+ if (hWrite != INVALID_HANDLE_VALUE)
+ CloseHandle(hWrite);
+ hWrite = INVALID_HANDLE_VALUE;
if (hRead != INVALID_HANDLE_VALUE)
- CloseHandle(hRead);
- hRead = INVALID_HANDLE_VALUE;
+ CloseHandle(hRead);
+ hRead = INVALID_HANDLE_VALUE;
- if (hWriteStream != INVALID_HANDLE_VALUE)
- CloseHandle(hWriteStream);
- if (hReadStream != INVALID_HANDLE_VALUE)
- CloseHandle(hReadStream);
+ if (hWriteStream != INVALID_HANDLE_VALUE)
+ CloseHandle(hWriteStream);
+ hWriteStream = INVALID_HANDLE_VALUE;
+ if (hReadStream != INVALID_HANDLE_VALUE)
+ CloseHandle(hReadStream);
+ hReadStream = INVALID_HANDLE_VALUE;
#else
if( hWrite >= 0)
close(hWrite);
@@ -167,14 +158,14 @@ void ConnectionXillybus::Close()
#endif
}
-/** @brief Returns connection status
- @return 1-connection open, 0-connection closed.
+/** @brief Returns connection status
+ @return 1-connection open, 0-connection closed.
*/
bool ConnectionXillybus::IsOpen()
{
#ifndef __unix__
if (hWrite != INVALID_HANDLE_VALUE && hRead != INVALID_HANDLE_VALUE )
- return true;
+ return true;
#else
if( hWrite != -1 && hRead != -1 )
return true;
@@ -182,262 +173,237 @@ bool ConnectionXillybus::IsOpen()
return false;
}
-/** @brief Sends given data buffer to chip through USB port.
- @param buffer data buffer, must not be longer than 64 bytes.
- @param length given buffer size.
+/** @brief Sends given data buffer to chip through USB port.
+ @param buffer data buffer, must not be longer than 64 bytes.
+ @param length given buffer size.
@param timeout_ms timeout limit for operation in milliseconds
- @return number of bytes sent.
+ @return number of bytes sent.
*/
int ConnectionXillybus::Write(const unsigned char *buffer, const int length, int timeout_ms)
{
- long totalBytesWritten = 0;
- long bytesToWrite = length;
-
#ifndef __unix__
- if (hWrite == INVALID_HANDLE_VALUE)
+ if (hWrite == INVALID_HANDLE_VALUE)
#else
- if (hWrite == -1)
+ if (hWrite == -1)
#endif
return -1;
+ int totalBytesWritten = 0;
+ int bytesToWrite = length;
auto t1 = chrono::high_resolution_clock::now();
- auto t2 = chrono::high_resolution_clock::now();
- while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < 500)
+ do
{
#ifndef __unix__
- DWORD bytesSent = 0;
- OVERLAPPED vOverlapped;
- memset(&vOverlapped, 0, sizeof(OVERLAPPED));
- vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
- WriteFile(hWrite, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
- if (::GetLastError() != ERROR_IO_PENDING)
- {
- CloseHandle(vOverlapped.hEvent);
- return totalBytesWritten;
- }
- std::this_thread::yield();
- DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 500);
- if (dwRet == WAIT_OBJECT_0)
- {
- if (GetOverlappedResult(hWrite, &vOverlapped, &bytesSent, FALSE) == FALSE)
- {
- bytesSent = 0;
- }
- }
- else
- {
- CancelIo(hWrite);
- bytesSent = 0;
- }
- CloseHandle(vOverlapped.hEvent);
+ DWORD bytesSent = 0;
+ OVERLAPPED vOverlapped;
+ memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+ vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+ WriteFile(hWrite, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
+ if (::GetLastError() != ERROR_IO_PENDING)
+ {
+ CloseHandle(vOverlapped.hEvent);
+ return totalBytesWritten;
+ }
+ std::this_thread::yield();
+ DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 500);
+ if (dwRet == WAIT_OBJECT_0)
+ {
+ if (GetOverlappedResult(hWrite, &vOverlapped, &bytesSent, FALSE) == FALSE)
+ {
+ bytesSent = 0;
+ }
+ }
+ else
+ {
+ CancelIo(hWrite);
+ bytesSent = 0;
+ }
+ CloseHandle(vOverlapped.hEvent);
#else
- int bytesSent;
+ int bytesSent;
if ((bytesSent = write(hWrite, buffer+ totalBytesWritten, bytesToWrite))<0)
{
-
- if(errno == EINTR)
+ if(errno == EINTR || errno == EAGAIN)
continue;
- else if (errno != EAGAIN)
- {
- ReportError(errno);
- return totalBytesWritten;
- }
+ ReportError(errno);
+ return totalBytesWritten;
}
- else
#endif
totalBytesWritten += bytesSent;
if (totalBytesWritten < length)
- {
bytesToWrite -= bytesSent;
- t2 = chrono::high_resolution_clock::now();
- }
else
break;
- }
+
+ }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
#ifdef __unix__
//Flush data to FPGA
- while (1)
+ while (write(hWrite, NULL, 0) < 0)
{
- int rc = write(hWrite, NULL, 0);
- if (rc < 0)
- {
- if (errno == EINTR)
- continue;
- else
- {
- ReportError(errno);
- }
- }
+ if (errno == EINTR)
+ continue;
+ ReportError(errno);
break;
}
#endif
return totalBytesWritten;
}
-/** @brief Reads data coming from the chip through USB port.
- @param buffer pointer to array where received data will be copied, array must be
- big enough to fit received data.
- @param length number of bytes to read from chip.
+/** @brief Reads data coming from the chip through USB port.
+ @param buffer pointer to array where received data will be copied, array must be
+ big enough to fit received data.
+ @param length number of bytes to read from chip.
@param timeout_ms timeout limit for operation in milliseconds
- @return number of bytes received.
+ @return number of bytes received.
*/
int ConnectionXillybus::Read(unsigned char *buffer, const int length, int timeout_ms)
{
memset(buffer, 0, length);
#ifndef __unix__
- if (hRead == INVALID_HANDLE_VALUE)
+ if (hRead == INVALID_HANDLE_VALUE)
#else
- if (hRead == -1)
+ if (hRead == -1)
#endif
- return -1;
+ return -1;
- long totalBytesReaded = 0;
- long bytesToRead = length;
- auto t1 = chrono::high_resolution_clock::now();
- auto t2 = chrono::high_resolution_clock::now();
+ int totalBytesReaded = 0;
+ int bytesToRead = length;
+ auto t1 = chrono::high_resolution_clock::now();
- while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < 1000)
- {
+ do
+ {
#ifndef __unix__
- DWORD bytesReceived = 0;
- OVERLAPPED vOverlapped;
- memset(&vOverlapped, 0, sizeof(OVERLAPPED));
- vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
- ReadFile(hRead, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
- if (::GetLastError() != ERROR_IO_PENDING)
- {
- CloseHandle(vOverlapped.hEvent);
- return totalBytesReaded;
- }
- std::this_thread::yield();
- DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 1000);
- if (dwRet == WAIT_OBJECT_0)
- {
- if (GetOverlappedResult(hRead, &vOverlapped, &bytesReceived, TRUE) == FALSE)
- {
- bytesReceived = 0;
- }
- }
- else
- {
- CancelIo(hRead);
- bytesReceived = 0;
- }
- CloseHandle(vOverlapped.hEvent);
-#else
- int bytesReceived = 0;
- if ((bytesReceived = read(hRead, buffer+ totalBytesReaded, bytesToRead))<0)
- {
- if(errno == EINTR)
- continue;
- else if (errno != EAGAIN)
- {
- ReportError(errno);
- return totalBytesReaded;
- }
- }
- else
-#endif
- totalBytesReaded += bytesReceived;
- if (totalBytesReaded < length)
+ DWORD bytesReceived = 0;
+ OVERLAPPED vOverlapped;
+ memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+ vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+ ReadFile(hRead, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
+ if (::GetLastError() != ERROR_IO_PENDING)
+ {
+ CloseHandle(vOverlapped.hEvent);
+ return totalBytesReaded;
+ }
+ std::this_thread::yield();
+ DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 1000);
+ if (dwRet == WAIT_OBJECT_0)
+ {
+ if (GetOverlappedResult(hRead, &vOverlapped, &bytesReceived, TRUE) == FALSE)
{
- bytesToRead -= bytesReceived;
- t2 = chrono::high_resolution_clock::now();
+ bytesReceived = 0;
}
- else
- break;
}
+ else
+ {
+ CancelIo(hRead);
+ bytesReceived = 0;
+ }
+ CloseHandle(vOverlapped.hEvent);
+#else
+ int bytesReceived;
+ if ((bytesReceived = read(hRead, buffer+ totalBytesReaded, bytesToRead))<0)
+ {
+ if(errno == EINTR || errno == EAGAIN)
+ continue;
+ ReportError(errno);
+ return totalBytesReaded;
+ }
+#endif
+ totalBytesReaded += bytesReceived;
+ if (totalBytesReaded < length)
+ bytesToRead -= bytesReceived;
+ else
+ break;
+
+ }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
+
return totalBytesReaded;
}
/**
- @brief Reads data from board
- @param buffer array where to store received data
- @param length number of bytes to read
- @param timeout read timeout in milliseconds
- @return number of bytes received
+ @brief Reads data from board
+ @param buffer array where to store received data
+ @param length number of bytes to read
+ @param timeout read timeout in milliseconds
+ @return number of bytes received
*/
-int ConnectionXillybus::ReceiveData(char *buffer, uint32_t length, double timeout_ms)
+int ConnectionXillybus::ReceiveData(char *buffer, const int length, const int timeout_ms)
{
- unsigned long totalBytesReaded = 0;
- unsigned long bytesToRead = length;
-
#ifndef __unix__
if (hReadStream == INVALID_HANDLE_VALUE)
{
- hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
- //hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+ hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+ if (hReadStream == INVALID_HANDLE_VALUE)
+ {
+ ReportError("Failed to open Xillybus");
+ return -1;
+ }
}
#else
- if (hReadStream < 0)
+ if (hReadStream == -1)
{
- if (( hReadStream = open(readStreamPort.c_str(), O_RDONLY | O_NOCTTY | O_NONBLOCK))<0)
+ if (( hReadStream = open("/dev/xillybus_read_32", O_RDONLY | O_NOCTTY | O_NONBLOCK))==-1)
{
ReportError(errno);
return -1;
}
}
#endif
+
+ int totalBytesReaded = 0;
+ int bytesToRead = length;
auto t1 = chrono::high_resolution_clock::now();
- auto t2 = chrono::high_resolution_clock::now();
- while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
+ do
{
#ifndef __unix__
- DWORD bytesReceived = 0;
- OVERLAPPED vOverlapped;
- memset(&vOverlapped, 0, sizeof(OVERLAPPED));
- vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
- ReadFile(hReadStream, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
- if (::GetLastError() != ERROR_IO_PENDING)
- {
- CloseHandle(vOverlapped.hEvent);
- return totalBytesReaded;
- }
- DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
- if (dwRet == WAIT_OBJECT_0)
- {
- if (GetOverlappedResult(hReadStream, &vOverlapped, &bytesReceived, TRUE) == FALSE)
- {
- bytesReceived = 0;
- }
- }
- else
- {
- CancelIo(hReadStream);
- bytesReceived = 0;
- }
- CloseHandle(vOverlapped.hEvent);
-#else
- int bytesReceived = 0;
- if ((bytesReceived = read(hReadStream, buffer+ totalBytesReaded, bytesToRead))<0)
+ DWORD bytesReceived = 0;
+ OVERLAPPED vOverlapped;
+ memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+ vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+ ReadFile(hReadStream, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
+ if (::GetLastError() != ERROR_IO_PENDING)
{
- bytesReceived = 0;
- if(errno == EINTR)
- continue;
- else if (errno != EAGAIN)
+ CloseHandle(vOverlapped.hEvent);
+ return totalBytesReaded;
+ }
+ DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
+ if (dwRet == WAIT_OBJECT_0)
+ {
+ if (GetOverlappedResult(hReadStream, &vOverlapped, &bytesReceived, TRUE) == FALSE)
{
- ReportError(errno);
- return totalBytesReaded;
+ bytesReceived = 0;
}
}
+ else
+ {
+ CancelIo(hReadStream);
+ bytesReceived = 0;
+ }
+ CloseHandle(vOverlapped.hEvent);
+#else
+ int bytesReceived;
+ if ((bytesReceived = read(hReadStream, buffer+ totalBytesReaded, bytesToRead))<0)
+ {
+ if(errno == EINTR || errno == EAGAIN)
+ continue;
+ ReportError(errno);
+ return totalBytesReaded;
+ }
#endif
totalBytesReaded += bytesReceived;
if (totalBytesReaded < length)
- {
bytesToRead -= bytesReceived;
- t2 = chrono::high_resolution_clock::now();
- }
else
break;
- }
+
+ }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
return totalBytesReaded;
}
/**
- @brief Aborts reading operations
+ @brief Aborts reading operations
*/
void ConnectionXillybus::AbortReading()
{
@@ -445,7 +411,7 @@ void ConnectionXillybus::AbortReading()
if (hReadStream != INVALID_HANDLE_VALUE)
{
CloseHandle(hReadStream);
- hReadStream = INVALID_HANDLE_VALUE;
+ hReadStream = INVALID_HANDLE_VALUE;
}
#else
if (hReadStream >= 0)
@@ -457,99 +423,89 @@ void ConnectionXillybus::AbortReading()
}
/**
- @brief sends data to board
- @param *buffer buffer to send
- @param length number of bytes to send
- @param timeout data write timeout in milliseconds
- @return number of bytes sent
+ @brief sends data to board
+ @param *buffer buffer to send
+ @param length number of bytes to send
+ @param timeout data write timeout in milliseconds
+ @return number of bytes sent
*/
-int ConnectionXillybus::SendData(const char *buffer, uint32_t length, double timeout_ms)
+int ConnectionXillybus::SendData(const char *buffer, const int length, const int timeout_ms)
{
#ifndef __unix__
- if (hWriteStream == INVALID_HANDLE_VALUE)
- {
- hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
- }
-#else
- if (hWriteStream < 0)
+ if (hWriteStream == INVALID_HANDLE_VALUE)
+ {
+ hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+ if (hWriteStream == INVALID_HANDLE_VALUE)
{
- if ((hWriteStream = open(writeStreamPort.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK))<0)
- {
- ReportError(errno);
- return -1;
- }
+ ReportError("Failed to open Xillybus");
+ return -1;
}
-
+ }
+#else
+ if (hWriteStream == -1)
+ {
+ if ((hWriteStream = open("/dev/xillybus_write_32", O_WRONLY | O_NOCTTY | O_NONBLOCK))==-1)
+ {
+ ReportError(errno);
+ return -1;
+ }
+ }
#endif
- unsigned long totalBytesWritten = 0;
- unsigned long bytesToWrite = length;
+ int totalBytesWritten = 0;
+ int bytesToWrite = length;
auto t1 = chrono::high_resolution_clock::now();
- auto t2 = chrono::high_resolution_clock::now();
- while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
+ do
{
#ifndef __unix__
- DWORD bytesSent = 0;
- OVERLAPPED vOverlapped;
- memset(&vOverlapped, 0, sizeof(OVERLAPPED));
- vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
- WriteFile(hWriteStream, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
- if (::GetLastError() != ERROR_IO_PENDING)
- {
- CloseHandle(vOverlapped.hEvent);
- return totalBytesWritten;
- }
- DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
- if (dwRet == WAIT_OBJECT_0)
- {
- if (GetOverlappedResult(hWriteStream, &vOverlapped, &bytesSent, TRUE) == FALSE)
- {
- bytesSent = 0;
- }
- }
- else
- {
- CancelIo(hWriteStream);
- bytesSent = 0;
- }
- CloseHandle(vOverlapped.hEvent);
-#else
- int bytesSent = 0;
- if ((bytesSent = write(hWriteStream, buffer+ totalBytesWritten, bytesToWrite))<0)
+ DWORD bytesSent = 0;
+ OVERLAPPED vOverlapped;
+ memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+ vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+ WriteFile(hWriteStream, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
+ if (::GetLastError() != ERROR_IO_PENDING)
{
- bytesSent =0;
- if(errno == EINTR)
- continue;
- else if (errno != EAGAIN)
+ CloseHandle(vOverlapped.hEvent);
+ return totalBytesWritten;
+ }
+ DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
+ if (dwRet == WAIT_OBJECT_0)
+ {
+ if (GetOverlappedResult(hWriteStream, &vOverlapped, &bytesSent, TRUE) == FALSE)
{
- ReportError(errno);
- return totalBytesWritten;
+ bytesSent = 0;
}
}
+ else
+ {
+ CancelIo(hWriteStream);
+ bytesSent = 0;
+ }
+ CloseHandle(vOverlapped.hEvent);
+#else
+ int bytesSent;
+ if ((bytesSent = write(hWriteStream, buffer+ totalBytesWritten, bytesToWrite))<0)
+ {
+ if(errno == EINTR || errno == EAGAIN)
+ continue;
+ ReportError(errno);
+ return totalBytesWritten;
+ }
#endif
totalBytesWritten += bytesSent;
if (totalBytesWritten < length)
- {
bytesToWrite -= bytesSent;
- t2 = chrono::high_resolution_clock::now();
- }
else
break;
- }
+
+ }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
//Flush data to FPGA
#ifdef __unix__
- while (1)
+ while (write(hWriteStream, NULL, 0)<0)
{
- int rc = write(hWriteStream, NULL, 0);
- if (rc < 0)
- {
- if (errno == EINTR)
- continue;
- else
- {
- ReportError(errno);
- }
- }
+ if (errno == EINTR)
+ continue;
+ ReportError(errno);
break;
}
#endif
@@ -565,26 +521,26 @@ void ConnectionXillybus::AbortSending()
if (hWriteStream != INVALID_HANDLE_VALUE)
{
CloseHandle(hWriteStream);
- hWriteStream = INVALID_HANDLE_VALUE;
+ hWriteStream = INVALID_HANDLE_VALUE;
}
#else
if (hWriteStream >= 0)
{
- close (hWriteStream);
+ close(hWriteStream);
hWriteStream = -1;
}
#endif
}
/** @brief Configures Stream board FPGA clocks to Limelight interface
- at param tx Rx/Tx selection
- at param InterfaceClk_Hz Limelight interface frequency
- at param phaseShift_deg IQ phase shift in degrees
- at return 0-success, other-failure
+ @param tx Rx/Tx selection
+ @param InterfaceClk_Hz Limelight interface frequency
+ @param phaseShift_deg IQ phase shift in degrees
+ @return 0-success, other-failure
*/
int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double interfaceClk_Hz, const double phaseShift_deg)
{
- eLMS_DEV boardType = GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_QSPARK) ? LMS_DEV_QSPARK : LMS_DEV_UNKNOWN;
+ eLMS_DEV boardType = GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_LIMESDR_QPCIE) ? LMS_DEV_LIMESDR_QPCIE : LMS_DEV_UNKNOWN;
const uint16_t busyAddr = 0x0021;
if(IsOpen() == false)
return ReportError(ENODEV, "ConnectionSTREAM: configure FPGA PLL, device not connected");
@@ -611,8 +567,8 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
const float oversampleClock_ns = 1e9 / oversampleClock_Hz;
const float phaseStep_deg = 360 * oversampleClock_ns*(1e-9) / (1 / inputClock_Hz);
uint16_t phase_reg_select = (phaseShift_deg / phaseStep_deg)+0.5;
- const float actualPhaseShift_deg = 360 * inputClock_Hz / (1 / (phase_reg_select * oversampleClock_ns*1e-9));
#ifndef NDEBUG
+ const float actualPhaseShift_deg = 360 * inputClock_Hz / (1 / (phase_reg_select * oversampleClock_ns*1e-9));
printf("reg value : %i\n", phase_reg_select);
printf("input clock: %f\n", inputClock_Hz);
printf("phase : %.2f/%.2f\n", phaseShift_deg, actualPhaseShift_deg);
@@ -656,7 +612,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
values.push_back(reg23val | PLLRST_START); //PLLRST_START
WriteRegisters(addrs.data(), values.data(), values.size());
- if(boardType == LMS_DEV_QSPARK) do //wait for reset to activate
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for reset to activate
{
ReadRegister(busyAddr, statusReg);
done = statusReg & 0x1;
@@ -720,7 +676,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
values.push_back(reg23val | PLLCFG_START); //PLLCFG_START
if(WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
ReportError(EIO, "ConnectionSTREAM: configure FPGA PLL, failed to write registers");
- if(boardType == LMS_DEV_QSPARK) do //wait for config to activate
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for config to activate
{
ReadRegister(busyAddr, statusReg);
done = statusReg & 0x1;
@@ -737,7 +693,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
values.push_back(reg23val | PHCFG_START); //PHCFG_START
if(WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
ReportError(EIO, "ConnectionSTREAM: configure FPGA PLL, failed to write registers");
- if(boardType == LMS_DEV_QSPARK) do
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do
{
ReadRegister(busyAddr, statusReg);
done = statusReg & 0x1;
diff --git a/src/ConnectionXillybus/ConnectionXillybus.h b/src/ConnectionXillybus/ConnectionXillybus.h
index 4a34d6e..d394824 100644
--- a/src/ConnectionXillybus/ConnectionXillybus.h
+++ b/src/ConnectionXillybus/ConnectionXillybus.h
@@ -30,31 +30,33 @@ public:
ConnectionXillybus(const unsigned index);
~ConnectionXillybus(void);
- int Open(const unsigned index);
- void Close();
- bool IsOpen();
- int GetOpenedIndex();
-
- int Write(const unsigned char *buffer, int length, int timeout_ms = 100) override;
- int Read(unsigned char *buffer, int length, int timeout_ms = 100) override;
-
- //hooks to update FPGA plls when baseband interface data rate is changed
- int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
+ int Open(const unsigned index);
+ void Close();
+ bool IsOpen();
+ int GetOpenedIndex();
+
+ int Write(const unsigned char *buffer, int length, int timeout_ms = 100) override;
+ int Read(unsigned char *buffer, int length, int timeout_ms = 100) override;
+
+ //hooks to update FPGA plls when baseband interface data rate is changed
+ int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
+ int UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)override;
+ int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100)override;
protected:
virtual void ReceivePacketsLoop(const ThreadData args) override;
virtual void TransmitPacketsLoop(const ThreadData args) override;
- virtual int ReceiveData(char* buffer, uint32_t length, double timeout);
+ virtual int ReceiveData(char* buffer, const int length, const int timeout = 100);
virtual void AbortReading();
- virtual int SendData(const char* buffer, uint32_t length, double timeout);
+ virtual int SendData(const char* buffer, const int length, const int timeout = 100);
virtual void AbortSending();
int ConfigureFPGA_PLL(unsigned int pllIndex, const double interfaceClk_Hz, const double phaseShift_deg);
private:
eConnectionType GetType(void)
{
- return USB_PORT;
+ return PCIE_PORT;
}
std::string m_hardwareName;
diff --git a/src/ConnectionXillybus/ConnectionXillybusing.cpp b/src/ConnectionXillybus/ConnectionXillybusing.cpp
index 12aec52..0279b29 100644
--- a/src/ConnectionXillybus/ConnectionXillybusing.cpp
+++ b/src/ConnectionXillybus/ConnectionXillybusing.cpp
@@ -23,47 +23,206 @@ using namespace lime;
*/
int ConnectionXillybus::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
{
- std::cout << "ConnectionXillybus::ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
+ std::cout << "ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
const float txInterfaceClk = 2 * txRate_Hz;
const float rxInterfaceClk = 2 * rxRate_Hz;
- mExpectedSampleRate = rxRate_Hz;
int status = 0;
- if(txInterfaceClk >= 5e6)
+ uint32_t reg20;
+ const double rxPhC1[] = { 91.08, 89.46 };
+ const double rxPhC2[] = { -1 / 6e6, 1.24e-6 };
+ const double txPhC1[] = { 89.75, 89.61 };
+ const double txPhC2[] = { -3.0e-7, 2.71e-7 };
+
+ const std::vector<uint32_t> spiAddr = {0x0021, 0x0022, 0x0023, 0x0024,
+ 0x0027, 0x002A, 0x0400, 0x040C,
+ 0x040B, 0x0400, 0x040B, 0x0400};
+ const int bakRegCnt = spiAddr.size() - 4;
+ auto info = GetDeviceInfo();
+ const int addrLMS7002M = info.addrsLMS7002M.at(0);
+ bool phaseSearch = false;
+ if (this->chipVersion == 0x3841 && stoi(info.gatewareRevision) >= 12) //0x3840 LMS7002Mr2, 0x3841 LMS7002Mr3
+ if(rxInterfaceClk >= 5e6 || txInterfaceClk >= 5e6)
+ phaseSearch = true;
+ mExpectedSampleRate = rxRate_Hz;
+
+ std::vector<uint32_t> dataWr;
+ std::vector<uint32_t> dataRd;
+
+ if (phaseSearch)
{
+ dataWr.resize(spiAddr.size());
+ dataRd.resize(spiAddr.size());
+ //backup registers
+ dataWr[0] = (uint32_t(0x0020) << 16);
+ TransactSPI(addrLMS7002M, dataWr.data(), ®20, 1);
+
+ dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | 0xFFFD; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+
+ for (int i = 0; i < bakRegCnt; ++i)
+ dataWr[i] = (spiAddr[i] << 16);
+ TransactSPI(addrLMS7002M, dataWr.data(), dataRd.data(), bakRegCnt);
+ UpdateThreads(true);
+ }
+
+ if(rxInterfaceClk >= 5e6)
+ {
+ if (phaseSearch)
+ {
+ const std::vector<uint32_t> spiData = { 0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+ 0xE4E4, 0x0086, 0x028D, 0x00FF,
+ 0x5555, 0x02CD, 0xAAAA, 0x02ED};
+ //Load test config
+ const int setRegCnt = spiData.size();
+ for (int i = 0; i < setRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+ }
lime::fpga::FPGA_PLL_clock clocks[2];
clocks[0].bypass = false;
clocks[0].index = 0;
- clocks[0].outFrequency = txInterfaceClk;
+ clocks[0].outFrequency = rxInterfaceClk;
clocks[0].phaseShift_deg = 0;
+ clocks[0].findPhase = false;
clocks[1].bypass = false;
clocks[1].index = 1;
- clocks[1].outFrequency = txInterfaceClk;
- clocks[1].phaseShift_deg = 90;
- status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
+ clocks[1].outFrequency = rxInterfaceClk;
+ if (this->chipVersion == 0x3841)
+ clocks[1].phaseShift_deg = rxPhC1[1] + rxPhC2[1] * rxInterfaceClk;
+ else
+ clocks[1].phaseShift_deg = rxPhC1[0] + rxPhC2[0] * rxInterfaceClk;
+
+ if (phaseSearch)
+ {
+ clocks[1].findPhase = true;
+ }
+ else
+ {
+ clocks[1].findPhase = false;
+ }
+ status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
}
else
- status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
- if(status != 0)
- return status;
+ status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
- if(rxInterfaceClk >= 5e6)
+ if(txInterfaceClk >= 5e6)
{
+ if (phaseSearch)
+ {
+ const std::vector<uint32_t> spiData = {0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+ 0xE4E4, 0x0484};
+ WriteRegister(0x000A, 0x0000);
+ //Load test config
+ const int setRegCnt = spiData.size();
+ for (int i = 0; i < setRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+ }
+
lime::fpga::FPGA_PLL_clock clocks[2];
clocks[0].bypass = false;
clocks[0].index = 0;
- clocks[0].outFrequency = rxInterfaceClk;
+ clocks[0].outFrequency = txInterfaceClk;
clocks[0].phaseShift_deg = 0;
+ clocks[0].findPhase = false;
clocks[1].bypass = false;
clocks[1].index = 1;
- clocks[1].outFrequency = rxInterfaceClk;
- clocks[1].phaseShift_deg = 90;
- status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
+ clocks[1].outFrequency = txInterfaceClk;
+ if (this->chipVersion == 0x3841)
+ clocks[1].phaseShift_deg = txPhC1[1] + txPhC2[1] * txInterfaceClk;
+ else
+ clocks[1].phaseShift_deg = txPhC1[0] + txPhC2[0] * txInterfaceClk;
+
+ if (phaseSearch)
+ {
+ clocks[1].findPhase = true;
+ WriteRegister(0x000A, 0x0200);
+ }
+ else
+ {
+ clocks[1].findPhase = false;
+ }
+ status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
}
else
- status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
+ status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
+
+ if (phaseSearch)
+ {
+ //Restore registers
+ for (int i = 0; i < bakRegCnt; ++i)
+ dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | dataRd[i]; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, bakRegCnt);
+ dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | reg20; //msbit 1=SPI write
+ TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+ WriteRegister(0x000A, 0);
+ UpdateThreads();
+ }
+
return status;
}
+
+int ConnectionXillybus::UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)
+{
+ WriteRegister(0x000C, 0x3); //channels 0,1
+ WriteRegister(0x000E, 0x2); //12bit samples
+ WriteRegister(0x000D, 0x0004); //WFM_LOAD
+
+ lime::FPGA_DataPacket pkt;
+ size_t samplesUsed = 0;
+
+ const complex16_t* const* src = (const complex16_t* const*)samples;
+ int cnt = sample_count;
+
+ const lime::complex16_t** batch = new const lime::complex16_t*[chCount];
+ while(cnt > 0)
+ {
+ pkt.counter = 0;
+ pkt.reserved[0] = 0;
+ int samplesToSend = cnt > 1360/chCount ? 1360/chCount : cnt;
+ cnt -= samplesToSend;
+
+ for(uint8_t i=0; i<chCount; ++i)
+ batch[i] = &src[i][samplesUsed];
+ samplesUsed += samplesToSend;
+
+ size_t bufPos = 0;
+ lime::fpga::Samples2FPGAPacketPayload(batch, samplesToSend, chCount, format, pkt.data, &bufPos);
+ int payloadSize = (bufPos / 4) * 4;
+ if(bufPos % 4 != 0)
+ printf("Packet samples count not multiple of 4\n");
+ pkt.reserved[2] = (payloadSize >> 8) & 0xFF; //WFM loading
+ pkt.reserved[1] = payloadSize & 0xFF; //WFM loading
+ pkt.reserved[0] = 0x1 << 5; //WFM loading
+
+ long bToSend = 16+payloadSize;
+ if (SendData((const char*)&pkt,bToSend,1000)!=bToSend)
+ break;
+ }
+ delete[] batch;
+ AbortSending();
+ this_thread::sleep_for(chrono::milliseconds(100));
+ if(cnt == 0)
+ return 0;
+ else
+ return ReportError(-1, "Failed to upload waveform");
+}
+
+int ConnectionXillybus::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+ fpga::StopStreaming(this);
+ WriteRegister(0x0008, 0x0100 | 0x2);
+ WriteRegister(0x0007, 1);
+
+ fpga::StartStreaming(this);
+ int totalBytesReceived = ReceiveData(buffer, length,timeout_ms);
+
+ fpga::StopStreaming(this);
+ AbortReading();
+ return totalBytesReceived;
+}
+
/** @brief Function dedicated for receiving data samples from board
@param rxFIFO FIFO to store received data
@param terminate periodically pooled flag to terminate thread
@@ -224,9 +383,9 @@ void ConnectionXillybus::ReceivePacketsLoop(const ThreadData args)
t1 = t2;
//total number of bytes sent per second
double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
//each channel sample rate
float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
#endif
samplesReceived[0] = 0;
@@ -341,8 +500,6 @@ void ConnectionXillybus::TransmitPacketsLoop(const ThreadData args)
{
//total number of bytes sent per second
float dataRate = 1000.0*totalBytesSent / timePeriod;
- //total number of samples from all channels per second
- float sampleRate = 1000.0*samplesSent / timePeriod;
if(dataRate_Bps)
dataRate_Bps->store(dataRate);
m_bufferFailures = 0;
@@ -350,6 +507,8 @@ void ConnectionXillybus::TransmitPacketsLoop(const ThreadData args)
totalBytesSent = 0;
t1 = t2;
#ifndef NDEBUG
+ //total number of samples from all channels per second
+ float sampleRate = 1000.0*samplesSent / timePeriod;
printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
#endif
}
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
index d41d3dd..1a9a9c1 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
@@ -10,8 +10,8 @@
#include <iostream>
#include <thread>
-#include <chrono>
-#include <FPGA_common.h>
+#include <chrono>
+#include <FPGA_common.h>
#include <LMS7002M.h>
#include <ciso646>
@@ -19,11 +19,11 @@ using namespace std;
using namespace lime;
Connection_uLimeSDR::Connection_uLimeSDR(void *arg)
-{
- RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
- TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
-
- isConnected = false;
+{
+ RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
+ TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
+
+ isConnected = false;
mStreamWrEndPtAddr = 0x03;
mStreamRdEndPtAddr = 0x83;
@@ -43,18 +43,20 @@ Connection_uLimeSDR::Connection_uLimeSDR(void *arg)
/** @brief Initializes port type and object necessary to communicate to usb device.
*/
Connection_uLimeSDR::Connection_uLimeSDR(void *arg, const unsigned index, const int vid, const int pid)
-{
- mTimestampOffset = 0;
- rxLastTimestamp.store(0);
- mExpectedSampleRate = 0;
- generateData.store(false);
- rxRunning.store(false);
- txRunning.store(false);
- isConnected = false;
- terminateRx.store(false);
- terminateTx.store(false);
- rxDataRate_Bps.store(0);
- txDataRate_Bps.store(0);
+{
+ RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
+ TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
+ mTimestampOffset = 0;
+ rxLastTimestamp.store(0);
+ mExpectedSampleRate = 0;
+ generateData.store(false);
+ rxRunning.store(false);
+ txRunning.store(false);
+ isConnected = false;
+ terminateRx.store(false);
+ terminateTx.store(false);
+ rxDataRate_Bps.store(0);
+ txDataRate_Bps.store(0);
mStreamWrEndPtAddr = 0x03;
mStreamRdEndPtAddr = 0x83;
@@ -71,21 +73,22 @@ Connection_uLimeSDR::Connection_uLimeSDR(void *arg, const unsigned index, const
#endif
if(this->Open(index, vid, pid) != 0)
std::cerr << GetLastErrorMessage() << std::endl;
+ this->SetReferenceClockRate(52e6);
}
/** @brief Closes connection to chip and deallocates used memory.
*/
Connection_uLimeSDR::~Connection_uLimeSDR()
{
- for(auto i : mTxStreams)
- ControlStream((size_t)i, false);
- for(auto i : mRxStreams)
- ControlStream((size_t)i, false);
- for(auto i : mTxStreams)
- CloseStream((size_t)i);
- for(auto i : mRxStreams)
- CloseStream((size_t)i);
- UpdateThreads();
+ for(auto i : mTxStreams)
+ ControlStream((size_t)i, false);
+ for(auto i : mRxStreams)
+ ControlStream((size_t)i, false);
+ for(auto i : mTxStreams)
+ CloseStream((size_t)i);
+ for(auto i : mRxStreams)
+ CloseStream((size_t)i);
+ UpdateThreads();
Close();
}
#ifdef __unix__
@@ -348,48 +351,49 @@ int Connection_uLimeSDR::Read(unsigned char *buffer, const int length, int timeo
static void callback_libusbtransfer(libusb_transfer *trans)
{
Connection_uLimeSDR::USBTransferContext *context = reinterpret_cast<Connection_uLimeSDR::USBTransferContext*>(trans->user_data);
+ std::unique_lock<std::mutex> lck(context->transferLock);
switch(trans->status)
{
- case LIBUSB_TRANSFER_CANCELLED:
- //printf("Transfer %i canceled\n", context->id);
- context->bytesXfered = trans->actual_length;
- context->done.store(true);
- //context->used = false;
- //context->reset();
- break;
- case LIBUSB_TRANSFER_COMPLETED:
- //if(trans->actual_length == context->bytesExpected)
- {
- context->bytesXfered = trans->actual_length;
- context->done.store(true);
- }
- break;
- case LIBUSB_TRANSFER_ERROR:
- printf("TRANSFER ERRRO\n");
- context->bytesXfered = trans->actual_length;
- context->done.store(true);
- //context->used = false;
+ case LIBUSB_TRANSFER_CANCELLED:
+ //printf("Transfer %i canceled\n", context->id);
+ context->bytesXfered = trans->actual_length;
+ context->done.store(true);
+ //context->used = false;
+ //context->reset();
+ break;
+ case LIBUSB_TRANSFER_COMPLETED:
+ //if(trans->actual_length == context->bytesExpected)
+ {
+ context->bytesXfered = trans->actual_length;
+ context->done.store(true);
+ }
break;
- case LIBUSB_TRANSFER_TIMED_OUT:
- //printf("transfer timed out %i\n", context->id);
- context->bytesXfered = trans->actual_length;
- context->done.store(true);
- //context->used = false;
+ case LIBUSB_TRANSFER_ERROR:
+ printf("TRANSFER ERRRO\n");
+ context->bytesXfered = trans->actual_length;
+ context->done.store(true);
+ //context->used = false;
+ break;
+ case LIBUSB_TRANSFER_TIMED_OUT:
+ //printf("transfer timed out %i\n", context->id);
+ context->bytesXfered = trans->actual_length;
+ context->done.store(true);
+ //context->used = false;
- break;
- case LIBUSB_TRANSFER_OVERFLOW:
- printf("transfer overflow\n");
+ break;
+ case LIBUSB_TRANSFER_OVERFLOW:
+ printf("transfer overflow\n");
- break;
- case LIBUSB_TRANSFER_STALL:
- printf("transfer stalled\n");
- break;
- case LIBUSB_TRANSFER_NO_DEVICE:
- printf("transfer no device\n");
+ break;
+ case LIBUSB_TRANSFER_STALL:
+ printf("transfer stalled\n");
+ break;
+ case LIBUSB_TRANSFER_NO_DEVICE:
+ printf("transfer no device\n");
- break;
+ break;
}
- context->transferLock.unlock();
+ lck.unlock();
context->cv.notify_one();
}
#endif
@@ -451,8 +455,6 @@ int Connection_uLimeSDR::BeginDataReading(char *buffer, uint32_t length)
contexts[i].used = false;
return -1;
}
- else
- contexts[i].transferLock.lock();
#endif
return i;
}
@@ -468,8 +470,8 @@ int Connection_uLimeSDR::WaitForReading(int contextHandle, unsigned int timeout_
if(contextHandle >= 0 && contexts[contextHandle].used == true)
{
#ifndef __unix__
- contexts[contextHandle].inOvLap.InternalHigh = 0;
- DWORD dwRet = WaitForSingleObject(contexts[contextHandle].inOvLap.hEvent, timeout_ms);
+ contexts[contextHandle].inOvLap.InternalHigh = 0;
+ DWORD dwRet = WaitForSingleObject(contexts[contextHandle].inOvLap.hEvent, timeout_ms);
if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_TIMEOUT)
return 1;
#else
@@ -480,7 +482,7 @@ int Connection_uLimeSDR::WaitForReading(int contextHandle, unsigned int timeout_
while(contexts[contextHandle].done.load() == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
{
//blocking not to waste CPU
- contexts[contextHandle].cv.wait(lck);
+ contexts[contextHandle].cv.wait_for(lck, chrono::milliseconds(timeout_ms));
t2 = chrono::high_resolution_clock::now();
}
return contexts[contextHandle].done.load() == true;
@@ -605,8 +607,6 @@ int Connection_uLimeSDR::BeginDataSending(const char *buffer, uint32_t length)
contextsToSend[i].used = false;
return -1;
}
- else
- contextsToSend[i].transferLock.lock();
#endif
return i;
}
@@ -623,7 +623,7 @@ int Connection_uLimeSDR::WaitForSending(int contextHandle, unsigned int timeout_
{
#ifndef __unix__
contextsToSend[contextHandle].inOvLap.InternalHigh = 0;
- DWORD dwRet = WaitForSingleObject(contextsToSend[contextHandle].inOvLap.hEvent, timeout_ms);
+ DWORD dwRet = WaitForSingleObject(contextsToSend[contextHandle].inOvLap.hEvent, timeout_ms);
if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_TIMEOUT)
return 1;
#else
@@ -633,7 +633,7 @@ int Connection_uLimeSDR::WaitForSending(int contextHandle, unsigned int timeout_
while(contextsToSend[contextHandle].done.load() == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
{
//blocking not to waste CPU
- contextsToSend[contextHandle].cv.wait(lck);
+ contextsToSend[contextHandle].cv.wait_for(lck, chrono::milliseconds(timeout_ms));
t2 = chrono::high_resolution_clock::now();
}
return contextsToSend[contextHandle].done == true;
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
index b1d4ff6..0d6132a 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
@@ -17,7 +17,6 @@ void Connection_uLimeSDREntry::handle_libusb_events()
{
int r = libusb_handle_events_timeout_completed(ctx, &tv, NULL);
if(r != 0) printf("error libusb_handle_events %s\n", libusb_strerror(libusb_error(r)));
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
#endif // __UNIX__
@@ -80,67 +79,76 @@ std::vector<ConnectionHandle> Connection_uLimeSDREntry::enumerate(const Connecti
#else
libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
int usbDeviceCount = libusb_get_device_list(ctx, &devs);
- if(usbDeviceCount > 0)
+
+ if (usbDeviceCount < 0) {
+ printf("failed to get libusb device list: %s\n", libusb_strerror(libusb_error(usbDeviceCount)));
+ return handles;
+ }
+
+ libusb_device_descriptor desc;
+ for(int i=0; i<usbDeviceCount; ++i)
{
- libusb_device_descriptor desc;
- for(int i=0; i<usbDeviceCount; ++i)
- {
- int r = libusb_get_device_descriptor(devs[i], &desc);
- if(r<0)
- printf("failed to get device description\n");
- int pid = desc.idProduct;
- int vid = desc.idVendor;
+ int r = libusb_get_device_descriptor(devs[i], &desc);
+ if(r<0)
+ printf("failed to get device description\n");
+ int pid = desc.idProduct;
+ int vid = desc.idVendor;
- if( vid == 0x0403)
+ if( vid == 0x0403)
+ {
+ if(pid == 0x601F)
{
- if(pid == 0x601F)
+ libusb_device_handle *tempDev_handle;
+ tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
+ if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached
{
- libusb_device_handle *tempDev_handle;
- tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
- if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached
- {
- if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
- printf("Kernel Driver Detached!\n");
- }
- if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
- {
- printf("Cannot Claim Interface\n");
- }
-
- std::string fullName;
- //check operating speed
- int speed = libusb_get_device_speed(devs[i]);
- if(speed == LIBUSB_SPEED_HIGH)
- fullName = "USB 2.0";
- else if(speed == LIBUSB_SPEED_SUPER)
- fullName = "USB 3.0";
- else
- fullName = "USB";
- fullName += " (";
- //read device name
- char data[255];
- memset(data, 0, 255);
- int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255);
- if(st < 0)
- printf("Error getting usb descriptor\n");
- if(strlen(data) > 0)
- fullName += data;
- fullName += ")";
- libusb_close(tempDev_handle);
-
- ConnectionHandle handle;
+ if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
+ printf("Kernel Driver Detached!\n");
+ }
+ if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
+ {
+ printf("Cannot Claim Interface\n");
+ }
+
+ ConnectionHandle handle;
+ //check operating speed
+ int speed = libusb_get_device_speed(devs[i]);
+ if(speed == LIBUSB_SPEED_HIGH)
+ handle.media = "USB 2.0";
+ else if(speed == LIBUSB_SPEED_SUPER)
+ handle.media = "USB 3.0";
+ else
handle.media = "USB";
- handle.name = fullName;
- handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+ //read device name
+ char data[255];
+ memset(data, 0, 255);
+ int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255);
+ if(st < 0)
+ printf("Error getting usb descriptor\n");
+ if(strlen(data) > 0)
+ handle.name = std::string(data, size_t(st));
+ handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+
+ if (desc.iSerialNumber > 0)
+ {
+ r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+ if(r<0)
+ printf("failed to get serial number\n");
+ else
+ handle.serial = std::string(data, size_t(r));
+ }
+ libusb_close(tempDev_handle);
+
+ //add handle conditionally, filter by serial number
+ if (hint.serial.empty() or hint.serial == handle.serial)
+ {
handles.push_back(handle);
}
}
}
}
- else
- {
- libusb_free_device_list(devs, 1);
- }
+
+ libusb_free_device_list(devs, 1);
#endif
return handles;
}
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
index 00fe8ae..ffd1460 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
@@ -1,59 +1,59 @@
-/**
- @file Connection_uLimeSDRing.cpp
- @author Lime Microsystems
- @brief Implementation of uLimeSDR board connection (streaming API)
-*/
-
-#include "Connection_uLimeSDR.h"
-#include "fifo.h"
-#include <LMS7002M.h>
-#include <iostream>
-#include <thread>
-#include <chrono>
-#include <algorithm>
-#include <complex>
+/**
+ @file Connection_uLimeSDRing.cpp
+ @author Lime Microsystems
+ @brief Implementation of uLimeSDR board connection (streaming API)
+*/
+
+#include "Connection_uLimeSDR.h"
+#include "fifo.h"
+#include <LMS7002M.h>
+#include <iostream>
+#include <thread>
+#include <chrono>
+#include <algorithm>
+#include <complex>
#include <ciso646>
-#include <vector>
+#include <vector>
#include <FPGA_common.h>
-#include "ErrorReporting.h"
-
+#include "ErrorReporting.h"
+
using namespace lime;
-using namespace std;
+using namespace std;
-/** @brief Configures FPGA PLLs to LimeLight interface frequency
-*/
-int Connection_uLimeSDR::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
-{
- std::cout << "Connection_uLimeSDR::UpdateExternalDataRate(tx=" << txRate_Hz / 1e6 << "MHz, rx=" << rxRate_Hz / 1e6 << "MHz)" << std::endl;
- const float txInterfaceClk = 2 * txRate_Hz;
+/** @brief Configures FPGA PLLs to LimeLight interface frequency
+*/
+int Connection_uLimeSDR::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
+{
+ std::cout << "Connection_uLimeSDR::UpdateExternalDataRate(tx=" << txRate_Hz / 1e6 << "MHz, rx=" << rxRate_Hz / 1e6 << "MHz)" << std::endl;
+ const float txInterfaceClk = 2 * txRate_Hz;
const float rxInterfaceClk = 2 * rxRate_Hz;
- mExpectedSampleRate = rxRate_Hz;
- if ((txInterfaceClk >= 5e6) && (rxInterfaceClk >= 5e6))
- {
- lime::fpga::FPGA_PLL_clock clocks[4];
- clocks[0].bypass = false;
- clocks[0].index = 0;
- clocks[0].outFrequency = txInterfaceClk;
- clocks[0].phaseShift_deg = 0;
- clocks[1].bypass = false;
- clocks[1].index = 1;
- clocks[1].outFrequency = txInterfaceClk;
- clocks[1].phaseShift_deg = 90;
- clocks[2].bypass = false;
- clocks[2].index = 2;
- clocks[2].outFrequency = rxInterfaceClk;
- clocks[2].phaseShift_deg = 0;
- clocks[3].bypass = false;
- clocks[3].index = 3;
- clocks[3].outFrequency = rxInterfaceClk;
- clocks[3].phaseShift_deg = 90;
- return lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 4);
- }
- else
- {
- return ReportError(-1, "uLimeSDR FPGA sampling rate must be >=2.5 MHz");
- }
-}
+ mExpectedSampleRate = rxRate_Hz;
+ if ((txInterfaceClk >= 5e6) && (rxInterfaceClk >= 5e6))
+ {
+ lime::fpga::FPGA_PLL_clock clocks[4];
+ clocks[0].bypass = false;
+ clocks[0].index = 0;
+ clocks[0].outFrequency = txInterfaceClk;
+ clocks[0].phaseShift_deg = 0;
+ clocks[1].bypass = false;
+ clocks[1].index = 1;
+ clocks[1].outFrequency = txInterfaceClk;
+ clocks[1].phaseShift_deg = 90;
+ clocks[2].bypass = false;
+ clocks[2].index = 2;
+ clocks[2].outFrequency = rxInterfaceClk;
+ clocks[2].phaseShift_deg = 0;
+ clocks[3].bypass = false;
+ clocks[3].index = 3;
+ clocks[3].outFrequency = rxInterfaceClk;
+ clocks[3].phaseShift_deg = 90;
+ return lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 4);
+ }
+ else
+ {
+ return ReportError(-1, "uLimeSDR FPGA sampling rate must be >=2.5 MHz");
+ }
+}
/** @brief Function dedicated for receiving data samples from board
@param rxFIFO FIFO to store received data
@@ -190,6 +190,7 @@ void Connection_uLimeSDR::ReceivePacketsLoop(const Connection_uLimeSDR::ThreadDa
printf("L");
resetTxFlags.notify_one();
resetFlagsDelay = packetsToBatch*buffersCount;
+ if (args.reportLateTx) args.reportLateTx(pkt[pktIndex].counter);
}
}
uint8_t* pktStart = (uint8_t*)pkt[pktIndex].data;
@@ -244,9 +245,9 @@ void Connection_uLimeSDR::ReceivePacketsLoop(const Connection_uLimeSDR::ThreadDa
t1 = t2;
//total number of bytes sent per second
double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
//each channel sample rate
float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
#endif
samplesReceived[0] = 0;
@@ -346,7 +347,7 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
}
int i=0;
- while(i<packetsToBatch)
+ while(i<packetsToBatch && terminate->load() != true)
{
IStreamChannel::Metadata meta;
FPGA_DataPacket* pkt = reinterpret_cast<FPGA_DataPacket*>(&buffers[bi*bufferSize]);
@@ -388,8 +389,6 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
{
//total number of bytes sent per second
float dataRate = 1000.0*totalBytesSent / timePeriod;
- //total number of samples from all channels per second
- float sampleRate = 1000.0*samplesSent / timePeriod;
if(dataRate_Bps)
dataRate_Bps->store(dataRate);
m_bufferFailures = 0;
@@ -397,6 +396,8 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
totalBytesSent = 0;
t1 = t2;
#ifndef NDEBUG
+ //total number of samples from all channels per second
+ float sampleRate = 1000.0*samplesSent / timePeriod;
printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
#endif
}
diff --git a/src/FPGA_common/FPGA_common.cpp b/src/FPGA_common/FPGA_common.cpp
index 6cf00ec..9513f7c 100644
--- a/src/FPGA_common/FPGA_common.cpp
+++ b/src/FPGA_common/FPGA_common.cpp
@@ -7,6 +7,7 @@
#include <map>
#include <math.h>
#include <assert.h>
+#include <thread>
using namespace std;
#ifndef NDEBUG
@@ -27,6 +28,13 @@ const int STREAM_LOAD = 1 << 2;
const int SMPL_NR_CLR = 1; // rising edge clears
const int TXPCT_LOSS_CLR = 1 << 1; // 0 - normal operation, 1-clear
+const uint16_t PLLCFG_START = 0x1;
+const uint16_t PHCFG_START = 0x2;
+const uint16_t PLLRST_START = 0x4;
+const uint16_t PHCFG_UPDN = 1 << 13;
+
+const uint16_t busyAddr = 0x0021;
+
int StartStreaming(IConnection* serPort)
{
uint16_t interface_ctrl_000A;
@@ -69,6 +77,51 @@ int ResetTimestamp(IConnection* serPort)
return status;
}
+static int SetPllClock(IConnection* serPort, int clockIndex, int nSteps, eLMS_DEV boardType, uint16_t ®23val)
+{
+ const auto timeout = chrono::seconds(3);
+ auto t1 = chrono::high_resolution_clock::now();
+ auto t2 = t1;
+ vector<uint32_t> addrs;
+ vector<uint32_t> values;
+ addrs.push_back(0x0023); values.push_back(reg23val & ~PLLCFG_START);
+ addrs.push_back(0x0024); values.push_back(abs(nSteps)); //CNT_PHASE
+ int cnt_ind = (clockIndex + 2) & 0x1F; //C0 index 2, C1 index 3...
+ reg23val &= ~(0xF<<8);
+ reg23val = reg23val | (cnt_ind << 8);
+ if(nSteps >= 0)
+ reg23val |= PHCFG_UPDN;
+ else
+ reg23val &= ~PHCFG_UPDN;
+ addrs.push_back(0x0023); values.push_back(reg23val); //PHCFG_UpDn, CNT_IND
+ addrs.push_back(0x0023); values.push_back(reg23val | PHCFG_START);
+
+ if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
+ ReportError(EIO, "SetPllFrequency: PHCFG, failed to write registers");
+ addrs.clear(); values.clear();
+
+ bool done = false;
+ uint8_t errorCode = 0;
+ t1 = chrono::high_resolution_clock::now();
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do
+ {
+ uint16_t statusReg;
+ serPort->ReadRegister(busyAddr, statusReg);
+ done = statusReg & 0x1;
+ errorCode = (statusReg >> 7) & 0xFF;
+ t2 = chrono::high_resolution_clock::now();
+ std::this_thread::sleep_for(chrono::milliseconds(10));
+ } while(!done && errorCode == 0 && (t2-t1) < timeout);
+ if(t2 - t1 > timeout)
+ return ReportError(ENODEV, "SetPllFrequency: PHCFG timeout, busy bit is still 1");
+ if(errorCode != 0)
+ return ReportError(EBUSY, "SetPllFrequency: error configuring PHCFG");
+ addrs.push_back(0x0023); values.push_back(reg23val & ~PHCFG_START);
+ if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
+ ReportError(EIO, "SetPllFrequency: configure FPGA PLL, failed to write registers");
+ return 0;
+}
+
/** @brief Configures board FPGA clocks
@param serPort communications port
@param pllIndex index of FPGA pll
@@ -76,18 +129,17 @@ int ResetTimestamp(IConnection* serPort)
@param clocksCount number of clocks to configure
@return 0-success, other-failure
*/
-int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* clocks, const uint8_t clockCount)
+int SetPllFrequency(IConnection* serPort, const uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* clocks, const uint8_t clockCount)
{
auto t1 = chrono::high_resolution_clock::now();
auto t2 = chrono::high_resolution_clock::now();
const auto timeout = chrono::seconds(3);
- const uint16_t busyAddr = 0x0021;
if(not serPort)
return ReportError(ENODEV, "ConfigureFPGA_PLL: connection port is NULL");
if(not serPort->IsOpen())
return ReportError(ENODEV, "ConfigureFPGA_PLL: configure FPGA PLL, device not connected");
- eLMS_DEV boardType = serPort->GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_QSPARK) ? LMS_DEV_QSPARK : LMS_DEV_UNKNOWN;
+ eLMS_DEV boardType = serPort->GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_LIMESDR_QPCIE) ? LMS_DEV_LIMESDR_QPCIE : LMS_DEV_UNKNOWN;
if(pllIndex > 15)
ReportError(ERANGE, "SetPllFrequency: PLL index(%i) out of range [0-15]", pllIndex);
@@ -109,10 +161,6 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
if(serPort->ReadRegister(0x0003, reg23val) != 0)
return ReportError(ENODEV, "SetPllFrequency: failed to read register");
- const uint16_t PLLCFG_START = 0x1;
- const uint16_t PHCFG_START = 0x2;
- const uint16_t PLLRST_START = 0x4;
- const uint16_t PHCFG_UPDN = 1 << 13;
reg23val &= ~(0x1F << 3); //clear PLL index
reg23val &= ~PLLCFG_START; //clear PLLCFG_START
reg23val &= ~PHCFG_START; //clear PHCFG
@@ -131,11 +179,12 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
addrs.clear(); values.clear();
t1 = chrono::high_resolution_clock::now();
- if(boardType == LMS_DEV_QSPARK) do //wait for reset to activate
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for reset to activate
{
serPort->ReadRegister(busyAddr, statusReg);
done = statusReg & 0x1;
errorCode = (statusReg >> 7) & 0xFF;
+ std::this_thread::sleep_for(chrono::milliseconds(10));
t2 = chrono::high_resolution_clock::now();
} while(not done && errorCode == 0 && (t2-t1) < timeout);
if(t2 - t1 > timeout)
@@ -146,7 +195,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
addrs.push_back(0x0023); values.push_back(reg23val & ~PLLRST_START);
//configure FPGA PLLs
- const double vcoLimits_Hz[2] = { 600e6, 1300e6 };
+ const double vcoLimits_Hz[2] = { 600e6, 1050e6 };
map< unsigned long, int> availableVCOs; //all available frequencies for VCO
for(int i=0; i<clockCount; ++i)
@@ -178,7 +227,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
bestScore = it.second;
}
}
- int N, M;
+ int N(0), M(0);
double bestDeviation = 1e9;
double Fvco;
for(auto it : availableVCOs)
@@ -200,7 +249,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
}
}
double deviation = fabs(it.first - inputFreq*Mtemp / Ntemp);
- if(deviation < bestDeviation)
+ if(deviation <= bestDeviation)
{
bestDeviation = deviation;
Fvco = it.first;
@@ -263,60 +312,93 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
addrs.clear(); values.clear();
t1 = chrono::high_resolution_clock::now();
- if(boardType == LMS_DEV_QSPARK) do //wait for config to activate
+ if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for config to activate
{
serPort->ReadRegister(busyAddr, statusReg);
done = statusReg & 0x1;
errorCode = (statusReg >> 7) & 0xFF;
t2 = chrono::high_resolution_clock::now();
+ std::this_thread::sleep_for(chrono::milliseconds(10));
} while(not done && errorCode == 0 && (t2-t1) < timeout);
if(t2 - t1 > timeout)
return ReportError(ENODEV, "SetPllFrequency: PLLCFG timeout, busy bit is still 1");
if(errorCode != 0)
return ReportError(EBUSY, "SetPllFrequency: error configuring PLLCFG");
- addrs.push_back(0x0023); values.push_back(reg23val & ~PLLCFG_START);
for(int i=0; i<clockCount; ++i)
{
int C = int(Fvco / clocks[i].outFrequency + 0.5);
float fOut_MHz = inputFreq/1e6;
float Fstep_us = 1 / (8 * fOut_MHz*C);
float Fstep_deg = (360 * Fstep_us) / (1 / fOut_MHz);
- short nSteps = clocks[i].phaseShift_deg / Fstep_deg;
- addrs.push_back(0x0024); values.push_back(nSteps); //CNT_PHASE
- int cnt_ind = (clocks[i].index + 2) & 0x1F; //C0 index 2, C1 index 3...
- reg23val &= ~(0xF<<8);
- reg23val = reg23val | (cnt_ind << 8);
- if(clocks[i].phaseShift_deg >= 0)
- reg23val |= PHCFG_UPDN;
+ if (clocks[i].findPhase == false)
+ {
+ const int nSteps = 0.49 + clocks[i].phaseShift_deg / Fstep_deg;
+ SetPllClock(serPort,clocks[i].index,nSteps, boardType, reg23val);
+#ifdef LMS_VERBOSE_OUTPUT
+ printf("Configured phase: %1.1f (steps %d)\n",nSteps*Fstep_deg,nSteps);
+#endif
+ }
else
- reg23val &= ~PHCFG_UPDN;
- addrs.push_back(0x0023); values.push_back(reg23val); //PHCFG_UpDn, CNT_IND
- addrs.push_back(0x0023); values.push_back(reg23val | PHCFG_START);
+ {
+ double min = -1;
+ const double maxPhase = 360;
+ double max = maxPhase;
+ const int testSize = 16*1024;
+ int nSteps = 6.0/Fstep_deg;
+ if (nSteps == 0) nSteps = 1;
+ unsigned char* buf = new unsigned char[testSize];
+ for (double phase = 0; phase <= maxPhase; phase += nSteps*Fstep_deg)
+ {
+
+ SetPllClock(serPort,clocks[i].index,nSteps, boardType, reg23val);
+ bool result = true;
+
+ if (serPort->ReadRawStreamData((char*)buf,testSize,20)==testSize)
+ {
+ for (size_t j = 16; j < testSize;j+=3)
+ {
+ if (j%4096 == 0)
+ j += 16;
+ if ((buf[j]!=0xAA) || (buf[j+1]!=0x5A) || (buf[j+2]!=0x55))
+ {
+ result = false;
+ break;
+ }
+ }
+ }
+ else result = false;
+
+ if (result == true && min < 0)
+ {
+ min = phase;
+ }
+ else if (result == false && min >= 0)
+ {
+ max = phase;
+ break;
+ }
+ }
+
+ delete [] buf;
+
+ if (min > -1.0)
+ {
+ clocks[i].findPhase = false;
+ clocks[i].phaseShift_deg = (min+max)/2;
#ifdef LMS_VERBOSE_OUTPUT
- printf("C%i=%i, Fout=%3.3f MHz, CNT_IND=%i, nSteps=%i, phaseShift=%.1f\n", i, C, clocks[i].rd_actualFrequency / 1e6, cnt_ind, nSteps, nSteps*Fstep_deg);
+ printf("phase: min %1.1f; max %1.1f)\n",min,max);
#endif
- if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
- ReportError(EIO, "SetPllFrequency: PHCFG, failed to write registers");
- addrs.clear();
- values.clear();
+ return SetPllFrequency(serPort, pllIndex, inputFreq, clocks,clockCount);
+ }
+ else
+ {
+ clocks[i].findPhase = false;
+ return SetPllFrequency(serPort, pllIndex, inputFreq, clocks,clockCount);
+ }
+ }
- t1 = chrono::high_resolution_clock::now();
- if(boardType == LMS_DEV_QSPARK) do
- {
- serPort->ReadRegister(busyAddr, statusReg);
- done = statusReg & 0x1;
- errorCode = (statusReg >> 7) & 0xFF;
- t2 = chrono::high_resolution_clock::now();
- } while(!done && errorCode == 0 && (t2-t1) < timeout);
- if(t2 - t1 > timeout)
- return ReportError(ENODEV, "SetPllFrequency: PHCFG timeout, busy bit is still 1");
- if(errorCode != 0)
- return ReportError(EBUSY, "SetPllFrequency: error configuring PHCFG");
- addrs.push_back(0x0023); values.push_back(reg23val & ~PHCFG_START);
}
- if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
- ReportError(EIO, "SetPllFrequency: configure FPGA PLL, failed to write registers");
return 0;
}
diff --git a/src/FPGA_common/FPGA_common.h b/src/FPGA_common/FPGA_common.h
index 10e9791..7eb9a77 100644
--- a/src/FPGA_common/FPGA_common.h
+++ b/src/FPGA_common/FPGA_common.h
@@ -21,14 +21,19 @@ int ResetTimestamp(IConnection* serPort);
struct FPGA_PLL_clock
{
+ FPGA_PLL_clock()
+ {
+ findPhase = false;
+ }
double outFrequency;
double phaseShift_deg;
uint8_t index;
bool bypass;
+ bool findPhase;
double rd_actualFrequency;
};
-int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* outputs, const uint8_t clockCount);
+int SetPllFrequency(IConnection* serPort, const uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* outputs, const uint8_t clockCount);
int SetDirectClocking(IConnection* serPort, uint8_t clockIndex, const double inputFreq, const double phaseShift_deg);
int FPGAPacketPayload2Samples(const uint8_t* buffer, const size_t bufLen, const size_t chCount, const int format, complex16_t** samples, size_t* samplesCount);
diff --git a/src/GFIR/gfir_lms.c b/src/GFIR/gfir_lms.c
index d47352f..084f00f 100644
--- a/src/GFIR/gfir_lms.c
+++ b/src/GFIR/gfir_lms.c
@@ -155,4 +155,4 @@ void GenerateFilter(int n, double w1, double w2, double a1, double a2, double *c
for (i = 0; i < n; i++)
coefs[i] = hi.a[i];
- }
\ No newline at end of file
+ }
diff --git a/src/LMS_Programing/LMS_Programing_wxgui.cpp b/src/LMS_Programing/LMS_Programing_wxgui.cpp
index 74eb846..745e03b 100644
--- a/src/LMS_Programing/LMS_Programing_wxgui.cpp
+++ b/src/LMS_Programing/LMS_Programing_wxgui.cpp
@@ -71,18 +71,10 @@ LMS_Programing_wxgui::LMS_Programing_wxgui(wxWindow* parent, wxWindowID id, cons
cmbDevice = new wxChoice(this, ID_CHOICE2, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE2"));
cmbDevice->Append(_T("HPM1000/HMP7"));
cmbDevice->Append(_T("FX3"));
- cmbDevice->SetSelection(cmbDevice->Append(_T("Altera FPGA")));
+ cmbDevice->Append(_T("Altera FPGA"));
+ cmbDevice->SetSelection(cmbDevice->Append(_T("Automatic")));
FlexGridSizer7->Add(cmbDevice, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
cmbProgMode = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxSize(176, -1), 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1"));
- cmbProgMode->SetSelection(cmbProgMode->Append(_T("Flash")));
- cmbProgMode->Append(_T("1"));
- cmbProgMode->Append(_T("2"));
- cmbProgMode->Append(_T("3"));
- cmbProgMode->Append(_T("4"));
- cmbProgMode->Append(_T("5"));
- cmbProgMode->Append(_T("6"));
- cmbProgMode->Append(_T("7"));
- cmbProgMode->Append(_T("8"));
FlexGridSizer7->Add(cmbProgMode, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
FlexGridSizer3->Add(FlexGridSizer7, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer1->Add(FlexGridSizer3, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
@@ -131,7 +123,9 @@ void LMS_Programing_wxgui::OnbtnOpenClick(wxCommandEvent& event)
void LMS_Programing_wxgui::OnbtnStartProgrammingClick(wxCommandEvent& event)
{
//if needed load program data from file
- if( (cmbDevice->GetSelection() == 2 && cmbProgMode->GetSelection() == 2) == false)
+ if((
+ (cmbDevice->GetSelection() == 3) ||
+ (cmbDevice->GetSelection() == 2 && cmbProgMode->GetSelection() == 2)) == false)
{
if (lblFilename->GetLabel().length() <= 1)
{
@@ -171,34 +165,44 @@ void LMS_Programing_wxgui::OnbtnStartProgrammingClick(wxCommandEvent& event)
void LMS_Programing_wxgui::OncmbDeviceSelect(wxCommandEvent& event)
{
int deviceSelection = cmbDevice->GetSelection();
+ int progMode = cmbProgMode->GetSelection();
cmbProgMode->Clear();
- if(deviceSelection == 2)
+ if(deviceSelection == 3)
+ {
+ cmbProgMode->SetSelection(cmbProgMode->Append("Automatic update"));
+ }
+ else if(deviceSelection == 2)
{
cmbProgMode->Append("Bitstream to FPGA");
cmbProgMode->Append("Bitstream to Flash");
cmbProgMode->Append("Bitstream from Flash");
- cmbProgMode->SetSelection(0);
+ cmbProgMode->SetSelection(progMode < 3 ? progMode : 2);
}
else if(deviceSelection == 1)
{
- cmbProgMode->Append(_("Firmware to RAM"));
+ cmbProgMode->Append(_("Firmware to RAM"));
cmbProgMode->Append(_("Firmware to Flash"));
- cmbProgMode->SetSelection(0);
+ cmbProgMode->SetSelection(progMode < 2 ? progMode : 1);
}
else if(deviceSelection == 0)
{
cmbProgMode->Append(_("Flash"));
for(int i=1; i<=8; ++i)
cmbProgMode->Append(wxString::Format("%i", i));
- cmbProgMode->SetSelection(0);
+ cmbProgMode->SetSelection(progMode);
}
+
+ btnOpenEnb = (deviceSelection != 3);
+ btnOpen->Enable(btnOpenEnb);
+ StaticText1->Enable(btnOpenEnb);
+ lblFilename->Enable(btnOpenEnb);
}
void LMS_Programing_wxgui::OnProgramingFinished(wxCommandEvent& event)
{
mWorkerThread.join();
wxMessageBox(event.GetString(), _("INFO"), wxICON_INFORMATION | wxOK);
- btnOpen->Enable();
+ btnOpen->Enable(btnOpenEnb);
Disconnect(btnStartStop->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&LMS_Programing_wxgui::OnAbortProgramming);
Connect(btnStartStop->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&LMS_Programing_wxgui::OnbtnStartProgrammingClick);
btnStartStop->SetLabel(_("Program"));
@@ -248,6 +252,10 @@ void LMS_Programing_wxgui::DoProgramming()
{
status = LMS_ProgramHPM7(lmsControl, mProgramData.data(), mProgramData.size(), progMode,OnProgrammingCallback);
}
+ else if (device == 3)
+ {
+ status = LMS_ProgramUpdate(lmsControl, true/*download*/, OnProgrammingCallback);
+ }
wxCommandEvent evt;
evt.SetEventObject(this);
evt.SetId(ID_PROGRAMING_FINISHED_EVENT);
diff --git a/src/LMS_Programing/LMS_Programing_wxgui.h b/src/LMS_Programing/LMS_Programing_wxgui.h
index 114f68c..9aef067 100644
--- a/src/LMS_Programing/LMS_Programing_wxgui.h
+++ b/src/LMS_Programing/LMS_Programing_wxgui.h
@@ -36,6 +36,7 @@ protected:
wxChoice* cmbProgMode;
wxButton* btnStartStop;
wxButton* btnOpen;
+ bool btnOpenEnb;
void DoProgramming();
static bool OnProgrammingCallback(int bsent, int btotal, const char* progressMsg);
diff --git a/src/LimeUtil.cpp b/src/LimeUtil.cpp
index 4fb519e..d3589af 100644
--- a/src/LimeUtil.cpp
+++ b/src/LimeUtil.cpp
@@ -5,6 +5,7 @@
*/
#include <VersionInfo.h>
+#include <SystemResources.h>
#include <ConnectionRegistry.h>
#include <IConnection.h>
#include <iostream>
@@ -33,6 +34,7 @@ static int printHelp(void)
std::cout << std::endl;
std::cout << " Advanced options:" << std::endl;
std::cout << " --args[=\"module=foo,serial=bar\"] \t Arguments for the options below" << std::endl;
+ std::cout << " --update \t\t\t Automatic firmware sync + flash" << std::endl;
std::cout << " --fpga=\"filename\" \t\t\t Program FPGA gateware to flash" << std::endl;
std::cout << " --fw=\"filename\" \t\t\t Program FX3 firmware to flash" << std::endl;
std::cout << " --timing \t\t\t Time interfaces and operations" << std::endl;
@@ -45,13 +47,29 @@ static int printHelp(void)
**********************************************************************/
static int printInfo(void)
{
- std::cout << "Library version: v" << lime::GetLibraryVersion() << std::endl;
- std::cout << "Build timestamp: " << lime::GetBuildTimestamp() << std::endl;
- std::cout << "Interface version: v" << lime::GetAPIVersion() << std::endl;
- std::cout << "Binary interface: " << lime::GetABIVersion() << std::endl;
- std::cout << "Connections: ";
- for (const auto &name : ConnectionRegistry::moduleNames()) std::cout << name << ", ";
+ std::cout << "######################################################" << std::endl;
+ std::cout << "## LimeSuite information summary" << std::endl;
+ std::cout << "######################################################" << std::endl;
std::cout << std::endl;
+
+ std::cout << "Version information:" << std::endl;
+ std::cout << " Library version:\tv" << lime::GetLibraryVersion() << std::endl;
+ std::cout << " Build timestamp:\t" << lime::GetBuildTimestamp() << std::endl;
+ std::cout << " Interface version:\tv" << lime::GetAPIVersion() << std::endl;
+ std::cout << " Binary interface:\t" << lime::GetABIVersion() << std::endl;
+ std::cout << std::endl;
+
+ std::cout << "System resources:" << std::endl;
+ std::cout << " Installation root:\t" << lime::getLimeSuiteRoot() << std::endl;
+ std::cout << " User home directory:\t" << lime::getHomeDirectory() << std::endl;
+ std::cout << " App data directory:\t" << lime::getAppDataDirectory() << std::endl;
+ std::cout << " Config directory:\t" << lime::getConfigDirectory() << std::endl;
+ std::cout << " Image search paths:" << std::endl;
+ for (const auto &name : lime::listImageSearchPaths()) std::cout << " - " << name << std::endl;
+ std::cout << std::endl;
+
+ std::cout << "Supported connections:" << std::endl;
+ for (const auto &name : ConnectionRegistry::moduleNames()) std::cout << " * " << name << std::endl;
std::cout << std::endl;
return EXIT_SUCCESS;
}
@@ -94,6 +112,7 @@ static int makeDevice(void)
if (not conn->IsOpen())
{
std::cout << "Connection not open!" << std::endl;
+ ConnectionRegistry::freeConnection(conn);
return EXIT_FAILURE;
}
@@ -116,6 +135,42 @@ static int makeDevice(void)
}
/***********************************************************************
+ * Program update (sync images and flash support)
+ **********************************************************************/
+static int programUpdate(const std::string &argStr)
+{
+ auto handles = ConnectionRegistry::findConnections(argStr);
+ if(handles.size() == 0)
+ {
+ std::cout << "No devices found" << std::endl;
+ return EXIT_FAILURE;
+ }
+ std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
+ auto conn = ConnectionRegistry::makeConnection(handles[0]);
+
+ auto progCallback = [](int bsent, int btotal, const char* progressMsg)
+ {
+ printf("[%3i%%] %5i/%5i Bytes %s\r", int(100.0*bsent/btotal+0.5), bsent, btotal, progressMsg);
+ return 0;
+ };
+
+ auto status = conn->ProgramUpdate(true/*yes download*/, progCallback);
+
+ std::cout << std::endl;
+ if(status == 0)
+ {
+ std::cout << "Programming update complete!" << std::endl;
+ }
+ else
+ {
+ std::cout << "Programming update failed! : " << GetLastErrorMessage() << std::endl;
+ }
+
+ ConnectionRegistry::freeConnection(conn);
+ return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
+}
+
+/***********************************************************************
* Program gateware
**********************************************************************/
static int programGateware(const std::string &argStr)
@@ -142,7 +197,7 @@ static int programGateware(const std::string &argStr)
std::cout << "No devices found" << std::endl;
return EXIT_FAILURE;
}
- std::cout << "Connected to [" << handles[0].serialize() << "]" << std::endl;
+ std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
auto conn = ConnectionRegistry::makeConnection(handles[0]);
auto progCallback = [](int bsent, int btotal, const char* progressMsg)
@@ -168,7 +223,7 @@ static int programGateware(const std::string &argStr)
else
std::cout << "Programming failed! : " << GetLastErrorMessage() << std::endl;
ConnectionRegistry::freeConnection(conn);
- return EXIT_SUCCESS;
+ return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
}
/***********************************************************************
@@ -198,7 +253,7 @@ static int programFirmware(const std::string &argStr)
std::cout << "No devices found" << std::endl;
return EXIT_FAILURE;
}
- std::cout << "Connected to [" << handles[0].serialize() << "]" << std::endl;
+ std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
auto conn = ConnectionRegistry::makeConnection(handles[0]);
auto progCallback = [](int bsent, int btotal, const char* progressMsg)
@@ -224,7 +279,7 @@ static int programFirmware(const std::string &argStr)
else
std::cout << "Programming failed! : " << GetLastErrorMessage() << std::endl;
ConnectionRegistry::freeConnection(conn);
- return EXIT_SUCCESS;
+ return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
}
/***********************************************************************
@@ -238,6 +293,7 @@ int main(int argc, char *argv[])
{"find", optional_argument, 0, 'f'},
{"make", optional_argument, 0, 'm'},
{"args", optional_argument, 0, 'a'},
+ {"update", no_argument, 0, 'u'},
{"fpga", required_argument, 0, 'g'},
{"fw", required_argument, 0, 'w'},
{"timing", no_argument, 0, 't'},
@@ -259,6 +315,7 @@ int main(int argc, char *argv[])
case 'a':
if (optarg != NULL) argStr = optarg;
break;
+ case 'u': return programUpdate(argStr);
case 'g': return programGateware(argStr);
case 'w': return programFirmware(argStr);
case 't': return deviceTestTiming(argStr);
diff --git a/src/SystemResources.h b/src/SystemResources.h
new file mode 100644
index 0000000..a460f3d
--- /dev/null
+++ b/src/SystemResources.h
@@ -0,0 +1,68 @@
+/**
+ at file SystemResources.h
+ at author Lime Microsystems
+ at brief APIs for locating system resources.
+*/
+
+#ifndef LIMESUITE_SYSTEM_RESOURCES_H
+#define LIMESUITE_SYSTEM_RESOURCES_H
+
+#include <LimeSuiteConfig.h>
+#include <string>
+#include <vector>
+
+namespace lime
+{
+
+/*!
+ * Get the root installation directory for the library.
+ * Use the configured installation prefix for the library,
+ * or override with the LIME_SUITE_ROOT environment variable.
+ */
+LIME_API std::string getLimeSuiteRoot(void);
+
+/*!
+ * Get the full path to the user's home directory
+ */
+LIME_API std::string getHomeDirectory(void);
+
+/*!
+ * Get the full path to the application data directory.
+ * On a unix system this is typically $HOME/.local/share.
+ * On a windows system this is typically %USERPROFILE%\AppData\Roaming.
+ * Also supports the APPDATA environment variable to override the default value.
+ */
+LIME_API std::string getAppDataDirectory(void);
+
+/*!
+ * Get the full path to the library's configuration data directory.
+ */
+LIME_API std::string getConfigDirectory(void);
+
+/*!
+ * Get a list of directories to search for image resources.
+ * Directories are returned in the order of search priority.
+ * Priority goes to the LIME_SUITE_IMAGE_PATH environment variable,
+ * and then images in the user's application data directory,
+ * and finally images in the installation root directory.
+ */
+LIME_API std::vector<std::string> listImageSearchPaths(void);
+
+/*!
+ * Get the full file path to an image resource given only the file name.
+ * @param name a unique name for the resource file including file extension
+ * @return the full filesystem path to the resource if it exists or empty
+ */
+LIME_API std::string locateImageResource(const std::string &name);
+
+/*!
+ * Download an image resource given only the file name.
+ * The resource will be downloaded in the user's application data directory.
+ * @param name a unique name for the resource file including file extension
+ * @return 0 for success or error code upon error
+ */
+LIME_API int downloadImageResource(const std::string &name);
+
+}
+
+#endif //LIMESUITE_SYSTEM_RESOURCES_H
diff --git a/src/SystemResources.in.cpp b/src/SystemResources.in.cpp
new file mode 100644
index 0000000..edeb285
--- /dev/null
+++ b/src/SystemResources.in.cpp
@@ -0,0 +1,205 @@
+/**
+ at file SystemResources.h
+ at author Lime Microsystems
+ at brief APIs for locating system resources.
+*/
+
+#include "SystemResources.h"
+#include "ErrorReporting.h"
+
+#include <cstdlib> //getenv, system
+#include <vector>
+#include <sstream>
+#include <iostream>
+
+#ifdef _MSC_VER
+#include <windows.h>
+#include <shlobj.h>
+#include <io.h>
+
+//access mode constants
+#define F_OK 0
+#define R_OK 2
+#define W_OK 4
+#endif
+
+#ifdef __unix__
+#include <pwd.h>
+#include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h> //stat
+
+std::string lime::getLimeSuiteRoot(void)
+{
+ //first check the environment variable
+ const char *limeSuiteRoot = std::getenv("LIME_SUITE_ROOT");
+ if (limeSuiteRoot != nullptr) return limeSuiteRoot;
+
+ // Get the path to the current dynamic linked library.
+ // The path to this library can be used to determine
+ // the installation root without prior knowledge.
+ #if defined(_MSC_VER) && defined(LIME_DLL)
+ char path[MAX_PATH];
+ HMODULE hm = NULL;
+ if (GetModuleHandleExA(
+ GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
+ GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+ (LPCSTR) &lime::getLimeSuiteRoot, &hm))
+ {
+ const DWORD size = GetModuleFileNameA(hm, path, sizeof(path));
+ if (size != 0)
+ {
+ const std::string libPath(path, size);
+ const size_t slash0Pos = libPath.find_last_of("/\\");
+ const size_t slash1Pos = libPath.substr(0, slash0Pos).find_last_of("/\\");
+ if (slash0Pos != std::string::npos && slash1Pos != std::string::npos)
+ return libPath.substr(0, slash1Pos);
+ }
+ }
+ #endif //_MSC_VER && LIME_DLL
+
+ return "@LIME_SUITE_ROOT@";
+}
+
+std::string lime::getHomeDirectory(void)
+{
+ //first check the HOME environment variable
+ const char *userHome = std::getenv("HOME");
+ if (userHome != nullptr) return userHome;
+
+ //use unix user id lookup to get the home directory
+ #ifdef __unix__
+ const char *pwDir = getpwuid(getuid())->pw_dir;
+ if (pwDir != nullptr) return pwDir;
+ #endif
+
+ return "";
+}
+
+/*!
+ * The generic location for data storage with user permission level.
+ */
+static std::string getBareAppDataDirectory(void)
+{
+ //always check APPDATA (usually windows, but can be set for linux)
+ const char *appDataDir = std::getenv("APPDATA");
+ if (appDataDir != nullptr) return appDataDir;
+
+ //use windows API to query for roaming app data directory
+ #ifdef _MSC_VER
+ char csidlAppDataDir[MAX_PATH];
+ if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, csidlAppDataDir)))
+ {
+ return csidlAppDataDir;
+ }
+ #endif
+
+ //xdg freedesktop standard location environment variable
+ #ifdef __unix__
+ const char *xdgDataHome = std::getenv("XDG_DATA_HOME");
+ if (xdgDataHome != nullptr) return xdgDataHome;
+ #endif
+
+ //xdg freedesktop standard location for data in home directory
+ return lime::getHomeDirectory() + "/.local/share";
+}
+
+std::string lime::getAppDataDirectory(void)
+{
+ return getBareAppDataDirectory() + "/LimeSuite";
+}
+
+std::string lime::getConfigDirectory(void)
+{
+ //xdg standard is XDG_CONFIG_HOME or $HOME/.config
+ //but historically we have used $HOME/.limesuite
+ return lime::getHomeDirectory() + "/.limesuite";
+}
+
+std::vector<std::string> lime::listImageSearchPaths(void)
+{
+ std::vector<std::string> imageSearchPaths;
+
+ //separator for search paths in the environment variable
+ #ifdef _MSC_VER
+ static const char sep = ';';
+ #else
+ static const char sep = ':';
+ #endif
+
+ //check the environment's search path
+ const char *imagePathEnv = std::getenv("LIME_IMAGE_PATH");
+ if (imagePathEnv != nullptr)
+ {
+ std::stringstream imagePaths(imagePathEnv);
+ std::string imagePath;
+ while (std::getline(imagePaths, imagePath, sep))
+ {
+ if (imagePath.empty()) continue;
+ imageSearchPaths.push_back(imagePath);
+ }
+ }
+
+ //search directories in the user's home directory
+ imageSearchPaths.push_back(lime::getAppDataDirectory() + "/images");
+
+ //search global installation directories
+ imageSearchPaths.push_back(lime::getLimeSuiteRoot() + "/share/LimeSuite/images");
+
+ return imageSearchPaths;
+}
+
+std::string lime::locateImageResource(const std::string &name)
+{
+ for (const auto &searchPath : lime::listImageSearchPaths())
+ {
+ const std::string fullPath(searchPath + "/@VERSION_MAJOR at .@VERSION_MINOR@/" + name);
+ if (access(fullPath.c_str(), R_OK) == 0) return fullPath;
+ }
+ return "";
+}
+
+int lime::downloadImageResource(const std::string &name)
+{
+ const std::string destDir(lime::getAppDataDirectory() + "/images/@VERSION_MAJOR at .@VERSION_MINOR@");
+ const std::string destFile(destDir + "/" + name);
+ const std::string sourceUrl("http://downloads.myriadrf.org/project/limesuite/@VERSION_MAJOR@.@VERSION_MINOR@/" + name);
+
+ //check if the directory already exists
+ struct stat s;
+ if (stat(destDir.c_str(), &s) == 0)
+ {
+ if ((s.st_mode & S_IFDIR) == 0)
+ {
+ return lime::ReportError("Not a directory: %s", destDir.c_str());
+ }
+ }
+
+ //create images directory
+ else
+ {
+ #ifdef __unix__
+ const std::string mkdirCmd("mkdir -p \""+destDir+"\"");
+ #else
+ const std::string mkdirCmd("md.exe \""+destDir+"\"");
+ #endif
+ int result = std::system(mkdirCmd.c_str());
+ if (result != 0) return lime::ReportError(result, "Failed: %s", mkdirCmd.c_str());
+ }
+
+ //check for write access
+ if (access(destDir.c_str(), W_OK) != 0) lime::ReportError("Cannot write: %s", destDir.c_str());
+
+ //download the file
+ #ifdef __unix__
+ const std::string dnloadCmd("wget --output-document=\""+destFile+"\" \""+sourceUrl+"\"");
+ #else
+ const std::string dnloadCmd("powershell.exe -Command \"(new-object System.Net.WebClient).DownloadFile('"+sourceUrl+"', '"+destFile+"')\"");
+ #endif
+ int result = std::system(dnloadCmd.c_str());
+ if (result != 0) return lime::ReportError(result, "Failed: %s", dnloadCmd.c_str());
+
+ return 0;
+}
diff --git a/src/VersionInfo.h b/src/VersionInfo.h
index b65effc..d778d3e 100644
--- a/src/VersionInfo.h
+++ b/src/VersionInfo.h
@@ -24,7 +24,7 @@
* #endif
* \endcode
*/
-#define LIME_SUITE_API_VERSION 0x20161200
+#define LIME_SUITE_API_VERSION 0x20170200
namespace lime
{
diff --git a/src/boards_wxgui/pnlLimeSDR.cpp b/src/boards_wxgui/pnlLimeSDR.cpp
index c1c3fbb..42e5a1a 100644
--- a/src/boards_wxgui/pnlLimeSDR.cpp
+++ b/src/boards_wxgui/pnlLimeSDR.cpp
@@ -35,7 +35,7 @@ pnlLimeSDR::pnlLimeSDR(wxWindow* parent,wxWindowID id, const wxPoint& pos,const
chkRFLB_A_EN->SetToolTip(_("[RFLB_A_EN] External RF loopback TxBAND2->RxLNAH channel A"));
Connect(chkRFLB_A_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
controlsSizer->Add(chkRFLB_A_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
- chkRFLB_B_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.A"));
+ chkRFLB_B_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.B"));
chkRFLB_B_EN->SetToolTip(_("[RFLB_B_EN] External RF loopback TxBAND2->RxLNAH channel B"));
Connect(chkRFLB_B_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
controlsSizer->Add(chkRFLB_B_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
@@ -80,8 +80,6 @@ void pnlLimeSDR::Initialize(lms_device_t* pControl)
auto info = LMS_GetDeviceInfo(lmsControl);
if(info != nullptr)
{
- int hw = std::stoi(info->hardwareVersion);
-
lblWarning->SetLabel(_(""));
lblWarning->Hide();
auto controls = controlsSizer->GetChildren();
@@ -89,7 +87,7 @@ void pnlLimeSDR::Initialize(lms_device_t* pControl)
i->GetWindow()->Enable();
}
}
-
+
mainSizer->Fit(this);
mainSizer->SetSizeHints(this);
Layout();
diff --git a/src/boards_wxgui/pnlUltimateEVB.cpp b/src/boards_wxgui/pnlUltimateEVB.cpp
new file mode 100644
index 0000000..659f484
--- /dev/null
+++ b/src/boards_wxgui/pnlUltimateEVB.cpp
@@ -0,0 +1,154 @@
+#include "pnlUltimateEVB.h"
+
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/button.h>
+#include <wx/string.h>
+#include <wx/checkbox.h>
+#include <wx/msgdlg.h>
+#include "lms7suiteEvents.h"
+
+#include <ciso646>
+#include <vector>
+
+
+using namespace std;
+
+BEGIN_EVENT_TABLE(pnlUltimateEVB, wxPanel)
+END_EVENT_TABLE()
+
+pnlUltimateEVB::pnlUltimateEVB(wxWindow* parent,wxWindowID id, const wxPoint& pos,const wxSize& size, int style, wxString name)
+{
+ lmsControl = nullptr;
+
+ Create(parent, id, pos, size, style, name);
+#ifdef WIN32
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+#endif
+ wxFlexGridSizer* mainSizer = new wxFlexGridSizer(0, 2, 5, 5);
+
+ SetSizer(mainSizer);
+
+ auto powerBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Voltage/Current/Power") ), wxVERTICAL );
+ auto sizerPowerRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+ sizerPowerRd->SetFlexibleDirection( wxBOTH );
+ sizerPowerRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Name")), 1, wxALL, 5);
+ sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Voltage")), 1, wxALL, 5);
+ sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Current")), 1, wxALL, 5);
+ sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Power")), 1, wxALL, 5);
+
+ const std::vector<std::string> names = {"VCC1P25_LMS_DIG", "VCC1P25_LMS", "VCC1P4_LMS", "VCC1P8_LMS", "VDIO_LMS", "USER"};
+
+ for (unsigned i = 0; i<names.size(); i++)
+ {
+ const int offset = 35+i;
+ pwrParams.push_back(ADCparam(offset,names[i]));
+ pwrParams.push_back(ADCparam(offset+names.size(),names[i]));
+ pwrParams.push_back(ADCparam(offset+2*names.size(),names[i]));
+ }
+
+ for (unsigned i = 0; i<pwrParams.size(); i++)
+ {
+ if (i%3 == 0)
+ {
+ pwrParams[i].title = new wxStaticText(this, wxID_ANY, pwrParams[i].name);
+ sizerPowerRd->Add(pwrParams[i].title, 1, wxALL, 5);
+ }
+ pwrParams[i].value = new wxStaticText(this, wxID_ANY, _("- - - - -"));
+ sizerPowerRd->Add(pwrParams[i].value, 1, wxALL, 5);
+ }
+ powerBox->Add( sizerPowerRd, 1, wxEXPAND, 5 );
+ auto sizertotalPwr = new wxFlexGridSizer( 1, 2, 10, 10 );
+ totalPwr = new wxStaticText(this, wxID_ANY, _("- - - W"));
+ sizertotalPwr->Add(new wxStaticText(this, wxID_ANY, _("Total LMS power:")), 1, wxALL, 5);
+ sizertotalPwr->Add( totalPwr, 1, wxALL, 5 );
+ powerBox->Add( sizertotalPwr, 1, wxEXPAND, 5 );
+
+ auto voltageBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Voltages") ), wxVERTICAL );
+ auto sizerVoltageRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+ sizerVoltageRd->SetFlexibleDirection( wxBOTH );
+ sizerVoltageRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
+ sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _(" Voltage")), 1, wxALL, 5);
+ sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
+ sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Voltage")), 1, wxALL, 5);
+
+ const std::vector<std::string> voltages = {
+ "AMUX_VDD_AFE", "AMUX_VDD12_RXBUF", "AMUX_VDD12_VCO_SXR", "AMUX_DVDD_SXR",
+ "AMUX_VDD_DIV_SXR", "AMUX_VDD_CP_SXR", "AMUX_VDD18_SXR", "AMUX_VDD_MXLOBUF_RFE",
+ "AMUX_VDD12_TIA_RFE", "AMUX_VDD14_LNA_RFE", "AMUX_VDD14_TIA_RFE", "AMUX_DIGPRVDD1_1",
+ "AMUX_VDD12_LNA_RFE", "AMUX_VDD14_RBB", "AMUX_DVDD_SXT", "AMUX_VDD_TBB",
+ "AMUX_VDD_TPAD_TRF", "AMUX_VDD12_DIG", "AMUX_VDD_CP_SXT", "AMUX_VDD12_VCO_SXT",
+ "AMUX_DIGPRVDD1_2", "AMUX_DVDD_CGEN", "AMUX_VDD_DIV_CGEN", "AMUX_VDD_SPI_BUF",
+ "AMUX_VDD12_TXBUF", "AMUX_VDD_DIV_SXT", "AMUX_VDD_TLOBUF_TRF", "AMUX_VDD14_VCO_CGEN",
+ "AMUX_VDD_CP_CGEN", "AMUX_LMS_TSTAO", "AMUX_LMS_TSTDO1", "AMUX_LMS_TSTDO0"
+ };
+
+ for (unsigned i = 0; i<voltages.size(); i++)
+ vltgParams.push_back(ADCparam(2+i,voltages[i]));
+
+
+ for (unsigned i = 0; i<vltgParams.size(); i++)
+ {
+ vltgParams[i].title = new wxStaticText(this, wxID_ANY, vltgParams[i].name);
+ sizerVoltageRd->Add(vltgParams[i].title, 1, wxALL, 5);
+ vltgParams[i].value = new wxStaticText(this, wxID_ANY, _("- - - mV"));
+ sizerVoltageRd->Add(vltgParams[i].value, 1, wxALL, 5);
+ }
+ voltageBox->Add( sizerVoltageRd, 1, wxEXPAND, 5 );
+
+ mainSizer->Add( voltageBox, 1, wxEXPAND, 5 );
+ mainSizer->Add( powerBox, 1, wxEXPAND, 5 );
+ mainSizer->Fit(this);
+ //mainSizer->SetSizeHints(this);
+ Layout();
+ Fit();
+ Bind(READ_ALL_VALUES, &pnlUltimateEVB::OnReadAll, this, this->GetId());
+}
+
+void pnlUltimateEVB::Initialize(lms_device_t* pControl)
+{
+ lmsControl = pControl;
+}
+
+pnlUltimateEVB::~pnlUltimateEVB()
+{
+}
+
+void pnlUltimateEVB::OnReadAll(wxCommandEvent &event)
+{
+ double sumPwr = 0;
+ float_type value;
+ lms_name_t units;
+ for (size_t i = 0; i < pwrParams.size(); ++i)
+ {
+ int status = LMS_ReadCustomBoardParam(lmsControl,pwrParams[i].channel,&value,units);
+ if (status != 0)
+ {
+ wxMessageBox(LMS_GetLastErrorMessage(), _("Warning"));
+ return;
+ }
+ if (pwrParams[i].channel >= 47 && pwrParams[i].channel < 52)
+ sumPwr += value;
+ pwrParams[i].value->SetLabel(wxString::Format(_("%1.0f %s"), value, units));
+ }
+ totalPwr->SetLabel(wxString::Format(_("%1.0f mW"), sumPwr));
+
+ for (size_t i = 0; i < vltgParams.size(); ++i)
+ {
+ int status = LMS_ReadCustomBoardParam(lmsControl,vltgParams[i].channel,&value,units);
+ if (status != 0)
+ {
+ wxMessageBox(LMS_GetLastErrorMessage(), _("Warning"));
+ return;
+ }
+ vltgParams[i].value->SetLabel(wxString::Format(_("%1.0f %s"), value, units));
+ }
+ this->GetParent()->Layout();
+ this->GetParent()->Fit();
+}
+
+void pnlUltimateEVB::OnWriteAll(wxCommandEvent &event)
+{
+}
diff --git a/src/boards_wxgui/pnlUltimateEVB.h b/src/boards_wxgui/pnlUltimateEVB.h
new file mode 100644
index 0000000..387ce7c
--- /dev/null
+++ b/src/boards_wxgui/pnlUltimateEVB.h
@@ -0,0 +1,50 @@
+#ifndef PNL_ULTIMATEEVB_H
+#define PNL_ULTIMATEEVB_H
+
+#include "lime/LimeSuite.h"
+#include <map>
+#include <vector>
+#include <wx/panel.h>
+#include <wx/stattext.h>
+
+class wxStaticText;
+class wxFlexGridSizer;
+class wxCheckBox;
+
+class pnlUltimateEVB : public wxPanel
+{
+ class ADCparam
+ {
+ public:
+ ADCparam(int ch, std::string nm = ""): title(nullptr), value(nullptr)
+ {
+ channel = ch;
+ name = nm;
+ };
+ ~ADCparam()
+ {
+ if (title) title->Destroy();
+ if (value) value->Destroy();
+ }
+ int channel;
+ std::string name;
+ wxStaticText* title;
+ wxStaticText* value;
+ };
+public:
+ pnlUltimateEVB(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int style = 0, wxString name = wxEmptyString);
+ void Initialize(lms_device_t *pControl);
+ virtual ~pnlUltimateEVB();
+
+ void OnReadAll(wxCommandEvent &event);
+ void OnWriteAll(wxCommandEvent &event);
+
+protected:
+ std::vector<ADCparam> pwrParams;
+ std::vector<ADCparam> vltgParams;
+ wxStaticText* totalPwr;
+ lms_device_t *lmsControl;
+ DECLARE_EVENT_TABLE()
+};
+
+#endif
diff --git a/src/examples/basicRX.cpp b/src/examples/basicRX.cpp
index b5f4c4f..6c67192 100644
--- a/src/examples/basicRX.cpp
+++ b/src/examples/basicRX.cpp
@@ -75,10 +75,10 @@ int main(int argc, char** argv)
//Initialize stream
lms_stream_t streamId; //stream structure
streamId.channel = 0; //channel number
- streamId.fifoSize = 1024 * 128; //fifo size in samples
+ streamId.fifoSize = 1024 * 1024; //fifo size in samples
streamId.throughputVsLatency = 1.0; //optimize for max throughput
streamId.isTx = false; //RX channel
- streamId.dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+ streamId.dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
if (LMS_SetupStream(device, &streamId) != 0)
error();
diff --git a/src/examples/dualRXTX.cpp b/src/examples/dualRXTX.cpp
index 2647d0f..76e542c 100644
--- a/src/examples/dualRXTX.cpp
+++ b/src/examples/dualRXTX.cpp
@@ -54,7 +54,7 @@ int main(int argc, char** argv)
if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0)
error();
cout << "Number of RX channels: " << n << endl;
- if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0)
+ if ((n = LMS_GetNumChannels(device, LMS_CH_TX)) < 0)
error();
cout << "Number of TX channels: " << n << endl;
@@ -116,17 +116,17 @@ int main(int argc, char** argv)
for (int i = 0; i < chCount; ++i)
{
rx_streams[i].channel = i; //channel number
- rx_streams[i].fifoSize = 1024 * 128; //fifo size in samples
+ rx_streams[i].fifoSize = 1024 * 1024; //fifo size in samples
rx_streams[i].throughputVsLatency = 0.0; //optimize for minimum latency
rx_streams[i].isTx = false; //RX channel
- rx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+ rx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
if (LMS_SetupStream(device, &rx_streams[i]) != 0)
error();
tx_streams[i].channel = i; //channel number
- tx_streams[i].fifoSize = 1024 * 128; //fifo size in samples
+ tx_streams[i].fifoSize = 1024 * 1024; //fifo size in samples
tx_streams[i].throughputVsLatency = 0.0; //optimize for minimum latency
tx_streams[i].isTx = true; //TX channel
- tx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+ tx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
if (LMS_SetupStream(device, &tx_streams[i]) != 0)
error();
}
@@ -169,8 +169,8 @@ int main(int argc, char** argv)
int samplesRead;
//Receive samples
samplesRead = LMS_RecvStream(&rx_streams[i], buffers[i], bufersize, &rx_metadata, 1000);
- //Send samples with 1024*1024 sample delay from RX (waitForTimestamp is enabled)
- tx_metadata.timestamp = rx_metadata.timestamp + 1024 * 512;
+ //Send samples with 1024*256 sample delay from RX (waitForTimestamp is enabled)
+ tx_metadata.timestamp = rx_metadata.timestamp + 1024 * 256;
LMS_SendStream(&tx_streams[i], buffers[i], samplesRead, &tx_metadata, 1000);
}
diff --git a/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp b/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
index 1885c6b..6731264 100644
--- a/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
+++ b/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
@@ -25,7 +25,7 @@ mStreamRunning(false),
lmsControl(nullptr)
{
captureSamples.store(false);
- averageCount.store(10);
+ averageCount.store(50);
spinAvgCount->SetValue(averageCount);
updateGUI.store(true);
#ifndef __unix__
@@ -209,7 +209,38 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
if (mStreamRunning.load() == false)
return;
- if (streamData.fftBins_dbFS[0].size() > 0)
+ const int fftSize = streamData.fftBins[0].size();
+
+ float chPwr[2] = { 0, 0 };
+ double cFreq[2] = { 0, 0 };
+ txtCenterOffset1->GetValue().ToDouble(&cFreq[0]);
+ txtCenterOffset2->GetValue().ToDouble(&cFreq[1]);
+ double bw[2] = {1, 1};
+ txtBW1->GetValue().ToDouble(&bw[0]);
+ txtBW2->GetValue().ToDouble(&bw[1]);
+
+ for (int c = 0; c<2; ++c)
+ {
+ float f0 = (cFreq[c] - bw[c]/2) * 1e6;
+ float fn = (cFreq[c] + bw[c]/2) * 1e6;
+ float sum = 0;
+ int bins = 0;
+ for (int i = 0; i<fftSize; ++i)
+ if (f0 <= fftFreqAxis[i] && fftFreqAxis[i] <= fn)
+ {
+ sum += streamData.fftBins[0][i];
+ ++bins;
+ }
+ chPwr[c] = sum;
+ }
+
+ float pwr1 = (chPwr[0] != 0 ? (10 * log10(chPwr[0])) - 69.2369 : -300);
+ lblPower1->SetLabel(wxString::Format("%.3f", pwr1));
+ float pwr2 = (chPwr[1] != 0 ? (10 * log10(chPwr[1])) - 69.2369 : -300);
+ lblPower2->SetLabel(wxString::Format("%.3f", pwr2));
+ lbldBc->SetLabel(wxString::Format("%.3f", pwr2-pwr1));
+
+ if (fftSize > 0)
{
if (chkFreezeTimeDomain->IsChecked() == false)
{
@@ -225,8 +256,15 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
}
if (chkFreezeFFT->IsChecked() == false)
{
- mFFTpanel->series[0]->AssignValues(&fftFreqAxis[0], &streamData.fftBins_dbFS[0][0], streamData.fftBins_dbFS[0].size());
- mFFTpanel->series[1]->AssignValues(&fftFreqAxis[0], &streamData.fftBins_dbFS[1][0], streamData.fftBins_dbFS[1].size());
+ for (int ch = 0; ch<2; ++ch)
+ {
+ for (int s = 0; s < fftSize; ++s)
+ {
+ streamData.fftBins[ch][s] = (streamData.fftBins[ch][s] != 0 ? (10 * log10(streamData.fftBins[ch][s])) - 69.2369 : -300);
+ }
+ }
+ mFFTpanel->series[0]->AssignValues(&fftFreqAxis[0], &streamData.fftBins[0][0], fftSize);
+ mFFTpanel->series[1]->AssignValues(&fftFreqAxis[0], &streamData.fftBins[1][0], fftSize);
}
}
@@ -246,44 +284,9 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
{
mFFTpanel->Refresh();
mFFTpanel->Draw();
+ enableFFT.store(true);
}
-
- float chPwr[2] = {0, 0};
- double cFreq[2] = {0, 0};
- txtCenterOffset1->GetValue().ToDouble(&cFreq[0]);
- cFreq[0] *= 1000000;
- txtCenterOffset2->GetValue().ToDouble(&cFreq[1]);
- cFreq[1] *= 1000000;
- double bw[2] = {1e6, 1e6};
- txtBW1->GetValue().ToDouble(&bw[0]);
- bw[0] *= 1000000;
- txtBW2->GetValue().ToDouble(&bw[1]);
- bw[1] *= 1000000;
- /*
- // TODO
- for(int c=0; c<2; ++c)
- {
- float f0 = cFreq[c]-bw[c]/2;
- float fn = cFreq[c]+bw[c]/2;
- float sum = 0;
- int bins = 0;
- const int fftSize = streamData.fftBins_dbFS[0].size();
- for(int i=0; i<fftSize; ++i)
- if(f0 <= fftFreqAxis[i] && fftFreqAxis[i] <= fn)
- {
- double val = streamData.fftBins_dbFS[0][i];
- sum += val;
- ++bins;
- }
- chPwr[c] = sum;
- }
- */
-
- float pwr1 = (chPwr[0] != 0 ? (20 * log10(chPwr[0])) - 69.2369 : -300);
- lblPower1->SetLabel(wxString::Format("%.3f", pwr1));
- float pwr2 = (chPwr[1] != 0 ? (20 * log10(chPwr[1])) - 69.2369 : -300);
- lblPower2->SetLabel(wxString::Format("%.3f", pwr2));
- lbldBc->SetLabel(wxString::Format("%.3f", 20*log10(chPwr[1]/chPwr[0])));
+ else enableFFT.store(false);
updateGUI.store(true);
}
@@ -292,13 +295,13 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
{
bool runTx = true;
const int cMaxChCount = 2;
- const int test_count = fftSize;// / 680*26;//4096*16;
+ const int fifoSize = fftSize*512;
int avgCount = pthis->spinAvgCount->GetValue();
int wndFunction = pthis->windowFunctionID.load();
+ bool fftEnabled = true;
vector<float> wndCoef;
- float amplitudeCorrection = 1;
- GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, amplitudeCorrection);
+ GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, 1);
lime::complex16_t** buffers;
@@ -308,11 +311,11 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
localDataResults.samplesI[1].resize(fftSize, 0);
localDataResults.samplesQ[0].resize(fftSize, 0);
localDataResults.samplesQ[1].resize(fftSize, 0);
- localDataResults.fftBins_dbFS[0].resize(fftSize, 0);
- localDataResults.fftBins_dbFS[1].resize(fftSize, 0);
+ localDataResults.fftBins[0].resize(fftSize, 0);
+ localDataResults.fftBins[1].resize(fftSize, 0);
buffers = new lime::complex16_t*[channelsCount];
for (int i = 0; i < channelsCount; ++i)
- buffers[i] = new complex16_t[test_count];
+ buffers[i] = new complex16_t[fftSize];
vector<complex16_t> captureBuffer[cMaxChCount];
uint32_t samplesToCapture[cMaxChCount];
@@ -327,7 +330,7 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
for(int i=0; i<channelsCount; ++i)
{
pthis->rxStreams[i].channel = i;
- pthis->rxStreams[i].fifoSize = test_count*40;
+ pthis->rxStreams[i].fifoSize = fifoSize;
pthis->rxStreams[i].isTx = false;
pthis->rxStreams[i].dataFmt = fmt;
pthis->rxStreams[i].throughputVsLatency = 1;
@@ -335,7 +338,7 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
pthis->txStreams[i].handle = 0;
pthis->txStreams[i].channel = i;
- pthis->txStreams[i].fifoSize = test_count*40;
+ pthis->txStreams[i].fifoSize = fifoSize;
pthis->txStreams[i].isTx = true;
pthis->txStreams[i].dataFmt = fmt;
pthis->txStreams[i].throughputVsLatency = 1;
@@ -355,30 +358,27 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
}
pthis->mStreamRunning.store(true);
- auto t1 = chrono::high_resolution_clock::now();
- auto t2 = chrono::high_resolution_clock::now();
lms_stream_meta_t meta;
meta.waitForTimestamp = true;
int fftCounter = 0;
while (pthis->stopProcessing.load() == false)
{
- for(int a = fftCounter; a<avgCount && pthis->stopProcessing.load() == false; ++a)
+ do
{
- uint32_t samplesPopped[2] = {0, 0};
- uint64_t ts[2];
+ uint32_t samplesPopped[cMaxChCount];
+ uint64_t ts[cMaxChCount];
for(int i=0; i<channelsCount; ++i)
{
- samplesPopped[i] += LMS_RecvStream(&pthis->rxStreams[i], &buffers[i][samplesPopped[i]], test_count, &meta, 1000);
- ts[i] = meta.timestamp + 1024 * 1024*2;
+ samplesPopped[i] = LMS_RecvStream(&pthis->rxStreams[i], &buffers[i][0], fftSize, &meta, 1000);
+ ts[i] = meta.timestamp + fifoSize/4;
}
- uint32_t samplesPushed[2] = {0, 0};
for(int i=0; runTx && i<channelsCount; ++i)
{
meta.timestamp = ts[i];
meta.waitForTimestamp = true;
- samplesPushed[i] += LMS_SendStream(&pthis->txStreams[i], &buffers[i][samplesPushed[i]], samplesPopped[i], &meta, 1000);
+ LMS_SendStream(&pthis->txStreams[i], &buffers[i][0], samplesPopped[i], &meta, 1000);
}
if(pthis->captureSamples.load())
@@ -397,45 +397,55 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
{
//take only first buffer for time domain display
//reset fftBins for accumulation
- for (unsigned i = 0; a==0 && i < fftSize; ++i)
+ for (unsigned i = 0; fftCounter==0 && i < fftSize; ++i)
{
- localDataResults.fftBins_dbFS[ch][i] = 0;
+ if (fftEnabled)
+ localDataResults.fftBins[ch][i] = 0;
localDataResults.samplesI[ch][i] = buffers[ch][i].i;
localDataResults.samplesQ[ch][i] = buffers[ch][i].q;
}
- for (unsigned i = 0; i < fftSize; ++i)
- {
- m_fftCalcIn[i].r = buffers[ch][i].i * amplitudeCorrection * wndCoef[i];
- m_fftCalcIn[i].i = buffers[ch][i].q * amplitudeCorrection * wndCoef[i];
- }
-
- kiss_fft(m_fftCalcPlan, m_fftCalcIn, m_fftCalcOut);
- ++fftCounter;
- for(unsigned int i=0; i<fftSize; ++i)
+ if (fftEnabled)
{
- m_fftCalcOut[i].r /= fftSize;
- m_fftCalcOut[i].i /= fftSize;
+ if (wndFunction == 0)
+ {
+ for (unsigned i = 0; i < fftSize; ++i)
+ {
+ m_fftCalcIn[i].r = buffers[ch][i].i;
+ m_fftCalcIn[i].i = buffers[ch][i].q;
+ }
+ }
+ else
+ {
+ for (unsigned i = 0; i < fftSize; ++i)
+ {
+ m_fftCalcIn[i].r = buffers[ch][i].i * wndCoef[i];
+ m_fftCalcIn[i].i = buffers[ch][i].q * wndCoef[i];
+ }
+ }
+
+ kiss_fft(m_fftCalcPlan, m_fftCalcIn, m_fftCalcOut);
+
+ int output_index = 0;
+ for (unsigned i = fftSize / 2 + 1; i < fftSize; ++i)
+ localDataResults.fftBins[ch][output_index++] += m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i;
+ for (unsigned i = 0; i < fftSize / 2 + 1; ++i)
+ localDataResults.fftBins[ch][output_index++] += m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i;
}
- int output_index = 0;
- for (unsigned i = fftSize / 2 + 1; i < fftSize; ++i)
- localDataResults.fftBins_dbFS[ch][output_index++] += sqrt(m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i);
- for (unsigned i = 0; i < fftSize / 2 + 1; ++i)
- localDataResults.fftBins_dbFS[ch][output_index++] += sqrt(m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i);
}
- }
+ } while (++fftCounter < avgCount && pthis->stopProcessing.load() == false);
- t2 = chrono::high_resolution_clock::now();
- auto timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
- if (timePeriod >= 33 && fftCounter >= avgCount && pthis->updateGUI.load() == true)
+ if (fftCounter >= avgCount && pthis->updateGUI.load() == true)
{
- t1 = t2;
- //shift fft, convert to dBfs
- for(int ch=0; ch<channelsCount; ++ch)
+ //shift fft
+ if (fftEnabled)
{
- for (unsigned s = 0; s < fftSize; ++s)
+ for(int ch=0; ch<channelsCount; ++ch)
{
- localDataResults.fftBins_dbFS[ch][s] /= fftCounter;
- localDataResults.fftBins_dbFS[ch][s] = (localDataResults.fftBins_dbFS[ch][s] != 0 ? (20 * log10(localDataResults.fftBins_dbFS[ch][s])) - 69.2369 : -300);
+ for (unsigned s = 0; s < fftSize; ++s)
+ {
+ const float div = (float)fftCounter*fftSize*fftSize;
+ localDataResults.fftBins[ch][s] /= div;
+ }
}
}
if(pthis->stopProcessing.load() == false)
@@ -447,13 +457,14 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
pthis->QueueEvent(evt);
}
fftCounter = 0;
- }
- avgCount = pthis->averageCount.load();
- int wndFunctionSelection = pthis->windowFunctionID.load();
- if(wndFunctionSelection != wndFunction)
- {
- wndFunction = wndFunctionSelection;
- GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, amplitudeCorrection);
+ fftEnabled = pthis->enableFFT.load();
+ avgCount = pthis->averageCount.load();
+ int wndFunctionSelection = pthis->windowFunctionID.load();
+ if(wndFunctionSelection != wndFunction)
+ {
+ wndFunction = wndFunctionSelection;
+ GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, 1);
+ }
}
}
@@ -534,6 +545,10 @@ void fftviewer_frFFTviewer::OnChannelVisibilityChange(wxCommandEvent& event)
visibilities[0] = true;
visibilities[1] = true;
break;
+ default:
+ visibilities[0] = false;
+ visibilities[1] = false;
+ break;
}
mTimeDomainPanel->series[0]->visible = visibilities[0];
mTimeDomainPanel->series[1]->visible = visibilities[0];
diff --git a/src/fftviewer_wxgui/fftviewer_frFFTviewer.h b/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
index 150cc09..4d86544 100644
--- a/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
+++ b/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
@@ -23,6 +23,7 @@ protected:
std::atomic<bool> captureSamples;
std::atomic<int> averageCount;
std::atomic<bool> updateGUI;
+ std::atomic<bool> enableFFT;
std::string captureFilename;
// Handlers for frFFTviewer events.
void OnWindowFunctionChanged( wxCommandEvent& event );
@@ -52,7 +53,7 @@ protected:
{
std::vector<float> samplesI[2];
std::vector<float> samplesQ[2];
- std::vector<float> fftBins_dbFS[2];
+ std::vector<float> fftBins[2];
float nyquist_Hz;
float rxDataRate_Bps;
float txDataRate_Bps;
@@ -67,9 +68,9 @@ protected:
this->samplesQ[ch].clear();
this->samplesQ[ch].reserve(src.samplesQ[ch].size());
this->samplesQ[ch] = src.samplesQ[ch];
- this->fftBins_dbFS[ch].clear();
- this->fftBins_dbFS[ch].reserve(src.fftBins_dbFS[ch].size());
- this->fftBins_dbFS[ch] = src.fftBins_dbFS[ch];
+ this->fftBins[ch].clear();
+ this->fftBins[ch].reserve(src.fftBins[ch].size());
+ this->fftBins[ch] = src.fftBins[ch];
this->nyquist_Hz = src.nyquist_Hz;
this->rxDataRate_Bps = src.rxDataRate_Bps;
this->txDataRate_Bps = src.txDataRate_Bps;
diff --git a/src/fftviewer_wxgui/fftviewer_wxgui.cpp b/src/fftviewer_wxgui/fftviewer_wxgui.cpp
index dfaab0c..8bd967b 100644
--- a/src/fftviewer_wxgui/fftviewer_wxgui.cpp
+++ b/src/fftviewer_wxgui/fftviewer_wxgui.cpp
@@ -232,13 +232,13 @@ frFFTviewer::frFFTviewer( wxWindow* parent, wxWindowID id, const wxString& title
cmbChannelVisibility->SetSelection( 0 );
fgSizer101->Add( cmbChannelVisibility, 0, 0, 5 );
- m_staticText23 = new wxStaticText( sbSizer3->GetStaticBox(), wxID_ANY, wxT("Average:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText23 = new wxStaticText( sbSizer3->GetStaticBox(), wxID_ANY, wxT("FFT averaging:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText23->Wrap( -1 );
m_staticText23->SetToolTip( wxT("Number of FFTs to average") );
fgSizer101->Add( m_staticText23, 0, wxALL, 5 );
- spinAvgCount = new wxSpinCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 128, 1 );
+ spinAvgCount = new wxSpinCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 512, 1 );
spinAvgCount->SetToolTip( wxT("Number of FFTs to average") );
spinAvgCount->SetMinSize( wxSize( 64,-1 ) );
diff --git a/src/fftviewer_wxgui/fftviewer_wxgui.fbp b/src/fftviewer_wxgui/fftviewer_wxgui.fbp
index 9d24271..9e1da34 100644
--- a/src/fftviewer_wxgui/fftviewer_wxgui.fbp
+++ b/src/fftviewer_wxgui/fftviewer_wxgui.fbp
@@ -2660,7 +2660,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
- <property name="label">Average:</property>
+ <property name="label">FFT averaging:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
@@ -2744,7 +2744,7 @@
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">1</property>
- <property name="max">128</property>
+ <property name="max">512</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
diff --git a/src/lime/LimeSuite.h b/src/lime/LimeSuite.h
index 1c02196..ac7c551 100644
--- a/src/lime/LimeSuite.h
+++ b/src/lime/LimeSuite.h
@@ -322,6 +322,23 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
size_t chan,float_type gain);
/**
+ * Set the combined gain value
+ *
+ * This function computes and sets the optimal gain values of various amplifiers
+ * that are present in the device based on desired gain value in dB.
+ *
+ * @note currently works only with RX
+ *
+ * @param device Device handle previously obtained by LMS_Open().
+ * @param dir_tx Select RX or TX
+ * @param chan Channel index
+ * @param gain Desired gain, range [0, 70] for RX
+ * @return 0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_SetGaindB(lms_device_t *device, bool dir_tx,
+ size_t chan,unsigned gain);
+
+/**
* Obtain the current combined gain value
*
* @param device Device handle previously obtained by LMS_Open().
@@ -334,6 +351,20 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx,
size_t chan,float_type *gain);
+/**
+ * Obtain the current combined gain value in dB
+ *
+ * @note currently works only with RX
+ *
+ * @param device Device handle previously obtained by LMS_Open().
+ * @param dir_tx Select RX or TX
+ * @param chan Channel index
+ * @param[out] gain Current gain, range [0, 700]
+ * @return 0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_GetGaindB(lms_device_t *device, bool dir_tx,
+ size_t chan, unsigned *gain);
+
typedef enum
{
LPF_BW_5_MHz,
@@ -1318,7 +1349,7 @@ API_EXPORT int CALL_CONV LMS_StopStream(lms_stream_t *conf);
* @param samples sample buffer.
* @param sample_count Number of samples to read
* @param meta Metadata. See the ::lms_stream_meta_t description.
- * @param timeout_ms how long to wait for data before timing out(0=infinite).
+ * @param timeout_ms how long to wait for data before timing out.
*
* @return number of samples received on success, (-1) on failure
*/
@@ -1342,7 +1373,7 @@ API_EXPORT int CALL_CONV LMS_GetStreamStatus(lms_stream_t *stream, lms_stream_st
* @param samples sample buffer.
* @param sample_count Number of samples to write
* @param meta Metadata. See the ::lms_stream_meta_t description.
- * @param timeout_ms how long to wait for data before timing out(0=infinite).
+ * @param timeout_ms how long to wait for data before timing out.
*
* @return number of samples send on success, (-1) on failure
*/
@@ -1521,6 +1552,15 @@ API_EXPORT int CALL_CONV LMS_ProgramHPM7File(lms_device_t *device,
const char *file, unsigned mode, lms_prog_callback_t callback);
/**
+ *
+ * @param device Device handle previously obtained by LMS_Open().
+ * @param download True to download missing images from the web.
+ * @return 0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_ProgramUpdate(lms_device_t *device,
+ const bool download, lms_prog_callback_t callback);
+
+/**
* Program LMS7 internal MCU.
*
* @param device Device handle previously obtained by LMS_Open().
diff --git a/src/lms7002_wxgui/CoefficientFileParser.cpp b/src/lms7002_wxgui/CoefficientFileParser.cpp
index 42fb5fc..d75d359 100644
--- a/src/lms7002_wxgui/CoefficientFileParser.cpp
+++ b/src/lms7002_wxgui/CoefficientFileParser.cpp
@@ -16,7 +16,7 @@ using namespace std;
// ***************************************************************
bool Parser::IsBlank(char c)
{
- char blankchar[] = ", \t\n";
+ char blankchar[] = ", \t\n\r";
for(unsigned i=0; i<strlen(blankchar); i++)
if(c == blankchar[i] ) return(true);
@@ -28,7 +28,7 @@ bool Parser::IsBlank(char c)
// ***************************************************************
bool Parser::IsDigit(char c)
{
- char digit[] = "0123456789+-";
+ char digit[] = ".0123456789+-";
for(unsigned i=0; i<strlen(digit); i++)
if(c == digit[i] ) return(true);
return(false);
@@ -41,7 +41,7 @@ bool Parser::IsDigit(char c)
// -1 if EOF or
// -2 if syntax error
// ***************************************************************
-int Parser::getint(FILE *fp, int *v)
+int Parser::getValue(FILE *fp, float *v)
{
char c, c1, str[256];
int i, opencomments;
@@ -57,7 +57,7 @@ int Parser::getint(FILE *fp, int *v)
if( c1 == '/') { /* C++ one line comment */
while( (c = fgetc(fp)) != '\n' && c != EOF) ;
if(c == EOF) return(EOF);
- else return(getint(fp, v));
+ else return(getValue(fp, v));
} else if( c1 == '*') { /* C like comment */
opencomments = 1;
c = fgetc(fp);
@@ -69,7 +69,7 @@ int Parser::getint(FILE *fp, int *v)
if(opencomments == 0) break;
}
if(c1 == EOF) return(EOF);
- else return(getint(fp, v));
+ else return(getValue(fp, v));
} else {
ungetc(c1, fp);
}
@@ -82,7 +82,7 @@ int Parser::getint(FILE *fp, int *v)
}
ungetc(c, fp);
str[i]='\0';
- *v = atoi(str);
+ *v = atof(str);
return(0);
} else return(-2);
}
@@ -95,7 +95,7 @@ int Parser::getint(FILE *fp, int *v)
// -5 too many coefficients in the file
// >=0 number of the coefficients read
// ***************************************************************
-int Parser::getcoeffs(const char *filename, int *v, int max)
+int Parser::getcoeffs(const char *filename, float *v, int max)
{
int i, n;
FILE *fp;
@@ -104,7 +104,7 @@ int Parser::getcoeffs(const char *filename, int *v, int max)
if( (fp = fopen(filename, "r")) == NULL) return(-4);
for(n=0; n < max; ) {
- i = getint(fp, v);
+ i = getValue(fp, v);
if( i == EOF ) {
fclose(fp);
return(n);
@@ -128,7 +128,7 @@ int Parser::getcoeffs(const char *filename, int *v, int max)
// -5 too many coefficients in the file
// >=0 number of the coefficients read
// ***************************************************************
-int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
+int Parser::getcoeffs2(const char *filename, float *v1, float *v2, int max)
{
int i, n;
FILE *fp;
@@ -137,7 +137,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
if( (fp = fopen(filename, "r")) == NULL) return(-4);
for(n=0; n < max+1; ) {
- i = getint(fp, v1);
+ i = getValue(fp, v1);
if( i == EOF ) {
fclose(fp);
return(n);
@@ -148,7 +148,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
v1++;
}
- i = getint(fp, v2);
+ i = getValue(fp, v2);
if( i == EOF ) {
fclose(fp);
return(-2);
@@ -167,7 +167,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
// ***************************************************************
// Saves given coefficients to fir file
// ***************************************************************
-void Parser::saveToFile(const char * filename, const int *coefficients, int cCount)
+void Parser::saveToFile(const char * filename, const float *coefficients, int cCount)
{
fstream fout;
fout.open(filename, ios::out);
@@ -195,7 +195,7 @@ void Parser::saveToFile(const char * filename, const int *coefficients, int cCou
for(int i=0; i<cCount; ++i)
{
- fout << "\t" << coefficients[i];
+ fout << "\t" << std::fixed << coefficients[i];
if(i<cCount-1)
fout << ',' << endl;
}
diff --git a/src/lms7002_wxgui/CoefficientFileParser.h b/src/lms7002_wxgui/CoefficientFileParser.h
index eedbaeb..e6a3eac 100644
--- a/src/lms7002_wxgui/CoefficientFileParser.h
+++ b/src/lms7002_wxgui/CoefficientFileParser.h
@@ -11,10 +11,10 @@ namespace Parser
{
bool IsBlank(char);
bool IsDigit(char);
- int getint(FILE *, int *);
- int getcoeffs(const char *, int *, int);
- int getcoeffs2(const char *, int *, int *, int);
- void saveToFile(const char *, const int *, int);
+ int getValue(FILE *, float *);
+ int getcoeffs(const char *, float *, int);
+ int getcoeffs2(const char *, float *, float *, int);
+ void saveToFile(const char *, const float *, int);
}
#endif // COEFFICIENT_FILE_PARSER_H
diff --git a/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp b/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
index b3cd0d9..20737da 100644
--- a/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
+++ b/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
@@ -16,7 +16,7 @@ void lms7002_dlgGFIR_Coefficients::OnLoadFromFile( wxCommandEvent& event )
if (dlg.ShowModal() == wxID_CANCEL)
return;
- int cbuf[200];
+ float cbuf[200];
int iVal = Parser::getcoeffs((const char*)dlg.GetPath().ToStdString().c_str(), cbuf, 200);
switch (iVal)
@@ -43,7 +43,7 @@ void lms7002_dlgGFIR_Coefficients::OnLoadFromFile( wxCommandEvent& event )
gridCoef->GetTable()->AppendRows(spinCoefCount->GetValue());
for (int i = 0; i<iVal; ++i)
{
- gridCoef->SetCellValue(i, 0, wxString::Format("%i", cbuf[i]));
+ gridCoef->SetCellValue(i, 0, wxString::Format("%f", cbuf[i]));
}
}
@@ -52,13 +52,13 @@ void lms7002_dlgGFIR_Coefficients::OnSaveToFile( wxCommandEvent& event )
wxFileDialog dlg(this, _("Save coefficients file"), "", "", "FIR Coeffs (*.fir)|*.fir", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (dlg.ShowModal() == wxID_CANCEL)
return;
- int coefficients[200];
+ float coefficients[200];
memset(coefficients, 0, sizeof(unsigned short) * 200);
- long ltemp;
+ double ltemp;
for (int i = 0; i<spinCoefCount->GetValue(); ++i)
{
ltemp = 0;
- gridCoef->GetCellValue(i, 0).ToLong(<emp);
+ gridCoef->GetCellValue(i, 0).ToDouble(<emp);
coefficients[i] = ltemp;
}
Parser::saveToFile((const char*)dlg.GetPath().ToStdString().c_str(), coefficients, spinCoefCount->GetValue());
@@ -84,7 +84,7 @@ void lms7002_dlgGFIR_Coefficients::OnspinCoefCountChange(wxSpinEvent& event)
}
void lms7002_dlgGFIR_Coefficients::SetCoefficients(const std::vector<double> &coefficients)
-{
+{
spinCoefCount->SetValue(coefficients.size());
if (gridCoef->GetTable()->GetRowsCount() > 0)
gridCoef->GetTable()->DeleteRows(0, gridCoef->GetTable()->GetRowsCount());
diff --git a/src/lms7002_wxgui/lms7002_mainPanel.cpp b/src/lms7002_wxgui/lms7002_mainPanel.cpp
index a865d51..f9fedd4 100644
--- a/src/lms7002_wxgui/lms7002_mainPanel.cpp
+++ b/src/lms7002_wxgui/lms7002_mainPanel.cpp
@@ -23,6 +23,7 @@
#include "lms7suiteEvents.h"
#include "lms7002_pnlMCU_BD_view.h"
#include "lms7002_pnlBuffers_view.h"
+#include "lms7002_pnlR3.h"
#include "lime/LimeSuite.h"
using namespace std;
using namespace lime;
@@ -34,6 +35,9 @@ lms7002_mainPanel::lms7002_mainPanel(wxWindow* parent, wxWindowID id, const wxPo
mTabMCU = new lms7002_pnlMCU_BD_view(tabsNotebook);
tabsNotebook->AddPage(mTabMCU, _("MCU"));
+ mTabR3 = new lms7002_pnlR3_view(tabsNotebook, wxNewId());
+ tabsNotebook->AddPage(mTabR3, _("R3 Controls"));
+
chkSyncAB->Hide();
}
@@ -103,6 +107,8 @@ void lms7002_mainPanel::UpdateVisiblePanel()
mTabBuffers->UpdateGUI();
break;
}
+ if(visibleTabId == mTabR3->GetId())
+ mTabR3->UpdateGUI();
t2 = wxGetUTCTimeMillis();
#ifndef NDEBUG
cout << "Visible GUI update time: " << (t2 - t1).ToString() << endl;
@@ -132,6 +138,7 @@ void lms7002_mainPanel::Initialize(lms_device_t* pControl)
mTabCalibrations->Initialize(lmsControl);
mTabMCU->Initialize(lmsControl);
mTabBuffers->Initialize(lmsControl);
+ mTabR3->Initialize(lmsControl);
UpdateGUI();
}
diff --git a/src/lms7002_wxgui/lms7002_mainPanel.h b/src/lms7002_wxgui/lms7002_mainPanel.h
index e937510..a1a7e5d 100644
--- a/src/lms7002_wxgui/lms7002_mainPanel.h
+++ b/src/lms7002_wxgui/lms7002_mainPanel.h
@@ -13,6 +13,7 @@ namespace lime{
class MCU_BD;
}
class lms7002_pnlMCU_BD_view;
+class lms7002_pnlR3_view;
/** Implementing mainPanel */
class lms7002_mainPanel : public mainPanel
@@ -43,6 +44,7 @@ class lms7002_mainPanel : public mainPanel
void Initialize(lms_device_t* pControl);
protected:
lms7002_pnlMCU_BD_view *mTabMCU;
+ lms7002_pnlR3_view *mTabR3;
lms_device_t* lmsControl;
};
diff --git a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
index d155daf..ac6ed49 100644
--- a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
@@ -17,6 +17,14 @@ pnlCLKGEN_view( parent )
lms7002_pnlCLKGEN_view::lms7002_pnlCLKGEN_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
: pnlCLKGEN_view(parent, id, pos, size, style), lmsControl(nullptr)
{
+ sizerR3->Add(new wxStaticText(this, wxID_ANY, _("CMPLO_CTRL:")), 1, wxEXPAND, 0);
+ cmbCMPLO_CTRL = new wxComboBox(this, wxID_ANY);
+ cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.18V"));
+ cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.1V"));
+ cmbCMPLO_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlCLKGEN_view::ParameterChangeHandler), NULL, this);
+ sizerR3->Add(cmbCMPLO_CTRL, 0, 0, 5);
+ wndId2Enum[cmbCMPLO_CTRL] = LMS7_CMPLO_CTRL_CGEN;
+
wndId2Enum[cmbCLKH_OV_CLKL_CGEN] = LMS7param(CLKH_OV_CLKL_CGEN);
wndId2Enum[chkCOARSE_START_CGEN] = LMS7param(COARSE_START_CGEN);
wndId2Enum[cmbCP2_CGEN] = LMS7param(CP2_CGEN);
@@ -211,7 +219,7 @@ void lms7002_pnlCLKGEN_view::OnbtnReadComparators(wxCommandEvent& event)
uint16_t param;
LMS_ReadParam(lmsControl,LMS7param(VCO_CMPHO_CGEN),¶m);
-
+
lblVCO_CMPHO_CGEN->SetLabel(wxString::Format(_("%i"), param));
if (param == 1)
lblVCO_CMPHO_CGEN->SetBackgroundColour(*wxGREEN);
@@ -219,7 +227,7 @@ void lms7002_pnlCLKGEN_view::OnbtnReadComparators(wxCommandEvent& event)
lblVCO_CMPHO_CGEN->SetBackgroundColour(*wxRED);
LMS_ReadParam(lmsControl,LMS7param(VCO_CMPLO_CGEN),¶m);
-
+
lblVCO_CMPLO_CGEN->SetLabel(wxString::Format(_("%i"), param));
if (param == 0)
lblVCO_CMPLO_CGEN->SetBackgroundColour(*wxGREEN);
diff --git a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
index dc0aa08..9ae273a 100644
--- a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
+++ b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
@@ -24,6 +24,8 @@ class lms7002_pnlCLKGEN_view : public pnlCLKGEN_view
void OnbtnReadComparators(wxCommandEvent& event);
void OnbtnUpdateCoarse(wxCommandEvent& event);
void OnShowVCOclicked(wxCommandEvent& event);
+
+ wxComboBox *cmbCMPLO_CTRL;
public:
void onbtnCalculateClick(wxCommandEvent& event);
/** Constructor */
diff --git a/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp b/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
index 3c6f8f9..661270e 100644
--- a/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
@@ -159,5 +159,24 @@ void lms7002_pnlLimeLightPAD_view::onbtnReadVerRevMask( wxCommandEvent& event )
void lms7002_pnlLimeLightPAD_view::UpdateGUI()
{
+ wxArrayString padStrenghts;
+ uint16_t value = 0;
+ LMS_ReadParam(lmsControl, LMS7_MASK, &value);
+ if(value == 0)
+ {
+ padStrenghts.push_back("4 mA");
+ padStrenghts.push_back("8 mA");
+ }
+ else
+ {
+ padStrenghts.push_back("8 mA");
+ padStrenghts.push_back("12 mA");
+ }
+ wxRadioBox* padStrenghtCtrl[] = {rgrSDA_DS, rgrSCL_DS, rgrSDIO_DS, rgrDIQ2_DS, rgrDIQ1_DS};
+ for(auto i : padStrenghtCtrl)
+ {
+ i->SetString(0, padStrenghts[0]);
+ i->SetString(1, padStrenghts[1]);
+ }
LMS7002_WXGUI::UpdateControlsByMap(this, lmsControl, wndId2Enum);
}
diff --git a/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp b/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
index 7933850..aebd60d 100644
--- a/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
@@ -68,7 +68,7 @@ int lms7002_pnlMCU_BD_view::GetProgramCode(const char* inFileName, bool bin)
{
unsigned char ch=0x00;
bool find_byte=false;
- int i=0;
+ size_t i=0;
if(!bin)
{
@@ -104,7 +104,7 @@ int lms7002_pnlMCU_BD_view::GetProgramCode(const char* inFileName, bool bin)
return -1;
mLoadedProgramFilename = inFileName;
memset(byte_array, 0, max_array_size);
- for (int i = 0; i<max_array_size && !fin.eof(); ++i)
+ for (size_t i = 0; i<max_array_size && !fin.eof(); ++i)
{
inByte = 0;
fin.read(&inByte, 1);
@@ -210,6 +210,8 @@ void lms7002_pnlMCU_BD_view::OnbtnStartProgrammingClick( wxCommandEvent& event )
target = LMS_TARGET_RAM;
else if (mode0 == 1 && mode1 == 1)
target = LMS_TARGET_BOOT;
+ else
+ target = LMS_TARGET_FLASH;
retval = LMS_ProgramLMSMCU(pthis->lmsControl, (const char*)pthis->byte_array, max_array_size, target, OnProgrammingCallback);
}
diff --git a/src/lms7002_wxgui/lms7002_pnlR3.cpp b/src/lms7002_wxgui/lms7002_pnlR3.cpp
new file mode 100644
index 0000000..7115208
--- /dev/null
+++ b/src/lms7002_wxgui/lms7002_pnlR3.cpp
@@ -0,0 +1,862 @@
+#include "lms7002_pnlR3.h"
+
+#include <wx/wx.h>
+#include <wx/stattext.h>
+#include "LMS7002M_parameters.h"
+#include "lms7002_gui_utilities.h"
+
+#include <vector>
+
+lms7002_pnlR3_view::lms7002_pnlR3_view( wxWindow* parent ) :
+ wxPanel( parent)
+{
+
+}
+
+lms7002_pnlR3_view::lms7002_pnlR3_view(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) :
+ wxPanel( parent, id, pos, size, style )
+{
+ lmsControl = nullptr;
+ wxFlexGridSizer* mainSizer;
+ mainSizer = new wxFlexGridSizer( 0, 1, 5, 5 );
+ {
+ wxFlexGridSizer* rowGroup = new wxFlexGridSizer(0, 4, 5, 5);
+ { //LimeLight controls
+ wxStaticBoxSizer* limeLight = new wxStaticBoxSizer(wxVERTICAL, this, wxT("LimeLight"));
+ const wxString delays[] = {_("No delay"), _("1x delay"), _("2x delay"), _("3x delay")};
+ const wxArrayString delaysArray(sizeof(delays) / sizeof(wxString), delays);
+
+ wxFlexGridSizer* lmlDelaysSizer = new wxFlexGridSizer(0, 4, 0, 0);
+ lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("FCLK1_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbFCLK1_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"));
+ cmbFCLK1_DLY->Append(delaysArray);
+ lmlDelaysSizer->Add(cmbFCLK1_DLY, 1, wxLEFT, 5);
+
+ lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("FCLK2_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbFCLK2_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"));
+ cmbFCLK2_DLY->Append(delaysArray);
+ lmlDelaysSizer->Add(cmbFCLK2_DLY, 1, wxLEFT, 5);
+
+ lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK1_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbMCLK1_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ cmbMCLK1_DLY->Append(delaysArray);
+ lmlDelaysSizer->Add(cmbMCLK1_DLY, 1, wxLEFT, 5);
+
+ lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK2_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbMCLK2_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ cmbMCLK2_DLY->Append(delaysArray);
+ lmlDelaysSizer->Add(cmbMCLK2_DLY, 1, wxLEFT, 5);
+
+ limeLight->Add(lmlDelaysSizer, 1, 0, 5);
+
+ cmbFCLK1_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ cmbFCLK2_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ cmbMCLK1_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ cmbMCLK2_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+
+ wxFlexGridSizer* lmlCheckboxes = new wxFlexGridSizer(0, 2, 0, 0);
+ chkMCLK1_INV = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK1 Invert"));
+ chkMCLK2_INV = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK2 invert"));
+ chkLML1_TRXIQPULSE = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML1_TRXIQPULSE mode"));
+ chkLML2_TRXIQPULSE = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML2_TRXIQPULSE mode"));
+ chkLML1_SISODDR = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML1_SISODDR mode"));
+ chkLML2_SISODDR = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML2_SISODDR mode"));
+ wxWindow* items[] = {chkMCLK1_INV, chkMCLK2_INV, chkLML1_TRXIQPULSE, chkLML2_TRXIQPULSE, chkLML1_SISODDR, chkLML2_SISODDR};
+ for(auto i : items)
+ {
+ i->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ lmlCheckboxes->Add(i, 0, wxEXPAND, 5);
+ }
+ limeLight->Add(lmlCheckboxes, 0, 0, 5);
+ rowGroup->Add(limeLight, 1, 0, 5);
+ }
+ {
+ wxStaticBoxSizer* sbSizer140;
+ sbSizer140 = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, wxT("TRX_GAIN")), wxVERTICAL);
+
+ chkTRX_GAIN_SRC = new wxCheckBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("Alternative TRX gain source"), wxDefaultPosition, wxDefaultSize, 0);
+ sbSizer140->Add(chkTRX_GAIN_SRC, 0, wxLEFT, 5);
+
+ wxFlexGridSizer* fgSizer256;
+ fgSizer256 = new wxFlexGridSizer(0, 2, 0, 0);
+ fgSizer256->SetFlexibleDirection(wxBOTH);
+ fgSizer256->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ wxStaticBoxSizer* sbSizer137;
+ sbSizer137 = new wxStaticBoxSizer(new wxStaticBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("TBB")), wxVERTICAL);
+
+ wxFlexGridSizer* fgSizer254;
+ fgSizer254 = new wxFlexGridSizer(0, 2, 0, 0);
+ fgSizer254->AddGrowableCol(1);
+ fgSizer254->SetFlexibleDirection(wxBOTH);
+ fgSizer254->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("CG_IAMP:")), 0, 0, 5);
+
+ spinCG_IAMP_TBB = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 63, 0);
+ fgSizer254->Add(spinCG_IAMP_TBB, 0, wxEXPAND, 5);
+
+ fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_LIN_TXPAD")), 0, 0, 5);
+
+ spinLOSS_LIN_TXPAD_TRF = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+ fgSizer254->Add(spinLOSS_LIN_TXPAD_TRF, 0, wxEXPAND, 5);
+
+ fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_MAIN_TXPAD")), 0, 0, 5);
+
+ spinLOSS_MAIN_TXPAD_TRF = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+ fgSizer254->Add(spinLOSS_MAIN_TXPAD_TRF, 0, wxEXPAND, 5);
+
+
+ sbSizer137->Add(fgSizer254, 1, wxEXPAND, 5);
+
+ chkR5_LPF_BYP_TBB = new wxCheckBox(sbSizer137->GetStaticBox(), wxID_ANY, wxT("Bypass LPFS5 low pass real-pole filter capacitor banks"), wxDefaultPosition, wxDefaultSize, 0);
+ chkR5_LPF_BYP_TBB->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sbSizer137->Add(chkR5_LPF_BYP_TBB, 0, 0, 5);
+
+
+ fgSizer256->Add(sbSizer137, 1, 0, 5);
+
+
+ wxStaticBoxSizer* sbSizer138;
+ sbSizer138 = new wxStaticBoxSizer(new wxStaticBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("RX")), wxVERTICAL);
+
+ wxFlexGridSizer* fgSizer255;
+ fgSizer255 = new wxFlexGridSizer(0, 2, 0, 0);
+ fgSizer255->SetFlexibleDirection(wxBOTH);
+ fgSizer255->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("C_CTL_PGA_RBB")), 0, wxALIGN_CENTER_VERTICAL, 5);
+
+ spinC_CTL_PGA_RBB = new NumericSlider(sbSizer138->GetStaticBox(), wxID_ANY, wxT("2"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 4, 2);
+ fgSizer255->Add(spinC_CTL_PGA_RBB, 0, 0, 5);
+
+ {
+ fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_PGA_RBB")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbG_PGA_RBB = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ wxArrayString temp;
+ for(int i = 0; i < 32; ++i)
+ temp.push_back(wxString::Format(_("%i dB"), -12 + i));
+ cmbG_PGA_RBB->Append(temp);
+ fgSizer255->Add(cmbG_PGA_RBB, 0, wxEXPAND, 5);
+ }
+ {
+ fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_LNA")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbG_LNA_RFE = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ const wxString items[] =
+ {_("Gmax-30")
+ , _("Gmax-27")
+ , _("Gmax-24")
+ , _("Gmax-21")
+ , _("Gmax-18")
+ , _("Gmax-15")
+ , _("Gmax-12")
+ , _("Gmax-9")
+ , _("Gmax-6")
+ , _("Gmax-5")
+ , _("Gmax-4")
+ , _("Gmax-3")
+ , _("Gmax-2")
+ , _("Gmax-1")
+ , _("Gmax")};
+ cmbG_LNA_RFE->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+ fgSizer255->Add(cmbG_LNA_RFE, 0, wxEXPAND, 5);
+ }
+
+ {
+ fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_TIA")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbG_TIA_RFE = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ const wxString items[] =
+ {_("Gmax-12")
+ , _("Gmax-3")
+ , _("Gmax")};
+ cmbG_TIA_RFE->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+ fgSizer255->Add(cmbG_TIA_RFE, 0, wxEXPAND, 5);
+ }
+
+ sbSizer138->Add(fgSizer255, 1, wxEXPAND, 5);
+
+
+ fgSizer256->Add(sbSizer138, 1, wxEXPAND, 5);
+
+
+ sbSizer140->Add(fgSizer256, 1, wxEXPAND, 5);
+
+
+ rowGroup->Add(sbSizer140, 1, wxEXPAND, 5);
+ }
+ mainSizer->Add(rowGroup, 1, wxEXPAND, 5);
+ }
+
+ {
+ wxStaticBoxSizer* dcCalibGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("DC calibration"));
+ wxWindow* panel = dcCalibGroup->GetStaticBox();
+ {
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 1, 0, 5);
+ std::vector<const LMS7Parameter*> params = {
+ &LMS7_PD_DCDAC_RXB,
+ &LMS7_PD_DCDAC_RXA,
+ &LMS7_PD_DCDAC_TXB,
+ &LMS7_PD_DCDAC_TXA,
+ &LMS7_PD_DCCMP_RXB,
+ &LMS7_PD_DCCMP_RXA,
+ &LMS7_PD_DCCMP_TXB,
+ &LMS7_PD_DCCMP_TXA
+ };
+ int row = 0;
+ for(auto i : params)
+ {
+ sizer->AddGrowableRow(row++);
+ wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), i->name);
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(chkbox, 1, wxEXPAND, 5);
+ wndId2Enum[chkbox] = *i;
+ }
+ dcCalibGroup->Add(sizer, 0, wxEXPAND, 5);
+ }
+ {
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 3, 0, 0);
+ std::vector<const LMS7Parameter*> params = {
+ &LMS7_DCWR_RXBQ, &LMS7_DCRD_RXBQ, &LMS7_DC_RXBQ,
+ &LMS7_DCWR_RXBI, &LMS7_DCRD_RXBI, &LMS7_DC_RXBI,
+ &LMS7_DCWR_RXAQ, &LMS7_DCRD_RXAQ, &LMS7_DC_RXAQ,
+ &LMS7_DCWR_RXAI, &LMS7_DCRD_RXAI, &LMS7_DC_RXAI,
+ &LMS7_DCWR_TXBQ, &LMS7_DCRD_TXBQ, &LMS7_DC_TXBQ,
+ &LMS7_DCWR_TXBI, &LMS7_DCRD_TXBI, &LMS7_DC_TXBI,
+ &LMS7_DCWR_TXAQ, &LMS7_DCRD_TXAQ, &LMS7_DC_TXAQ,
+ &LMS7_DCWR_TXAI, &LMS7_DCRD_TXAI, &LMS7_DC_TXAI
+ };
+ for(size_t i = 0; i<params.size(); i += 3)
+ {
+ wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), params[i]->name);
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(chkbox, 1, wxEXPAND, 5);
+ wndId2Enum[chkbox] = *params[i];
+ chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), params[i + 1]->name);
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadDC), NULL, this);
+ sizer->Add(chkbox, 1, wxEXPAND, 5);
+ wndId2Enum[chkbox] = *params[i + 1];
+ NumericSlider* slider = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, -1023, 1023, 0);
+ cmbDCControls.push_back(slider);
+ slider->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::OnWriteDC), NULL, this);
+ sizer->Add(slider, 1, wxEXPAND, 5);
+ wndId2Enum[slider] = *params[i + 2];
+ }
+ dcCalibGroup->Add(sizer, 0, 0, 5);
+ }
+ {
+ const std::vector<wxString> names = {_("RXBQ"), _("RXBI"), _("RXAQ"), _("RXAI"), _("TXBQ"), _("TXBI"), _("TXAQ"), _("TXAI")};
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 5, 0, 5);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Name:")), 1, wxEXPAND, 0);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("START:")), 1, wxEXPAND, 0);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("CMP invert:")), 1, wxEXPAND, 0);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("CMP:")), 1, wxEXPAND, 0);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Status:")), 1, wxEXPAND, 0);
+ for(size_t i = 0; i<names.size(); ++i)
+ {
+ sizer->AddGrowableRow(i);
+ wxCheckBox* chkbox;
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, names[i]), 1, wxEXPAND, 0);
+
+ chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString);
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnDCCMPCFGChanged), NULL, this);
+ wndId2Enum[chkbox] = LMS7_DCCAL_START;
+ sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+ dccal_start[i] = chkbox;
+
+ chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString);
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnDCCMPCFGChanged), NULL, this);
+ wndId2Enum[chkbox] = LMS7_DCCAL_CMPCFG;
+ sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+ dccal_cmpcfg[i] = chkbox;
+
+ dccal_cmpstatuses[i] = new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("0"));
+ sizer->Add(dccal_cmpstatuses[i], 1, wxEXPAND, 0);
+ dccal_statuses[i] = new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Not running"));
+ sizer->Add(dccal_statuses[i], 1, wxEXPAND, 0);
+ }
+ for(int i = 0; i < 4; ++i)
+ sizer->Add(new wxFlexGridSizer(0, 0, 0, 0));
+ wxButton* btnUpdateCMP = new wxButton(panel, wxNewId(), _("Read"));
+ btnUpdateCMP->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadDCCMP), NULL, this);
+ sizer->Add(btnUpdateCMP);
+ dcCalibGroup->Add(sizer, 0, 0, 5);
+ }
+ {
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("DC_RXCDIV")), 1, wxEXPAND, 0);
+ NumericSlider* ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_DC_RXCDIV;
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("DC_TXCDIV")), 1, wxEXPAND, 0);
+ ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_DC_TXCDIV;
+
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_RXB")), 1, wxEXPAND, 0);
+ ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_HYSCMP_RXB;
+
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_RXA")), 1, wxEXPAND, 0);
+ ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_HYSCMP_RXA;
+
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_TXB")), 1, wxEXPAND, 0);
+ ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_HYSCMP_TXB;
+
+ sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_TXA")), 1, wxEXPAND, 0);
+ ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(ctrl, 1, wxEXPAND, 5);
+ wndId2Enum[ctrl] = LMS7_HYSCMP_TXA;
+ dcCalibGroup->Add(sizer, 0, wxLEFT, 5);
+
+ wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), "Automatic DC calibration mode");
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ wndId2Enum[chkbox] = LMS7_DCMODE;
+ sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+ }
+ mainSizer->Add(dcCalibGroup, 1, wxEXPAND, 5);
+ }
+ {
+ wxFlexGridSizer* rowGroup = new wxFlexGridSizer(0, 4, 0, 5);
+ {
+ wxFlexGridSizer* rowGroupTSP = new wxFlexGridSizer(0, 1, 0, 0);
+ {
+ wxStaticBoxSizer* sbSizer139 = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("LDO"));
+ sbSizer139->Add(new wxStaticText(sbSizer139->GetStaticBox(), wxID_ANY, wxT("ISINK_SPI_BUFF")), 0, wxALIGN_CENTER_VERTICAL, 5);
+ cmbISINK_SPIBUFF = new wxComboBox(sbSizer139->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ cmbISINK_SPIBUFF->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+
+ sbSizer139->Add(cmbISINK_SPIBUFF, 0, wxLEFT, 5);
+ const wxString items[] = {_("Off"), _("10 kOhm"), _("2.5 kOhm"), _("2 kOhm"), _("625 Ohm"), _("588 Ohm"), _("500 Ohm"), _("476 Ohm")};
+ cmbISINK_SPIBUFF->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+ rowGroupTSP->Add(sbSizer139, 1, 0, 5);
+ }
+ {
+ wxStaticBoxSizer* txtspSizer = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("TxTSP"));
+ txtspSizer->Add(new wxStaticText(txtspSizer->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:")), 0, wxALIGN_CENTER_VERTICAL);
+ cmbCMIX_GAIN_TXTSP = new wxComboBox(txtspSizer->GetStaticBox(), wxID_ANY);
+ cmbCMIX_GAIN_TXTSP->Append(_("0 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("+6 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("+3 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("-3 dB"));
+ cmbCMIX_GAIN_TXTSP->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ txtspSizer->Add(cmbCMIX_GAIN_TXTSP, 0, 0, 5);
+ rowGroupTSP->Add(txtspSizer, 0, 0, 5);
+ }
+
+ {
+ wxStaticBoxSizer* rxtspGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RxTSP"));
+ wxFlexGridSizer* rxtspSizer = new wxFlexGridSizer(0, 2, 0, 0);
+
+ wxCheckBox* chkbox = new wxCheckBox(rxtspGroup->GetStaticBox(), wxNewId(), _("DCLOOP_STOP"));
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ rxtspSizer->Add(chkbox);
+ wndId2Enum[chkbox] = LMS7_DCLOOP_STOP;
+
+ rxtspSizer->Add(new wxFlexGridSizer(0,1,0,0));
+
+ rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:")), 0, wxALIGN_CENTER_VERTICAL);
+ cmbCMIX_GAIN_RXTSP = new wxComboBox(rxtspGroup->GetStaticBox(), wxID_ANY);
+ cmbCMIX_GAIN_RXTSP->Append(_("0 dB"));
+ cmbCMIX_GAIN_RXTSP->Append(_("+6 dB"));
+ cmbCMIX_GAIN_RXTSP->Append(_("-6 dB"));
+ cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+ cmbCMIX_GAIN_RXTSP->Append(_("+3 dB"));
+ cmbCMIX_GAIN_RXTSP->Append(_("-3 dB"));
+ cmbCMIX_GAIN_RXTSP->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ rxtspSizer->Add(cmbCMIX_GAIN_RXTSP, 0, 0, 5);
+
+ rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("HBD delay:")), 0, wxALIGN_CENTER_VERTICAL);
+ cmbHBD_DLY = new wxComboBox(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("No delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+ cmbHBD_DLY->Append(wxT("No delay"));
+ cmbHBD_DLY->Append(wxT("Delay 1 clock cycle"));
+ cmbHBD_DLY->Append(wxT("Delay 2 clock cycles"));
+ cmbHBD_DLY->Append(wxT("Delay 3 clock cycles"));
+ cmbHBD_DLY->Append(wxT("Delay 4 clock cycles"));
+ cmbHBD_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ rxtspSizer->Add(cmbHBD_DLY, 1, wxEXPAND, 5);
+ rxtspGroup->Add(rxtspSizer, 1, wxEXPAND, 5);
+
+ rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("ADCI_o:")), 0, wxALIGN_CENTER_VERTICAL);
+ lblADCI_o = new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("???"));
+ rxtspSizer->Add(lblADCI_o, 0, wxALIGN_CENTER_VERTICAL);
+ rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("ADCQ_o:")), 0, wxALIGN_CENTER_VERTICAL);
+ lblADCQ_o = new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("???"));
+ rxtspSizer->Add(lblADCQ_o, 0, wxALIGN_CENTER_VERTICAL);
+ btnReadADC = new wxButton(rxtspGroup->GetStaticBox(), wxNewId(), _("Read"));
+ rxtspSizer->Add(btnReadADC, 0, wxALIGN_CENTER_VERTICAL);
+ btnReadADC->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadADC), NULL, this);
+
+ chkbox = new wxCheckBox(rxtspGroup->GetStaticBox(), wxNewId(), _("CAPSEL_ADC"));
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ rxtspSizer->Add(chkbox);
+ wndId2Enum[chkbox] = LMS7_CAPSEL_ADC;
+
+ rowGroupTSP->Add(rxtspGroup, 1, wxEXPAND, 5);
+ }
+ rowGroup->Add(rowGroupTSP, 1, wxEXPAND, 5);
+ }
+
+ {
+ wxStaticBoxSizer* RSSIPDETGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RSSI, PDET, TEMP"));
+ wxWindow* panel = RSSIPDETGroup->GetStaticBox();
+
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+
+ wxCheckBox* chkbox = new wxCheckBox(panel, wxNewId(), _("Power down modules"));
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(chkbox);
+ wndId2Enum[chkbox] = LMS7_RSSI_PD;
+
+ chkbox = new wxCheckBox(panel, wxNewId(), _("Manual operation mode"));
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(chkbox);
+ wndId2Enum[chkbox] = LMS7_RSSI_RSSIMODE;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("DAC_CLKDIV")), 1, wxEXPAND, 0);
+ NumericSlider* spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_DAC_CLKDIV;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("Reference bias current to test ADC")), 1, wxEXPAND, 0);
+ spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSI_BIAS;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("HYSCMP")), 1, wxEXPAND, 0);
+ spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSI_HYSCMP;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("DAC_VAL")), 1, wxEXPAND, 0);
+ spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSI_DAC_VAL;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("PDET2_VAL")), 1, wxEXPAND, 0);
+ pdet_vals[1] = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(pdet_vals[1]);
+ wndId2Enum[pdet_vals[1]] = LMS7_RSSI_PDET2_VAL;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("PDET1_VAL")), 1, wxEXPAND, 0);
+ pdet_vals[0] = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(pdet_vals[0]);
+ wndId2Enum[pdet_vals[0]] = LMS7_RSSI_PDET1_VAL;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSSI2_VAL")), 1, wxEXPAND, 0);
+ rssi_vals[1] = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(rssi_vals[1]);
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSSI1_VAL")), 1, wxEXPAND, 0);
+ rssi_vals[0] = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(rssi_vals[0]);
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("TREF_VAL")), 1, wxEXPAND, 0);
+ tref_val = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(tref_val);
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("TVPTAT_VAL")), 1, wxEXPAND, 0);
+ tvptat_val = new wxStaticText(panel, wxID_ANY, _("????"));
+ sizer->Add(tvptat_val);
+
+ RSSIPDETGroup->Add(sizer);
+
+ wxFlexGridSizer* sizerCMP = new wxFlexGridSizer(0, 2, 0, 5);
+ const wxString cmpNames[] = {"Power Detector 1", "Power Detector 2", "RSSI 1", "RSSI 2", "Temperature VPTAT", "Temperature Reference"};
+ sizerCMP->Add( new wxStaticText(panel, wxID_ANY, _("Invert:")));
+ sizerCMP->Add(new wxStaticText(panel, wxID_ANY, _("CMP:")));
+
+ for(int i = 0; i < 6; ++i)
+ {
+ rssiCMPCFG[i] = new wxCheckBox(panel, wxNewId(), wxString::Format("%s", cmpNames[i]));
+ sizerCMP->Add(rssiCMPCFG[i]);
+ wndId2Enum[rssiCMPCFG[i]] = LMS7_RSSI_CMPCFG;
+ rssiCMPCFG[i]->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnRSSICMPCFGChanged), NULL, this);
+ rssiCMPSTATUS[i] = new wxStaticText(panel, wxNewId(), _("?"));
+ sizerCMP->Add(rssiCMPSTATUS[i]);
+ }
+ sizerCMP->Add(new wxFlexGridSizer(0, 0, 0, 0));
+ wxButton* btnUpdateRSSICMP = new wxButton(panel, wxNewId(), _("Read"));
+ btnUpdateRSSICMP->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadRSSICMP), NULL, this);
+ sizerCMP->Add(btnUpdateRSSICMP);
+ RSSIPDETGroup->Add(sizerCMP);
+
+ rowGroup->Add(RSSIPDETGroup);
+ }
+ {
+ wxStaticBoxSizer* RSSIGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RSSI DC Calibration"));
+ wxWindow* panel = RSSIGroup->GetStaticBox();
+
+ wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+
+ sizer->Add(new wxFlexGridSizer(0, 1, 0, 0), 0, 0, 0);
+
+ wxCheckBox* chkbox = new wxCheckBox(panel, wxNewId(), _("Power down modules"));
+ chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(chkbox);
+ wndId2Enum[chkbox] = LMS7_RSSIDC_PD;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("HYSCMP")), 1, wxEXPAND, 0);
+ NumericSlider* spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSIDC_HYSCMP;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("DCO2")), 1, wxEXPAND, 0);
+ spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 127, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSIDC_DCO2;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("DCO1")), 1, wxEXPAND, 0);
+ spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 127, 0);
+ spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+ sizer->Add(spnCtrl);
+ wndId2Enum[spnCtrl] = LMS7_RSSIDC_DCO1;
+
+ wxArrayString rselArray;
+ float value_mV = 800;
+ int i = 0;
+ for(; i < 4; ++i)
+ {
+ rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+ value_mV -= 50;
+ }
+ for(; i < 12; ++i)
+ {
+ rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+ value_mV -= 21.5;
+ }
+ for(; i <= 31; ++i)
+ {
+ rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+ value_mV -= 10;
+ }
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSEL:")), 1, wxEXPAND, 0);
+ wxComboBox* cmbRSEL = new wxComboBox(panel, wxID_ANY);
+ cmbRSEL->Append(rselArray);
+ cmbRSEL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+ sizer->Add(cmbRSEL);
+ wndId2Enum[cmbRSEL] = LMS7_RSSIDC_RSEL;
+
+ sizer->Add(new wxStaticText(panel, wxID_ANY, _("CMPSTATUS")), 1, wxEXPAND, 0);
+ rssidc_cmpstatus = new wxStaticText(panel, wxID_ANY, _("?"));
+ sizer->Add(rssidc_cmpstatus);
+
+ RSSIGroup->Add(sizer);
+ rowGroup->Add(RSSIGroup);
+ }
+ mainSizer->Add(rowGroup);
+ }
+
+
+
+ this->SetSizer( mainSizer );
+ this->Layout();
+ mainSizer->Fit( this );
+
+ // Connect Events
+ chkTRX_GAIN_SRC->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_PGA_RBB->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_LNA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_TIA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+
+ wndId2Enum[cmbFCLK1_DLY] = LMS7param(FCLK1_DLY);
+ wndId2Enum[cmbFCLK2_DLY] = LMS7param(FCLK2_DLY);
+ wndId2Enum[cmbMCLK1_DLY] = LMS7param(MCLK1_DLY);
+ wndId2Enum[cmbMCLK2_DLY] = LMS7param(MCLK2_DLY);
+ wndId2Enum[chkMCLK1_INV] = LMS7param(MCLK1_INV);
+ wndId2Enum[chkMCLK2_INV] = LMS7param(MCLK2_INV);
+ wndId2Enum[chkLML1_TRXIQPULSE] = LMS7param(LML1_TRXIQPULSE);
+ wndId2Enum[chkLML2_TRXIQPULSE] = LMS7param(LML2_TRXIQPULSE);
+ wndId2Enum[chkLML1_SISODDR] = LMS7param(LML1_SISODDR);
+ wndId2Enum[chkLML2_SISODDR] = LMS7param(LML2_SISODDR);
+ wndId2Enum[cmbHBD_DLY] = LMS7param(HBD_DLY);
+ wndId2Enum[cmbISINK_SPIBUFF] = LMS7param(ISINK_SPIBUFF);
+ wndId2Enum[chkTRX_GAIN_SRC] = LMS7param(TRX_GAIN_SRC);
+ wndId2Enum[spinCG_IAMP_TBB] = LMS7param(CG_IAMP_TBB_R3);
+ wndId2Enum[spinLOSS_LIN_TXPAD_TRF] = LMS7param(LOSS_LIN_TXPAD_R3);
+ wndId2Enum[spinLOSS_MAIN_TXPAD_TRF] = LMS7param(LOSS_MAIN_TXPAD_R3);
+ wndId2Enum[chkR5_LPF_BYP_TBB] = LMS7param(R5_LPF_BYP_TBB);
+ wndId2Enum[spinC_CTL_PGA_RBB] = LMS7param(C_CTL_PGA_RBB_R3);
+ wndId2Enum[cmbG_PGA_RBB] = LMS7param(G_PGA_RBB_R3);
+ wndId2Enum[cmbG_LNA_RFE] = LMS7param(G_LNA_RFE_R3);
+ wndId2Enum[cmbG_TIA_RFE] = LMS7param(G_TIA_RFE_R3);
+ wndId2Enum[cmbCMIX_GAIN_TXTSP] = LMS7param(CMIX_GAIN_TXTSP_R3);
+ wndId2Enum[cmbCMIX_GAIN_RXTSP] = LMS7param(CMIX_GAIN_RXTSP_R3);
+
+
+
+ LMS7002_WXGUI::UpdateTooltips(wndId2Enum, true);
+}
+
+lms7002_pnlR3_view::~lms7002_pnlR3_view()
+{
+ // Disconnect Events
+ cmbFCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbFCLK2_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ chkLML1_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ chkLML2_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ chkLML1_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ chkLML2_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbCMIX_GAIN_TXTSP->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ chkTRX_GAIN_SRC->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_PGA_RBB->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_LNA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+ cmbG_TIA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+}
+
+void lms7002_pnlR3_view::Initialize(lms_device_t* pControl)
+{
+ lmsControl = pControl;
+}
+
+void lms7002_pnlR3_view::UpdateGUI()
+{
+ LMS7002_WXGUI::UpdateControlsByMap(this, lmsControl, wndId2Enum);
+
+ wxCommandEvent evt;
+ OnRSSICMPCFGChanged(evt);
+ OnReadRSSICMP(evt);
+ OnReadDCCMP(evt);
+ OnReadADC(evt);
+
+ for(size_t i = 0; i<cmbDCControls.size(); ++i)
+ {
+ uint16_t value = 0;
+ int16_t signedValue = 0;
+ LMS_ReadParam(lmsControl, wndId2Enum[cmbDCControls[i]], &value);
+ signedValue = value;
+ signedValue <<= 5;
+ signedValue >>= 5;
+ cmbDCControls[i]->SetValue(signedValue );
+ }
+
+ uint16_t value;
+ uint16_t rxtsp_cmix_gain = 0;
+ LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_RXTSP, &value);
+ rxtsp_cmix_gain |= value;
+ LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_RXTSP_R3, &value);
+ rxtsp_cmix_gain |= value << 2;
+ cmbCMIX_GAIN_RXTSP->SetSelection(rxtsp_cmix_gain);
+
+ uint16_t txtsp_cmix_gain = 0;
+ LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_TXTSP, &value);
+ txtsp_cmix_gain |= value;
+ LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_TXTSP_R3, &value);
+ txtsp_cmix_gain |= value << 2;
+ cmbCMIX_GAIN_TXTSP->SetSelection(txtsp_cmix_gain);
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandler(wxCommandEvent& event)
+{
+ assert(lmsControl != nullptr);
+ LMS7Parameter parameter;
+ try
+ {
+ parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+ if(parameter.address == LMS7_CMIX_GAIN_RXTSP_R3.address || parameter.name == LMS7_CMIX_GAIN_RXTSP_R3.name)
+ {
+ uint16_t value = event.GetInt();
+ LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_RXTSP, value & 0x3);
+ LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_RXTSP_R3, value > 0x2);
+ return;
+ }
+ if(parameter.address == LMS7_CMIX_GAIN_TXTSP_R3.address || parameter.name == LMS7_CMIX_GAIN_TXTSP_R3.name)
+ {
+ uint16_t value = event.GetInt();
+ LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_TXTSP, value & 0x3);
+ LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_TXTSP_R3, value > 0x2);
+ return;
+ }
+ }
+ catch (std::exception & e)
+ {
+ std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+ return;
+ }
+ LMS_WriteParam(lmsControl,parameter,event.GetInt());
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandler(wxSpinEvent& event)
+{
+ wxCommandEvent evt;
+ evt.SetInt(event.GetInt());
+ evt.SetId(event.GetId());
+ evt.SetEventObject(event.GetEventObject());
+ ParameterChangeHandler(evt);
+}
+
+void lms7002_pnlR3_view::OnReadADC( wxCommandEvent& event )
+{
+ //LMS_WriteParam(lmsControl, LMS7param(CAPSEL_ADC), 1);
+ LMS_WriteParam(lmsControl, LMS7param(CAPTURE), 0);
+ LMS_WriteParam(lmsControl, LMS7param(CAPTURE), 1);
+
+ uint16_t adci = 0;
+ LMS_ReadLMSReg(lmsControl, 0x040E, &adci);
+ uint16_t adcq = 0;
+ LMS_ReadLMSReg(lmsControl, 0x040F, &adcq);
+
+ lblADCI_o->SetLabel(wxString::Format("0x%04X", adci));
+ lblADCQ_o->SetLabel(wxString::Format("0x%04X", adcq));
+
+ //LMS_WriteParam(lmsControl, LMS7param(CAPSEL_ADC), 0);
+}
+
+void lms7002_pnlR3_view::OnDCCMPCFGChanged(wxCommandEvent& event)
+{
+ uint16_t value = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ value |= (dccal_cmpcfg[i]->GetValue() & 0x1) << i;
+ }
+ LMS_WriteParam(lmsControl, LMS7_DCCAL_CMPCFG, value);
+
+ value = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ value |= (dccal_start[i]->GetValue() & 0x1) << i;
+ }
+ LMS_WriteParam(lmsControl, LMS7_DCCAL_START, value);
+}
+
+void lms7002_pnlR3_view::OnRSSICMPCFGChanged(wxCommandEvent& event)
+{
+ uint16_t value = 0;
+ for(int i = 0; i < 5; ++i)
+ {
+ value |= (rssiCMPCFG[i]->GetValue() & 0x1) << i;
+ }
+ LMS_WriteParam(lmsControl, LMS7_RSSI_CMPCFG, value);
+}
+
+void lms7002_pnlR3_view::OnReadRSSICMP(wxCommandEvent& event)
+{
+ uint16_t value;
+ LMS_ReadParam(lmsControl, LMS7_RSSI_CMPSTATUS, &value);
+ for(int i = 0; i < 6; ++i)
+ {
+ rssiCMPSTATUS[i]->SetLabel(wxString::Format("%i", value & 0x1));
+ value >>= 1;
+ }
+ LMS_ReadParam(lmsControl, LMS7_RSSI_RSSI1_VAL, &value);
+ rssi_vals[0]->SetLabel(wxString::Format("0x%04X", value));
+ LMS_ReadParam(lmsControl, LMS7_RSSI_RSSI2_VAL, &value);
+ rssi_vals[1]->SetLabel(wxString::Format("0x%04X", value));
+ LMS_ReadParam(lmsControl, LMS7_RSSI_TREF_VAL, &value);
+ tref_val->SetLabel(wxString::Format("0x%04X", value));
+ LMS_ReadParam(lmsControl, LMS7_RSSI_TVPTAT_VAL, &value);
+ tvptat_val->SetLabel(wxString::Format("0x%04X", value));
+
+ LMS_ReadParam(lmsControl, LMS7_RSSI_PDET1_VAL, &value);
+ pdet_vals[0]->SetLabel(wxString::Format("0x%04X", value));
+ LMS_ReadParam(lmsControl, LMS7_RSSI_PDET2_VAL, &value);
+ pdet_vals[1]->SetLabel(wxString::Format("0x%04X", value));
+
+ LMS_ReadParam(lmsControl, LMS7_RSSIDC_CMPSTATUS, &value);
+ rssidc_cmpstatus->SetLabel(wxString::Format("%i", value & 1));
+}
+
+void lms7002_pnlR3_view::OnReadDCCMP(wxCommandEvent& event)
+{
+ uint16_t value;
+ LMS_ReadParam(lmsControl, LMS7_DCCAL_CMPSTATUS, &value);
+ for(int i = 7; i >= 0; --i)
+ {
+ dccal_cmpstatuses[i]->SetLabel(wxString::Format("%i", value & 0x1));
+ value >>= 1;
+ }
+ LMS_ReadParam(lmsControl, LMS7_DCCAL_CALSTATUS, &value);
+ for(int i = 7; i >= 0; --i)
+ {
+ dccal_statuses[i]->SetLabel(wxString::Format("%s", (value & 0x1) ? "Running" : "Not running"));
+ value >>= 1;
+ }
+}
+
+void lms7002_pnlR3_view::OnWriteDC(wxCommandEvent& event)
+{
+ ParameterChangeHandler(event);
+ //toggle load flag
+ LMS7Parameter parameter;
+ try
+ {
+ parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+ uint16_t regVal;
+ LMS_ReadLMSReg(lmsControl, parameter.address, ®Val);
+ regVal &= ~0xC000;
+ LMS_WriteLMSReg(lmsControl, parameter.address, regVal);
+ LMS_WriteLMSReg(lmsControl, parameter.address, regVal | 0x8000);
+ LMS_WriteLMSReg(lmsControl, parameter.address, regVal);
+ return;
+ }
+ catch (std::exception & e)
+ {
+ std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+ return;
+ }
+}
+
+void lms7002_pnlR3_view::OnReadDC( wxCommandEvent& event )
+{
+ ParameterChangeHandler(event);
+ if(event.GetInt() != 0)
+ {
+ LMS7Parameter parameter;
+ try
+ {
+ parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+ uint16_t regVal;
+ LMS_ReadLMSReg(lmsControl, parameter.address, ®Val);
+ }
+ catch (std::exception & e)
+ {
+ std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+ return;
+ }
+ UpdateGUI();
+ }
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandlerCMPRead( wxCommandEvent& event )
+{
+ ParameterChangeHandler(event);
+ uint16_t value = 0;
+ LMS_ReadParam(lmsControl, LMS7_RSSIDC_CMPSTATUS, &value);
+ rssidc_cmpstatus->SetLabel(wxString::Format("%i", value & 1));
+}
diff --git a/src/lms7002_wxgui/lms7002_pnlR3.h b/src/lms7002_wxgui/lms7002_pnlR3.h
new file mode 100644
index 0000000..1db7836
--- /dev/null
+++ b/src/lms7002_wxgui/lms7002_pnlR3.h
@@ -0,0 +1,83 @@
+#ifndef __lms7002_R3__
+#define __lms7002_R3__
+
+#include <wx/panel.h>
+#include <wx/checkbox.h>
+#include <wx/spinctrl.h>
+#include <wx/combobox.h>
+#include "numericSlider.h"
+
+#include <map>
+#include <vector>
+#include "lime/LimeSuite.h"
+namespace lime{
+
+}
+
+class lms7002_pnlR3_view : public wxPanel
+{
+ protected:
+ wxComboBox* cmbFCLK1_DLY;
+ wxComboBox* cmbFCLK2_DLY;
+ wxComboBox* cmbMCLK1_DLY;
+ wxComboBox* cmbMCLK2_DLY;
+ wxCheckBox* chkMCLK1_INV;
+ wxCheckBox* chkMCLK2_INV;
+ wxCheckBox* chkLML1_TRXIQPULSE;
+ wxCheckBox* chkLML2_TRXIQPULSE;
+ wxCheckBox* chkLML1_SISODDR;
+ wxCheckBox* chkLML2_SISODDR;
+ wxComboBox* cmbCMIX_GAIN_TXTSP;
+ wxComboBox* cmbCMIX_GAIN_RXTSP;
+ wxComboBox* cmbHBD_DLY;
+ wxComboBox* cmbISINK_SPIBUFF;
+ wxCheckBox* chkTRX_GAIN_SRC;
+ NumericSlider* spinCG_IAMP_TBB;
+ NumericSlider* spinLOSS_LIN_TXPAD_TRF;
+ NumericSlider* spinLOSS_MAIN_TXPAD_TRF;
+ wxCheckBox* chkR5_LPF_BYP_TBB;
+ NumericSlider* spinC_CTL_PGA_RBB;
+ wxComboBox* cmbG_PGA_RBB;
+ wxComboBox* cmbG_LNA_RFE;
+ wxComboBox* cmbG_TIA_RFE;
+ wxStaticText* lblADCI_o;
+ wxStaticText* lblADCQ_o;
+ wxButton* btnReadADC;
+ wxStaticText* dccal_statuses[8];
+ wxStaticText* dccal_cmpstatuses[8];
+ wxCheckBox* dccal_cmpcfg[8];
+ wxCheckBox* dccal_start[8];
+ wxStaticText* rssi_vals[2];
+ wxStaticText* pdet_vals[2];
+ wxStaticText* tref_val;
+ wxStaticText* tvptat_val;
+ wxStaticText* rssidc_cmpstatus;
+ std::vector<NumericSlider*> cmbDCControls;
+
+ wxStaticText* rssiCMPSTATUS[6];
+ wxCheckBox* rssiCMPCFG[6];
+
+ // Virtual event handlers, overide them in your derived class
+ void ParameterChangeHandler( wxSpinEvent& event );
+ void ParameterChangeHandler( wxCommandEvent& event );
+ void OnRSSICMPCFGChanged(wxCommandEvent& event);
+ void OnDCCMPCFGChanged(wxCommandEvent& event);
+ void OnReadRSSICMP(wxCommandEvent& event);
+ void OnReadDCCMP(wxCommandEvent& event);
+ void OnReadADC( wxCommandEvent& event );
+
+ void OnWriteDC( wxCommandEvent& event );
+ void OnReadDC( wxCommandEvent& event );
+ void ParameterChangeHandlerCMPRead( wxCommandEvent& event );
+ public:
+ lms7002_pnlR3_view( wxWindow* parent );
+ lms7002_pnlR3_view(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+ ~lms7002_pnlR3_view();
+ void Initialize(lms_device_t* pControl);
+ void UpdateGUI();
+protected:
+ lms_device_t* lmsControl;
+ std::map<wxWindow*, LMS7Parameter> wndId2Enum;
+};
+
+#endif // __lms7002_pnlAFE_view__
diff --git a/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp b/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
index 549d8d8..c5a7b4c 100644
--- a/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
@@ -55,7 +55,7 @@ lms7002_pnlRBB_view::lms7002_pnlRBB_view( wxWindow* parent, wxWindowID id, const
cmbICT_PGA_IN_RBB->Set(temp);
cmbICT_PGA_OUT_RBB->Set(temp);
cmbRCC_CTL_PGA_RBB->Append(temp);
- cmbR_CTL_LPF_RBB->Append(temp);
+ cmbR_CTL_LPF_RBB->Append(temp);
temp.clear();
temp.push_back("LPFL_RBB");
diff --git a/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp b/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
index f5ad314..75ebf2d 100644
--- a/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
@@ -325,6 +325,7 @@ void lms7002_pnlRxTSP_view::OnbtnReadRSSI(wxCommandEvent& event)
uint16_t value2 = 0;
long valrez = 0;
//Read RSSI
+ LMS_WriteParam(lmsControl,LMS7param(CAPSEL_ADC),0);
LMS_WriteParam(lmsControl,LMS7param(CAPSEL),0);
LMS_WriteParam(lmsControl,LMS7param(CAPTURE),0);
LMS_WriteParam(lmsControl,LMS7param(CAPTURE),1);
diff --git a/src/lms7002_wxgui/lms7002_pnlSX_view.cpp b/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
index 516375a..ec73404 100644
--- a/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
@@ -14,6 +14,24 @@ using namespace lime;
lms7002_pnlSX_view::lms7002_pnlSX_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
: pnlSX_view(parent, id, pos, size, style), lmsControl(nullptr)
{
+ sizerR3->Add(new wxStaticText(this, wxID_ANY, _("PLL LPF zero resistor:")), 1, wxEXPAND, 0);
+ cmbRZ_CTRL = new wxComboBox(this, wxID_ANY);
+ cmbRZ_CTRL->Append(_("Rzero = 20 kOhm"));
+ cmbRZ_CTRL->Append(_("Rzero = 8 kOhm"));
+ cmbRZ_CTRL->Append(_("Rzero = 4 kOhm"));
+ cmbRZ_CTRL->Append(_("LPF resistors are in bypass mode (<100 Ohm)"));
+ cmbRZ_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlSX_view::ParameterChangeHandler), NULL, this);
+ wndId2Enum[cmbRZ_CTRL] = LMS7_RZ_CTRL;
+ sizerR3->Add(cmbRZ_CTRL);
+
+ sizerR3->Add(new wxStaticText(this, wxID_ANY, _("CMPLO_CTRL:")), 1, wxEXPAND, 0);
+ cmbCMPLO_CTRL = new wxComboBox(this, wxID_ANY);
+ cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.18V"));
+ cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.1V"));
+ cmbCMPLO_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlSX_view::ParameterChangeHandler), NULL, this);
+ sizerR3->Add(cmbCMPLO_CTRL, 0, 0, 5);
+ wndId2Enum[cmbCMPLO_CTRL] = LMS7_CMPLO_CTRL_SX;
+
//ids for updating from chip
wndId2Enum[chkBYPLDO_VCO] = LMS7param(BYPLDO_VCO);
wndId2Enum[cmbCP2_PLL] = LMS7param(CP2_PLL);
diff --git a/src/lms7002_wxgui/lms7002_pnlSX_view.h b/src/lms7002_wxgui/lms7002_pnlSX_view.h
index 3c8faf8..d7ec4d3 100644
--- a/src/lms7002_wxgui/lms7002_pnlSX_view.h
+++ b/src/lms7002_wxgui/lms7002_pnlSX_view.h
@@ -26,6 +26,9 @@ class lms7002_pnlSX_view : public pnlSX_view
void OnbtnCalculateClick( wxCommandEvent& event );
void OnbtnTuneClick( wxCommandEvent& event );
void OnShowVCOclicked(wxCommandEvent& event);
+
+ wxComboBox* cmbRZ_CTRL;
+ wxComboBox* cmbCMPLO_CTRL;
public:
/** Constructor */
lms7002_pnlSX_view( wxWindow* parent );
diff --git a/src/lms7002_wxgui/lms7002_wxgui.cpp b/src/lms7002_wxgui/lms7002_wxgui.cpp
index 776d32b..00859c2 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.cpp
+++ b/src/lms7002_wxgui/lms7002_wxgui.cpp
@@ -143,7 +143,7 @@ mainPanel::mainPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const
tabsNotebook->SetMinSize( wxSize( 1050,-1 ) );
mTabCalibrations = new lms7002_pnlCalibrations_view( tabsNotebook, ID_TAB_CALIBRATIONS, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- tabsNotebook->AddPage( mTabCalibrations, wxT("Calibrations"), true );
+ tabsNotebook->AddPage( mTabCalibrations, wxT("Calibrations"), false );
mTabRFE = new lms7002_pnlRFE_view( tabsNotebook, ID_TAB_RFE, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
tabsNotebook->AddPage( mTabRFE, wxT("RFE"), false );
mTabRBB = new lms7002_pnlRBB_view( tabsNotebook, ID_TAB_RBB, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
@@ -3711,6 +3711,13 @@ pnlCLKGEN_view::pnlCLKGEN_view( wxWindow* parent, wxWindowID id, const wxPoint&
fgSizer245->Add( sbSizer69, 1, wxALIGN_LEFT|wxALIGN_TOP|wxEXPAND, 5 );
+ sizerR3 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ sizerR3->SetFlexibleDirection( wxBOTH );
+ sizerR3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+
+ fgSizer245->Add( sizerR3, 1, wxEXPAND, 5 );
+
fgSizer244->Add( fgSizer245, 1, wxEXPAND, 5 );
@@ -4306,6 +4313,13 @@ pnlSX_view::pnlSX_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, con
fgSizer103->Add( fgSizer193, 0, 0, 0 );
+ sizerR3 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ sizerR3->SetFlexibleDirection( wxBOTH );
+ sizerR3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+
+ fgSizer103->Add( sizerR3, 1, wxEXPAND, 5 );
+
fgSizer92->Add( fgSizer103, 1, wxALIGN_LEFT|wxALIGN_TOP, 5 );
@@ -9337,3 +9351,325 @@ dlgVCOfrequencies::~dlgVCOfrequencies()
btnSaveFile->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( dlgVCOfrequencies::OnSaveFile ), NULL, this );
}
+
+pnlR3::pnlR3( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ wxFlexGridSizer* fgSizer251;
+ fgSizer251 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer251->SetFlexibleDirection( wxBOTH );
+ fgSizer251->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticBoxSizer* sbSizer132;
+ sbSizer132 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("LimeLight") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer252;
+ fgSizer252 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer252->SetFlexibleDirection( wxBOTH );
+ fgSizer252->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxBoxSizer* bSizer3;
+ bSizer3 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText345 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("FCLK1_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText345->Wrap( -1 );
+ bSizer3->Add( m_staticText345, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbFCLK1_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ cmbFCLK1_DLY->Append( wxT("No Delay") );
+ cmbFCLK1_DLY->Append( wxT("No delay") );
+ cmbFCLK1_DLY->Append( wxT("2x delay") );
+ cmbFCLK1_DLY->Append( wxT("3x delay") );
+ cmbFCLK1_DLY->Append( wxT("1x delay") );
+ cmbFCLK1_DLY->SetSelection( 0 );
+ bSizer3->Add( cmbFCLK1_DLY, 1, wxLEFT, 5 );
+
+
+ fgSizer252->Add( bSizer3, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer31;
+ bSizer31 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText3451 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("FCLK2_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText3451->Wrap( -1 );
+ bSizer31->Add( m_staticText3451, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbFCLK2_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ cmbFCLK2_DLY->Append( wxT("No Delay") );
+ cmbFCLK2_DLY->Append( wxT("No delay") );
+ cmbFCLK2_DLY->Append( wxT("2x delay") );
+ cmbFCLK2_DLY->Append( wxT("3x delay") );
+ cmbFCLK2_DLY->Append( wxT("1x delay") );
+ cmbFCLK2_DLY->SetSelection( 0 );
+ bSizer31->Add( cmbFCLK2_DLY, 1, wxLEFT, 5 );
+
+
+ fgSizer252->Add( bSizer31, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer32;
+ bSizer32 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText3452 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK1_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText3452->Wrap( -1 );
+ bSizer32->Add( m_staticText3452, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbMCLK1_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ cmbMCLK1_DLY->Append( wxT("No Delay") );
+ cmbMCLK1_DLY->Append( wxT("No delay") );
+ cmbMCLK1_DLY->Append( wxT("2x delay") );
+ cmbMCLK1_DLY->Append( wxT("3x delay") );
+ cmbMCLK1_DLY->Append( wxT("1x delay") );
+ cmbMCLK1_DLY->SetSelection( 0 );
+ bSizer32->Add( cmbMCLK1_DLY, 0, wxLEFT, 5 );
+
+
+ fgSizer252->Add( bSizer32, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer321;
+ bSizer321 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText34521 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK2_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText34521->Wrap( -1 );
+ bSizer321->Add( m_staticText34521, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbMCLK1_DLY1 = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ cmbMCLK1_DLY1->Append( wxT("No Delay") );
+ cmbMCLK1_DLY1->Append( wxT("No delay") );
+ cmbMCLK1_DLY1->Append( wxT("2x delay") );
+ cmbMCLK1_DLY1->Append( wxT("3x delay") );
+ cmbMCLK1_DLY1->Append( wxT("1x delay") );
+ cmbMCLK1_DLY1->SetSelection( 0 );
+ bSizer321->Add( cmbMCLK1_DLY1, 0, wxLEFT, 5 );
+
+
+ fgSizer252->Add( bSizer321, 1, wxEXPAND, 5 );
+
+ chkMCLK1_INV = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK1 Invert"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkMCLK1_INV, 0, 0, 5 );
+
+ chkMCLK2_INV = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK2 invert"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkMCLK2_INV, 0, 0, 5 );
+
+ chkLML1_TRXIQPULSE = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML1_TRXIQPULSE mode"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkLML1_TRXIQPULSE, 0, 0, 5 );
+
+ chkLML2_TRXIQPULSE = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML2_TRXIQPULSE mode"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkLML2_TRXIQPULSE, 0, 0, 5 );
+
+ chkLML1_SISODDR = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML1_SISODDR mode"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkLML1_SISODDR, 0, 0, 5 );
+
+ chkLML2_SISODDR = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML2_SISODDR mode"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer252->Add( chkLML2_SISODDR, 0, 0, 5 );
+
+
+ sbSizer132->Add( fgSizer252, 1, wxEXPAND, 5 );
+
+
+ fgSizer251->Add( sbSizer132, 1, wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer133;
+ sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("TxTSP") ), wxHORIZONTAL );
+
+ m_staticText352 = new wxStaticText( sbSizer133->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText352->Wrap( -1 );
+ sbSizer133->Add( m_staticText352, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_comboBox143 = new wxComboBox( sbSizer133->GetStaticBox(), wxID_ANY, wxT("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ sbSizer133->Add( m_comboBox143, 0, 0, 5 );
+
+
+ fgSizer251->Add( sbSizer133, 0, 0, 5 );
+
+ wxStaticBoxSizer* sbSizer134;
+ sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("RxTSP") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer13;
+ bSizer13 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText353 = new wxStaticText( sbSizer134->GetStaticBox(), wxID_ANY, wxT("HBD delay"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText353->Wrap( -1 );
+ bSizer13->Add( m_staticText353, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbHBD_DLY = new wxComboBox( sbSizer134->GetStaticBox(), wxID_ANY, wxT("No delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ cmbHBD_DLY->Append( wxT("No delay") );
+ cmbHBD_DLY->Append( wxT("Delay 1 clock cycle") );
+ cmbHBD_DLY->Append( wxT("Delay 2 clock cycles") );
+ cmbHBD_DLY->Append( wxT("Delay 3 clock cycles") );
+ cmbHBD_DLY->Append( wxT("Delay 4 clock cycles") );
+ cmbHBD_DLY->Append( wxT("Delay 2 clock cycle") );
+ cmbHBD_DLY->Append( wxT("Delay 2 clock cycle") );
+ cmbHBD_DLY->Append( wxT("delay 1 clock cycle") );
+ bSizer13->Add( cmbHBD_DLY, 0, 0, 5 );
+
+
+ sbSizer134->Add( bSizer13, 1, wxEXPAND, 5 );
+
+
+ fgSizer251->Add( sbSizer134, 1, wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer139;
+ sbSizer139 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("LDO") ), wxHORIZONTAL );
+
+ m_staticText362 = new wxStaticText( sbSizer139->GetStaticBox(), wxID_ANY, wxT("ISINK_SPI_BUFF"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText362->Wrap( -1 );
+ sbSizer139->Add( m_staticText362, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbISINK_SPIBUFF = new wxComboBox( sbSizer139->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ sbSizer139->Add( cmbISINK_SPIBUFF, 0, wxLEFT, 5 );
+
+
+ fgSizer251->Add( sbSizer139, 1, 0, 5 );
+
+ wxStaticBoxSizer* sbSizer140;
+ sbSizer140 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("TRX_GAIN") ), wxVERTICAL );
+
+ chkTRX_GAIN_SRC = new wxCheckBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("Alternative TRX gain source"), wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer140->Add( chkTRX_GAIN_SRC, 0, wxLEFT, 5 );
+
+ wxFlexGridSizer* fgSizer256;
+ fgSizer256 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer256->SetFlexibleDirection( wxBOTH );
+ fgSizer256->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticBoxSizer* sbSizer137;
+ sbSizer137 = new wxStaticBoxSizer( new wxStaticBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("TBB") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer254;
+ fgSizer254 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer254->AddGrowableCol( 1 );
+ fgSizer254->SetFlexibleDirection( wxBOTH );
+ fgSizer254->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText355 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("CG_IAMP:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText355->Wrap( -1 );
+ fgSizer254->Add( m_staticText355, 0, 0, 5 );
+
+ spinCG_IAMP_TBB = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10, 0 );
+ fgSizer254->Add( spinCG_IAMP_TBB, 0, wxEXPAND, 5 );
+
+ m_staticText356 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_LIN_TXPAD"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText356->Wrap( -1 );
+ fgSizer254->Add( m_staticText356, 0, 0, 5 );
+
+ spinLOSS_LIN_TXPAD_TRF = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0 );
+ fgSizer254->Add( spinLOSS_LIN_TXPAD_TRF, 0, wxEXPAND, 5 );
+
+ m_staticText357 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_MAIN_TXPAD"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText357->Wrap( -1 );
+ fgSizer254->Add( m_staticText357, 0, 0, 5 );
+
+ spinLOSS_MAIN_TXPAD_TRF = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0 );
+ fgSizer254->Add( spinLOSS_MAIN_TXPAD_TRF, 0, wxEXPAND, 5 );
+
+
+ sbSizer137->Add( fgSizer254, 1, wxEXPAND, 5 );
+
+ chkR5_LPF_BYP_TBB = new wxCheckBox( sbSizer137->GetStaticBox(), wxID_ANY, wxT("Bypass LPFS5 low pass real-pole filter capacitor banks"), wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer137->Add( chkR5_LPF_BYP_TBB, 0, 0, 5 );
+
+
+ fgSizer256->Add( sbSizer137, 1, 0, 5 );
+
+ wxStaticBoxSizer* sbSizer138;
+ sbSizer138 = new wxStaticBoxSizer( new wxStaticBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("RX") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer255;
+ fgSizer255 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer255->SetFlexibleDirection( wxBOTH );
+ fgSizer255->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText358 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("C_CTL_PGA_RBB"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText358->Wrap( -1 );
+ fgSizer255->Add( m_staticText358, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ spinC_CTL_PGA_RBB = new wxSpinCtrl( sbSizer138->GetStaticBox(), wxID_ANY, wxT("2"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 2 );
+ fgSizer255->Add( spinC_CTL_PGA_RBB, 0, 0, 5 );
+
+ m_staticText359 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_PGA_RBB"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText359->Wrap( -1 );
+ fgSizer255->Add( m_staticText359, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbG_PGA_RBB = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ fgSizer255->Add( cmbG_PGA_RBB, 0, wxEXPAND, 5 );
+
+ m_staticText360 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_LNA"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText360->Wrap( -1 );
+ fgSizer255->Add( m_staticText360, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbG_LNA_RFE = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ fgSizer255->Add( cmbG_LNA_RFE, 0, wxEXPAND, 5 );
+
+ m_staticText361 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_TIA"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText361->Wrap( -1 );
+ fgSizer255->Add( m_staticText361, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ cmbG_TIA_RFE = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ fgSizer255->Add( cmbG_TIA_RFE, 0, wxEXPAND, 5 );
+
+
+ sbSizer138->Add( fgSizer255, 1, wxEXPAND, 5 );
+
+
+ fgSizer256->Add( sbSizer138, 1, wxEXPAND, 5 );
+
+
+ sbSizer140->Add( fgSizer256, 1, wxEXPAND, 5 );
+
+
+ fgSizer251->Add( sbSizer140, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( fgSizer251 );
+ this->Layout();
+ fgSizer251->Fit( this );
+
+ // Connect Events
+ cmbFCLK1_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbFCLK2_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY1->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML1_TRXIQPULSE->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML2_TRXIQPULSE->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML1_SISODDR->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML2_SISODDR->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ m_comboBox143->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkTRX_GAIN_SRC->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_PGA_RBB->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_LNA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_TIA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+}
+
+pnlR3::~pnlR3()
+{
+ // Disconnect Events
+ cmbFCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbFCLK2_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbMCLK1_DLY1->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML1_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML2_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML1_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkLML2_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ m_comboBox143->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ chkTRX_GAIN_SRC->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_PGA_RBB->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_LNA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+ cmbG_TIA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+
+}
diff --git a/src/lms7002_wxgui/lms7002_wxgui.fbp b/src/lms7002_wxgui/lms7002_wxgui.fbp
index 522620e..760d25f 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.fbp
+++ b/src/lms7002_wxgui/lms7002_wxgui.fbp
@@ -1334,7 +1334,7 @@
<object class="notebookpage" expanded="0">
<property name="bitmap"></property>
<property name="label">Calibrations</property>
- <property name="select">1</property>
+ <property name="select">0</property>
<object class="wxPanel" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
@@ -35708,7 +35708,7 @@
</object>
</object>
</object>
- <object class="Panel" expanded="0">
+ <object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
@@ -35760,7 +35760,7 @@
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
- <object class="wxFlexGridSizer" expanded="0">
+ <object class="wxFlexGridSizer" expanded="1">
<property name="cols">3</property>
<property name="flexible_direction">wxBOTH</property>
<property name="growablecols"></property>
@@ -42123,6 +42123,24 @@
</object>
</object>
</object>
+ <object class="sizeritem" expanded="1">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="1">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">sizerR3</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">protected</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ </object>
+ </object>
</object>
</object>
</object>
@@ -48738,6 +48756,24 @@
</object>
</object>
</object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">sizerR3</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">protected</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ </object>
+ </object>
</object>
</object>
</object>
@@ -91885,7 +91921,7 @@
</object>
</object>
</object>
- <object class="Panel" expanded="1">
+ <object class="Panel" expanded="0">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
@@ -91937,7 +91973,7 @@
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
- <object class="wxFlexGridSizer" expanded="1">
+ <object class="wxFlexGridSizer" expanded="0">
<property name="cols">3</property>
<property name="flexible_direction">wxBOTH</property>
<property name="growablecols">0,1</property>
@@ -94521,11 +94557,11 @@
</object>
</object>
</object>
- <object class="sizeritem" expanded="1">
+ <object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag"></property>
<property name="proportion">0</property>
- <object class="wxStaticBoxSizer" expanded="1">
+ <object class="wxStaticBoxSizer" expanded="0">
<property name="id">wxID_ANY</property>
<property name="label">Full calibration</property>
<property name="minimum_size"></property>
@@ -94621,7 +94657,7 @@
<event name="OnUpdateUI"></event>
</object>
</object>
- <object class="sizeritem" expanded="1">
+ <object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
@@ -94979,11 +95015,11 @@
</object>
</object>
</object>
- <object class="sizeritem" expanded="1">
+ <object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag"></property>
<property name="proportion">0</property>
- <object class="wxFlexGridSizer" expanded="1">
+ <object class="wxFlexGridSizer" expanded="0">
<property name="cols">1</property>
<property name="flexible_direction">wxVERTICAL</property>
<property name="growablecols"></property>
@@ -94995,11 +95031,11 @@
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
- <object class="sizeritem" expanded="1">
+ <object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
- <object class="wxRadioBox" expanded="1">
+ <object class="wxRadioBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@@ -97959,5 +97995,3424 @@
</object>
</object>
</object>
+ <object class="Panel" expanded="0">
+ <property name="aui_managed">0</property>
+ <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+ <property name="bg"></property>
+ <property name="context_help"></property>
+ <property name="context_menu">1</property>
+ <property name="enabled">1</property>
+ <property name="event_handler">decl_pure_virtual</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">pnlR3</property>
+ <property name="pos"></property>
+ <property name="size">-1,-1</property>
+ <property name="subclass"></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="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="OnEnterWindow"></event>
+ <event name="OnEraseBackground"></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="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">fgSizer251</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">none</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">LimeLight</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer132</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">fgSizer252</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">none</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="0">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer3</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">FCLK1_DLY:</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_staticText345</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">1</property>
+ <object class="wxComboBox" expanded="0">
+ <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">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</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">cmbFCLK1_DLY</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="selection">0</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">No Delay</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="0">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer31</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">FCLK2_DLY:</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_staticText3451</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">1</property>
+ <object class="wxComboBox" expanded="0">
+ <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">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</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">cmbFCLK2_DLY</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="selection">0</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">No Delay</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="0">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer32</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">MCLK1_DLY:</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_staticText3452</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</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">cmbMCLK1_DLY</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="selection">0</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">No Delay</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="0">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer321</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">MCLK2_DLY:</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_staticText34521</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</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">cmbMCLK1_DLY1</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="selection">0</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">No Delay</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">MCLK1 Invert</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">chkMCLK1_INV</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="OnCheckBox"></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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">MCLK2 invert</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">chkMCLK2_INV</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="OnCheckBox"></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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">LML1_TRXIQPULSE mode</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">chkLML1_TRXIQPULSE</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="OnCheckBox">ParameterChangeHandler</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">LML2_TRXIQPULSE mode</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">chkLML2_TRXIQPULSE</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="OnCheckBox">ParameterChangeHandler</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">LML1_SISODDR mode</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">chkLML1_SISODDR</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="OnCheckBox">ParameterChangeHandler</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">LML2_SISODDR mode</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">chkLML2_SISODDR</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="OnCheckBox">ParameterChangeHandler</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 class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">TxTSP</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer133</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">CMIX_GAIN:</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_staticText352</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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_comboBox143</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="selection">-1</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">Combo!</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">RxTSP</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer134</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxBoxSizer" expanded="0">
+ <property name="minimum_size"></property>
+ <property name="name">bSizer13</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">HBD delay</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_staticText353</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">"No delay" "Delay 1 clock cycle" "Delay 2 clock cycles" "Delay 3 clock cycles" "Delay 4 clock cycles" "Delay 2 clock cycle" "Delay 2 clock cycle" "delay 1 clock cycle"</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">cmbHBD_DLY</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="selection">-1</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">No delay</property>
+ <property name="window_extra_style"></property>
+ <property name="window_name"></property>
+ <property name="window_style"></property>
+ <event name="OnChar"></event>
+ <event name="OnCombobox"></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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">LDO</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer139</property>
+ <property name="orient">wxHORIZONTAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">ISINK_SPI_BUFF</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_staticText362</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">cmbISINK_SPIBUFF</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="selection">-1</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="OnCombobox"></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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">TRX_GAIN</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer140</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxLEFT</property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">Alternative TRX gain source</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">chkTRX_GAIN_SRC</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="OnCheckBox">ParameterChangeHandler</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">fgSizer256</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">none</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">TBB</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer137</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols">1</property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">fgSizer254</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">none</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">CG_IAMP:</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_staticText355</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxSpinCtrl" expanded="0">
+ <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="initial">0</property>
+ <property name="max">10</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min">0</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">spinCG_IAMP_TBB</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">wxSP_ARROW_KEYS</property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></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="OnSpinCtrl">ParameterChangeHandler</event>
+ <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+ <event name="OnTextEnter"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">LOSS_LIN_TXPAD</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_staticText356</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxSpinCtrl" expanded="0">
+ <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="initial">0</property>
+ <property name="max">31</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min">0</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">spinLOSS_LIN_TXPAD_TRF</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">wxSP_ARROW_KEYS</property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="value">0</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="OnSpinCtrl">ParameterChangeHandler</event>
+ <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+ <event name="OnTextEnter"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">LOSS_MAIN_TXPAD</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_staticText357</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxSpinCtrl" expanded="0">
+ <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="initial">0</property>
+ <property name="max">31</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min">0</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">spinLOSS_MAIN_TXPAD_TRF</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">wxSP_ARROW_KEYS</property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="value">0</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="OnSpinCtrl">ParameterChangeHandler</event>
+ <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+ <event name="OnTextEnter"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxCheckBox" expanded="0">
+ <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="checked">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">Bypass LPFS5 low pass real-pole filter capacitor banks</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">chkR5_LPF_BYP_TBB</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="OnCheckBox"></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 class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxStaticBoxSizer" expanded="0">
+ <property name="id">wxID_ANY</property>
+ <property name="label">RX</property>
+ <property name="minimum_size"></property>
+ <property name="name">sbSizer138</property>
+ <property name="orient">wxVERTICAL</property>
+ <property name="permission">none</property>
+ <event name="OnUpdateUI"></event>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">1</property>
+ <object class="wxFlexGridSizer" expanded="0">
+ <property name="cols">2</property>
+ <property name="flexible_direction">wxBOTH</property>
+ <property name="growablecols"></property>
+ <property name="growablerows"></property>
+ <property name="hgap">0</property>
+ <property name="minimum_size"></property>
+ <property name="name">fgSizer255</property>
+ <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+ <property name="permission">none</property>
+ <property name="rows">0</property>
+ <property name="vgap">0</property>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">C_CTL_PGA_RBB</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_staticText358</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="0">
+ <property name="border">5</property>
+ <property name="flag"></property>
+ <property name="proportion">0</property>
+ <object class="wxSpinCtrl" expanded="0">
+ <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="initial">2</property>
+ <property name="max">255</property>
+ <property name="max_size"></property>
+ <property name="maximize_button">0</property>
+ <property name="maximum_size"></property>
+ <property name="min">0</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">spinC_CTL_PGA_RBB</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">wxSP_ARROW_KEYS</property>
+ <property name="subclass"></property>
+ <property name="toolbar_pane">0</property>
+ <property name="tooltip"></property>
+ <property name="value">2</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="OnSpinCtrl">ParameterChangeHandler</event>
+ <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+ <event name="OnTextEnter"></event>
+ <event name="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">G_PGA_RBB</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_staticText359</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">cmbG_PGA_RBB</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="selection">-1</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="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">G_LNA</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_staticText360</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" expanded="0">
+ <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">cmbG_LNA_RFE</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="selection">-1</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="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ <object class="sizeritem" expanded="0">
+ <property name="border">5</property>
+ <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+ <property name="proportion">0</property>
+ <object class="wxStaticText" expanded="0">
+ <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">G_TIA</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_staticText361</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="0">
+ <property name="border">5</property>
+ <property name="flag">wxEXPAND</property>
+ <property name="proportion">0</property>
+ <object class="wxComboBox" 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">cmbG_TIA_RFE</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="selection">-1</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="OnCombobox">ParameterChangeHandler</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="OnUpdateUI"></event>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
</object>
</wxFormBuilder_Project>
diff --git a/src/lms7002_wxgui/lms7002_wxgui.h b/src/lms7002_wxgui/lms7002_wxgui.h
index b2fd8c3..4ddaca1 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.h
+++ b/src/lms7002_wxgui/lms7002_wxgui.h
@@ -1078,6 +1078,7 @@ class pnlCLKGEN_view : public wxPanel
NumericSlider* cmbIOFFSET_CP_CGEN;
wxStaticText* ID_STATICTEXT17;
NumericSlider* cmbIPULSE_CP_CGEN;
+ wxFlexGridSizer* sizerR3;
// Virtual event handlers, overide them in your derived class
virtual void ParameterChangeHandler( wxCommandEvent& event ) { event.Skip(); }
@@ -1218,6 +1219,7 @@ class pnlSX_view : public wxPanel
wxComboBox* cmbRSEL_LDO_VCO;
wxStaticText* ID_STATICTEXT12;
wxComboBox* cmbIOFFSET_CP;
+ wxFlexGridSizer* sizerR3;
// Virtual event handlers, overide them in your derived class
virtual void ParameterChangeHandler( wxCommandEvent& event ) { event.Skip(); }
@@ -2232,4 +2234,61 @@ class dlgVCOfrequencies : public wxDialog
};
+///////////////////////////////////////////////////////////////////////////////
+/// Class pnlR3
+///////////////////////////////////////////////////////////////////////////////
+class pnlR3 : public wxPanel
+{
+ private:
+
+ protected:
+ wxStaticText* m_staticText345;
+ wxComboBox* cmbFCLK1_DLY;
+ wxStaticText* m_staticText3451;
+ wxComboBox* cmbFCLK2_DLY;
+ wxStaticText* m_staticText3452;
+ wxComboBox* cmbMCLK1_DLY;
+ wxStaticText* m_staticText34521;
+ wxComboBox* cmbMCLK1_DLY1;
+ wxCheckBox* chkMCLK1_INV;
+ wxCheckBox* chkMCLK2_INV;
+ wxCheckBox* chkLML1_TRXIQPULSE;
+ wxCheckBox* chkLML2_TRXIQPULSE;
+ wxCheckBox* chkLML1_SISODDR;
+ wxCheckBox* chkLML2_SISODDR;
+ wxStaticText* m_staticText352;
+ wxComboBox* m_comboBox143;
+ wxStaticText* m_staticText353;
+ wxComboBox* cmbHBD_DLY;
+ wxStaticText* m_staticText362;
+ wxComboBox* cmbISINK_SPIBUFF;
+ wxCheckBox* chkTRX_GAIN_SRC;
+ wxStaticText* m_staticText355;
+ wxSpinCtrl* spinCG_IAMP_TBB;
+ wxStaticText* m_staticText356;
+ wxSpinCtrl* spinLOSS_LIN_TXPAD_TRF;
+ wxStaticText* m_staticText357;
+ wxSpinCtrl* spinLOSS_MAIN_TXPAD_TRF;
+ wxCheckBox* chkR5_LPF_BYP_TBB;
+ wxStaticText* m_staticText358;
+ wxSpinCtrl* spinC_CTL_PGA_RBB;
+ wxStaticText* m_staticText359;
+ wxComboBox* cmbG_PGA_RBB;
+ wxStaticText* m_staticText360;
+ wxComboBox* cmbG_LNA_RFE;
+ wxStaticText* m_staticText361;
+ wxComboBox* cmbG_TIA_RFE;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void ParameterChangeHandler( wxCommandEvent& event ) = 0;
+ virtual void ParameterChangeHandler( wxSpinEvent& event ) = 0;
+
+
+ public:
+
+ pnlR3( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~pnlR3();
+
+};
+
#endif //__LMS7002_WXGUI_H__
diff --git a/src/lms7002_wxgui/pnlBoardControls.cpp b/src/lms7002_wxgui/pnlBoardControls.cpp
index 07cf86c..b2f7b1d 100644
--- a/src/lms7002_wxgui/pnlBoardControls.cpp
+++ b/src/lms7002_wxgui/pnlBoardControls.cpp
@@ -8,7 +8,7 @@
#include <wx/wx.h>
#endif //WX_PRECOMP
-
+#include "pnlUltimateEVB.h"
#include "pnluLimeSDR.h"
#include "pnlLimeSDR.h"
#include <IConnection.h>
@@ -153,61 +153,57 @@ pnlBoardControls::pnlBoardControls(wxWindow* parent, wxWindowID id, const wxStri
fgSizer247->Add(pnlCustomControls, 1, wxEXPAND, 5);
- wxFlexGridSizer* fgSizer249;
- fgSizer249 = new wxFlexGridSizer( 0, 2, 5, 5 );
- fgSizer249->AddGrowableCol( 0 );
- fgSizer249->AddGrowableCol( 1 );
- fgSizer249->SetFlexibleDirection( wxBOTH );
- fgSizer249->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ wxFlexGridSizer* fgSizer249;
+ fgSizer249 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer249->AddGrowableCol( 0 );
+ fgSizer249->AddGrowableCol( 1 );
+ fgSizer249->SetFlexibleDirection( wxBOTH );
+ fgSizer249->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- wxStaticBoxSizer* sbSizer133;
- sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Read") ), wxVERTICAL );
+ wxStaticBoxSizer* sbSizer133;
+ sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Read") ), wxVERTICAL );
- sizerAnalogRd = new wxFlexGridSizer( 0, 4, 2, 2 );
- sizerAnalogRd->SetFlexibleDirection( wxBOTH );
- sizerAnalogRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ sizerAnalogRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+ sizerAnalogRd->SetFlexibleDirection( wxBOTH );
+ sizerAnalogRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Ch.")), 1, wxALL, 5);
sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Value")), 1, wxALL, 5);
sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Units")), 1, wxALL, 5);
-
- sbSizer133->Add( sizerAnalogRd, 1, wxEXPAND, 5 );
+ sbSizer133->Add( sizerAnalogRd, 1, wxEXPAND, 5 );
- fgSizer249->Add( sbSizer133, 1, wxEXPAND, 5 );
+ fgSizer249->Add( sbSizer133, 1, wxEXPAND, 5 );
- wxStaticBoxSizer* sbSizer134;
- sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Write") ), wxVERTICAL );
+ wxStaticBoxSizer* sbSizer134;
+ sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Write") ), wxVERTICAL );
- sizerAnalogWr = new wxFlexGridSizer( 0, 4, 2, 2 );
- sizerAnalogWr->SetFlexibleDirection( wxBOTH );
- sizerAnalogWr->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ sizerAnalogWr = new wxFlexGridSizer( 0, 4, 2, 2 );
+ sizerAnalogWr->SetFlexibleDirection( wxBOTH );
+ sizerAnalogWr->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- sbSizer134->Add( sizerAnalogWr, 1, wxEXPAND, 5 );
+ sbSizer134->Add( sizerAnalogWr, 1, wxEXPAND, 5 );
sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Ch.")), 1, wxALL, 5);
sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Value")), 1, wxALL, 5);
sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Units")), 1, wxALL, 5);
+ fgSizer249->Add( sbSizer134, 1, wxEXPAND, 5 );
- fgSizer249->Add( sbSizer134, 1, wxEXPAND, 5 );
-
-
- fgSizer247->Add( fgSizer249, 1, wxEXPAND, 5 );
+ fgSizer247->Add( fgSizer249, 1, wxEXPAND, 5 );
sizerAdditionalControls = new wxFlexGridSizer(0, 1, 0, 0);
fgSizer247->Add(sizerAdditionalControls, 1, wxEXPAND, 5);
-
- this->SetSizer( fgSizer247 );
- this->Layout();
- fgSizer247->Fit( this );
+ this->SetSizer( fgSizer247 );
+ this->Layout();
+ fgSizer247->Fit( this );
// Connect Events
cmbBoardSelection->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(pnlBoardControls::OnUserChangedBoardType), NULL, this);
- btnReadAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
- btnWriteAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
+ btnReadAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
+ btnWriteAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
SetupControls(GetDeviceName(LMS_DEV_UNKNOWN));
}
@@ -318,7 +314,7 @@ void pnlBoardControls::UpdatePanel()
{
mADC_GUI_widgets[i]->channel->SetLabel(wxString::Format(_("%i"), mADCparameters[i].channel));
mADC_GUI_widgets[i]->title->SetLabel(wxString(mADCparameters[i].name));
- mADC_GUI_widgets[i]->value->SetLabel(wxString::Format(_("%i"), mADCparameters[i].value));
+ mADC_GUI_widgets[i]->value->SetLabel(wxString::Format(_("%1.0f"), mADCparameters[i].value));
mADC_GUI_widgets[i]->units->SetLabelText(wxString::Format("%s", mADCparameters[i].units));
}
@@ -336,23 +332,13 @@ std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::getBoardADCs(const stri
std::vector<ADC_DAC> paramList;
if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
|| boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE)
- || boardID == GetDeviceName(LMS_DEV_QSPARK))
+ || boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
+ || boardID == GetDeviceName(LMS_DEV_LIMESDR_USB_SP)
+ || boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
{
- ADC_DAC dacVoltage;
- dacVoltage.name = "DAC";
- dacVoltage.channel = 0;
- dacVoltage.powerOf10 = 0;
- dacVoltage.units = adcUnits2string(RAW);
- dacVoltage.value = 0;
- paramList.push_back(dacVoltage);
- ADC_DAC temperature;
- temperature.name = "Temperature";
- temperature.channel = 1;
- temperature.powerOf10 = 0;
- temperature.units = adcUnits2string(TEMPERATURE);
- temperature.value = 0;
- paramList.push_back(temperature);
+ paramList.push_back(ADC_DAC{"DAC", 0, 0, adcUnits2string(RAW)});
+ paramList.push_back(ADC_DAC{"Board Temperature", 0, 1, adcUnits2string(TEMPERATURE)});
}
return paramList;
}
@@ -362,7 +348,9 @@ std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::getBoardDACs(const std:
std::vector<ADC_DAC> paramList;
if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
|| boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE)
- || boardID == GetDeviceName(LMS_DEV_QSPARK))
+ || boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
+ || boardID == GetDeviceName(LMS_DEV_LIMESDR_USB_SP)
+ || boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
{
ADC_DAC dacVoltage;
dacVoltage.name = "DAC";
@@ -452,13 +440,21 @@ void pnlBoardControls::SetupControls(const std::string &boardID)
additionalControls = pnl;
sizerAdditionalControls->Add(additionalControls);
}
- else if(boardID == GetDeviceName(LMS_DEV_LIMESDR) || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE))
+ else if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
+ || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE))
{
pnlLimeSDR* pnl = new pnlLimeSDR(this, wxNewId());
pnl->Initialize(lmsControl);
additionalControls = pnl;
sizerAdditionalControls->Add(additionalControls);
}
+ else if(boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
+ {
+ pnlUltimateEVB* pnl = new pnlUltimateEVB(this, wxNewId());
+ pnl->Initialize(lmsControl);
+ additionalControls = pnl;
+ sizerAdditionalControls->Add(additionalControls);
+ }
Layout();
Fit();
@@ -518,7 +514,8 @@ void pnlBoardControls::OnCustomRead(wxCommandEvent& event)
}
txtCustomUnitsRd->SetLabel(units);
- txtCustomValueRd->SetLabel(wxString::Format(_("%f"), value));
+ txtCustomValueRd->SetLabel(wxString::Format(_("%1.1f"), value));
+
}
void pnlBoardControls::OnCustomWrite(wxCommandEvent& event)
diff --git a/src/lms7002_wxgui/pnlBoardControls.h b/src/lms7002_wxgui/pnlBoardControls.h
index 7120170..2ba8888 100644
--- a/src/lms7002_wxgui/pnlBoardControls.h
+++ b/src/lms7002_wxgui/pnlBoardControls.h
@@ -33,7 +33,7 @@ class pnlBoardControls : public wxFrame
struct ADC_DAC
{
std::string name;
- int16_t value;
+ double value;
uint8_t channel;
std::string units;
int8_t powerOf10;
diff --git a/src/lms7002m/CalibrationCache.cpp b/src/lms7002m/CalibrationCache.cpp
index 6030f6e..a63e1c0 100644
--- a/src/lms7002m/CalibrationCache.cpp
+++ b/src/lms7002m/CalibrationCache.cpp
@@ -1,5 +1,6 @@
#include "CalibrationCache.h"
#include "ErrorReporting.h"
+#include "SystemResources.h"
#include <fstream>
#include <sstream>
#include <iostream>
@@ -10,13 +11,11 @@
#include <cmath>
#ifndef __unix__
#include <Windows.h>
- #include <Shlobj.h>
#endif
using namespace std;
using namespace lime;
std::string CalibrationCache::cachePath = "";
-static const char* limeSuiteDirName = ".limesuite";
static const char* cacheFilename = "LMS7002M_cache_values.db";
int CalibrationCache::instanceCount = 0;
@@ -32,26 +31,8 @@ CalibrationCache::CalibrationCache()
{
if(instanceCount == 0)
{
- std::string limeSuiteDir;
- std::string homeDir;
-#ifdef __unix__
- homeDir = getenv("HOME");
- //check if HOME variable is set
- if (homeDir.size() == 0)
- {
- printf("HOME variable is not set\n");
- homeDir = "/tmp"; //home not defined move to temp
- }
-#else
- CHAR path[MAX_PATH];
- if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, path)) != S_OK)
- {
- printf("HOME variable is not set\n");
- GetTempPathA(MAX_PATH, path); //home not defined move to temp
- }
- homeDir = path;
-#endif
- limeSuiteDir = homeDir + "/" + limeSuiteDirName;
+ std::string limeSuiteDir = lime::getConfigDirectory();
+
//check if limesuite directory exists
struct stat info;
if( stat( limeSuiteDir.c_str(), &info ) != 0 )
diff --git a/src/lms7002m/LMS7002M.cpp b/src/lms7002m/LMS7002M.cpp
index d813222..39a8e69 100644
--- a/src/lms7002m/LMS7002M.cpp
+++ b/src/lms7002m/LMS7002M.cpp
@@ -37,7 +37,7 @@ using namespace lime;
#include "MCU_BD.h"
float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800e6, 5222e6 }, { 4961e6, 6754e6 }, {6306e6, 7714e6} };
-float_type LMS7002M::gCGEN_VCO_frequencies[2] = {1950e6, 2700e6};
+float_type LMS7002M::gCGEN_VCO_frequencies[2] = {1950e6, 2900e6};
///define for parameter enumeration if prefix might be needed
extern std::vector<const LMS7Parameter*> LMS7parameterList;
@@ -1028,9 +1028,9 @@ float_type LMS7002M::GetReferenceClk_SX(bool tx)
*/
float_type LMS7002M::GetFrequencyCGEN()
{
- float_type dMul = (GetReferenceClk_SX(Rx)/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN
- uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers
- uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0);
+ float_type dMul = (GetReferenceClk_SX(Rx)/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), true)+1); //DIV_OUTCH_CGEN
+ uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0, true); //read whole register to reduce SPI transfers
+ uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0, true);
return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0));
}
@@ -1175,7 +1175,7 @@ bool LMS7002M::GetSXLocked(bool tx)
@return 0-success, other-failure
*/
int LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT
-{
+{
auto settlingTime = chrono::microseconds(50); //can be lower
struct CSWInteval
{
diff --git a/src/lms7002m/LMS7002M_RegistersMap.cpp b/src/lms7002m/LMS7002M_RegistersMap.cpp
index 96586ee..681f82b 100644
--- a/src/lms7002m/LMS7002M_RegistersMap.cpp
+++ b/src/lms7002m/LMS7002M_RegistersMap.cpp
@@ -56,11 +56,13 @@ void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, co
uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const
{
- const std::map<const uint16_t, Register> *regMap;
+ const std::map<const uint16_t, Register> *regMap(nullptr);
if(channel == 0)
regMap = &mChannelA;
else if(channel == 1)
regMap = &mChannelB;
+ else
+ return 0;
std::map<const uint16_t, Register>::const_iterator iter;
iter = regMap->find(address);
if (iter != regMap->end())
diff --git a/src/lms7002m/LMS7002M_RxTxCalibrations.cpp b/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
index af93069..f76e4bd 100644
--- a/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
+++ b/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
@@ -503,6 +503,8 @@ int LMS7002M::CalibrateTxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
Modify_SPI_Reg_bits(LMS7param(GFIR2_BYP_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4); //Decimation HBD ratio
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
//CDS
Modify_SPI_Reg_bits(LMS7param(CDS_TXATSP), 3);
@@ -868,7 +870,7 @@ int LMS7002M::CalibrateTx(float_type bandwidth_Hz, bool useExtLoopback)
uint16_t gcorri, gcorrq;
int16_t dccorri, dccorrq, phaseOffset;
- bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && info.hardwareVersion == "3");
+ bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && std::stoi(info.hardwareVersion) >= 3);
const char* methodName;
if(useExtLoopback)
{
@@ -1254,6 +1256,8 @@ int LMS7002M::CalibrateRxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0);
}
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
//CDS
Modify_SPI_Reg_bits(LMS7param(CDS_TXATSP), 3);
@@ -1345,6 +1349,8 @@ int LMS7002M::CalibrateRxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
*/
int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
{
+ if(controlPort == nullptr)
+ return ReportError(ENODEV, "Device not connected");
#ifdef __cplusplus
auto beginTime = std::chrono::high_resolution_clock::now();
#endif
@@ -1361,7 +1367,7 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
}
#endif // ENABLE_CALIBRATION_USING_FFT
DeviceInfo info = controlPort->GetDeviceInfo();
- bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && info.hardwareVersion == "3");
+ bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && std::stoi(info.hardwareVersion) >= 3);
int status;
verbose_printf(cSquaresLine);
verbose_printf("Rx calibration using %s %s %s loopback\n",
@@ -1390,11 +1396,11 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
Get_SPI_Reg_bits(LMS7param(G_LNA_RFE)),
Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)));
- int16_t dcoffi;
- int16_t dcoffq;
- uint16_t gcorri;
- uint16_t gcorrq;
- int16_t phaseOffset;
+ int16_t dcoffi(0);
+ int16_t dcoffq(0);
+ uint16_t gcorri(0);
+ uint16_t gcorrq(0);
+ int16_t phaseOffset(0);
if(useCache)
{
@@ -1520,7 +1526,10 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
CheckSaturationRx(bandwidth_Hz, useExtLoopback);
- Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
+ else
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 0);
SetNCOFrequency(LMS7002M::Rx, 0, bandwidth_Hz/calibUserBwDivider + offsetNCO);
@@ -1630,7 +1639,10 @@ void LMS7002M::RestoreAllRegisters()
int LMS7002M::CheckSaturationRx(const float_type bandwidth_Hz, const bool useExtLoopback)
{
- Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
+ else
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 0);
SetNCOFrequency(LMS7002M::Rx, 0, bandwidth_Hz / calibUserBwDivider - offsetNCO);
@@ -1711,7 +1723,7 @@ void LMS7002M::GridSearch(GridSearchParam* args)
const uint16_t DCOFFaddr = 0x010E;
const bool rxDC = (args->a.param.address == DCOFFaddr || args->b.param.address == DCOFFaddr);
uint32_t rssi, minRSSI = ~0;
- int16_t minI, minQ, i, q;
+ int16_t minI(0), minQ(0), i, q;
for(i=args->a.minValue; i<=args->a.maxValue; ++i)
{
diff --git a/src/lms7002m/LMS7002M_filtersCalibration.cpp b/src/lms7002m/LMS7002M_filtersCalibration.cpp
index cf57b9c..d6aa34a 100644
--- a/src/lms7002m/LMS7002M_filtersCalibration.cpp
+++ b/src/lms7002m/LMS7002M_filtersCalibration.cpp
@@ -681,6 +681,8 @@ int LMS7002M::TuneRxFilterSetup(const float_type rx_lpf_IF)
Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 0);
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
SetNCOFrequency(LMS7002M::Rx, 0, 0);
if(ch == 2)
@@ -833,6 +835,8 @@ int LMS7002M::TuneTxFilterSetup(const float_type tx_lpf_IF)
Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
if(tx_lpf_IF <= TxLPF_RF_LimitLowMid/2)
{
@@ -945,6 +949,8 @@ int LMS7002M::TuneTxFilterFixedSetup()
Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
+ if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+ Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
const float_type rxNCO_freqs[] = {0, 4.4e6, 2.4e6, 4.9e6, 7.4e6, 9.9e6};
for(int i=0; i<6; ++i)
diff --git a/src/lms7002m/LMS7002M_parameters.cpp b/src/lms7002m/LMS7002M_parameters.cpp
index 88b2b7a..440d552 100644
--- a/src/lms7002m/LMS7002M_parameters.cpp
+++ b/src/lms7002m/LMS7002M_parameters.cpp
@@ -559,7 +559,6 @@ std::vector<const LMS7Parameter*> LMS7parameterList =
&LMS7_HBD_OVR_RXTSP,
&LMS7_IQCORR_RXTSP,
&LMS7_HBD_DLY,
-&LMS7_DCLOOP_BYP,
&LMS7_DCCORR_AVG_RXTSP,
&LMS7_GFIR1_L_RXTSP,
&LMS7_GFIR1_N_RXTSP,
@@ -586,5 +585,155 @@ std::vector<const LMS7Parameter*> LMS7parameterList =
&LMS7_CAPD,
&LMS7_DTHBIT_RX,
&LMS7_SEL_RX,
-&LMS7_MODE_RX
+&LMS7_MODE_RX,
+&LMS7_TRX_GAIN_SRC,
+&LMS7_DCMODE,
+&LMS7_PD_DCDAC_RXB,
+&LMS7_PD_DCDAC_RXA,
+&LMS7_PD_DCDAC_TXB,
+&LMS7_PD_DCDAC_TXA,
+&LMS7_PD_DCCMP_RXB,
+&LMS7_PD_DCCMP_RXA,
+&LMS7_PD_DCCMP_TXB,
+&LMS7_PD_DCCMP_TXA,
+&LMS7_DCCAL_CALSTATUS,
+&LMS7_DCCAL_CMPSTATUS,
+&LMS7_DCCAL_CMPCFG,
+&LMS7_DCCAL_START,
+&LMS7_DCWR_TXAI,
+&LMS7_DCRD_TXAI,
+&LMS7_DC_TXAI,
+&LMS7_DCWR_TXAQ,
+&LMS7_DCRD_TXAQ,
+&LMS7_DC_TXAQ,
+&LMS7_DCWR_TXBI,
+&LMS7_DCRD_TXBI,
+&LMS7_DC_TXBI,
+&LMS7_DCWR_TXBQ,
+&LMS7_DCRD_TXBQ,
+&LMS7_DC_TXBQ,
+&LMS7_DCWR_RXAI,
+&LMS7_DCRD_RXAI,
+&LMS7_DC_RXAI,
+&LMS7_DCWR_RXAQ,
+&LMS7_DCRD_RXAQ,
+&LMS7_DC_RXAQ,
+&LMS7_DCWR_RXBI,
+&LMS7_DCRD_RXBI,
+&LMS7_DC_RXBI,
+&LMS7_DCWR_RXBQ,
+&LMS7_DCRD_RXBQ,
+&LMS7_DC_RXBQ,
+&LMS7_DC_RXCDIV,
+&LMS7_DC_TXCDIV,
+&LMS7_HYSCMP_RXB,
+&LMS7_HYSCMP_RXA,
+&LMS7_HYSCMP_TXB,
+&LMS7_HYSCMP_TXA,
+&LMS7_DAC_CLKDIV,
+&LMS7_RSSI_RSSIMODE,
+&LMS7_RSSI_PD,
+&LMS7_RSSI_CMPSTATUS,
+&LMS7_RSSI_BIAS,
+&LMS7_RSSI_HYSCMP,
+&LMS7_RSSI_CMPCFG,
+&LMS7_RSSI_DAC_VAL,
+&LMS7_RSSI_PDET2_VAL,
+&LMS7_RSSI_PDET1_VAL,
+&LMS7_RSSI_RSSI2_VAL,
+&LMS7_RSSI_RSSI1_VAL,
+&LMS7_RSSI_TREF_VAL,
+&LMS7_RSSI_TVPTAT_VAL,
+&LMS7_RSSIDC_CMPSTATUS,
+&LMS7_RSSIDC_RSEL,
+&LMS7_RSSIDC_HYSCMP,
+&LMS7_RSSIDC_PD,
+&LMS7_RSSIDC_DCO2,
+&LMS7_RSSIDC_DCO1,
+&LMS7_LML2_TRXIQPULSE,
+&LMS7_LML2_SISODDR,
+&LMS7_LML1_TRXIQPULSE,
+&LMS7_LML1_SISODDR,
+&LMS7_MCLK2_DLY,
+&LMS7_MCLK1_DLY,
+&LMS7_MCLK2_INV,
+&LMS7_MCLK1_INV,
+&LMS7_CMIX_GAIN_TXTSP_R3,
+&LMS7_CMIX_GAIN_RXTSP_R3,
+&LMS7_R5_LPF_BYP_TBB,
+&LMS7_CG_IAMP_TBB_R3,
+&LMS7_LOSS_LIN_TXPAD_R3,
+&LMS7_LOSS_MAIN_TXPAD_R3,
+&LMS7_C_CTL_PGA_RBB_R3,
+&LMS7_G_PGA_RBB_R3,
+&LMS7_G_LNA_RFE_R3,
+&LMS7_G_TIA_RFE_R3,
+&LMS7_RZ_CTRL,
+&LMS7_CMPLO_CTRL_SX,
+&LMS7_CMPLO_CTRL_CGEN_R3,
+&LMS7_ISINK_SPIBUFF,
+&LMS7_DCMODE,
+&LMS7_PD_DCDAC_RXB,
+&LMS7_PD_DCDAC_RXA,
+&LMS7_PD_DCDAC_TXB,
+&LMS7_PD_DCDAC_TXA,
+&LMS7_PD_DCCMP_RXB,
+&LMS7_PD_DCCMP_RXA,
+&LMS7_PD_DCCMP_TXB,
+&LMS7_PD_DCCMP_TXA,
+&LMS7_DCCAL_CALSTATUS,
+&LMS7_DCCAL_CMPSTATUS,
+&LMS7_DCCAL_CMPCFG,
+&LMS7_DCCAL_START,
+&LMS7_DCWR_TXAI,
+&LMS7_DCRD_TXAI,
+&LMS7_DC_TXAI,
+&LMS7_DCWR_TXAQ,
+&LMS7_DCRD_TXAQ,
+&LMS7_DC_TXAQ,
+&LMS7_DCWR_TXBI,
+&LMS7_DCRD_TXBI,
+&LMS7_DC_TXBI,
+&LMS7_DCWR_TXBQ,
+&LMS7_DCRD_TXBQ,
+&LMS7_DC_TXBQ,
+&LMS7_DCWR_RXAI,
+&LMS7_DCRD_RXAI,
+&LMS7_DC_RXAI,
+&LMS7_DCWR_RXAQ,
+&LMS7_DCRD_RXAQ,
+&LMS7_DC_RXAQ,
+&LMS7_DCWR_RXBI,
+&LMS7_DCRD_RXBI,
+&LMS7_DC_RXBI,
+&LMS7_DCWR_RXBQ,
+&LMS7_DCRD_RXBQ,
+&LMS7_DC_RXBQ,
+&LMS7_DC_RXCDIV,
+&LMS7_DC_TXCDIV,
+&LMS7_HYSCMP_RXB,
+&LMS7_HYSCMP_RXA,
+&LMS7_HYSCMP_TXB,
+&LMS7_HYSCMP_TXA,
+&LMS7_DAC_CLKDIV,
+&LMS7_RSSI_RSSIMODE,
+&LMS7_RSSI_PD,
+&LMS7_RSSI_CMPSTATUS,
+&LMS7_RSSI_BIAS,
+&LMS7_RSSI_HYSCMP,
+&LMS7_RSSI_CMPCFG,
+&LMS7_RSSI_DAC_VAL,
+&LMS7_RSSI_PDET2_VAL,
+&LMS7_RSSI_PDET1_VAL,
+&LMS7_RSSI_RSSI2_VAL,
+&LMS7_RSSI_RSSI1_VAL,
+&LMS7_RSSI_TREF_VAL,
+&LMS7_RSSI_TVPTAT_VAL,
+&LMS7_RSSIDC_CMPSTATUS,
+&LMS7_RSSIDC_RSEL,
+&LMS7_RSSIDC_HYSCMP,
+&LMS7_RSSIDC_PD,
+&LMS7_RSSIDC_DCO2,
+&LMS7_RSSIDC_DCO1,
+&LMS7_DCLOOP_STOP,
};
diff --git a/src/lms7002m/LMS7002M_parameters.h b/src/lms7002m/LMS7002M_parameters.h
index fb8a2b8..2ba2cbf 100644
--- a/src/lms7002m/LMS7002M_parameters.h
+++ b/src/lms7002m/LMS7002M_parameters.h
@@ -24,7 +24,7 @@ struct LMS7Parameter
const char* tooltip;
};
-int LMS7ParameterCompare(LMS7Parameter a, LMS7Parameter b);
+int LMS7ParameterCompare(struct LMS7Parameter a, struct LMS7Parameter b);
static const struct LMS7Parameter LMS7_LRST_TX_B = { 0x0020, 15, 15, 1, "LRST_TX_B", "Resets all the logic registers to the default state for Tx MIMO channel B" };
static const struct LMS7Parameter LMS7_MRST_TX_B = { 0x0020, 14, 14, 1, "MRST_TX_B", "Resets all the configuration memory to the default state for Tx MIMO channel B" };
@@ -575,7 +575,7 @@ static const struct LMS7Parameter LMS7_MODE_TX = { 0x0240, 0, 0, 0, "MODE_TX", "
static const struct LMS7Parameter LMS7_PHO_TX = { 0x0241, 15, 0, 0, "PHO_TX", "" };
static const struct LMS7Parameter LMS7_CAPTURE = { 0x0400, 15, 15, 0, "CAPTURE", "" };
static const struct LMS7Parameter LMS7_CAPSEL = { 0x0400, 14, 13, 0, "CAPSEL", "" };
-static const struct LMS7Parameter LMS7_CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "" };
+static const struct LMS7Parameter LMS7_CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "Selects ADC value source to be captured" };
static const struct LMS7Parameter LMS7_TSGFC_RXTSP = { 0x0400, 9, 9, 0, "TSGFC_RXTSP", "TSG full scale control" };
static const struct LMS7Parameter LMS7_TSGFCW_RXTSP = { 0x0400, 8, 7, 1, "TSGFCW_RXTSP", "Set frequency of TSG's NCO" };
static const struct LMS7Parameter LMS7_TSGDCLDQ_RXTSP = { 0x0400, 6, 6, 0, "TSGDCLDQ_RXTSP", "" };
@@ -590,7 +590,6 @@ static const struct LMS7Parameter LMS7_GCORRI_RXTSP = { 0x0402, 10, 0, 2047, "GC
static const struct LMS7Parameter LMS7_HBD_OVR_RXTSP = { 0x0403, 14, 12, 0, "HBD_OVR_RXTSP", "HBD interpolation ratio. Interpolation ratio is 2HBD_OVR+1" };
static const struct LMS7Parameter LMS7_IQCORR_RXTSP = { 0x0403, 11, 0, 0, "IQCORR_RXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" };
static const struct LMS7Parameter LMS7_HBD_DLY = { 0x0404, 15, 13, 0, "HBD_DLY", "" };
-static const struct LMS7Parameter LMS7_DCLOOP_BYP = { 0x0404, 8, 8, 0, "DCLOOP_BYP", "" };
static const struct LMS7Parameter LMS7_DCCORR_AVG_RXTSP = { 0x0404, 2, 0, 0, "DCCORR_AVG_RXTSP", "Number of samples to average for Automatic DC corrector. Number of samples to average is 2DCCORR_AVG + 12" };
static const struct LMS7Parameter LMS7_GFIR1_L_RXTSP = { 0x0405, 10, 8, 0, "GFIR1_L_RXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" };
static const struct LMS7Parameter LMS7_GFIR1_N_RXTSP = { 0x0405, 7, 0, 0, "GFIR1_N_RXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" };
@@ -619,6 +618,97 @@ static const struct LMS7Parameter LMS7_DTHBIT_RX = { 0x0440, 8, 5, 1, "DTHBIT_RX
static const struct LMS7Parameter LMS7_SEL_RX = { 0x0440, 4, 1, 0, "SEL_RX", "" };
static const struct LMS7Parameter LMS7_MODE_RX = { 0x0440, 0, 0, 0, "MODE_RX", "" };
static const struct LMS7Parameter LMS7_PHO_RX = { 0x0441, 15, 0, 0, "PHO_RX", "" };
+static const struct LMS7Parameter LMS7_TRX_GAIN_SRC = { 0x0081, 15, 15, 0, "TRX_GAIN_SRC", "Alternative TRX gain source select" };
+
+static const struct LMS7Parameter LMS7_LML2_TRXIQPULSE = { 0x0022, 15, 15, 0, "LML2_TRXIQPULSE", "TRXIQPULSE mode selection for LML Port 2" };
+static const struct LMS7Parameter LMS7_LML2_SISODDR = { 0x0022, 14, 14, 0, "LML2_SISODDR", "SISODDR mode selection for LML Port 2" };
+static const struct LMS7Parameter LMS7_LML1_TRXIQPULSE = { 0x0022, 13, 13, 0, "LML1_TRXIQPULSE", "TRXIQPULSE mode selection for LML Port 1" };
+static const struct LMS7Parameter LMS7_LML1_SISODDR = { 0x0022, 12, 12, 0, "LML1_SISODDR", "SISODDR mode selection for LML Port 1" };
+static const struct LMS7Parameter LMS7_MCLK2_DLY = { 0x002B, 13, 12, 0, "MCLK2_DLY", "MCLK2 clock internal delay." };
+static const struct LMS7Parameter LMS7_MCLK1_DLY = { 0x002B, 11, 10, 0, "MCLK1_DLY", "MCLK1 clock internal delay." };
+static const struct LMS7Parameter LMS7_MCLK2_INV = { 0x002B, 9, 9, 0, "MCLK2_INV", "MCLK2 clock inversion." };
+static const struct LMS7Parameter LMS7_MCLK1_INV = { 0x002B, 8, 8, 0, "MCLK1_INV", "MCLK1 clock inversion." };
+
+static const struct LMS7Parameter LMS7_CMIX_GAIN_TXTSP_R3 = { 0x0208, 12, 12, 0, "CMIX_GAIN_TXTSP_R3", "Gain of CMIX output, most significant part" };
+static const struct LMS7Parameter LMS7_CMIX_GAIN_RXTSP_R3 = { 0x040C, 12, 12, 0, "CMIX_GAIN_RXTSP_R3", "Gain of CMIX output, most significant part" };
+static const struct LMS7Parameter LMS7_R5_LPF_BYP_TBB = { 0x010B, 0, 0, 0, "R5_LPF_BYP_TBB", "Bypasses LPFS5_TBB low pass real-pole filter capacitor banks" };
+static const struct LMS7Parameter LMS7_CG_IAMP_TBB_R3 = { 0x0125, 15, 10, 37, "CG_IAMP_TBB_R3", ""};
+static const struct LMS7Parameter LMS7_LOSS_LIN_TXPAD_R3 = { 0x0125, 9, 5, 0, "LOSS_LIN_TXPAD_R3", ""};
+static const struct LMS7Parameter LMS7_LOSS_MAIN_TXPAD_R3 = { 0x0125, 4, 0, 0, "LOSS_MAIN_TXPAD_R3", ""};
+static const struct LMS7Parameter LMS7_C_CTL_PGA_RBB_R3 = { 0x0126, 12, 11, 2, "C_CTL_PGA_RBB_R3", ""};
+static const struct LMS7Parameter LMS7_G_PGA_RBB_R3 = { 0x0126, 10, 6, 11, "G_PGA_RBB_R3", ""};
+static const struct LMS7Parameter LMS7_G_LNA_RFE_R3 = { 0x0126, 5, 2, 15, "G_LNA_RFE_R3", ""};
+static const struct LMS7Parameter LMS7_G_TIA_RFE_R3 = { 0x0126, 1, 0, 3, "G_TIA_RFE_R3", ""};
+static const struct LMS7Parameter LMS7_RZ_CTRL = { 0x0122, 15, 14, 0, "RZ_CTRL", "Controls the PLL LPF zero resistor values"};
+static const struct LMS7Parameter LMS7_CMPLO_CTRL_SX = { 0x0122, 13, 13, 0, "CMPLO_CTRL_SX", "Controls the SXR/SXT PLL VCO comparator low treshold value"};
+static const struct LMS7Parameter LMS7_CMPLO_CTRL_CGEN_R3 = { 0x008B, 14, 14, 0, "CMPLO_CTRL_CGEN", "Controls the CGEN PLL VCO comparator low treshold value"};
+static const struct LMS7Parameter LMS7_ISINK_SPIBUFF = { 0x00A6, 15, 13, 0, "ISINK_SPI_BUFF", "Controls the SPIBUF LDO output resistive load"};
+
+static const struct LMS7Parameter LMS7_DCMODE = { 0x05C0, 15, 15, 0, "DCMODE", "DC calibration mode" };
+static const struct LMS7Parameter LMS7_PD_DCDAC_RXB = { 0x05C0, 7, 7, 0, "PD_DCDAC_RXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_RXA = { 0x05C0, 6, 6, 0, "PD_DCDAC_RXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_TXB = { 0x05C0, 5, 5, 0, "PD_DCDAC_TXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_TXA = { 0x05C0, 4, 4, 0, "PD_DCDAC_TXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_RXB = { 0x05C0, 3, 3, 0, "PD_DCCMP_RXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_RXA = { 0x05C0, 2, 2, 0, "PD_DCCMP_RXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_TXB = { 0x05C0, 1, 1, 0, "PD_DCCMP_TXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_TXA = { 0x05C0, 0, 0, 0, "PD_DCCMP_TXA", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CALSTATUS = { 0x05C1, 15, 8, 0, "DCCAL_CALSTATUS", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CMPSTATUS = { 0x05C1, 7, 0, 0, "DCCAL_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CMPCFG = { 0x05C2, 15, 8, 0, "DCCAL_CMPCFG", ""};
+static const struct LMS7Parameter LMS7_DCCAL_START = { 0x05C2, 7, 0, 0, "DCCAL_START", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXAI = { 0x05C3, 15, 15, 0, "DCWR_TXAI", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXAI = { 0x05C3, 14, 14, 0, "DCRD_TXAI", ""};
+static const struct LMS7Parameter LMS7_DC_TXAI = { 0x05C3, 10, 0, 0, "DC_TXAI", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXAQ = { 0x05C4, 15, 15, 0, "DCWR_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXAQ = { 0x05C4, 14, 14, 0, "DCRD_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DC_TXAQ = { 0x05C4, 10, 0, 0, "DC_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXBI = { 0x05C5, 15, 15, 0, "DCWR_TXBI", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXBI = { 0x05C5, 14, 14, 0, "DCRD_TXBI", ""};
+static const struct LMS7Parameter LMS7_DC_TXBI = { 0x05C5, 10, 0, 0, "DC_TXBI", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXBQ = { 0x05C6, 15, 15, 0, "DCWR_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXBQ = { 0x05C6, 14, 14, 0, "DCRD_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_TXBQ = { 0x05C6, 10, 0, 0, "DC_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXAI = { 0x05C7, 15, 15, 0, "DCWR_RXAI", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXAI = { 0x05C7, 14, 14, 0, "DCRD_RXAI", ""};
+static const struct LMS7Parameter LMS7_DC_RXAI = { 0x05C7, 10, 0, 0, "DC_RXAI", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXAQ = { 0x05C8, 15, 15, 0, "DCWR_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXAQ = { 0x05C8, 14, 14, 0, "DCRD_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXAQ = { 0x05C8, 10, 0, 0, "DC_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXBI = { 0x05C9, 15, 15, 0, "DCWR_RXBI", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXBI = { 0x05C9, 14, 14, 0, "DCRD_RXBI", ""};
+static const struct LMS7Parameter LMS7_DC_RXBI = { 0x05C9, 10, 0, 0, "DC_RXBI", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXBQ = { 0x05CA, 15, 15, 0, "DCWR_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXBQ = { 0x05CA, 14, 14, 0, "DCRD_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXBQ = { 0x05CA, 10, 0, 0, "DC_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXCDIV = { 0x05CB, 15, 8, 0, "DC_RXCDIV", "Clock division ratio for Rx DC calibration loop"};
+static const struct LMS7Parameter LMS7_DC_TXCDIV = { 0x05CB, 7, 0, 0, "DC_TXCDIV", "Clock division ratio for Tx DC calibration loop"};
+static const struct LMS7Parameter LMS7_HYSCMP_RXB = { 0x05CC, 11, 9, 0, "HYSCMP_RXB", "Comparator hysteresis control, RXB channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_RXA = { 0x05CC, 8, 6, 0, "HYSCMP_RXA", "Comparator hysteresis control, RXA channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_TXB = { 0x05CC, 5, 3, 0, "HYSCMP_TXB", "Comparator hysteresis control, TXB channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_TXA = { 0x05CC, 2, 0, 0, "HYSCMP_TXA", "Comparator hysteresis control, TXA channel"};
+static const struct LMS7Parameter LMS7_DAC_CLKDIV = { 0x0600, 15, 8, 15, "DAC_CLKDIV", "Clock division ratio for measurement loop" };
+static const struct LMS7Parameter LMS7_RSSI_RSSIMODE = { 0x0600, 1, 1, 0, "RSSI_RSSIMODE", ""};
+static const struct LMS7Parameter LMS7_RSSI_PD = { 0x0600, 0, 0, 0, "RSSI_PD", ""};
+static const struct LMS7Parameter LMS7_RSSI_CMPSTATUS = { 0x0601, 5, 0, 0, "RSSI_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_RSSI_BIAS = { 0x0602, 13, 9, 1<<4, "RSSI_BIAS", "Controls the reference bias current of the test ADC"};
+static const struct LMS7Parameter LMS7_RSSI_HYSCMP = { 0x0602, 8, 6, 0, "RSSI_HYSCMP", "Comparator hysteresis control"};
+static const struct LMS7Parameter LMS7_RSSI_CMPCFG = { 0x0602, 5, 0, 0, "RSSI_CMPCFG", "Comparator configuration"};
+static const struct LMS7Parameter LMS7_RSSI_DAC_VAL = { 0x0603, 7, 0, 0, "RSSI_DAC_VAL", "Stores the value to be written to the DAC, when MODE = 1"};
+static const struct LMS7Parameter LMS7_RSSI_PDET2_VAL = { 0x0604, 15, 8, 0, "RSSI_PDET2_VAL", "Stores the value of Power Detector 2"};
+static const struct LMS7Parameter LMS7_RSSI_PDET1_VAL = { 0x0604, 7, 0, 0, "RSSI_PDET1_VAL", "Stores the value of Power Detector 1"};
+static const struct LMS7Parameter LMS7_RSSI_RSSI2_VAL = { 0x0605, 15, 8, 0, "RSSI_RSSI2_VAL", "Stores the value of RSSI 2"};
+static const struct LMS7Parameter LMS7_RSSI_RSSI1_VAL = { 0x0605, 7, 0, 0, "RSSI_RSSI1_VAL", "Stores the value of RSSI 1"};
+static const struct LMS7Parameter LMS7_RSSI_TREF_VAL = { 0x0606, 15, 8, 0, "RSSI_TREF_CAL", "Stores the temperature reference value"};
+static const struct LMS7Parameter LMS7_RSSI_TVPTAT_VAL = { 0x0606, 7, 0, 0, "RSSI_TVPTAT_VAL", "Stores the voltage proportional to absolute temperature value"};
+static const struct LMS7Parameter LMS7_RSSIDC_CMPSTATUS = { 0x0640, 15, 15, 0, "RSSIDC_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_RSSIDC_RSEL = { 0x0640, 8, 4, 10, "RSSIDC_RSEL", "Reference voltage for the RSSI output comparator"};
+static const struct LMS7Parameter LMS7_RSSIDC_HYSCMP = { 0x0640, 3, 1, 0, "RSSIDC_HYSCMP", ""};
+static const struct LMS7Parameter LMS7_RSSIDC_PD = { 0x0640, 0, 0, 0, "RSSIDC_PD", "Power down modules"};
+static const struct LMS7Parameter LMS7_RSSIDC_DCO2 = { 0x0641, 13, 7, 32, "RSSIDC_DCO2", "Value of RSSI offset DAC2"};
+static const struct LMS7Parameter LMS7_RSSIDC_DCO1 = { 0x0641, 6, 0, 32, "RSSIDC_DCO1", "Value of RSSI offset DAC1"};
+static const struct LMS7Parameter LMS7_DCLOOP_STOP = { 0x040C, 8, 8, 0, "DCLOOP_STOP", "RxDC tracking loop stop" };
+
//}
#ifdef __cplusplus
diff --git a/src/lms7002m_mcu/MCU_BD.cpp b/src/lms7002m_mcu/MCU_BD.cpp
index 0724a49..c11d0a9 100644
--- a/src/lms7002m_mcu/MCU_BD.cpp
+++ b/src/lms7002m_mcu/MCU_BD.cpp
@@ -570,6 +570,7 @@ int MCU_BD::Program_MCU(int m_iMode1, int m_iMode0)
case 1: mode = IConnection::MCU_PROG_MODE::EEPROM_AND_SRAM; break;
case 2: mode = IConnection::MCU_PROG_MODE::SRAM; break;
case 3: mode = IConnection::MCU_PROG_MODE::BOOT_SRAM_FROM_EEPROM; break;
+ default: mode = IConnection::MCU_PROG_MODE::RESET; break;
}
if(m_serPort)
return m_serPort->ProgramMCU(byte_array, byte_array_size, mode, callback);
diff --git a/src/lms7002m_mcu/MCU_File.h b/src/lms7002m_mcu/MCU_File.h
index 70f1f66..61235be 100644
--- a/src/lms7002m_mcu/MCU_File.h
+++ b/src/lms7002m_mcu/MCU_File.h
@@ -89,7 +89,7 @@ public:
{
char szLine[1024];
bool formatDetected = false;
- bool intel;
+ bool intel = false;
bool endSeen = false;
bool linear = true; // Only used for intel hex
unsigned long addressBase = 0; // Only used for intel hex
diff --git a/src/lms7suiteAppFrame.cpp b/src/lms7suiteAppFrame.cpp
index 6955617..6dad71f 100644
--- a/src/lms7suiteAppFrame.cpp
+++ b/src/lms7suiteAppFrame.cpp
@@ -281,7 +281,9 @@ void LMS7SuiteAppFrame::OnControlBoardConnect(wxCommandEvent& event)
wxString controlDev = _("Control port: ");
controlDev.Append(info->deviceName);
- controlDev.Append(wxString::Format(_(" FW:%s HW:%s Protocol:%s GW:%s GW_rev:%s"), info->firmwareVersion, info->hardwareVersion, info->protocolVersion, info->gatewareVersion, info->gatewareRevision));
+ double refClk;
+ LMS_GetClockFreq(lmsControl,LMS_CLOCK_REF, &refClk);
+ controlDev.Append(wxString::Format(_(" FW:%s HW:%s Protocol:%s GW:%s GW_rev:%s Ref Clk: %1.2f MHz"), info->firmwareVersion, info->hardwareVersion, info->protocolVersion, info->gatewareVersion, info->gatewareRevision, refClk/1e6));
statusBar->SetStatusText(controlDev, controlCollumn);
LMS_SetDataLogCallback(lmsControl, &LMS7SuiteAppFrame::OnLogDataTransfer);
@@ -414,7 +416,7 @@ void LMS7SuiteAppFrame::OnShowPrograming(wxCommandEvent& event)
programmer->Show();
else
{
- programmer = new LMS_Programing_wxgui(this, wxNewId(), _("Programing"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
+ programmer = new LMS_Programing_wxgui(this, wxNewId(), _("Programming"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
programmer->SetConnection(lmsControl);
programmer->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(LMS7SuiteAppFrame::OnProgramingClose), NULL, this);
programmer->Show();
diff --git a/src/lms7suiteApp_gui.cpp b/src/lms7suiteApp_gui.cpp
index a2ff92e..19602e1 100644
--- a/src/lms7suiteApp_gui.cpp
+++ b/src/lms7suiteApp_gui.cpp
@@ -57,7 +57,7 @@ AppFrame_view::AppFrame_view( wxWindow* parent, wxWindowID id, const wxString& t
mnuModules->Append( mnuSi5351C );
wxMenuItem* mnuPrograming;
- mnuPrograming = new wxMenuItem( mnuModules, wxID_ANY, wxString( wxT("Programing") ) , wxEmptyString, wxITEM_NORMAL );
+ mnuPrograming = new wxMenuItem( mnuModules, wxID_ANY, wxString( wxT("Programming") ) , wxEmptyString, wxITEM_NORMAL );
mnuModules->Append( mnuPrograming );
wxMenuItem* mnuRFSpark;
diff --git a/src/oglGraph/OpenGLGraph.cpp b/src/oglGraph/OpenGLGraph.cpp
index 64c3f70..0e6df2a 100644
--- a/src/oglGraph/OpenGLGraph.cpp
+++ b/src/oglGraph/OpenGLGraph.cpp
@@ -1628,8 +1628,8 @@ void OpenGLGraph::onReset(wxCommandEvent& event)
bool OpenGLGraph::SearchPeak()
{
bool found = false;
- double maxValue;
- unsigned maxPos;
+ double maxValue(0.0);
+ unsigned maxPos(0);
//Init max value
for(unsigned int i=0; i<series.size(); i++)
{
diff --git a/src/oglGraph/dlgMarkers.cpp b/src/oglGraph/dlgMarkers.cpp
index 1d625ad..b08dcbf 100644
--- a/src/oglGraph/dlgMarkers.cpp
+++ b/src/oglGraph/dlgMarkers.cpp
@@ -103,9 +103,9 @@ void dlgMarkers::AddMarker(int id)
void dlgMarkers::AddDeltas()
{
wxArrayString selections;
- for(size_t i=0; i<parent_graph->markers.size(); ++i)
+ for(unsigned i=0; i<parent_graph->markers.size(); ++i)
{
- selections.push_back(wxString::Format("M%i", i));
+ selections.push_back(wxString::Format("M%u", i));
}
for(int i=0; i<5; ++i)
{
diff --git a/src/protocols/ILimeSDRStreaming.cpp b/src/protocols/ILimeSDRStreaming.cpp
index 3521a2b..e4bfdc3 100644
--- a/src/protocols/ILimeSDRStreaming.cpp
+++ b/src/protocols/ILimeSDRStreaming.cpp
@@ -23,8 +23,7 @@ int ILimeSDRStreaming::SetupStream(size_t& streamID, const StreamConfig& config)
if(rxRunning.load() == true || txRunning.load() == true)
return ReportError(EPERM, "All streams must be stopped before doing setups");
streamID = ~0;
- StreamChannel* stream = new StreamChannel(this);
- stream->config = config;
+ StreamChannel* stream = new StreamChannel(this,config);
//TODO check for duplicate streams
if(config.isTx)
mTxStreams.push_back(stream);
@@ -181,24 +180,27 @@ double ILimeSDRStreaming::GetHardwareTimestampRate(void)
return mExpectedSampleRate;
}
-int ILimeSDRStreaming::UpdateThreads()
+int ILimeSDRStreaming::UpdateThreads(bool stopAll)
{
bool needTx = false;
bool needRx = false;
//check which threads are needed
- for(auto i : mRxStreams)
- if(i->IsActive())
- {
- needRx = true;
- break;
- }
- for(auto i : mTxStreams)
- if(i->IsActive())
- {
- needTx = true;
- break;
- }
+ if (!stopAll)
+ {
+ for(auto i : mRxStreams)
+ if(i->IsActive())
+ {
+ needRx = true;
+ break;
+ }
+ for(auto i : mTxStreams)
+ if(i->IsActive())
+ {
+ needTx = true;
+ break;
+ }
+ }
//stop threads if not needed
if(not needTx and txRunning.load())
@@ -297,7 +299,6 @@ int ILimeSDRStreaming::UpdateThreads()
lmsControl.Modify_SPI_Reg_bits(LMS7param(LML2_S3S), 3, fromChip);
}
-
if(channelEnables & 0x2) //enable MIMO
{
uint16_t macBck = lmsControl.Get_SPI_Reg_bits(LMS7param(MAC), fromChip);
@@ -352,11 +353,22 @@ int ILimeSDRStreaming::UpdateThreads()
//-----------------------------------------------------------------------------
-ILimeSDRStreaming::StreamChannel::StreamChannel(lime::IConnection* port) :
+ILimeSDRStreaming::StreamChannel::StreamChannel(lime::IConnection* port, StreamConfig conf) :
mActive(false)
{
this->port = dynamic_cast<ILimeSDRStreaming*>(port);
- fifo = new RingFIFO(1024*8);
+ this->config = conf;
+
+ if (this->config.bufferLength == 0) //default size
+ this->config.bufferLength = 1024*8*SamplesPacket::maxSamplesInPacket;
+ else
+ {
+ size_t fifoSize = 64;
+ while(fifoSize < conf.bufferLength/SamplesPacket::maxSamplesInPacket)
+ fifoSize <<= 1;
+ this->config.bufferLength = fifoSize*SamplesPacket::maxSamplesInPacket;
+ }
+ fifo = new RingFIFO(this->config.bufferLength);
}
ILimeSDRStreaming::StreamChannel::~StreamChannel()
@@ -377,7 +389,6 @@ int ILimeSDRStreaming::StreamChannel::Read(void* samples, const uint32_t count,
for(int i=2*popped-1; i>=0; --i)
samplesFloat[i] = (float)samplesShort[i]/2048.0;
}
- //else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
else
{
complex16_t* ptr = (complex16_t*)samples;
@@ -397,7 +408,7 @@ int ILimeSDRStreaming::StreamChannel::Write(const void* samples, const uint32_t
samplesShort[i] = samplesFloat[i]*2047;
const complex16_t* ptr = (const complex16_t*)samplesShort ;
pushed = fifo->push_samples(ptr, count, 1, meta->timestamp, timeout_ms, meta->flags);
- delete samplesShort;
+ delete[] samplesShort;
}
//else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
else
diff --git a/src/protocols/ILimeSDRStreaming.h b/src/protocols/ILimeSDRStreaming.h
index 341934e..a3948c1 100644
--- a/src/protocols/ILimeSDRStreaming.h
+++ b/src/protocols/ILimeSDRStreaming.h
@@ -26,7 +26,7 @@ public:
static const uint16_t samplesCount = 1360;
complex16_t samples[samplesCount];
};
- StreamChannel(IConnection* port);
+ StreamChannel(IConnection* port, StreamConfig config);
~StreamChannel();
int Read(void* samples, const uint32_t count, Metadata* meta, const int32_t timeout_ms = 100);
@@ -77,7 +77,7 @@ public:
};
virtual void ReceivePacketsLoop(const ThreadData args) = 0;
virtual void TransmitPacketsLoop(const ThreadData args) = 0;
- virtual int UpdateThreads();
+ virtual int UpdateThreads(bool stopAll = false);
StreamConfig config;
std::thread rxThread;
diff --git a/src/protocols/LMS64CProtocol.cpp b/src/protocols/LMS64CProtocol.cpp
index ce42315..2fd4ae4 100644
--- a/src/protocols/LMS64CProtocol.cpp
+++ b/src/protocols/LMS64CProtocol.cpp
@@ -491,7 +491,7 @@ int LMS64CProtocol::TransferPacket(GenericPacket& pkt)
}
ParsePacket(pkt, inBuffer, inDataPos, protocol);
}
- delete outBuffer;
+ delete[] outBuffer;
delete[] inBuffer;
return status;
}
@@ -794,13 +794,19 @@ int LMS64CProtocol::CustomParameterRead(const uint8_t *ids, double *values, cons
for (size_t i = 0; i < count; ++i)
{
- int unitsIndex = (pkt.inBuffer[i * 4 + 1] & 0xF0) >> 4;
+ int unitsIndex = pkt.inBuffer[i * 4 + 1];
if(units)
- units[i] = adcUnits2string(unitsIndex);
- values[i] = pkt.inBuffer[i * 4 + 2] << 8 | pkt.inBuffer[i * 4 + 3];
- int powerOf10 = pkt.inBuffer[i * 4 + 1] & 0x0F;
- values[i] *= pow(10, powerOf10);
- if(unitsIndex == TEMPERATURE)
+ {
+
+ const char adc_units_prefix[] = {
+ ' ', 'k', 'M', 'G', 'T', 'P', 'E', 'Z',
+ 'y', 'z', 'a', 'f', 'p', 'n', 'u', 'm'};
+ units[i] = adc_units_prefix[unitsIndex&0x0F];
+ units[i] += adcUnits2string((unitsIndex & 0xF0)>>4);
+ }
+ values[i] = (int16_t)(pkt.inBuffer[i * 4 + 2] << 8 | pkt.inBuffer[i * 4 + 3]);
+
+ if((unitsIndex & 0xF0)>>4 == TEMPERATURE)
values[i] /= 10;
}
return 0;
@@ -853,7 +859,10 @@ int LMS64CProtocol::GPIORead(uint8_t *buffer, const size_t bufLength)
int LMS64CProtocol::ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback)
{
LMSinfo lmsInfo = this->GetInfo();
- if(lmsInfo.device == LMS_DEV_LIMESDR)
+ if(lmsInfo.device == LMS_DEV_LIMESDR
+ || lmsInfo.device == LMS_DEV_LIMESDR_PCIE
+ || lmsInfo.device == LMS_DEV_LIMESDR_USB_SP
+ || lmsInfo.device == LMS_DEV_LMS7002M_ULTIMATE_EVB)
return IConnection::ProgramMCU(buffer, length, mode, callback);
#ifndef NDEBUG
@@ -911,3 +920,18 @@ int LMS64CProtocol::ProgramMCU(const uint8_t *buffer, const size_t length, const
#endif
return success ? 0 : -1;
}
+
+/** @brief Reads chip version information form LMS7 chip.
+*/
+int LMS64CProtocol::GetChipVersion()
+{
+ LMS64CProtocol::GenericPacket ctrPkt;
+ ctrPkt.cmd = CMD_LMS7002_RD;
+ ctrPkt.outBuffer.push_back(0x00); //reset bulk endpoints
+ ctrPkt.outBuffer.push_back(0x2F); //reset bulk endpoints
+ if(TransferPacket(ctrPkt) != 0)
+ this->chipVersion = 0;
+ else
+ this->chipVersion=(ctrPkt.inBuffer[2]<<8)|ctrPkt.inBuffer[3];
+ return this->chipVersion;
+}
diff --git a/src/protocols/LMS64CProtocol.h b/src/protocols/LMS64CProtocol.h
index dbace8f..a5ed316 100644
--- a/src/protocols/LMS64CProtocol.h
+++ b/src/protocols/LMS64CProtocol.h
@@ -182,6 +182,9 @@ public:
virtual int GPIORead(uint8_t *buffer, const size_t bufLength);
int ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback) override;
+protected:
+ int GetChipVersion();
+ unsigned chipVersion;
private:
int WriteLMS7002MSPI(const uint32_t *writeData, const size_t size);
diff --git a/src/protocols/LMSBoards.h b/src/protocols/LMSBoards.h
index a91bad7..03f7e8e 100644
--- a/src/protocols/LMSBoards.h
+++ b/src/protocols/LMSBoards.h
@@ -9,50 +9,56 @@ namespace lime {
enum eLMS_DEV
{
- LMS_DEV_UNKNOWN,
- LMS_DEV_EVB6,
- LMS_DEV_DIGIGREEN,
- LMS_DEV_DIGIRED,
- LMS_DEV_EVB7,
- LMS_DEV_ZIPPER,
- LMS_DEV_SOCKETBOARD,
- LMS_DEV_EVB7V2,
- LMS_DEV_STREAM,
- LMS_DEV_NOVENA,
- LMS_DEV_DATASPARK,
- LMS_DEV_RFSPARK,
- LMS_DEV_LMS6002USB,
- LMS_DEV_RFESPARK,
- LMS_DEV_LIMESDR,
- LMS_DEV_LIMESDR_PCIE,
- LMS_DEV_QSPARK,
- LMS_DEV_ULIMESDR,
- LMS_DEV_USTREAM,
+ LMS_DEV_UNKNOWN,
+ LMS_DEV_EVB6,
+ LMS_DEV_DIGIGREEN,
+ LMS_DEV_DIGIRED,
+ LMS_DEV_EVB7,
+ LMS_DEV_ZIPPER,
+ LMS_DEV_SOCKETBOARD,
+ LMS_DEV_EVB7V2,
+ LMS_DEV_STREAM,
+ LMS_DEV_NOVENA,
+ LMS_DEV_DATASPARK,
+ LMS_DEV_RFSPARK,
+ LMS_DEV_LMS6002USB,
+ LMS_DEV_RFESPARK,
+ LMS_DEV_LIMESDR,
+ LMS_DEV_LIMESDR_PCIE,
+ LMS_DEV_LIMESDR_QPCIE,
+ LMS_DEV_ULIMESDR,
+ LMS_DEV_USTREAM,
+ LMS_DEV_LIMESDR_SONY, //stand alone board with Sony PAs, tuners
+ LMS_DEV_LIMESDR_USB_SP,
+ LMS_DEV_LMS7002M_ULTIMATE_EVB,
- LMS_DEV_COUNT
+ LMS_DEV_COUNT
};
-const char LMS_DEV_NAMES[][80] =
+const char LMS_DEV_NAMES[][80] =
{
- "UNKNOWN",
- "EVB6",
- "DigiGreen",
- "DigiRed",
- "EVB7",
- "ZIPPER",
- "Socket Board",
- "EVB7_v2",
- "Stream",
- "Novena",
- "DataSpark",
- "RF-Spark",
- "LMS6002-USB Stick",
- "RF-ESpark",
- "LimeSDR USB",
- "LimeSDR PCI-E",
- "QSpark",
+ "UNKNOWN",
+ "EVB6",
+ "DigiGreen",
+ "DigiRed",
+ "EVB7",
+ "ZIPPER",
+ "Socket Board",
+ "EVB7_v2",
+ "Stream",
+ "Novena",
+ "DataSpark",
+ "RF-Spark",
+ "LMS6002-USB Stick",
+ "RF-ESpark",
+ "LimeSDR-USB",
+ "LimeSDR-PCIe",
+ "LimeSDR-QPCIe",
"uLimeSDR",
"uStream",
+ "LimeSDR SONY PA",
+ "LimeSDR-USB SP",
+ "LMS7002M Ultimate EVB"
};
static inline const char* GetDeviceName(const eLMS_DEV device)
@@ -63,32 +69,32 @@ static inline const char* GetDeviceName(const eLMS_DEV device)
return LMS_DEV_NAMES[LMS_DEV_UNKNOWN];
}
-enum eEXP_BOARD
+enum eEXP_BOARD
{
- EXP_BOARD_UNKNOWN,
- EXP_BOARD_UNSUPPORTED,
- EXP_BOARD_NO,
- EXP_BOARD_MYRIAD1,
- EXP_BOARD_MYRIAD2,
- EXP_BOARD_MYRIAD_NOVENA,
- EXP_BOARD_HPM1000,
- EXP_BOARD_MYRIAD7,
- EXP_BOARD_HPM7,
+ EXP_BOARD_UNKNOWN,
+ EXP_BOARD_UNSUPPORTED,
+ EXP_BOARD_NO,
+ EXP_BOARD_MYRIAD1,
+ EXP_BOARD_MYRIAD2,
+ EXP_BOARD_MYRIAD_NOVENA,
+ EXP_BOARD_HPM1000,
+ EXP_BOARD_MYRIAD7,
+ EXP_BOARD_HPM7,
EXP_BOARD_MYRIAD7_NOVENA,
-
- EXP_BOARD_COUNT
+
+ EXP_BOARD_COUNT
};
-const char EXP_BOARD_NAMES[][80] =
+const char EXP_BOARD_NAMES[][80] =
{
- "UNKNOWN",
- "UNSUPPORTED",
- "NOT AVAILABLE",
- "Myriad1",
- "Myriad2",
- "Novena",
- "HPM1000",
- "Myriad7",
+ "UNKNOWN",
+ "UNSUPPORTED",
+ "NOT AVAILABLE",
+ "Myriad1",
+ "Myriad2",
+ "Novena",
+ "HPM1000",
+ "Myriad7",
"HMP7",
"Myriad7 Novena",
};
diff --git a/src/protocols/dataTypes.h b/src/protocols/dataTypes.h
index 8c75c17..884f72f 100644
--- a/src/protocols/dataTypes.h
+++ b/src/protocols/dataTypes.h
@@ -26,7 +26,7 @@ public:
uint64_t timestamp; //timestamp of the packet
uint16_t first; //index of first unused sample in samples
uint16_t last; //end index of samples
- complex16_t samples[1360];
+ complex16_t samples[maxSamplesInPacket];
uint32_t flags;
SamplesPacket()
diff --git a/src/protocols/fifo.h b/src/protocols/fifo.h
index ee82501..330a3f2 100644
--- a/src/protocols/fifo.h
+++ b/src/protocols/fifo.h
@@ -33,15 +33,15 @@ public:
{
std::unique_lock<std::mutex> lck(lock);
BufferInfo stats;
- stats.size = mBufferSize;
- stats.itemsFilled = mElementsFilled;
+ stats.size = mBufferSize*mBuffer->maxSamplesInPacket;
+ stats.itemsFilled = mElementsFilled*mBuffer->maxSamplesInPacket;
return stats;
}
//! @brief Initializes FIFO memory
- RingFIFO(const uint32_t bufLength) : mBufferSize(bufLength)
+ RingFIFO(const uint32_t bufLength) : mBufferSize(1+(bufLength-1)/mBuffer->maxSamplesInPacket)
{
- mBuffer = new SamplesPacket[bufLength];
+ mBuffer = new SamplesPacket[mBufferSize];
Clear();
}
diff --git a/src/utilities_gui/dlgConnectionSettings.cpp b/src/utilities_gui/dlgConnectionSettings.cpp
index 5a45b0b..065d488 100644
--- a/src/utilities_gui/dlgConnectionSettings.cpp
+++ b/src/utilities_gui/dlgConnectionSettings.cpp
@@ -2,6 +2,7 @@
#include <wx/msgdlg.h>
#include <vector>
#include "lms7suiteEvents.h"
+#include "ConnectionHandle.h"
#include <iso646.h> // alternative operators for visual c++: not, and, or...
using namespace std;
@@ -29,8 +30,8 @@ void dlgConnectionSettings::GetDeviceList( wxInitDialogEvent& event )
return;
for (int i = 0; i<ret; ++i)
{
- std::string str = list[i];
- mListLMS7ports->Append(str.substr(0,str.find(',')));
+ const auto handle = lime::ConnectionHandle(list[i]);
+ mListLMS7ports->Append(handle.ToString());
}
if (lmsOpenedIndex >= 0 && lmsOpenedIndex < int(mListLMS7ports->GetCount()))
mListLMS7ports->SetSelection(lmsOpenedIndex);
diff --git a/src/windowFunction.cpp b/src/windowFunction.cpp
index e8c07d8..28bd5dc 100644
--- a/src/windowFunction.cpp
+++ b/src/windowFunction.cpp
@@ -1,49 +1,42 @@
#include "windowFunction.h"
#include <cmath>
-void GenerateWindowCoefficients(int func, int coefCount, std::vector<float> &windowFcoefs, float &litudeCorrection)
+void GenerateWindowCoefficients(int func, int N /*coef count*/, std::vector<float> &windowFcoefs, float amplitudeCorrection)
{
windowFcoefs.clear();
- windowFcoefs.resize(coefCount);
+ windowFcoefs.resize(N);
float a0 = 0.35875;
float a1 = 0.48829;
float a2 = 0.14128;
float a3 = 0.01168;
- int N = coefCount;
- float PI = 3.14159265359;
+ float PI = 3.14159265359;
switch(func)
{
case 1: //blackman-harris
- for (int i = 0; i<N; ++i)
- {
- windowFcoefs[i] = a0 - a1*cos((2 * PI*i) / (N - 1)) + a2*cos((4 * PI*i) / (N - 1)) - a3*cos((6 * PI*i) / (N - 1));
- amplitudeCorrection += windowFcoefs[i];
- }
- amplitudeCorrection = 1.0 / (amplitudeCorrection / N);
- break;
- case 2: //hamming
- amplitudeCorrection = 0;
- a0 = 0.54;
- for(int i=0; i<N; ++i)
- {
- windowFcoefs[i] = a0 -(1-a0)*cos((2*PI*i)/(N));
- amplitudeCorrection += windowFcoefs[i];
- }
- amplitudeCorrection = 1.0/(amplitudeCorrection/N);
- break;
- case 3: //hanning
- amplitudeCorrection = 0;
- for(int i=0; i<N; ++i)
- {
- windowFcoefs[i] = 0.5 *(1 - cos((2*PI*i)/(N)));
- amplitudeCorrection += windowFcoefs[i];
- }
- amplitudeCorrection = 1.0/(amplitudeCorrection/N);
- break;
- default:
- for (int i = 0; i<N; ++i)
- windowFcoefs[i] = 1;
- amplitudeCorrection = 1;
+ for (int i = 0; i<N; ++i)
+ windowFcoefs[i] = a0 - a1*cos((2 * PI*i) / (N - 1)) + a2*cos((4 * PI*i) / (N - 1)) - a3*cos((6 * PI*i) / (N - 1));
+ break;
+ case 2: //hamming
+ amplitudeCorrection = 0;
+ a0 = 0.54;
+ for(int i=0; i<N; ++i)
+ windowFcoefs[i] = a0 -(1-a0)*cos((2*PI*i)/(N));
+ break;
+ case 3: //hanning
+ amplitudeCorrection = 0;
+ for(int i=0; i<N; ++i)
+ windowFcoefs[i] = 0.5 *(1 - cos((2*PI*i)/(N)));
+ break;
+ default:
+ for (int i = 0; i<N; ++i)
+ windowFcoefs[i] = 1;
+ return;
}
+ for (int i = 0; i<N; ++i)
+ amplitudeCorrection += windowFcoefs[i];
+ amplitudeCorrection = 1.0/(amplitudeCorrection/N);
+ for (int i = 0; i<N; ++i)
+ windowFcoefs[i] *= amplitudeCorrection;
+
}
diff --git a/src/windowFunction.h b/src/windowFunction.h
index 5d8f3af..e43a66b 100644
--- a/src/windowFunction.h
+++ b/src/windowFunction.h
@@ -3,6 +3,6 @@
#include <vector>
-void GenerateWindowCoefficients(int func, int fftsize, std::vector<float> &windowFcoefs, float &litudeCorrection);
+void GenerateWindowCoefficients(int func, int fftsize, std::vector<float> &windowFcoefs, float amplitudeCorrection);
#endif
\ No newline at end of file
diff --git a/udev-rules/64-limesuite.rules b/udev-rules/64-limesuite.rules
index a1ad06f..e928210 100644
--- a/udev-rules/64-limesuite.rules
+++ b/udev-rules/64-limesuite.rules
@@ -2,3 +2,4 @@ ATTR{idVendor}=="04b4", ATTR{idProduct}=="8613", SYMLINK+="stream-%k", MODE="660
ATTR{idVendor}=="04b4", ATTR{idProduct}=="00f1", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
ATTR{idVendor}=="0403", ATTR{idProduct}=="601f", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
ATTR{idVendor}=="1d50", ATTR{idProduct}=="6108", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
+SUBSYSTEM=="xillybus", MODE="666", OPTIONS="last_rule"
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/limesuite.git
More information about the pkg-hamradio-commits
mailing list