From dff3fe4eda8bff45d30218ae91902eafa84a9b4a Mon Sep 17 00:00:00 2001 From: y3n Date: Mon, 12 Jan 2026 12:47:55 +0100 Subject: [PATCH 1/2] convbin.sh refactoring for triple band and rinex date interval optimization --- tools/convbin.sh | 209 +++++++++++++++++++++++------------- web_app/templates/logs.html | 2 +- 2 files changed, 138 insertions(+), 73 deletions(-) diff --git a/tools/convbin.sh b/tools/convbin.sh index 91a8020c..199f330a 100755 --- a/tools/convbin.sh +++ b/tools/convbin.sh @@ -1,110 +1,175 @@ #!/bin/bash -#convert zipped raw file to rinex -#./convbin.sh ubx.zip directory rinex_type +# convert zipped raw file to rinex +# usage: ./convbin.sh + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) source <( grep '=' "${SCRIPT_DIR}"/../settings.conf ) -RAW_ARCHIVE=$1 -DATA_DIR=$2 -MOUNT_NAME=$mnt_name_a -RAW_TYPE=$receiver_format -RINEX_TYPE=$3 -CONVBIN_PATH=$(type -P convbin) -ANT_POSITION=$(echo "${position}" | cs2cs EPSG:4979 EPSG:4978 -f "%.2f" | sed 's/\s/\//g') + +RAW_ARCHIVE="${1:?Missing raw archive/raw file argument}" +DATA_DIR="${2:?Missing data dir argument}" +RINEX_TYPE="${3:?Missing rinex_type argument}" + +MOUNT_NAME="$mnt_name_a" +RAW_TYPE="$receiver_format" +CONVBIN_PATH="$(type -P convbin || true)" + +ANT_POSITION=$(echo "${position}" | cs2cs EPSG:4979 EPSG:4978 -f "%.2f" | sed 's/\s/\//g') RECEIVER="${receiver}" REC_VERSION="${receiver_firmware}" REC_OPTION='' -[[ -n $ntrip_a_receiver_options ]] && REC_OPTION="${ntrip_a_receiver_options}" +[[ -n "${ntrip_a_receiver_options:-}" ]] && REC_OPTION="${ntrip_a_receiver_options}" ANT_TYPE="${antenna_info}" RTKBASE_VERSION='RTKBase v'"${version}" +test -z "${CONVBIN_PATH}" && echo 'Error: convbin not found in PATH' 1>&2 && exit 1 + extract_raw_file() { raw_file=$(unzip -l "${RAW_ARCHIVE}" "*.${RAW_TYPE}" | awk '/-----/ {p = ++p % 2; next} p {print $NF}') - test $(echo "${raw_file}" | wc -l) -gt 1 && echo 'Error: There is more than 1 file in this archive' 1>&2 && exit 1 - echo "- Extracting " "${raw_file}" + test "$(echo "${raw_file}" | wc -l)" -gt 1 && echo 'Error: There is more than 1 file in this archive' 1>&2 && exit 1 + echo "- Extracting ${raw_file}" unzip -o "${RAW_ARCHIVE}" "${raw_file}" - return $? } +# Determine observation date for convbin -ts/-te (requires YYYY/MM/DD). +# Primary: RAW_ARCHIVE filename starts with YYYY-MM-DD +# Fallback: filesystem mtime of RAW_ARCHIVE +set_obs_date() { + filedate="${RAW_ARCHIVE:0:10}" # expected: YYYY-MM-DD + year2="${RAW_ARCHIVE:2:2}" # used for RINEX v2 naming + + if [[ "${filedate}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then + OBS_DATE="${filedate//-/\/}" # YYYY/MM/DD + else + OBS_DATE="$(date -r "${RAW_ARCHIVE}" +%Y-%m-%d)" # get mtime date (modified date) + PREV_DATE="$(date -d "${OBS_DATE} -1 day" +%Y-%m-%d)" # previous day of OBS_DATE + year2="${PREV_DATE:2:2}" + fi + + export OBS_DATE filedate year2 +} + +# GPS Time window for the day (convbin default is GPST unless -tu is used) +TS_HMS="00:00:00" +TE_HMS="23:59:30" + # Rinex v2.11 - 30s - GPS convert_to_rinex_ign() { - echo "- CREATING RINEX " "${RINEX_FILE}" - "${CONVBIN_PATH}" "${raw_file}" -v 2.11 -r "${RAW_TYPE}" \ - -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ - -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ - -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -f 2 -y R -y E -y J -y S -y C -y I \ - -od -os -oi -ot -ti 30 -tt 0.005 \ + echo "- CREATING RINEX ${RINEX_FILE}" + "${CONVBIN_PATH}" "${raw_file}" -v 2.11 -r "${RAW_TYPE}" \ + -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ + -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ + -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ + -f 3 -y R -y E -y J -y S -y C -y I \ + -od -os -oi -ot \ + -ti 30 -tt 0.005 \ + -ts "${OBS_DATE}" "${TS_HMS}" \ + -te "${OBS_DATE}" "${TE_HMS}" \ -ro "${REC_OPTION}" -o "${RINEX_FILE}" - return $? } +# (kept for reference; fixed to pass args as separate tokens, not one string) convert_to_rinex_ign_bis() { - echo "- CREATING RINEX " "${RINEX_FILE}" - args="${raw_file}"' -v 2.11 -r '"${RAW_TYPE}"' -hc '"${RTKBASE_VERSION}"' -hm '"${MOUNT_NAME}"' -hp '"${ANT_POSITION}"' -ha 0000/'"${ANT_TYPE}"' -hr 0000/'"${RECEIVER}"'/'"${REC_VERSION}"' -f 2 -y R -y E -y J -y S -y C -y I -od -os -oi -ot -ti 30 -tt 0 -ro '"${REC_OPTION}"' -o '"${RINEX_FILE}" - "${CONVBIN_PATH}" "${args}" - return $? + echo "- CREATING RINEX ${RINEX_FILE}" + "${CONVBIN_PATH}" "${raw_file}" -v 2.11 -r "${RAW_TYPE}" \ + -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ + -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ + -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ + -f 3 -y R -y E -y J -y S -y C -y I \ + -od -os -oi -ot \ + -ti 30 -tt 0 \ + -ts "${OBS_DATE}" "${TS_HMS}" \ + -te "${OBS_DATE}" "${TE_HMS}" \ + -ro "${REC_OPTION}" -o "${RINEX_FILE}" } -# Rinex v3.04 - 30s - GPS + GLONASS + GALILEO + +# Rinex v3.04 - 30s - GPS + GLONASS + GALILEO convert_to_rinex_nrcan() { - echo "- CREATING RINEX " "${RINEX_FILE}" - "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ - -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ - -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ - -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -f 2 -y J -y S -y C -y I \ - -od -os -oi -ot -ti 30 -tt 0 \ + echo "- CREATING RINEX ${RINEX_FILE}" + "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ + -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ + -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ + -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ + -f 3 -y J -y S -y C -y I \ + -od -os -oi -ot \ + -ti 30 -tt 0 \ + -ts "${OBS_DATE}" "${TS_HMS}" \ + -te "${OBS_DATE}" "${TE_HMS}" \ -ro "${REC_OPTION}" -o "${RINEX_FILE}" - return $? } -# Rinex v3.04 - 30s - GPS + GLONASS + GALILEO + BEIDOU + QZSS + NAVIC + SBAS +# Rinex v3.04 - 30s - GPS + GLONASS + GALILEO + BEIDOU + QZSS + NAVIC + SBAS convert_to_rinex_30s_full() { - echo "- CREATING RINEX " "${RINEX_FILE}" - "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ - -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ - -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ - -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -od -os -oi -ot -ti 30 -tt 0 \ + echo "- CREATING RINEX ${RINEX_FILE}" + "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ + -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ + -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ + -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ + -od -os -oi -ot \ + -ti 30 -tt 0 \ + -ts "${OBS_DATE}" "${TS_HMS}" \ + -te "${OBS_DATE}" "${TE_HMS}" \ -ro "${REC_OPTION}" -o "${RINEX_FILE}" - return $? } -# Rinex v3.04 - 1s - GPS + GLONASS + GALILEO + BEIDOU + QZSS + NAVIC + SBAS +# Rinex v3.04 - 1s - GPS + GLONASS + GALILEO + BEIDOU + QZSS + NAVIC + SBAS convert_to_rinex_1s_full() { - echo "- CREATING RINEX " "${RINEX_FILE}" - "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ - -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ - -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ - -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -od -os -oi -ot -ti 1 -tt 0 \ + echo "- CREATING RINEX ${RINEX_FILE}" + "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ + -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ + -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ + -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ + -od -os -oi -ot \ + -ti 1 -tt 0 \ + -ts "${OBS_DATE}" "${TS_HMS}" \ + -te "${OBS_DATE}" "${TE_HMS}" \ -ro "${REC_OPTION}" -o "${RINEX_FILE}" - return $? } -#go to directory +# go to directory cd "${DATA_DIR}" || exit 1 -#get date file, year & create RINEX name -filedate=$(echo ${1:0:10}) -year2=$(echo ${1:2:2}) - -test -z "${CONVBIN_PATH}" && echo 'Error: Convbin not found' && exit 1 -if [[ ${RINEX_TYPE} == 'ign' ]] ; then rnx_conversion_func='convert_to_rinex_ign' ; RINEX_FILE=$(echo "${filedate}"-"${MOUNT_NAME}"_"${RINEX_TYPE}"."${year2}"o) -elif [[ ${RINEX_TYPE} == 'nrcan' ]] ; then rnx_conversion_func='convert_to_rinex_nrcan' ; RINEX_FILE=$(echo "${filedate}"-"${MOUNT_NAME}"_"${RINEX_TYPE}".obs) -elif [[ ${RINEX_TYPE} == '30s_full' ]] ; then rnx_conversion_func='convert_to_rinex_30s_full' ; RINEX_FILE=$(echo "${filedate}"-"${MOUNT_NAME}"_"${RINEX_TYPE}".obs) -elif [[ ${RINEX_TYPE} == '1s_full' ]] ; then rnx_conversion_func='convert_to_rinex_1s_full' ; RINEX_FILE=$(echo "${filedate}"-"${MOUNT_NAME}"_"${RINEX_TYPE}".obs) -fi -#Let's launch the CONVBIN process -echo "- Processing on ""${RAW_ARCHIVE}" +# compute dates for naming and time window +set_obs_date + +# choose conversion function and output name +case "${RINEX_TYPE}" in + ign) + rnx_conversion_func='convert_to_rinex_ign' + RINEX_FILE="${filedate}-${MOUNT_NAME}_${RINEX_TYPE}.${year2}o" + ;; + nrcan) + rnx_conversion_func='convert_to_rinex_nrcan' + RINEX_FILE="${filedate}-${MOUNT_NAME}_${RINEX_TYPE}.obs" + ;; + 30s_full) + rnx_conversion_func='convert_to_rinex_30s_full' + RINEX_FILE="${filedate}-${MOUNT_NAME}_${RINEX_TYPE}.obs" + ;; + 1s_full) + rnx_conversion_func='convert_to_rinex_1s_full' + RINEX_FILE="${filedate}-${MOUNT_NAME}_${RINEX_TYPE}.obs" + ;; + *) + echo "Error: unknown rinex_type '${RINEX_TYPE}' (expected: ign|nrcan|30s_full|1s_full)" 1>&2 + exit 1 + ;; +esac + +# Launch convbin +echo "- Processing on ${RAW_ARCHIVE}" + file_extension="${RAW_ARCHIVE##*.}" -if [[ $file_extension == 'zip' ]] - then - extract_raw_file - else - raw_file="${RAW_ARCHIVE}" +if [[ "${file_extension}" == "zip" ]]; then + extract_raw_file +else + raw_file="${RAW_ARCHIVE}" fi -${rnx_conversion_func} + +"${rnx_conversion_func}" return_code=$? -echo -n 'rinex_file='"${RINEX_FILE}" -[[ $file_extension == 'zip' ]] && rm "${raw_file}" -exit $return_code \ No newline at end of file + +echo -n "rinex_file=${RINEX_FILE}" + +[[ "${file_extension}" == "zip" ]] && rm -f "${raw_file}" + +exit "${return_code}" diff --git a/web_app/templates/logs.html b/web_app/templates/logs.html index 43015784..ae8fb0fb 100644 --- a/web_app/templates/logs.html +++ b/web_app/templates/logs.html @@ -77,7 +77,7 @@
  • Rinex v2.11
  • GPS only
  • L1/L2
  • Time interval: 30 seconds
  • preset for Ign service
