diff --git a/RTCMv3_decode.py b/RTCMv3_decode.py index 6e954fd..aa17362 100755 --- a/RTCMv3_decode.py +++ b/RTCMv3_decode.py @@ -16,6 +16,8 @@ from bitstring import BitStream +max_sats = 12 + RTCMv3_PREAMBLE = 0xD3 PRUNIT_GPS = 299792.458 CLIGHT = 299792458.0 @@ -113,10 +115,11 @@ def decode_1004(pkt): smint = pkt.read(3).uint prs = {} + temp_corrs = {} for n in range(nsat): svid = pkt.read(6).uint - corr_set[svid] = {} + temp_corrs[svid] = {} code1 = pkt.read(1).uint pr1 = pkt.read(24).uint @@ -133,27 +136,37 @@ def decode_1004(pkt): pr1 = pr1 * 0.02 + amb * PRUNIT_GPS if ppr1 != 0x80000: - corr_set[svid]['P1'] = pr1 + temp_corrs[svid]['P1'] = pr1 cp1 = adjcp(svid, 0, ppr1 * 0.0005 / lam_carr[0]) - corr_set[svid]['L1'] = pr1 / lam_carr[0] + cp1 + temp_corrs[svid]['L1'] = pr1 / lam_carr[0] + cp1 - corr_set[svid]['LLI1'] = lossoflock(svid, 0, lock1) - corr_set[svid]['SNR1'] = snratio(cnr1 * 0.25) - corr_set[svid]['CODE1'] = 'CODE_P1' if code1 else 'CODE_C1' + temp_corrs[svid]['LLI1'] = lossoflock(svid, 0, lock1) + temp_corrs[svid]['SNR1'] = snratio(cnr1 * 0.25) + temp_corrs[svid]['CODE1'] = 'CODE_P1' if code1 else 'CODE_C1' if pr21 != 0xE000: - corr_set[svid]['P2'] = pr1 + pr21 * 0.02 + temp_corrs[svid]['P2'] = pr1 + pr21 * 0.02 if ppr2 != 0x80000: cp2 = adjcp(svid, 1, ppr2 * 0.0005 / lam_carr[1]) - corr_set[svid]['L2'] = pr1 / lam_carr[1] + cp2 + temp_corrs[svid]['L2'] = pr1 / lam_carr[1] + cp2 - corr_set[svid]['LLI2'] = lossoflock(svid, 1, lock2) - corr_set[svid]['SNR2'] = snratio(cnr2 * 0.25) - corr_set[svid]['CODE2'] = L2codes[code2] + temp_corrs[svid]['LLI2'] = lossoflock(svid, 1, lock2) + temp_corrs[svid]['SNR2'] = snratio(cnr2 * 0.25) + temp_corrs[svid]['CODE2'] = L2codes[code2] + + # Sort the list of sats by SNR, trim to 10 sats + quals = sorted([ (s, temp_corrs[s]['SNR1']) for s in temp_corrs], key=lambda x: x[1]) + if len(quals) > max_sats: + print("Drop {} sats for encode".format(len(quals) - max_sats)) + quals = quals[:max_sats] + + # Copy the kept sats in to the correction set + corr_set = {} + for sv, snr in quals: + corr_set[sv] = temp_corrs[sv] + prs[sv] = temp_corrs[sv]['P1'] - prs[svid] = corr_set[svid]['P1'] - itow = tow @@ -350,16 +363,16 @@ def parse_rtcmv3(pkt): def RTCM_converter_thread(server, port, username, password, mountpoint, rtcm_callback = None): import subprocess - """nt = subprocess.Popen(["./ntripclient", + nt = subprocess.Popen(["./ntripclient", "--server", server, "--password", password, "--user", username, "--mountpoint", mountpoint ], - stdout=subprocess.PIPE)""" - - nt = subprocess.Popen(["./ntrip.py", server, str(port), username, password, mountpoint], stdout=subprocess.PIPE) + """nt = subprocess.Popen(["./ntrip.py", server, str(port), username, password, mountpoint], + stdout=subprocess.PIPE)""" + if nt is None or nt.stdout is None: indev = sys.stdin diff --git a/ntrip_to_udp.py b/ntrip_to_udp.py new file mode 100755 index 0000000..42b5fd4 --- /dev/null +++ b/ntrip_to_udp.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +''' +NTRIP -> RTCMv2 transcode, UDP link +''' + +import time, socket +import RTCMv3_decode + +from optparse import OptionParser + +parser = OptionParser("ntrip_to_udp.py [options]") + +parser.add_option("--ntrip-server", default='192.104.43.25') +parser.add_option("--ntrip-port", type='int', default=2101) +parser.add_option("--ntrip-user") +parser.add_option("--ntrip-password") +parser.add_option("--ntrip-mount", default='TID10') + +parser.add_option("--udp-port", type='int', default=13320) +parser.add_option("--udp-addr", default="127.0.0.1") + + +(opts, args) = parser.parse_args() + +packet_count = 0 + +def send_rtcm(msg): + global packet_count + packet_count += 1 + msg = msg[:-2] # Trim off \r\n that the RTCM encoder puts there + port.sendto(msg,(opts.udp_addr, opts.udp_port)) + print(len(msg), msg) + +RTCMv3_decode.run_RTCM_converter(opts.ntrip_server, opts.ntrip_port, opts.ntrip_user, opts.ntrip_password, opts.ntrip_mount, rtcm_callback=send_rtcm) + +port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +# port.setsockopt... + + +while True: + print(packet_count) + time.sleep(10)