Skip to content

High-precision Windows time sync via GPS/GNSS. (GPS/GNSSレシーバーによる高精度なWindows時刻同期ツール)

License

Notifications You must be signed in to change notification settings

jp1lrt/ChronoGPS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

164 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Note

本プロジェクトは旧名称 gps-time-sync から変更されました。 This project was formerly known as gps-time-sync.

ChronoGPS

GPS / NTP 時刻同期ツール — Windows向け

GPSレシーバーまたはNTPサーバーを使って、WindowsのPC時刻を正確に同期するツールです。
FT8などのデジタル無線通信で必要な高精度な時刻合わせに特化しています。
管理者権限がない環境でも「モニタ専用」として安全に動作します。

本ツールは「とりあえず合う」ではなく、
なぜその時刻になるのかを説明できること
OSのルールを正面から守ることを重視して設計されています。

🌐 English README

ChronoGPS


設計思想

ChronoGPS は「正確な時刻を、余計��操作なしで得る」ことを目的に設計されています。

  • GPS / NTP といった複数の時刻源を状況に応じて使い分けられること
  • 時刻同期処理はバックグラウンドで安全に行い、UI は常に安定していること
  • アマチュア無線(FT8 など)や計測用途で「信頼できる基準時」を提供すること

派手な演出よりも、確実に・静かに・長時間動き続けることを重視しています。

即時同期(Instant Sync) / 定期同期(Weak Sync) の設計思想や挙動の詳細については、 以下の FAQ にまとめています:

👉 FAQ(よくある質問)


Why ChronoGPS?

設計思想(透明性 / 権限の扱い / "モニタ専用モード" の意図)はこちら:

  • 🔗 Why ChronoGPS (Discussion): #3 ※ 設計思想の背景については Discussion #3 を参照してください。

特徴

  • 🌐 NTP同期(RFC 5905準拠) — 64bitタイムスタンプ、t1/t2/t3/t4によるoffset/delay計算、msオーダーの高精度補正
  • 🛰️ GPS同期 — オフ / 即時 / 定期の3モード、RMCベースのUTC時刻取得、重複同期防止ロジックあり
    定期モードはGPS受信直後トリガ方式+中央値フィルタ(ジッタ抑制)で±0.1秒以内を維持
  • ⏱️ FT8オフセット — ±0.1秒刻みで時刻を微調整するFT8デジタルモード専用機能
  • 📡 衛星情報表示 — GPS / GLONASS / BeiDou / Galileo / SBAS / QZSS をリアルタイム表示
  • 🔒 非管理者対応(v2.5強化) — デフォルトでモニタ専用起動。同期が必要なときだけバナーから昇格可能
  • 🧵 スレッド安全なGUI — ワーカースレッド + Queue + メインスレッド更新でTkinterのフリーズを防止
  • 🌍 16言語対応 — 日本語・英語・フランス語・スペイン語・ドイツ語・中国語(簡体・繁体)・韓国語・ポルトガル語・イタリア語・オランダ語・ロシア語・ポーランド語・トルコ語・スウェーデン語・インドネシア語
  • 🖥️ Windowsネイティブ体験 — システムトレイ常駐、×ボタン→トレイ収納、タスクバーアイコン対応

スクリーンショット

時刻同期画面

衛星情報画面


動作モード(v2.5〜)

v2.5 から、起動時のUACダイアログは廃止されました。
常にモニタ専用モードで起動し、同期が必要なときだけ画面上のバナーから昇格できます。

起動時(デフォルト��モニタ専用)

  • UACダイアログは表示されません
  • GPS受信・衛星表示・NTP時刻確認はそのまま利用可能
  • 画面上部に「時刻同期を有効にする(管理者として再起動)」バナーが表示されます

同期機能を使いたいとき

  • バナーのボタンをクリック → UACダイアログで許可 → 管理者として再起動
  • UACをキャンセルしても、モニタモードのまま継続されます(プロセスは終了しません)
  • 再起動後はバナーが消え、GPS/NTP同期が利用可能になります

コマンドライン起動

# モニタ専用で起動(デフォルト)
.\ChronoGPS.exe

# 同期モードで起動(非管理者でもバナーは表示される)
.\ChronoGPS.exe --mode=sync

動作環境

  • Windows 10 / 11
  • Python 3.11以上(スクリプト実行の場合)
  • GPSレシーバー(GPS同期使用時)
  • 管理者権限(時刻同期を行う場合)

インストール・起動

