Simba-Avionic / Simba-Avionic/srp

Specyfikacja: Dynamiczny wybór źródła czasu w mechanizmie timestamp_mw

Open
#213 0 comments 0 reactions 1 assignee View on GitHub

@WiktorM8 is already working on this.

Since Apr 25, 2026.

Dominant language
C++
Stars
1
Forks
3
Avg merge
34m
Merged PRs (30d)
1

Description

Specyfikacja: Dynamiczny wybór źródła czasu w mechanizmie timestamp_mw

1. Cel zadania

Przejście z modelu statycznego (sztywny adres masterIP) na model dynamiczny, w którym urządzenia automatycznie wybierają najlepsze źródło synchronizacji czasu na podstawie klasy urządzenia przesyłanej w ramce tinyNTP.

2. Architektura danych (ntpStruct)

Należy wykorzystać pole settings w strukturze ntpStruct do przesyłania metadanych o statusie urządzenia.

Bity Nazwa Opis
0 - 2 deviceClass Klasa urządzenia (0–7). Im niższa wartość, tym wyższy priorytet.
3 holdover 1 = brak aktualnej referencji (czas niepewny); 0 = zsynchronizowany.
4 - 5 version Wersja protokołu (aktualnie 0b00).
6 msg_type 0 = Synchronizacja czasu (Unicast); 1 = Rozgłoszenie (Multicast Announce).
7 Reserved Zarezerwowane do przyszłego użytku.

3. Wymagania Funkcjonalne

3.1. Konfiguracja i start
  • Plik konfiguracyjny: Aplikacja musi wczytywać parametry z /opt/srp/cpu_simba/ntp_config.json.
    • Wymagane pola: ip, ntp_class (0-7), T_hb_ms (interwał ogłoszeń).
  • Inicjalizacja: Podczas startu TimestampService musi zainicjalizować NtpController z uwzględnieniem klasy wczytanej z pliku. W przypadku błędnych danych w JSON należy zastosować fallback (np. klasa 7) i zalogować błąd.
3.2. Mechanizm Discovery (Multicast)
  • Rozgłaszanie: Każde urządzenie musi co interwał T_hb_ms wysyłać ramkę Announce na adres/port UDP Multicast.
  • Baza sąsiadów: Urządzenie utrzymuje listę aktywnych węzłów (IP, klasa, czas ostatniej aktywności).
  • Zarządzanie listą:
    • Wpisy starsze niż 15 sekund muszą być automatycznie usuwane.
    • Urządzenie nie dodaje własnego adresu IP do listy kandydatów.
3.3. Algorytm wyboru źródła (Best Master Clock)

Przed każdą sesją synchronizacji urządzenie analizuje listę dostępnych węzłów i wybiera źródło według priorytetów:

  1. Najniższa klasa (deviceClass): Im mniejsza wartość, tym lepsze źródło.
  2. Status Holdover: Preferowane są urządzenia z bitem holdover = 0.
  3. Tie-breaker: W przypadku identycznej klasy i statusu, wybierane jest urządzenie o niższym adresie IP.

Logika Ról:

  • Jeśli lokalne urządzenie posiada najwyższy priorytet na liście -> pracuje jako Serwer.
  • W przeciwnym wypadku -> pracuje jako Klient i synchronizuje się do wybranego lidera.
3.4. Integracja z tinyNTP
  • Utrzymanie obecnej logiki obliczania przesunięcia czasu (offset) i RTT na podstawie znaczników t0..t3.
  • Dynamiczne uzupełnianie pola settings we wszystkich wychodzących ramkach (zarówno Unicast, jak i Multicast).

4. Kryteria Akceptacji (AC)

  • Brak statycznego IP: Usunięcie zależności od zmiennej masterIP w kodzie.
  • Prawidłowe mapowanie: Potwierdzenie bitowego zapisu/odczytu klasy i flagi holdover w settings.
  • Obsługa błędów: System poprawnie reaguje na brak pliku konfiguracyjnego lub błędy w JSON.
  • Dynamiczna zmiana: Po wyłączeniu urządzenia o najwyższym priorytecie (klasa 0), pozostałe urządzenia w sieci w ciągu max 15s wybierają nowe źródło (np. klasa 1).
  • Stabilność: Proces synchronizacji nie ulega przerwaniu przy zmianie roli z Serwera na Klienta.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.