Source file: /~heha/basteln/PC/FunkUsb/dcf77franz9.zip/dcf77dec.h

#pragma once
#include "dcf77.h"

// Dekoder für den DCF77-Zeitsender.

struct DCF77Data{
 byte	wl,	// 0	MStart	W1	W2	W3	W4	W5	W6	W7
	wh,	// 8	W8	W9	W10	W11	W12	W13	W14	-
	inf,	//16	Ant	AnkZ	MESZ	MEZ	AnkS	TStart	-	-
	min,	//24	M1	M2	M4	M8	M10	M20	M40	MPar
	hod,	//32	H1	H2	H4	H8	H10	H20	HPar	-
	day,	//40	DPar	(0)	D1	D2	D4	D8	D10	D20
	wdm,	//48	W1	W2	W4	M1	M2	M4	M8	M10
	rok;	//56	Y1	Y2	Y4	Y8	Y10	Y20	Y40	Y80
 operator byte*() {return &wl;}
 operator const byte*() const {return &wl;}
};

struct DateTime{	// BCD oder binär, das kommt auf das Dateninterface an!
 byte Minute;	// 0..59		DS3231: Alles BCD
 byte Hour;	// 0..23		DS3231: Bit 6 = 12h-Bit, wenn gesetzt dann 1..12 und Bit 5 = AM/PM
 byte WDay;	// 0..6, 0 = Sonntag	DS3231: 1..7, 1 = Sonntag
 byte Date;	// 0..x-1		DS3231: 1..x
 byte Month;	// 0..11		DS3231: 1..12, Bit 7 = Jahresüberlauf
 byte Year;	// 0..99, 0 = 2000
 void operator++();
 byte operator=(const DateTime&);	// Flash als Quelle möglich; liefert Bit7:3 für verändertes Byte
 unsigned operator=(const DCF77Data&);	// Flash als Quelle möglich, liefert Bit11:0 für Fehler
 void print() const;
};

// Kein RAM-Vielfraß mehr: 18 Bytes
extern struct DCF77Dec{
 byte Grade;	// 0: Keine Minutenmarke empfangen, 1: Sekunden vielleicht, 2: Zeit gültig, 3+: Zeit aufeinanderfolgend gültig
 byte Info;	// Fünf Infobits
 byte Second;	// 0..59		DS3231: BCD
 DateTime dt;
private:
 byte recvbit;
public:
 DCF77Data data;
 void ProcessVal(byte twobit);	// Bit 1 = Minutenbit, Bit 0 = Datenbit, 0 = Trägerabsenkung
}dcf77dec;

// - "Grade"
//   Gibt die Anzahl von aufeinanderfolgend zueinander passenden
//   (Prüfbit- und Konsistenzprüfung) Minutendatensätze an.
//   Der Wert spiegelt die Fehlerwahrscheinlichkeit wider.
//   - Gültigkeit der Werte in der DCF77Dec-Struktur
//     Grade=0 : undefiniert
//     Grade=1 : Sekunden stimmen, alle anderen Angaben 0
//     Grade=2 : 1× fehlerfrei empfangen: akzeptabel
//     Grade=3 : 2× hintereinanderweg: sicher
//     Grade>4 : 3+× hintereinanderweg: äußerst sicher
//   Einmal korrekt empfangen fällt „Grade“ nie auf 1 zurück.
// - Zeitdifferenz / exakter Zeitbezug (innerhalb einer Sekunde)
//   Der nach Aufruf vom DCF77Dec_ProcessVal() in TDCF77Dec
//   angegebene Zeitstempel gilt für die kommende Sekundenmarke.
//   Empfänger stellen Bits 200ms nach der 59. Sekunde bereit.
//   Die Dekoderzeit geht damit um etwa 800ms vor.
// - „Zone“: Zeitzonen gibt es in halben und Viertelstunden
//   Das passt glücklicherweise in ein char mit ±24 × 4 = ±96 Einstellschritten
//   Falls daraus mal eine Weltzeituhr werden soll …
Detected encoding: UTF-80