exeで使う場合(推奨)

  1. ChronoGPS.exeicon.ico を同じフォルダに置く
  2. ChronoGPS.exe をダブルクリックで起動(モニタ専用モードで起動します)
  3. 時刻同期が必要な場合は画面上部のバナーから昇格してください

管理者権限で自動起動させたい場合は FAQ Q21 を参照してください。

Pythonスクリプトで使う場合

python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python main.py

exe のビルド方法(開発者向け)

ChronoGPS は venv 環境でのビルドを前提としています。
グローバル環境での PyInstaller 実行は、依存関係の混入や再現性低下の原因となるため推奨しません。

1. 仮想環境の作成と有効化(Windows / PowerShell)

python -m venv .venv
.\.venv\Scripts\Activate.ps1

2. 依存関係のインストール

pip install -r requirements.txt
pip install -r requirements-dev.txt
pip install -U pyinstaller

3. テストの実行(必須)

python -m pytest -q

すべてのテストが成功していることを確認してください。

4. exe のビルド(クリーンビルド)

pyinstaller --noconfirm --clean --onefile --windowed `
  --name "ChronoGPS" `
  --icon ".\icon.ico" `
  --add-data ".\icon.ico;." `
  --add-data ".\icon.png;." `
  --add-data ".\donate_qr.png;." `
  --add-data ".\locales.py;." `
  --add-data ".\locales_override.py;." `
  --add-data ".\gps_time_sync_config.json;." `
  --hidden-import "tkinter" `
  --hidden-import "tkinter.ttk" `
  --hidden-import "tkinter.messagebox" `
  --hidden-import "tkinter.filedialog" `
  --hidden-import "tkinter.scrolledtext" `
  --hidden-import "admin" `
  --hidden-import "startup" `
  --hidden-import "shutdown_manager" `
  --collect-submodules "tkinter" `
  .\main.py

ビルド方針について

  • --clean を必ず使用し、過去の build / dist による汚染を防止します
  • v2.5 から admin / startup / shutdown_manager が追加されたため、--hidden-import に3モジュールを明示指定しています
  • 同梱するファイルは必要なものを明示指定します(プロジェクト全体の一括同梱は行いません)

ビルド後、dist ディレクトリに ChronoGPS.exe が生成されます。

5. アイコンについて

  • exe ファイルのアイコンは ChronoGPS のロゴを使用しています
  • トレイアイコンは視認性を優先して時計アイコンを採用しています
    (小サイズでの黒つぶれを防ぐため、意図的に分けています)

使い方

GPS同期

  1. GPSレシーバーをPCに接続
  2. COMポートとボーレート(通常9600)を選択
  3. 「開始」ボタンで受信スタート
  4. GPS同期モードを「即時」または「定期」に設定

GPS同期について(推奨設定)

ChronoGPS は GNSS(GPS / QZSS など)を UTC に直結した絶対時刻基準として使用します。

FT8 / FT4 などの 通常のデジタルモード運用では、
GPS の「Instant Sync(即時同期)」を推奨します。

Instant Sync は、

  • GNSS を基準として
  • OS のシステム時刻を適切な代表値で校正し
  • その後は OS の時刻モデルを尊重しつつ監視する

ための同期モードです。

こ��で重要なのは、Instant Sync が
「毎秒必ず時刻を書き換える」モードではない という点です。

Note

Instant Sync が「推奨」であるという意味

「Instant Sync を推奨する」という表現は、
OS のシステム時刻を書き換える操作を頻繁に繰り返す必要がない
(=不要な連続補正をしない)という意味です。

これは「同期をオフにしてよい」という意味ではありません。 Instant Sync は 有効にしたまま運用して問題ありません

Instant Sync は GNSS を常に参照しますが、
必要な場合にのみ最小限の補正が行われます。

また、GPS受信を停止してよいという意味でもありません。 GPS受信は表示・監視・検証目的で継続していても問題ありません。

GNSS は非常に安定した時刻基準であり、
Instant Sync により正しく校正された状態は、
FT8 / FT4 の要求精度(±1 秒)を大きく上回る余裕を持ちます。

即時同期 / 定期同期 の設計思想や挙動の詳細については、
以下の FAQ にまとめています:

👉 FAQ(よくある質問)


定期同期(Weak Sync / Interval Sync)について

一方で、以下のような用途では
定期同期(Weak Sync / Interval Sync) を利用できます。

  • 長時間稼働時の システムクロックのドリフト監視
  • GNSS 受信状態の変化確認
  • 異常検知・検証用途

