Library to decode MSF time signal.
MSF_Time.h
- Committer:
- dswood
- Date:
- 2022-01-07
- Revision:
- 0:340305453f64
File content as of revision 0:340305453f64:
/*This library will decode an MSF signal on a digital input pin and turn it
into a timestamp.
Copyright (C) 2017 Duncan Wood
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mbed.h"
class MSF_Time
{
public:
/* Start MSF_Time with this function
InputPin is the data coming from your reciever
Polarity is 0 if your receiver output is high for no carrier
polarity is 1 to invert this logic. */
MSF_Time(PinName InputPin, int polarity,int OffsetTuning =48000);
bool Valid(); // Is the time valid
time_t Read();
protected:
struct MSF_Data {
int BCDYear;
int BCDMonth;
int DayOfWeek;
int BCDTime;
int SyncByte; //This is sent and allows you to detect leap seconds
int DUT;
int BST;
};
struct MSF_Data MyData;
struct tm Received_Time; // Normal data coming in
time_t Received_timestamp; //Data converted to timestamp
unsigned int Time_Data_Duration; //Pulse length - The minute marker is 500ms
bool Time_Data_Sync; // True when a 500ms pulse is detected denoting the start of a minute
Ticker Time_Data_Ticker; // A 50ms clock used to clock in data
unsigned int Time_Data_Count;// counts the 50ms for clocking in the data
void Time_Data_Strobe(); // When the ticker ticks do this
void Falling();
void Rising();
bool DataValid;
Timeout offset; // used to fine tune the seconds 50ms equals zero offset
InterruptIn Time_Data;
DigitalIn MyInput;
int Polarity;
int OffsetTuning;
Timer Time_Data_timer;
void LogicOne();
void LogicZero();
int ParityCheck(unsigned int CheckMe);
void ProcessData();
void IncrementSeconds();
void IncrementSecondsNow();
//int const OffsetTuning=48000; //in microseconds
bool debug; //turn on off debugging noise
bool DV;
};