From 7683e23bd63f828ebe0bd96653686e837af9fdc1 Mon Sep 17 00:00:00 2001 From: Paul Thevenon Date: Wed, 20 May 2026 13:18:54 +0200 Subject: [PATCH 01/10] packaging --- pyproject.toml | 11 +++++++++++ src/android_rinex/__init__.py | 0 src/{ => android_rinex}/gnsslogger.py | 0 src/{ => android_rinex}/gnsslogger_to_rnx.py | 0 src/{ => android_rinex}/rinex3.py | 0 5 files changed, 11 insertions(+) create mode 100644 pyproject.toml create mode 100644 src/android_rinex/__init__.py rename src/{ => android_rinex}/gnsslogger.py (100%) rename src/{ => android_rinex}/gnsslogger_to_rnx.py (100%) rename src/{ => android_rinex}/rinex3.py (100%) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..877cf95 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "android_rinex" +version = "0.1.0" +requires-python = ">=3.8" + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["src"] diff --git a/src/android_rinex/__init__.py b/src/android_rinex/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gnsslogger.py b/src/android_rinex/gnsslogger.py similarity index 100% rename from src/gnsslogger.py rename to src/android_rinex/gnsslogger.py diff --git a/src/gnsslogger_to_rnx.py b/src/android_rinex/gnsslogger_to_rnx.py similarity index 100% rename from src/gnsslogger_to_rnx.py rename to src/android_rinex/gnsslogger_to_rnx.py diff --git a/src/rinex3.py b/src/android_rinex/rinex3.py similarity index 100% rename from src/rinex3.py rename to src/android_rinex/rinex3.py From d54886a6c7558c5c0b29909934a4cbe8a52c8458 Mon Sep 17 00:00:00 2001 From: Paul Thevenon Date: Wed, 20 May 2026 13:56:25 +0200 Subject: [PATCH 02/10] fix relative import --- src/android_rinex/gnsslogger_to_rnx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/android_rinex/gnsslogger_to_rnx.py b/src/android_rinex/gnsslogger_to_rnx.py index 9593ae6..67bc9b8 100644 --- a/src/android_rinex/gnsslogger_to_rnx.py +++ b/src/android_rinex/gnsslogger_to_rnx.py @@ -14,8 +14,8 @@ import argparse import os, sys -import gnsslogger as alogger -import rinex3 as arinex +from . import gnsslogger as alogger +from . import rinex3 as arinex def convert2rnx(args): From 2e49f1e4075e0c5e022b73e59815d1284d07fa63 Mon Sep 17 00:00:00 2001 From: Paul Thevenon Date: Wed, 20 May 2026 14:15:03 +0200 Subject: [PATCH 03/10] close log file (.trc) --- src/android_rinex/gnsslogger_to_rnx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android_rinex/gnsslogger_to_rnx.py b/src/android_rinex/gnsslogger_to_rnx.py index 67bc9b8..1372b80 100644 --- a/src/android_rinex/gnsslogger_to_rnx.py +++ b/src/android_rinex/gnsslogger_to_rnx.py @@ -93,7 +93,7 @@ def convert2rnx(args): fh.write(header + body) #print(args.output, outFile) -#sys.stderr.close() + sys.stderr.close() if __name__ == "__main__": From 714bff1259a9efa834632f368c1df338a1cbbe44 Mon Sep 17 00:00:00 2001 From: Paul Thevenon Date: Wed, 20 May 2026 14:25:16 +0200 Subject: [PATCH 04/10] update readme --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 714adc6..64e54b9 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,17 @@ This repository contains a Python script that converts logs from Google's GNSS measurement tools to RINEX. It was originally forked from https://github.com/rokubun/android_rinex but has been substantially modified. -See gnslogger_to_rnx.py for sample usage and a list of command line options +See gnslogger_to_rnx.py for sample usage and a list of command line options. + +`rtklibexplorer`'s fork has been modified in `plutonheaven`'s fork to use the code as a package in another project. + +To do so, add the following line to your projects `pyproject.toml`: +``` +dependencies = [ + ... + "android_rinex==0.1.0", +] + +[tool.uv.sources] +android_rinex = { git = "https://github.com/plutonheaven/android_rinex", branch = "master" } +``` \ No newline at end of file From b5c5928ab353ff4f96c46139df4d659c19846be3 Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Wed, 20 May 2026 16:04:08 +0200 Subject: [PATCH 05/10] Fix glonass header (#2) * fix GLONASS header * Adapt instruction example to new packaging structure --- src/android_rinex/gnsslogger_to_rnx.py | 14 +++++++++++--- src/android_rinex/rinex3.py | 24 +++++++++++++++--------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/android_rinex/gnsslogger_to_rnx.py b/src/android_rinex/gnsslogger_to_rnx.py index 1372b80..272813c 100644 --- a/src/android_rinex/gnsslogger_to_rnx.py +++ b/src/android_rinex/gnsslogger_to_rnx.py @@ -2,11 +2,19 @@ """ Tool to convert from logfile of GPS-measurements to RINEX format -Usage: gnsslogger_to_rnx logfile +Let us assume the following folder structure: +android_rinex/ +├── data/ +│ └── gnss_log.txt/ +└── src/ + └── android_rinex/ + ├── gnsslogger_to_rnx.py + +Usage from the root folder: +> python -m src.android_rinex.gnsslogger_to_rnx logfile Example using sample data file: - - gnsslogger_to_rnx ../data/gnss_log.txt + > python -m src.android_rinex.gnsslogger_to_rnx data/gnss_log.txt See main() below for a list of command line options """ diff --git a/src/android_rinex/rinex3.py b/src/android_rinex/rinex3.py index b5b24ba..312a868 100644 --- a/src/android_rinex/rinex3.py +++ b/src/android_rinex/rinex3.py @@ -214,21 +214,27 @@ def __write_rnx3_header_glo_slot_frq_chn__(glo_slot_freq_chns): # Gets the number of satellites in the list num_sats = len(glo_slot_freq_chns) - # Number of satellites in list + # list of lines + res_list = [] + + # First line begins with number of satellites in list res = "{0:3d} ".format(num_sats) - # Satellite numbers + frequency numbers + # Loop on satellite numbers + frequency numbers for sat in glo_slot_freq_chns: res += "{0:3s} {1:2d} ".format(sat, glo_slot_freq_chns[sat]) if len(res) == 60: - res += "{0:60s}{1}\n".format(res, TAIL) - res += " " - - # Tail specs - res = "{0:60s}{1}\n".format(res, TAIL) - - return res + # add tail and add current line to list + res_list.append("{0:60s}{1}\n".format(res, TAIL)) + # start a new line + res = " " + + # Add current line to list if not empty + if res != " ": + res_list.append("{0:60s}{1}\n".format(res, TAIL)) + + return "".join(res_list) # ----------------------------------------------------------------------------- From 7a5541ee890ce0bd5bf6a847d35b76754bb147fe Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Wed, 20 May 2026 22:35:51 +0200 Subject: [PATCH 06/10] remove glonass frequency slot when carrier frequency is unknown (#3) gnss_log.txt from sm-g955f phones do not contain the carrier frequency. This makes the determination of the GLONASS frequency slot impossible. This PR deactivates the writing of the GLONASS SLOT / FRQ # in the header in such case. --- src/android_rinex/gnsslogger.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/android_rinex/gnsslogger.py b/src/android_rinex/gnsslogger.py index e9160df..dda8828 100644 --- a/src/android_rinex/gnsslogger.py +++ b/src/android_rinex/gnsslogger.py @@ -463,8 +463,9 @@ def get_glo_freq_chn_list(batches): if sat not in freq_chn_list: freq = get_frequency(measurement) - freq_chn = round((freq -FREQ1_GLO ) / DFREQ1_GLO) - freq_chn_list[sat] = freq_chn + if freq != 1575420000: + freq_chn = round((freq -FREQ1_GLO ) / DFREQ1_GLO) + freq_chn_list[sat] = freq_chn return freq_chn_list From 98feb6aca28c96eeffb5509407ea96cfc0887f23 Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Wed, 20 May 2026 22:48:09 +0200 Subject: [PATCH 07/10] Specify position written in header (#4) --- src/android_rinex/gnsslogger_to_rnx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android_rinex/gnsslogger_to_rnx.py b/src/android_rinex/gnsslogger_to_rnx.py index 272813c..0f84559 100644 --- a/src/android_rinex/gnsslogger_to_rnx.py +++ b/src/android_rinex/gnsslogger_to_rnx.py @@ -84,7 +84,7 @@ def convert2rnx(args): rec_version=args.receiver_version, antenna=args.antenna_number, ant_type=args.antenna_type, - pos=[0.0, 0.0, 0.0], + pos=args.pos, hen=[0.0, 0.0, 0.0], glo_slot_freq_chns=glo_freq_chns, glo_cod_phs_bis=glo_cod_phs_bis) From 9d2bba4bd14a4da31f1fcdfdfe55eb516f3baf7e Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Tue, 26 May 2026 15:36:43 +0200 Subject: [PATCH 08/10] work around when data is missing in loc.txt (#5) --- src/android_rinex/gnsslogger.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/android_rinex/gnsslogger.py b/src/android_rinex/gnsslogger.py index dda8828..6060b37 100644 --- a/src/android_rinex/gnsslogger.py +++ b/src/android_rinex/gnsslogger.py @@ -672,6 +672,9 @@ def process(measurement, model, fix_bias=True, timeadj=1e-7, pseudorange_bias=0. raise ValueError("-- WARNING: Invalid value of TimeNanos or satellite [ {0} ]\n".format(satname)) + if fullbiasnanos == "": + return None + # Compute the GPS week number and reception time (i.e. clock epoch) gpsweek = math.floor(-fullbiasnanos * NS_TO_S / GPS_WEEKSECS) local_est_GPS_time = timenanos - (fullbiasnanos + biasnanos) From 18ba7a391d1a2992005eb91d90dcc0243c311f5b Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Tue, 26 May 2026 16:20:30 +0200 Subject: [PATCH 09/10] add system time to header (#6) --- src/android_rinex/rinex3.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/android_rinex/rinex3.py b/src/android_rinex/rinex3.py index 312a868..2279ffe 100644 --- a/src/android_rinex/rinex3.py +++ b/src/android_rinex/rinex3.py @@ -175,7 +175,8 @@ def __write_rnx3_header_firstobs__(epoch): res = epoch.strftime(" %Y %m %d %H %M %S.") + \ '{0:06d}0'.format(int(epoch.microsecond)) - + res += " GPS" + res = "{0:60s}{1}\n".format(res, TAIL) return res From a6f0a5cc4d5b9d4460d654f35d6e44919e0df8c6 Mon Sep 17 00:00:00 2001 From: plutonheaven <43670654+plutonheaven@users.noreply.github.com> Date: Wed, 27 May 2026 10:28:13 +0200 Subject: [PATCH 10/10] Add sys time 2 (#7) * add syst time to TIME OF LAST OBS * correct date format --- src/android_rinex/rinex3.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/android_rinex/rinex3.py b/src/android_rinex/rinex3.py index 2279ffe..d10f02a 100644 --- a/src/android_rinex/rinex3.py +++ b/src/android_rinex/rinex3.py @@ -174,9 +174,8 @@ def __write_rnx3_header_firstobs__(epoch): TAIL = "TIME OF FIRST OBS" res = epoch.strftime(" %Y %m %d %H %M %S.") + \ - '{0:06d}0'.format(int(epoch.microsecond)) + '{0:06d}'.format(int(epoch.microsecond)) res += " GPS" - res = "{0:60s}{1}\n".format(res, TAIL) return res @@ -192,8 +191,8 @@ def __write_rnx3_header_lastobs__(epoch): TAIL = "TIME OF LAST OBS" res = epoch.strftime(" %Y %m %d %H %M %S.") + \ - '{0:06d}0'.format(int(epoch.microsecond)) - + '{0:06d}'.format(int(epoch.microsecond)) + res += " GPS" res = "{0:60s}{1}\n".format(res, TAIL) return res