定期同期は、常時補正を行う同期モードではありません。
ChronoGPS では、このモードを 「監視が主、補正は例外」 として設計しています。

Weak Sync(定期同期)動作図

Interval(Weak Sync)は
「毎秒サンプルを蓄積 → 設定間隔に到達したときだけ評価」
という動作を行います。

閾値内であれば補正を行わず、
GNSS受信ジッタを Windows のシステム時刻に注入しない ことを優先します。


定期同期はどう動くか

  • GNSS受信(毎秒)に合わせて
    時刻差サンプルを常時蓄積します(OS時刻は変更しません)
  • 設定した同期間隔に到達したタイミングでのみ、
    蓄積したサンプルを評価します
  • 評価には 中央値(メディアン) を使用します
  • 中央値オフセットが閾値内の場合は
    意図的に補正を行いません(skipped)

緩やかなドリフトが見える場合(正常動作)

ログに -0.03s → -0.05s のような緩やかなドリフトが見えることがあります。
これは多くの場合、

  • PC システムクロックの自然なドリフト

であり、同期失敗ではありません。

この程度の変化に対して毎回 OS 時刻を補正すると、
GNSS 受信時の微小な揺らぎ(ジッタ)を
逆に OS 時刻へ注入してしまう可能性があります。

そのため ChronoGPS は、

  • 閾値内 → あえて何もしない
  • 閾値超過 → 必要なときだけ補正

という、保守的で説明可能な判断を行います。


デフォルト設定(Weak Sync)

  • 閾値:±0.2 秒
  • サンプル窓:直近 30 秒の中央値

どのモードを使うべきか(まとめ)

  • 通常の FT8 / FT4 運用
    Instant Sync(即時同期)

  • 長時間稼働・挙動確認・検証用途
    Weak Sync(定期同期)

定期同期は
「勝手に時刻を合わせてくれる魔法の機能」ではありません。

時刻の状態を"見える化"し、必要なときだけ補正するためのツールです。