-
  • Rinex v3.04
  • GPS + Glonass
  • L1/L2
  • Time interval: 30 seconds
  • preset for Nrcan service
+
  • Rinex v3.04
  • GPS + Glonass + Galileo
  • L1/L2/5
  • Time interval: 30 seconds
  • preset for Nrcan service
  • Rinex v3.04
  • All supported GNSS constellations
  • All supported frequencies
  • Time interval: 30 seconds
From cf445ba9d31459f35c1cd5b5927020958bf32a27 Mon Sep 17 00:00:00 2001 From: y3n Date: Sat, 31 Jan 2026 00:11:57 +0100 Subject: [PATCH 2/2] convbin: changed IGN freq to 2 and added docs for nrcan --- tools/convbin.sh | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tools/convbin.sh b/tools/convbin.sh index 199f330a..420eeef2 100755 --- a/tools/convbin.sh +++ b/tools/convbin.sh @@ -53,13 +53,14 @@ TS_HMS="00:00:00" TE_HMS="23:59:30" # Rinex v2.11 - 30s - GPS +# doc: https://rgp.ign.fr/SERVICES/aide_calcul_ligne.php convert_to_rinex_ign() { echo "- CREATING RINEX ${RINEX_FILE}" "${CONVBIN_PATH}" "${raw_file}" -v 2.11 -r "${RAW_TYPE}" \ -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -f 3 -y R -y E -y J -y S -y C -y I \ + -f 2 -y R -y E -y J -y S -y C -y I \ -od -os -oi -ot \ -ti 30 -tt 0.005 \ -ts "${OBS_DATE}" "${TS_HMS}" \ @@ -74,7 +75,7 @@ convert_to_rinex_ign_bis() { -hc "${RTKBASE_VERSION}" -hm "${MOUNT_NAME}" \ -hp "${ANT_POSITION}" -ha 0000/"${ANT_TYPE}" \ -hr 0000/"${RECEIVER}"/"${REC_VERSION}" \ - -f 3 -y R -y E -y J -y S -y C -y I \ + -f 2 -y R -y E -y J -y S -y C -y I \ -od -os -oi -ot \ -ti 30 -tt 0 \ -ts "${OBS_DATE}" "${TS_HMS}" \ @@ -83,6 +84,9 @@ convert_to_rinex_ign_bis() { } # Rinex v3.04 - 30s - GPS + GLONASS + GALILEO +# doc: https://webapp.csrs-scrs.nrcan-rncan.gc.ca/geod/tools-outils/ppp-info.php?locale=en#csrs_ppp_v5_upgrade_header +# Galileo only supported for "rapid" and "final" products, not "ultra-rapid" +# Wait 18h after observation day start for Galileo "rapid" products to be available to improve accuracy. convert_to_rinex_nrcan() { echo "- CREATING RINEX ${RINEX_FILE}" "${CONVBIN_PATH}" "${raw_file}" -v 3.04 -r "${RAW_TYPE}" \ @@ -168,8 +172,24 @@ fi "${rnx_conversion_func}" return_code=$? -echo -n "rinex_file=${RINEX_FILE}" +# var for tar.gz output +TAR_GZ_OUTPUT="${RINEX_FILE}.tar.gz" +# Compress output rinex file to .tar.gz +if [[ "${return_code}" -eq 0 ]]; then + echo "- COMPRESSING RINEX ${TAR_GZ_OUTPUT}" + tar -czf "${TAR_GZ_OUTPUT}" "${RINEX_FILE}" + rm -f "${RINEX_FILE}" +fi + +# Output rinex file path +echo -n "rinex_file=${TAR_GZ_OUTPUT}" + +# Clean up extracted raw file if needed [[ "${file_extension}" == "zip" ]] && rm -f "${raw_file}" +# Clean up non-compressed rinex if exists +[[ -f "${RINEX_FILE}" ]] && rm -f "${RINEX_FILE}" + +# Exit with convbin return code exit "${return_code}"