Skip to content

Diagnostics

Module ID: 1 (jako FLAG_ERROR w ramce Data, MODULE_SYSTEM)

Moduł Diagnostics odpowiada za raportowanie błędów systemowych. Błędy są wysyłane jako ramki Data z ustawioną flagą FLAG_ERROR (bit 7) — payload zawiera serializowany error_t zamiast danych sensorowych.

Data Frame

Header (12B)
Module ID Flags Frame Nr Sample Count Timestamp First Timestamp Last Δ
1B 1B 1B 1B 5B LE 3B LE
byte 0 byte 1 byte 2 byte 3 byte 4–8 byte 9–11
Pole Wartość
Module ID ID modułu, który zgłosił błąd
Flags 0x80 (bit 7 = FLAG_ERROR)
Sample Count 1
Timestamp Last Δ 0 (zdarzenie — single sample)

Payload — error_t (9 bajtów, little-endian)

error_t (9B)
Level Source Reason Instance Sensor Model Detail Type Detail Value
1B 1B 1B 1B 1B 1B 3B LE
byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 byte 6–8
Offset Rozmiar Pole Typ Opis
0 1B level error_level_t Poziom błędu
1 1B source error_source_t Źródło błędu
2 1B reason error_reason_t Przyczyna
3 1B instance uint8_t Indeks instancji (np. numer barometru) — opcjonalne
4 1B sensor_model error_sensor_model_t Model sensora — opcjonalne
5 1B detail_type error_detail_type_t Typ informacji dodatkowej — opcjonalne
6–8 3B detail_value uint24_t LE Wartość szczegółowa — opcjonalne

Interpretacja

  • WARNING — pozwala na dalsze działanie (np. niski stan baterii)
  • CRITICAL — wymaga reakcji (np. awaria czujnika)

Perspektywa aplikacji mobilnej

Z perspektywy aplikacji kluczowe są dwa pola: level i source. Wiadomo wtedy jak ważny jest błąd i jakie jest źródło. Pozostałe pola (instance, sensor_model, detail) służą do diagnostyki i mogą być przesłane do producenta w razie problemów.

Parsowanie (TypeScript)

interface MwtError {
  level: number;      // 0=None, 1=Warning, 2=Critical
  source: number;     // error_source_t
  reason: number;     // error_reason_t
  instance: number;
  sensorModel: number;
  detailType: number;
  detailValue: number;
}

function parseError(payload: DataView): MwtError {
  return {
    level:       payload.getUint8(0),
    source:      payload.getUint8(1),
    reason:      payload.getUint8(2),
    instance:    payload.getUint8(3),
    sensorModel: payload.getUint8(4),
    detailType:  payload.getUint8(5),
    detailValue: payload.getUint8(6)
                 | (payload.getUint8(7) << 8)
                 | (payload.getUint8(8) << 16),
  };
}

Przykłady

Ostrzeżenie — niski stan baterii

level        [0]: 0x01 (WARNING)
source       [1]: 0x68 (104 = Battery)
reason       [2]: 0x05 (LOW_LEVEL)
instance     [3]: 0x00
sensor_model [4]: 0x00
detail_type  [5]: 0x03 (MILLIVOLTS)
detail_value [6-8]: 0xA9 0x0C 0x00 → 3241 mV

Interpretacja: Ostrzeżenie o niskim stanie baterii (3241 mV).

Błąd krytyczny — barometr

level        [0]: 0x02 (CRITICAL)
source       [1]: 0x67 (103 = Barometer)
reason       [2]: 0x03 (INITIALIZATION_FAILED)
instance     [3]: 0x04 (barometr nr 4)
sensor_model [4]: 0x01 (BMP581)
detail_type  [5]: 0x04 (NRFX_ERROR_CODE)
detail_value [6-8]: 0x07 0xAC 0xAB → 11250695

Interpretacja: Barometr nr 4 (BMP581) nie przeszedł inicjalizacji — błąd NRFX o kodzie 11250695.

Control

Moduł Diagnostics nie obsługuje bezpośrednich komend Control. Błędy są dostępne przez moduł System (MODULE_SYSTEM, ID = 1).

Błędy z kolejki są automatycznie flushowane po połączeniu BLE jako ramki Data z flagą FLAG_ERROR.

Pełna tabela enumów: Kody błędów.