NTP同期

  1. NTPサーバーを入力(デフォルト: pool.ntp.org
    • 日本国内では ntp.nict.jp がおすすめ
  2. 「NTP同期」ボタンで即時同期、または自動同期を有効化

FT8オフセット

FT8運用でタイミングがずれる場合、オフセット欄に補正値(秒)を入力して「適用」。
±0.1秒刻みのクイック調整ボタンも利用可能。


表示される時刻について

ChronoGPS の画面に表示される「システム時刻」「GPS時刻」「NTP時刻」は、 取得タイミングや更新周期の違いにより、瞬間的に差が見える場合があります。

これは表示上のものであり、バックグラウンドで行われる時刻同期処理自体の精度には影響しません。 実際の同期はミリ秒単位で正しく行われています。


衛星情報について

表示 意味
使用中 (GNSS) GPS / GLONASS / BeiDou / Galileo の主衛星。時刻解・測位解に直接使用
使用中 (SBAS) WAAS / MSAS / EGNOS などの補強衛星。軌道誤差・電離層補正に使用(時刻源ではない)
捕捉中 受信できているが時刻解・測位解には使用していない衛星

SBAS衛星(日本ではMSAS)は受信しても「使用中」に入らないことがありますが、これは正常な動作です。
SBASは時刻源ではなく測位補強信号であり、ChronoGPSは業務用GNSS時刻同期機に近い設計を採用しています。

QZSS(みちびき)は日本の準天頂衛星システムです。対応受信機では衛星情報タブに表示されます。
受信機のファームウェアによっては QZSS の NMEA 出力が無効化されている場合があり、その場合は表示欄が空欄になりますが、これは正常な動作です。


起動時の注意

  • v2.5以降、起動時のUACダイアログは廃止されました。デフォルトでモニタ専用モードで起動します
  • 時刻同期が必要な場合は画面上部のバナーから昇格してください
  • ×ボタンはトレイに収納されます。完全終了はタスクトレイアイコンを右クリック →「終了」
  • NTPサーバーはデフォルト pool.ntp.org です。ntp.nict.jp など好みのサーバーに変更できます

ファイル構成

ChronoGPS/
├── README.md               # プロジェクトの概要・使い方
├── docs/                   # ドキュメント類
│   ├── FAQ.md              # 設計思想・詳細な仕様解説
│   └── weak-sync-diagram.ja2.png # 動作原理の図解
├── main.py                 # エントリーポイント(アプリの起動)
├── gui.py                  # メインGUI画面の制御
├── startup.py              # 起動引数解析・モード決定・Mutex管理 (v2.5)
├── admin.py                # 管理者権限チェック・UAC昇格処理 (v2.5)
├── shutdown_manager.py     # 終了シーケンス管理 (v2.5)
├── config.py               # 設定ファイル(JSON)の読み書き管理
├── locales.py              # 多言語対応(翻訳データ)
├── locales_override.py     # 特定環境向けの文言上書き
├── nmea_parser.py          # GPSからのNMEAデータの解析
├── ntp_client.py           # NTPサーバーとの通信
├── time_sync.py            # OS時刻の変更・同期処理の司令塔
├── weak_sync_logic.py      # 弱同期(定期同期)の判定アルゴリズム(Pure Logic)
├── autostart.py            # Windows起動時の自動実行管理
├── tray_icon.py            # システムトレイ(タスクトレイ)の制御
├── requirements.txt        # 実行に必要なパッケージ一覧
├── requirements-dev.txt    # 開発・テストに必要なパッケージ一覧
├── icon.png                # アプリアイコン(PNG形式)
├── icon.ico                # アプリアイコン(Windows用、exe内蔵用)
└── gps_time_sync_config.json # 実行時に生成される設定ファイル

ダウンロード

公式の配布は GitHub Releases を通じて行います。常に最新版は Releases の「Latest」を参照してください。

配布物(例)

  • ChronoGPS.exe — Windows 実行ファイル(PyInstaller ビルド)
  • icon.ico — アプリケーションアイコン
  • checksums.txt — 各ファイルの SHA256 チェックサム

ダウンロードしたバイナリの検証(PowerShell)

# SHA256 ハッシュを表示
Get-FileHash .\ChronoGPS.exe -Algorithm SHA256

出力されたハッシュを releases に添付された checksums.txt の該当行と照合してください。

セキュリティ上の注意

  • 公式ダウンロードは必ず GitHub Releases(上のリンク)から行ってください。非公式サイトやサードパーティの配布は避けてください。
  • 配布物には GPG 署名(checksums.txt.asc)を添付しています。なお、Windows Authenticode 署名(SmartScreen 警告の抑制)は現在未対応です。
  • ウイルススキャンの結果(VirusTotal 等)を公開することも検討してください。

ウイルス対策ソフトによる誤検知について

一部のウイルス対策ソフトが ChronoGPS.exe を誤検知する場合があります。 これは PyInstaller でビルドされた exe に対してヒューリスティック検出が反応するもので、 悪意のあるコードは含まれていません。

ソースコードはすべて公開されており、ご自身でビルドすることも可能です。


日本語 — ダウンロード後の検証手順

  1. GitHub から公開鍵を取得してインポート:

    # Linux / macOS
    curl -s https://github.com/jp1lrt.gpg | gpg --import
    
    # Windows (PowerShell)
    Invoke-WebRequest -Uri https://github.com/jp1lrt.gpg -OutFile mypubkey.asc
    gpg --import mypubkey.asc
  2. checksums.txt の署名を検証:

    gpg --verify checksums.txt.asc checksums.txt

    出力に「正しい署名(Good signature)」が表示され、次を確認してください:

    • 鍵ID: 864FA6445EE4D4E3
    • UID: Yoshiharu Tsukuura <jp1lrt@jarl.com>
  3. 配布ファイルの SHA256 を計算して checksums.txt と照合:

    # Windows PowerShell
    Get-FileHash ChronoGPS.exe -Algorithm SHA256
    
    # Linux / macOS
    sha256sum ChronoGPS.exe

    計算結果のハッシュが checksums.txt の該当行と完全に一致することを確認してください。

  4. 注意:

    • 署名が別の鍵を示す、または「不正な署名」の場合は配布物を信頼せず、リポジトリの管理者に連絡してください

ライセンス

MIT License — © 2026 津久浦 慶治 (JP1LRT)

詳細は LICENSE を参照してください。


作者

津久浦 慶治 / Yoshiharu Tsukuura
アマチュア無線局 JP1LRT


寄付(Donate)

もしこのツールが役に立ったと感じていただけたら、
コーヒー代くらいの感覚で応援していただけると今後の開発の励みになります 🪙

Donate Coffee


About

High-precision Windows time sync via GPS/GNSS. (GPS/GNSSレシーバーによる高精度なWindows時刻同期ツール)

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

 
 
 

Contributors

Languages