10 Commits

Author SHA1 Message Date
Alexander Chemeris
a870e8a16f host: Check if DC offset value reads as it's been written to LMS.
We had an issue with GPS 1pps signals disrupting SPI operations,
which was mostly visible during calibratoin, because it takes
many SPI operations to finish. And because the key operation
during calibration is DC offset altering, it's easy to spot when
SPI is working incorrectrly by checking it. It's a useless check
in a normal situation, so I don't want to see this in production
code.
2015-12-23 21:34:40 -05:00
Alexander Chemeris
3c240a2ab2 host: Checking in umtrx_query_versions.py 2015-12-21 13:57:06 -05:00
Alexander Chemeris
e4c59df63e host: Add string getters/setters to the Python property tree library. 2015-12-21 13:57:06 -05:00
Alexander Chemeris
ad8ff4a345 host: Add "STRING" to umtrx_monitor error output. 2015-12-21 12:44:24 -05:00
Alexander Chemeris
4f909bcfa2 host: Properly handle most corner cases in VSWR calculations. 2015-12-21 12:32:28 -05:00
Kirill Zakharenko
9309e3c548 Bump version to 1.0.6 2015-12-21 14:40:33 +03:00
Josh Blum
6b5ff4a460 host: make boost property tree thread safe 2015-12-17 23:14:39 -08:00
Josh Blum
53e7e5597f host: support string type in JSON query 2015-12-17 23:06:26 -08:00
Kirill Zakharenko
a89917faae debian: build now produces an additional package with debug symbols 2015-12-16 22:08:58 +03:00
Kirill Zakharenko
b600665303 umtrx_firmware: fixed typo preventing it from working 2015-12-01 02:48:10 +03:00
10 changed files with 76 additions and 3 deletions

9
debian/changelog vendored
View File

@@ -1,3 +1,12 @@
umtrx (1.0.6) trusty; urgency=low
* host: make boost property tree thread safe
* host: support string type in JSON query
* debian: build now produces an additional package with debug symbols
* umtrx_firmware: fixed typo preventing it from working
-- Kirill Zakharenko <earwin@gmail.com> Mon, 21 Dec 2015 14:23:56 +0300
umtrx (1.0.5) trusty; urgency=low umtrx (1.0.5) trusty; urgency=low
* host: disable umtrx_fifo_ctrl cache of spi config * host: disable umtrx_fifo_ctrl cache of spi config

7
debian/control vendored
View File

@@ -31,3 +31,10 @@ Conflicts: umtrx-uhd
Replaces: umtrx-uhd Replaces: umtrx-uhd
Description: Fairwaves UmTRX driver - UHD plugin module Description: Fairwaves UmTRX driver - UHD plugin module
The industrial grade dual-channel wide-band SDR transceiver. The industrial grade dual-channel wide-band SDR transceiver.
Package: umtrx-dbg
Section: debug
Architecture: any
Depends: umtrx, uhd-umtrx, ${misc:Depends}
Description: Fairwaves UmTRX driver - debug symbols
The industrial grade dual-channel wide-band SDR transceiver.

3
debian/rules vendored
View File

@@ -16,3 +16,6 @@ export DH_OPTIONS
override_dh_auto_configure: override_dh_auto_configure:
dh_auto_configure -- -DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)" dh_auto_configure -- -DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)"
override_dh_strip:
dh_strip --dbg-package=umtrx-dbg

View File

@@ -128,6 +128,10 @@ if (UNIX)
list(APPEND UMTRX_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) list(APPEND UMTRX_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif() endif()
#make boost property tree thread safe
#http://stackoverflow.com/questions/8156948/is-boostproperty-treeptree-thread-safe
add_definitions(-DBOOST_SPIRIT_THREADSAFE)
######################################################################## ########################################################################
# Helpful compiler flags # Helpful compiler flags
######################################################################## ########################################################################

View File

@@ -395,6 +395,10 @@ protected:
boost::recursive_mutex::scoped_lock l(_mutex); boost::recursive_mutex::scoped_lock l(_mutex);
if (verbosity>0) printf("lms6002d_ctrl_impl::set_tx_vga1dc_i_int(%d)\n", offset); if (verbosity>0) printf("lms6002d_ctrl_impl::set_tx_vga1dc_i_int(%d)\n", offset);
lms.set_tx_vga1dc_i_int(offset); lms.set_tx_vga1dc_i_int(offset);
uint8_t old = lms.get_tx_vga1dc_i_int();
if (offset != old) {
lms.dump();
}
return offset; return offset;
} }
@@ -402,6 +406,10 @@ protected:
boost::recursive_mutex::scoped_lock l(_mutex); boost::recursive_mutex::scoped_lock l(_mutex);
if (verbosity>0) printf("lms6002d_ctrl_impl::set_tx_vga1dc_q_int(%d)\n", offset); if (verbosity>0) printf("lms6002d_ctrl_impl::set_tx_vga1dc_q_int(%d)\n", offset);
lms.set_tx_vga1dc_q_int(offset); lms.set_tx_vga1dc_q_int(offset);
uint8_t old = lms.get_tx_vga1dc_q_int();
if (offset != old) {
lms.dump();
}
return offset; return offset;
} }

View File

