#ifndef DCF77_h #define DCF77_h #if ARDUINO >= 100 #include <Arduino.h> #else #include <WProgram.h> #endif #include <Time.h> #define MIN_TIME 1334102400 // Date: 11-4-2012 #define MAX_TIME 4102444800 // Date: 1-1-2100 #define DCFRejectionTime 700 // Pulse-to-Pulse rejection time. #define DCFRejectPulseWidth 50 // Minimal pulse width #define DCFSplitTime 180 // Specifications distinguishes pulse width 100 ms and 200 ms. In practice we see 130 ms and 230 #define DCFSyncTime 1500 // Specifications defines 2000 ms pulse for end of sequence class DCF77 { private: //Private variables bool initialized; static int dCF77Pin; static int dCFinterrupt; static byte pulseStart; // DCF77 and internal timestamps static time_t previousUpdatedTime; static time_t latestupdatedTime; static time_t processingTimestamp; static time_t previousProcessingTimestamp; static unsigned char CEST; // DCF time format structure struct DCF77Buffer { //unsigned long long prefix :21; unsigned long long prefix :17; unsigned long long CEST :1; // CEST unsigned long long CET :1; // CET unsigned long long unused :2; // unused bits unsigned long long Min :7; // minutes unsigned long long P1 :1; // parity minutes unsigned long long Hour :6; // hours unsigned long long P2 :1; // parity hours unsigned long long Day :6; // day unsigned long long Weekday :3; // day of week unsigned long long Month :5; // month unsigned long long Year :8; // year (5 -> 2005) unsigned long long P3 :1; // parity }; // DCF Parity format structure struct ParityFlags{ unsigned char parityFlag :1; unsigned char parityMin :1; unsigned char parityHour :1; unsigned char parityDate :1; } static flags; // Parameters shared between interupt loop and main loop static volatile bool FilledBufferAvailable; static volatile unsigned long long filledBuffer; static volatile time_t filledTimestamp; // DCF Buffers and indicators static int bufferPosition; static unsigned long long runningBuffer; static unsigned long long processingBuffer; // Pulse flanks static int leadingEdge; static int trailingEdge; static int PreviousLeadingEdge; static bool Up; //Private functions void static initialize(void); void static bufferinit(void); void static finalizeBuffer(void); static bool receivedTimeUpdate(void); void static storePreviousTime(void); void static calculateBufferParities(void); bool static processBuffer(void); void static appendSignal(unsigned char signal); public: // Public Functions DCF77(int DCF77Pin, int DCFinterrupt, bool OnRisingFlank=true); static time_t getTime(void); static time_t getUTCTime(void); static void Start(void); static void Stop(void); static void int0handler(); }; #endif