After messing with another RFID library that also claims that it works on the bladeRF, I had more popping issues. However when I pulled LimeSuite from the osmotrx fork (from @IgnasJ)and built it, I’m not seeing the popping error. I’m still not able to read the RFID tag completely (although it is able to acknowledge the tag sometimes) with the following file:
#!/usr/bin/env python
# Developed by: Michael Buettner (buettner@cs.washington.edu)
# Modified by: Bruno Espinoza (bruno.espinozaamaya@uqconnect.edu.au)
# Modified for LimeSDR by: Jordan Treiwtt (jot437@utulsa.edu)
from gnuradio import gr, gru
from PyQt4 import Qt
from gnuradio import eng_notation
from gnuradio import qtgui
from gnuradio import analog, blocks, digital, filter
from gnuradio.eng_option import eng_option
from string import split
from string import strip
from string import atoi
import time
import os
import math
import sys
import rfid
import optparse
import osmosdr
import sip
# parser for frequency and other options
parser = optparse.OptionParser();
parser.add_option('--f', action="store", dest="center_freq", default="910e6", help="Center Frequency", type="float");
parser.add_option('--g', action="store", dest="rx_gain", default="20", help="RX Gain", type="float");
parser.add_option('--l', action="store", dest="log_file", default="log_out.log", help="Log file name");
parser.add_option('--d', action="store", dest="dump_file", default="none", help="[none|matched|full]");
parser.add_option('--s', action="store", dest="device", default="uhd", help="[uhd|bladerf]");
parser.add_option('--q', action="store", dest="q_value", default="0", help="Q value from 0 to 8");
parser.add_option('--m', action="store", dest="modul_type", default="1",
help="Modulation Type from 0 to 3 -> 0: FM Encoding, 1: Miller M=2, 2: Miller M=4, 3: Miller M=8");
parser.add_option('--c', action="store", dest="cycles_num", default="5", help="Number of Reader Cycles (def. 5)");
parser.add_option('--r', action="store", dest="round_num", default="10", help="Number of Rounds per Cycle (def. 10)");
options, args = parser.parse_args()
log_file = open(options.log_file, "a")
dump_type = options.dump_file
mtype = int(options.modul_type)
qval = int(options.q_value)
n_cycle = int(options.cycles_num)
n_round = int(options.round_num)
if dump_type == "none":
print "* Alert: Skipping dumping of the rx block..."
elif dump_type == "full":
print "** Using a full dump of the RX block!!"
elif dump_type == "matched":
print "** Using dump of the match_filter block!!"
else:
print "Unknown dump_type flag!! Set to 'none'"
dump_type = 'none'
if options.device == "uhd":
print "Using USRP devices..."
else:
print "Using bladeRF device..."
modul_msg = ["FM0", "Miller M=2", "Miller M=4", "Miller M=8"];
if mtype > 3 or mtype < 0:
mtype = 1;
if (qval > 8 or qval < 0):
qval = 0
slots = pow(2, qval);
print "* Using", modul_msg[mtype], "modulation for tags..."
print "* Q Value of", str(qval), "so", str(slots), "slots assigned for tags..."
print "* Reader using", str(n_cycle), "cycles with", str(n_round), "rounds per cycle..."
class my_top_block(gr.top_block, Qt.QWidget):
def __init__(self):
gr.top_block.__init__(self)
Qt.QWidget.__init__(self)
self.setWindowTitle("Top Block")
try:
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
except:
pass
self.top_scroll_layout = Qt.QVBoxLayout()
self.setLayout(self.top_scroll_layout)
self.top_scroll = Qt.QScrollArea()
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
self.top_scroll_layout.addWidget(self.top_scroll)
self.top_scroll.setWidgetResizable(True)
self.top_widget = Qt.QWidget()
self.top_scroll.setWidget(self.top_widget)
self.top_layout = Qt.QVBoxLayout(self.top_widget)
self.top_grid_layout = Qt.QGridLayout()
self.top_layout.addLayout(self.top_grid_layout)
self.settings = Qt.QSettings("GNU Radio", "top_block")
self.restoreGeometry(self.settings.value("geometry").toByteArray())
# Constants
amplitude = 5000
sw_dec = 5 # For reduce the sample rate after the filtering. (4MS / 5 = 800 KS/s)
samp_rate = 4e6 # corresponds to dec_rate 16. (64M/16)
tx_sample = .5e6
# Filter mathced to 1/4 of 40 KHz tag cycle.
# 40 KHz = 100 samples, so 1/4 is 25 samples.
# num_taps = int(64000 / ( (dec_rate * 4) * 40 )) #Filter matched to 1/4 of the 40 kHz tag cycle
num_taps = 25
taps = [complex(1, 1)] * num_taps
# Blocks
matched_filt = filter.fir_filter_ccc(sw_dec, taps);
agc = analog.agc2_cc(0.3, 1e-3, 1, 1)
agc.set_max_gain(100)
to_mag = blocks.complex_to_mag()
center = rfid.center_ff(10)
omega = 5
mu = 0.25
gain_mu = 0.25
gain_omega = .25 * gain_mu * gain_mu
omega_relative_limit = .05
# clock recovery
mm = digital.clock_recovery_mm_ff(omega, gain_omega, mu, gain_mu, omega_relative_limit)
mtype = int(options.modul_type)
qval = int(options.q_value)
if (mtype > 3 or mtype < 0):
mtype = 1 # Miller M=2 by default
# qval = int(options.q_value)
if qval > 8 or qval < 0:
qval = 0;
n_cycle = int(options.cycles_num)
n_round = int(options.round_num)
self.reader = rfid.reader_f(int(tx_sample), mtype, qval, n_cycle, n_round)
tag_decoder = rfid.tag_decoder_f()
# The parameters for command_gate_cc are:
# - PW: 12 us. (Negative part of the PIE pulses)
# - T1: 250 us (Maximium timeout for the tag to reply).
# - Sample Rate. (800 KS/s after the matched filter)
command_gate = rfid.command_gate_cc(12, 250, int(800e3)) # 800 KS/s.
dc_block = filter.dc_blocker_cc(64, True)
to_complex = blocks.float_to_complex()
amp = blocks.multiply_const_ff(amplitude)
# TX
freq = options.center_freq # 915e6
rx_gain = options.rx_gain # 20
if (options.device == "uhd"):
tx = osmosdr.sink("uhd,type=usrp1")
tx.set_gain(0, 'DAC-pga') # range -20 to 0.
tx.set_antenna('TX/RX')
else:
# LimeSDR
tx = osmosdr.sink(args="numchan=" + str(1) + " " + 'driver=lime,soapy=0')
tx.set_gain(30, 0)
tx.set_if_gain(10, 0)
tx.set_bb_gain(10, 0)
tx.set_antenna("BAND1", 0)
tx.set_bandwidth(0, 1000000)
# Settings for Backscatter = VGA1 = -4 / VGA2 = 20
tx.set_sample_rate(tx_sample)
tx.set_center_freq(freq)
if not tx:
print "Couldn't set tx freq"
# End TX
# RX
if (options.device == "uhd"):
rx = osmosdr.source("uhd,type=usrp1")
rx.set_gain(20, 'PGA0')
rx.set_gain(15, 'ADC-pga')
rx.set_antenna('RX2')
else:
# LimeSDR
rx = osmosdr.source(args="numchan=" + str(1) + " " + 'driver=lime,soapy=0')
rx.set_gain_mode(False, 0)
rx.set_gain(20, 0)
rx.set_if_gain(10, 0)
rx.set_bb_gain(10, 0)
rx.set_antenna("LNAL", 0)
rx.set_bandwidth(0, 6000000)
rx.set_sample_rate(samp_rate)
rx.set_center_freq(freq)
# rx.set_iq_balance_mode(0, 0)
# rx.set_dc_offset_mode(0, 0)
if not rx:
print "Couldn't set rx freq"
# End RX
command_gate.set_ctrl_out(self.reader.ctrl_q())
tag_decoder.set_ctrl_out(self.reader.ctrl_q())
# QT setup
self.qtgui_time_sink = qtgui.time_sink_c(
1024, # size
samp_rate, # samp_rate
"", # name
1 # number of inputs
)
self.qtgui_time_sink.set_update_time(0.10)
self.qtgui_time_sink.set_y_axis(-5, 5)
self.qtgui_time_sink.set_y_label('Amplitude', "")
self.qtgui_time_sink.enable_tags(-1, True)
self.qtgui_time_sink.set_trigger_mode(qtgui.TRIG_MODE_AUTO, qtgui.TRIG_SLOPE_POS, 1, 0, 0, "")
self.qtgui_time_sink.enable_autoscale(False)
self.qtgui_time_sink.enable_grid(False)
self.qtgui_time_sink.enable_axis_labels(True)
self.qtgui_time_sink.enable_control_panel(True)
if not True:
self.qtgui_time_sink.disable_legend()
labels = ['', '', '', '', '',
'', '', '', '', '']
widths = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
colors = ["blue", "red", "green", "black", "cyan",
"magenta", "yellow", "dark red", "dark green", "blue"]
styles = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
markers = [-1, -1, -1, -1, -1,
-1, -1, -1, -1, -1]
alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0]
for i in xrange(2 * 1):
if len(labels[i]) == 0:
if (i % 2 == 0):
self.qtgui_time_sink.set_line_label(i, "Re{{Data {0}}}".format(i / 2))
else:
self.qtgui_time_sink.set_line_label(i, "Im{{Data {0}}}".format(i / 2))
else:
self.qtgui_time_sink.set_line_label(i, labels[i])
self.qtgui_time_sink.set_line_width(i, widths[i])
self.qtgui_time_sink.set_line_color(i, colors[i])
self.qtgui_time_sink.set_line_style(i, styles[i])
self.qtgui_time_sink.set_line_marker(i, markers[i])
self.qtgui_time_sink.set_line_alpha(i, alphas[i])
self._qtgui_time_sink_win = sip.wrapinstance(self.qtgui_time_sink.pyqwidget(), Qt.QWidget)
self.top_layout.addWidget(self._qtgui_time_sink_win)
#########Build Graph
self.connect(rx, dc_block)
self.connect(dc_block, matched_filt)
self.connect(matched_filt, self.qtgui_time_sink)
self.connect(matched_filt, command_gate)
self.connect(command_gate, agc)
self.connect(agc, to_mag)
self.connect(to_mag, center, mm, tag_decoder)
self.connect(tag_decoder, self.reader, amp, to_complex, tx)
#################
# Output dumps for debug
# self.connect(to_complex, f_txout);
if dump_type == "matched":
f_rxout = blocks.file_sink(gr.sizeof_gr_complex, 'f_rxout.out');
self.connect(matched_filt, f_rxout)
# f_rxout = blocks.file_sink(gr.sizeof_float, 'f_rxout.out');
# self.connect(mm, f_rxout)
if dump_type == "full":
f_rxout = blocks.file_sink(gr.sizeof_gr_complex, 'f_rxout.out');
self.connect(rx, f_rxout)
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "top_block")
self.settings.setValue("geometry", self.saveGeometry())
event.accept()
def main():
from distutils.version import StrictVersion
if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
style = gr.prefs().get_string('qtgui', 'style', 'raster')
Qt.QApplication.setGraphicsSystem(style)
qapp = Qt.QApplication(sys.argv)
tb = my_top_block()
tb.start()
tb.show()
qapp.exec_()
while 1:
c = raw_input("'Q' to quit. L to get log.\n")
if c == "q":
break
if c == "L" or c == "l":
log_file.write("T,CMD,ERROR,BITS,SNR\n")
log = tb.reader.get_log()
print "Log has %s Entries" % (str(log.count()))
i = log.count();
for k in range(0, i):
msg = log.delete_head_nowait()
print_log_msg(msg, log_file)
tb.stop()
def print_log_msg(msg, log_file):
LOG_START_CYCLE, LOG_QUERY, LOG_ACK, LOG_QREP, LOG_NAK, LOG_REQ_RN, LOG_READ, LOG_RN16, LOG_EPC, LOG_HANDLE, LOG_DATA, LOG_EMPTY, LOG_COLLISION, LOG_OKAY, LOG_ERROR = range(
15)
fRed = chr(27) + '[31m'
fBlue = chr(27) + '[34m'
fReset = chr(27) + '[0m'
if msg.type() == LOG_START_CYCLE:
fields = split(strip(msg.to_string()), " ")
print "%s\t Started Cycle" % (fields[-1])
log_file.write(fields[-1] + ",START_CYCLE,0,0,0\n");
if msg.type() == LOG_QUERY:
fields = split(strip(msg.to_string()), " ")
print "%s\t Query" % (fields[-1])
log_file.write(fields[-1] + ",QUERY,0,0,0\n");
if msg.type() == LOG_QREP:
fields = split(strip(msg.to_string()), " ")
print "%s\t QRep" % (fields[-1])
log_file.write(fields[-1] + ",QREP,0,0,0\n");
if msg.type() == LOG_ACK:
fields = split(strip(msg.to_string()), " ")
print "%s\t ACK" % (fields[-1])
log_file.write(fields[-1] + ",ACK,0,0,0\n");
if msg.type() == LOG_NAK:
fields = split(strip(msg.to_string()), " ")
print "%s\t NAK" % (fields[-1])
log_file.write(fields[-1] + ",NAK,0,0,0\n");
if msg.type() == LOG_RN16:
fields = split(strip(msg.to_string()), " ")
rn16 = fields[0].split(",")[0]
snr = strip(fields[0].split(",")[1])
tmp = int(rn16, 2)
if msg.arg2() == LOG_ERROR:
print "%s\t %s RN16 w/ Error: %04X%s" % (fields[-1], fRed, tmp, fReset)
log_file.write(fields[-1] + ",RN16,1," + "%04X" % tmp + "," + snr + "\n");
else:
print "%s\t %s RN16: %04X%s" % (fields[-1], fBlue, tmp, fReset)
log_file.write(fields[-1] + ",RN16,0," + "%04X" % tmp + "," + snr + "\n");
if msg.type() == LOG_EPC:
fields = split(strip(msg.to_string()), " ")
epc = fields[0].split(",")[0]
snr = strip(fields[0].split(",")[1])
epc = epc[16:112]
tmp = int(epc, 2)
if msg.arg2() == LOG_ERROR:
print "%s\t %s EPC w/ Error: %024X%s" % (fields[-1], fRed, tmp, fReset)
log_file.write(fields[-1] + ",EPC,1," + "%024X" % tmp + "," + snr + "\n");
else:
print "%s\t %s EPC: %024X%s" % (fields[-1], fBlue, tmp, fReset)
log_file.write(fields[-1] + ",EPC,0," + "%024X" % tmp + "," + snr + "\n");
if msg.type() == LOG_EMPTY:
fields = split(strip(msg.to_string()), " ")
snr = strip(fields[0])
print "%s\t - Empty Slot - " % (fields[-1])
log_file.write(fields[-1] + ",EMPTY,0,0," + snr + "\n");
if msg.type() == LOG_COLLISION:
fields = split(strip(msg.to_string()), " ")
print "%s\t - Collision - " % (fields[-1])
log_file.write(fields[-1] + ",COLLISION,0,0,0\n");
if __name__ == '__main__':
main()
With the following output:
logic@logic-ThinkPad-X260:~/PycharmProjects/LimeReader$ python LimeReader2.py --s akdf --r 100 --c 100 --m 8
linux; GNU C++ version 5.4.0 20160609; Boost_105800; UHD_003.010.001.001-release
* Alert: Skipping dumping of the rx block...
Using bladeRF device...
* Using Miller M=2 modulation for tags...
* Q Value of 0 so 1 slots assigned for tags...
* Reader using 100 cycles with 100 rounds per cycle...
us Per Sample: 1.250000 Num samples per pulse:9 T1:200
gr-osmosdr v0.1.x-xxx-xunknown (0.1.5git) gnuradio 3.7.10
built-in sink types: uhd hackrf bladerf soapy redpitaya file
[INFO] Make connection: 'LimeSDR-USB [USB 2.0] 9060A02592E12'
[INFO] Estimated reference clock 30.7197 MHz
[INFO] Selected reference clock 30.720 MHz
[INFO] Device name: LimeSDR-USB
[INFO] Reference: 30.72 MHz
[INFO] Init LMS7002M(0)
[INFO] LMS7002M cache /home/logic/.limesuite/LMS7002M_cache_values.db
[INFO] Ver=7, Rev=1, Mask=1
[INFO] LMS7002M calibration values caching Enable
[INFO] Rx Filter calibrated from cache
[INFO] Tx Filter calibrated from cache
[INFO] Rx Filter calibrated from cache
[INFO] Tx Filter calibrated from cache
SetFrequency using cache values vco:2, csw:175
gr-osmosdr v0.1.x-xxx-xunknown (0.1.5git) gnuradio 3.7.10
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy soapy redpitaya
SetFrequency using cache values vco:2, csw:173
############################################################
Tx calibration values found in cache:
| DC | GAIN | PHASE
---+-----+------+------
I: | 626 | 1974 | -17
Q: | 114 | 2047 |
############################################################
############################################################
Rx calibration using RSSI INTERNAL ON BOARD loopback
Rx ch.A @ 910 MHz, BW: 30 MHz, RF input: LNAL, PGA: 22, LNA: 4, TIA: 1
Rx calibration: using cached values
Rx calibration values found in cache:
| DC | GAIN | PHASE
---+-----+------+------
I: | 0 | 2047 | 0
Q: | 0 | 2047 |
############################################################
Timer fired starting cycle
Timer fired starting cycle
[INFO] L
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 10
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
[INFO] L
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 20
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 30
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 40
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 50
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Starting cycle 60
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
Timer fired starting cycle
'Q' to quit. L to get log.
Timer fired starting cycle
Starting cycle 70
Timer fired starting cycle
Timer fired starting cycle
lTimer fired starting cycle
Log has 479 Entries
66804.589 Started Cycle
66804.589 Query
66804.636 Started Cycle
66804.636 Query
66805.137 Started Cycle
66805.137 Query
66805.637 Started Cycle
66805.637 Query
66806.136 Started Cycle
66806.136 Query
66806.637 Started Cycle
66806.637 Query
66807.136 Started Cycle
66807.136 Query
66807.637 Started Cycle
66807.637 Query
66808.137 Started Cycle
66808.137 Query
66808.576 - Empty Slot -
66808.576 Query
66808.636 Started Cycle
66808.636 Query
66808.837 - Empty Slot -
66808.837 Query
66809.137 Started Cycle
66809.137 Query
66809.152 - Empty Slot -
66809.152 Query
66809.442 - Empty Slot -
66809.442 Query
66809.619 - Empty Slot -
66809.619 Query
66809.637 Started Cycle
66809.637 Query
66810.136 Started Cycle
66810.136 Query
66810.637 Started Cycle
66810.637 Query
66811.136 Started Cycle
66811.136 Query
66811.618 - Empty Slot -
66811.618 Query
66811.636 Started Cycle
66811.636 Query
66811.799 - Empty Slot -
66811.799 Query
66811.879 - Empty Slot -
66811.879 Query
66811.883 RN16: E856
66811.883 ACK
66812.137 Started Cycle
66812.137 Query
66812.553 - Empty Slot -
66812.553 Query
66812.636 Started Cycle
66812.636 Query
66812.667 - Empty Slot -
66812.667 Query
66812.784 - Empty Slot -
66812.785 Query
66812.838 - Empty Slot -
66812.838 Query
66812.935 - Empty Slot -
66812.935 Query
66812.963 - Empty Slot -
66812.963 Query
66813.067 - Empty Slot -
66813.067 Query
66813.136 Started Cycle
66813.136 Query
66813.144 - Empty Slot -
66813.144 Query
66813.250 - Empty Slot -
66813.250 Query
66813.262 - Empty Slot -
66813.262 Query
66813.393 - Empty Slot -
66813.393 Query
66813.420 - Empty Slot -
66813.420 Query
66813.506 - Empty Slot -
66813.506 Query
66813.555 - Empty Slot -
66813.555 Query
66813.625 - Empty Slot -
66813.625 Query
66813.637 Started Cycle
66813.637 Query
66814.136 Started Cycle
66814.136 Query
66814.563 - Empty Slot -
66814.563 Query
66814.577 - Empty Slot -
66814.577 Query
66814.628 - Empty Slot -
66814.628 Query
66814.636 Started Cycle
66814.636 Query
66814.681 - Empty Slot -
66814.681 Query
66814.715 - Empty Slot -
66814.715 Query
66814.740 - Empty Slot -
66814.740 Query
66814.804 RN16 w/ Error: 0980
66814.804 Query
66814.922 - Empty Slot -
66814.922 Query
66814.941 - Empty Slot -
66814.941 Query
66815.014 - Empty Slot -
66815.014 Query
66815.039 - Empty Slot -
66815.039 Query
66815.137 Started Cycle
66815.137 Query
66815.188 - Empty Slot -
66815.188 Query
66815.636 Started Cycle
66815.636 Query
66815.720 - Empty Slot -
66815.720 Query
66815.800 - Empty Slot -
66815.800 Query
66815.965 - Empty Slot -
66815.965 Query
66816.137 Started Cycle
66816.137 Query
66816.397 - Empty Slot -
66816.397 Query
66816.637 Started Cycle
66816.637 Query
66817.136 Started Cycle
66817.136 Query
66817.170 - Empty Slot -
66817.170 Query
66817.577 - Empty Slot -
66817.577 Query
66817.636 Started Cycle
66817.636 Query
66817.680 - Empty Slot -
66817.680 Query
66817.817 - Empty Slot -
66817.817 Query
66817.937 - Empty Slot -
66817.937 Query
66818.059 - Empty Slot -
66818.059 Query
66818.136 Started Cycle
66818.136 Query
66818.297 - Empty Slot -
66818.297 Query
66818.439 - Empty Slot -
66818.439 Query
66818.636 Started Cycle
66818.636 Query
66818.651 - Empty Slot -
66818.651 Query
66818.679 - Empty Slot -
66818.679 Query
66819.137 Started Cycle
66819.137 Query
66819.637 Started Cycle
66819.637 Query
66820.136 Started Cycle
66820.136 Query
66820.637 Started Cycle
66820.637 Query
66821.136 Started Cycle
66821.136 Query
66821.637 Started Cycle
66821.637 Query
66821.789 - Empty Slot -
66821.789 Query
66822.138 Started Cycle
66822.138 Query
66822.571 - Empty Slot -
66822.571 Query
66822.574 - Empty Slot -
66822.574 Query
66822.636 Started Cycle
66822.636 Query
66822.689 - Empty Slot -
66822.689 Query
66822.695 - Empty Slot -
66822.695 Query
66822.701 - Empty Slot -
66822.701 Query
66822.806 - Empty Slot -
66822.806 Query
66822.822 - Empty Slot -
66822.822 Query
66822.830 - Empty Slot -
66822.830 Query
66822.896 - Empty Slot -
66822.896 Query
66822.900 - Empty Slot -
66822.900 Query
66823.039 - Empty Slot -
66823.039 Query
66823.079 - Empty Slot -
66823.079 Query
66823.080 - Empty Slot -
66823.080 Query
66823.089 - Empty Slot -
66823.089 Query
66823.136 Started Cycle
66823.136 Query
66823.637 Started Cycle
66823.637 Query
66824.137 Started Cycle
66824.137 Query
66824.341 - Empty Slot -
66824.341 Query
66824.351 - Empty Slot -
66824.351 Query
66824.364 - Empty Slot -
66824.364 Query
66824.396 - Empty Slot -
66824.396 Query
66824.461 - Empty Slot -
66824.461 Query
66824.476 - Empty Slot -
66824.476 Query
66824.480 - Empty Slot -
66824.480 Query
66824.485 - Empty Slot -
66824.486 Query
66824.627 - Empty Slot -
66824.627 Query
66824.632 - Empty Slot -
66824.632 Query
66824.637 Started Cycle
66824.637 Query
66824.652 - Empty Slot -
66824.652 Query
66824.741 - Empty Slot -
66824.741 Query
66824.747 - Empty Slot -
66824.747 Query
66824.756 - Empty Slot -
66824.756 Query
66825.137 Started Cycle
66825.137 Query
66825.151 - Empty Slot -
66825.151 Query
66825.636 Started Cycle
66825.636 Query
66825.653 - Empty Slot -
66825.653 Query
66825.895 - Empty Slot -
66825.895 Query
66825.931 - Empty Slot -
66825.931 Query
66826.040 - Empty Slot -
66826.040 Query
66826.139 Started Cycle
66826.139 Query
66826.139 - Empty Slot -
66826.139 Query
66826.179 - Empty Slot -
66826.179 Query
66826.400 - Empty Slot -
66826.400 Query
66826.523 - Empty Slot -
66826.523 Query
66826.636 Started Cycle
66826.636 Query
66826.766 - Empty Slot -
66826.766 Query
66826.826 - Empty Slot -
66826.826 Query
66826.846 - Empty Slot -
66826.846 Query
66827.136 Started Cycle
66827.136 Query
66827.211 - Empty Slot -
66827.211 Query
66827.251 - Empty Slot -
66827.251 Query
66827.255 - Empty Slot -
66827.255 Query
66827.258 - Empty Slot -
66827.258 Query
66827.474 RN16: D0DC
66827.474 ACK
66827.492 EPC w/ Error: A030B048433200C606019D46
66827.492 NAK
66827.492 Query
66827.503 - Empty Slot -
66827.503 Query
66827.507 - Empty Slot -
66827.507 Query
66827.540 - Empty Slot -
66827.540 Query
66827.579 RN16 w/ Error: D0F0
66827.579 Query
'Q' to quit. L to get log.
Again I probably need to add filters to the TX, but at least it’s able to ACK the RN.