@@ -187,7 +187,8 @@ void umtrx_impl::client_query_handle1(const boost::property_tree::ptree &request
else if (action == "GET") else if (action == "GET")
{ {
const std::string type = request.get("type", ""); const std::string type = request.get("type", "");
if (type.empty()) response.put("error", "type field not specified: BOOL, INT, DOUBLE, SENSOR, RANGE"); if (type.empty()) response.put("error", "type field not specified: STRING, BOOL, INT, DOUBLE, SENSOR, RANGE");
else if (type == "STRING") response.put("result", _tree->access<std::string>(path).get());
else if (type == "BOOL") response.put("result", _tree->access<bool>(path).get()); else if (type == "BOOL") response.put("result", _tree->access<bool>(path).get());
else if (type == "INT") response.put("result", _tree->access<int>(path).get()); else if (type == "INT") response.put("result", _tree->access<int>(path).get());
else if (type == "DOUBLE") response.put("result", _tree->access<double>(path).get()); else if (type == "DOUBLE") response.put("result", _tree->access<double>(path).get());
@@ -218,7 +219,8 @@ void umtrx_impl::client_query_handle1(const boost::property_tree::ptree &request
else if (action == "SET") else if (action == "SET")
{ {
const std::string type = request.get("type", ""); const std::string type = request.get("type", "");
if (type.empty()) response.put("error", "type field not specified: BOOL, INT, DOUBLE"); if (type.empty()) response.put("error", "type field not specified: STRING, BOOL, INT, DOUBLE");
else if (type == "STRING") _tree->access<std::string>(path).set(request.get<std::string>("value"));
else if (type == "BOOL") _tree->access<bool>(path).set(request.get<bool>("value")); else if (type == "BOOL") _tree->access<bool>(path).set(request.get<bool>("value"));
else if (type == "INT") _tree->access<int>(path).set(request.get<int>("value")); else if (type == "INT") _tree->access<int>(path).set(request.get<int>("value"));
else if (type == "DOUBLE") _tree->access<double>(path).set(request.get<double>("value")); else if (type == "DOUBLE") _tree->access<double>(path).set(request.get<double>("value"));

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
case word in case $1 in
flash ) flash )
umtrx_net_burner --addr=192.168.10.2 --fpga=/usr/share/umtrx/firmware/u2plus_umtrx_v2.bin --fw=/usr/share/umtrx/firmware/umtrx_txrx_uhd.bin --reset umtrx_net_burner --addr=192.168.10.2 --fpga=/usr/share/umtrx/firmware/u2plus_umtrx_v2.bin --fw=/usr/share/umtrx/firmware/umtrx_txrx_uhd.bin --reset
;; ;;

View File

@@ -59,6 +59,10 @@ class umtrx_property_tree:
self._send_request('GET', path, value_type='RANGE') self._send_request('GET', path, value_type='RANGE')
return self._recv_response() return self._recv_response()
def query_string_raw(self, path):
self._send_request('GET', path, value_type='STRING')
return self._recv_response()
# #
# Getters (value) # Getters (value)
# #
@@ -83,6 +87,10 @@ class umtrx_property_tree:
res = self.query_range_raw(path) res = self.query_range_raw(path)
return res['result'] return res['result']
def query_string_value(self, path):
res = self.query_string_raw(path)
return res['result']
# #
# Setters # Setters
# #
@@ -99,6 +107,10 @@ class umtrx_property_tree:
self._send_request('SET', path, value_type='DOUBLE', value=val) self._send_request('SET', path, value_type='DOUBLE', value=val)
return self._recv_response() return self._recv_response()
def set_string(self, path, val):
self._send_request('SET', path, value_type='STRING', value=val)
return self._recv_response()
# #
# Check path presence and list paths # Check path presence and list paths
# #

View File

@@ -0,0 +1,20 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##########################
### Query sensors
##########################
from umtrx_property_tree import umtrx_property_tree
s = umtrx_property_tree()
s.connect()
mb_path="/mboards/0"
fpga_version = s.query_string_value(mb_path+"/fpga_version")
fw_version = s.query_string_value(mb_path+"/fw_version")
print "FPGA bitstream version: %s" % fpga_version
print "ZPU firmware version: %s" % fw_version
s.close()

View File

@@ -46,6 +46,8 @@ class umtrx_vswr:
gamma = self._gamma gamma = self._gamma
if gamma == 1.0: if gamma == 1.0:
return float("inf") return float("inf")
elif gamma > 1.0:
return float("nan")
else: else:
return (1+gamma)/(1-gamma) return (1+gamma)/(1-gamma)
@@ -54,15 +56,21 @@ class umtrx_vswr:
gamma = self._gamma gamma = self._gamma
if gamma == 1.0: if gamma == 1.0:
return float("-inf") return float("-inf")
elif gamma > 1.0:
return float("nan")
else: else:
return -10.0 * math.log(1.0-gamma*gamma, 10) return -10.0 * math.log(1.0-gamma*gamma, 10)
def pf_rate(self): def pf_rate(self):
''' Estimated reflected power rate, % ''' ''' Estimated reflected power rate, % '''
gamma = self._gamma gamma = self._gamma
if gamma > 1.0:
return float("nan")
return 1.0 - gamma*gamma return 1.0 - gamma*gamma
def pr_rate(self): def pr_rate(self):
''' Estimated reflected power rate, % ''' ''' Estimated reflected power rate, % '''
gamma = self._gamma gamma = self._gamma
if gamma > 1.0:
return float("nan")
return gamma*gamma return gamma*gamma