A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

settings/settings.c

Committer:
andrewboyson
Date:
2020-05-06
Revision:
97:af023452967f
Parent:
88:2c72beb1debe
Child:
98:52506c675c82

File content as of revision 97:af023452967f:

#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#include        "gps.h"
#include       "nmea.h"
#include     "clkutc.h"
#include        "log.h"
#include        "net.h"
#include       "link.h"
#include        "dns.h"
#include   "dnslabel.h"
#include    "dnsname.h"
#include   "dnsquery.h"
#include   "dnsreply.h"
#include  "dnsserver.h"
#include        "ntp.h"
#include  "ntpclient.h"
#include       "dhcp.h"
#include         "ns.h"
#include        "nr4.h"
#include        "nr6.h"
#include     "clkgov.h"
#include      "echo4.h"
#include      "echo6.h"
#include      "dest6.h"
#include         "ra.h"
#include         "rs.h"
#include        "ar4.h"
#include        "ar6.h"
#include        "arp.h"
#include        "ip4.h"
#include        "ip6.h"
#include        "udp.h"
#include        "tcp.h"
#include        "web.h"
#include       "tftp.h"
#include        "rtc.h"

#define GPREG4 (*((volatile unsigned *) 0x40024054))
#define ALMON  (*((volatile unsigned *) 0x40024078))
#define ALYEAR (*((volatile unsigned *) 0x4002407C))
#define ALDOM  (*((volatile unsigned *) 0x4002406C))

/*
ALSEC   6 Alarm value for Seconds      R/W 0x4002 4060 - 
ALMIN   6 Alarm value for Minutes      R/W 0x4002 4064 - 
ALHOUR  5 Alarm value for Hours        R/W 0x4002 4068
ALDOM   5 Alarm value for Day of Month R/W 0x4002 406C *
ALDOW   3 Alarm value for Day of Week  R/W 0x4002 4070
ALDOY   9 Alarm value for Day of Year  R/W 0x4002 4074 -
ALMON   4 Alarm value for Months       R/W 0x4002 4078 *
ALYEAR 12 Alarm value for Years        R/W 0x4002 407C *
*/

enum { iLogUart, iNetStack, iNetNewLine, iNetVerbose, iLink, iDnsName, iDnsQuery, iDnsReply, iDnsServer,
       iNtp, iDhcp, iNsRecvSol, iNsRecvAdv, iNsSendSol, iNr4, iNr6, iNtpClient, iClkGov, iEcho4, iEcho6,
       iDest6, iRa, iRs, iAr4, iAr6, iArp, iIp4, iIp6, iUdp, iTcp, iHttp, iTftp };

int GetSensorHeight()
{
    return ALDOM; //9 bits
}
void SetSensorHeight(int value)
{
    ALDOM = value & 0x001F; //5 bits +32
}

void ChgNmeaMsgTrace() { NmeaMsgTrace = !NmeaMsgTrace; }
void ChgNmeaCmdTrace() { NmeaCmdTrace = !NmeaCmdTrace; }
void ChgGpsTrace()     { GpsTrace     = !GpsTrace;     }
void ChgGpsVerbose()   { GpsVerbose   = !GpsVerbose;   }

static bool getBit(int bit)
{
    return GPREG4 & (1U << bit); 
}
static void setBit(int bit, bool value)
{
    if (value) GPREG4 |=   1U << bit ;
    else       GPREG4 &= ~(1U << bit);
}

void SetTraceNetHost (char* text)
{
    int value = strtol(text, NULL, 16);
    NetTraceHost[1] =  value       & 0xFF; //Little endian so low byte
    NetTraceHost[0] = (value >> 8) & 0xFF; //high byte
    ALMON  = value >> 12;    // 4 bits
    ALYEAR = value & 0x3FFF; //12 bits
}
void ChgLogUart        () {       LogUart         =       !LogUart;         setBit(iLogUart,           LogUart       ); }
void ChgTraceNetStack  () {       NetTraceStack   =       !NetTraceStack;   setBit(iNetStack,          NetTraceStack ); }
void ChgTraceNetNewLine() {       NetTraceNewLine =       !NetTraceNewLine; setBit(iNetNewLine,       NetTraceNewLine); }
void ChgTraceNetVerbose() {       NetTraceVerbose =       !NetTraceVerbose; setBit(iNetVerbose,       NetTraceVerbose); }
void ChgTraceLink      () {      LinkTrace        =      !LinkTrace;        setBit(iLink,            LinkTrace       ); }
void ChgTraceDnsName   () {   DnsNameTrace        =   !DnsNameTrace;        setBit(iDnsName,      DnsNameTrace       ); }
void ChgTraceDnsQuery  () {  DnsQueryTrace        =  !DnsQueryTrace;        setBit(iDnsQuery,    DnsQueryTrace       ); }
void ChgTraceDnsReply  () {  DnsReplyTrace        =  !DnsReplyTrace;        setBit(iDnsReply,    DnsReplyTrace       ); }
void ChgTraceDnsServer () { DnsServerTrace        = !DnsServerTrace;        setBit(iDnsServer,  DnsServerTrace       ); }
void ChgTraceNtp       () {       NtpTrace        =       !NtpTrace;        setBit(iNtp,              NtpTrace       ); }
void ChgTraceDhcp      () {      DhcpTrace        =      !DhcpTrace;        setBit(iDhcp,            DhcpTrace       ); }
void ChgTraceNsRecvSol () {        NsTraceRecvSol =        !NsTraceRecvSol; setBit(iNsRecvSol,         NsTraceRecvSol); }
void ChgTraceNsRecvAdv () {        NsTraceRecvAdv =        !NsTraceRecvAdv; setBit(iNsRecvAdv,         NsTraceRecvAdv); }
void ChgTraceNsSendSol () {        NsTraceSendSol =        !NsTraceSendSol; setBit(iNsSendSol,         NsTraceSendSol); }
void ChgTraceNr4       () {       Nr4Trace        =       !Nr4Trace       ; setBit(iNr4,              Nr4Trace       ); }
void ChgTraceNr6       () {       Nr6Trace        =       !Nr6Trace       ; setBit(iNr6,              Nr6Trace       ); }
void ChgTraceNtpClient () { NtpClientTrace        = !NtpClientTrace       ; setBit(iNtpClient,  NtpClientTrace       ); }
void ChgTraceSync      () {    ClkGovTrace        =    !ClkGovTrace       ; setBit(iClkGov,        ClkGovTrace       ); }
void ChgTraceEcho4     () {     Echo4Trace        =     !Echo4Trace       ; setBit(iEcho4,          Echo4Trace       ); }
void ChgTraceEcho6     () {     Echo6Trace        =     !Echo6Trace       ; setBit(iEcho6,          Echo6Trace       ); }
void ChgTraceDest6     () {     Dest6Trace        =     !Dest6Trace       ; setBit(iDest6,          Dest6Trace       ); }
void ChgTraceRa        () {        RaTrace        =        !RaTrace       ; setBit(iRa,                RaTrace       ); }
void ChgTraceRs        () {        RsTrace        =        !RsTrace       ; setBit(iRs,                RsTrace       ); }
void ChgTraceAr4       () {       Ar4Trace        =       !Ar4Trace       ; setBit(iAr4,              Ar4Trace       ); }
void ChgTraceAr6       () {       Ar6Trace        =       !Ar6Trace       ; setBit(iAr6,              Ar6Trace       ); }
void ChgTraceArp       () {       ArpTrace        =       !ArpTrace       ; setBit(iArp,              ArpTrace       ); }
void ChgTraceIp4       () {       Ip4Trace        =       !Ip4Trace       ; setBit(iIp4,              Ip4Trace       ); }
void ChgTraceIp6       () {       Ip6Trace        =       !Ip6Trace       ; setBit(iIp6,              Ip6Trace       ); }
void ChgTraceUdp       () {       UdpTrace        =       !UdpTrace       ; setBit(iUdp,              UdpTrace       ); }
void ChgTraceTcp       () {       TcpTrace        =       !TcpTrace       ; setBit(iTcp,              TcpTrace       ); }
void ChgTraceHttp      () {       WebTrace        =       !WebTrace       ; setBit(iHttp,             WebTrace       ); }
void ChgTraceTftp      () {      TftpTrace        =      !TftpTrace       ; setBit(iTftp,            TftpTrace       ); }

void ChgDnsSendRequestsViaIp4()  {             DnsSendRequestsViaIp4 =             !DnsSendRequestsViaIp4; }
void ChgNtpSendRequestsViaIp4()  {  NtpClientQuerySendRequestsViaIp4 =  !NtpClientQuerySendRequestsViaIp4; }
void ChgTftpSendRequestsViaIp4() {            TftpSendRequestsViaIp4 =            !TftpSendRequestsViaIp4; }

//Clock settings
void SetClockPpbDivisor       (int  value) { ClkGovFreqDivisor       = value; }
void SetClockPpbChangeMax     (int  value) { ClkGovFreqChangeMaxPpb  = value; }
void SetClockSyncedLimitPpb   (int  value) { ClkGovFreqSyncedLimPpb  = value; }
void SetClockSyncedHysterisPpb(int  value) { ClkGovFreqSyncedHysPpb  = value; }
void SetClockSlewDivisor      (int  value) { ClkGovSlewDivisor       = value; }
void SetClockSlewMaxMs        (int  value) { ClkGovSlewChangeMaxMs   = value; }
void SetClockSyncedLimitNs    (int  value) { ClkGovSlewSyncedLimNs   = value; }
void SetClockSyncedHysterisNs (int  value) { ClkGovSlewSyncedHysNs   = value; }
void SetClockMaxOffsetSecs    (int  value) { ClkGovSlewOffsetMaxSecs = value; }

//NTP settings

void SetNtpClientServerName      ( char* value) { DnsLabelCopy(NtpClientQueryServerName,   value); }
void SetNtpClientInitialInterval ( int   value) { NtpClientQueryInitialInterval    = value ; }
void SetNtpClientNormalInterval  ( int   value) { NtpClientQueryNormalInterval     = value ; }
void SetNtpClientRetryInterval   ( int   value) { NtpClientQueryRetryInterval      = value ; }
void SetNtpClientOffsetMs        ( int   value) { NtpClientReplyOffsetMs           = value ; }
void SetNtpClientMaxDelayMs      ( int   value) { NtpClientReplyMaxDelayMs         = value ; }

int SettingsInit()
{
    ClkGovFreqDivisor       =     1000;
    ClkGovFreqChangeMaxPpb  =     1000;
    ClkGovFreqSyncedLimPpb  =   100000;
    ClkGovFreqSyncedHysPpb  =     1000;
    ClkGovSlewDivisor       =      100;
    ClkGovSlewChangeMaxMs   =       10;
    ClkGovSlewSyncedLimNs   = 10000000; //10ms
    ClkGovSlewSyncedHysNs   =  1000000; //1ms
    ClkGovSlewOffsetMaxSecs =        3;
    
    NtpClientQueryInitialInterval    =   2 ;
    NtpClientQueryNormalInterval     = 600 ;
    NtpClientQueryRetryInterval      =  60 ;
    NtpClientReplyOffsetMs           =   0 ;
    NtpClientReplyMaxDelayMs         = 100 ;
    
               DnsSendRequestsViaIp4 = false;
    NtpClientQuerySendRequestsViaIp4 = false;
              TftpSendRequestsViaIp4 = true;
              
    if (RtcPowerLost()) 
    {
        GPREG4 = 0;
        ALMON  = 0;
        ALYEAR = 0;
        ALDOM  = 0;
    }
    
    NetTraceHost[1] =  ALYEAR & 0xFF;               //Little endian so low byte
    NetTraceHost[0] = (ALMON << 4) + (ALYEAR >> 8); //high byte
    
          LogUart         = getBit(iLogUart);
          NetTraceStack   = getBit(iNetStack);
          NetTraceNewLine = getBit(iNetNewLine);
          NetTraceVerbose = getBit(iNetVerbose);
         LinkTrace        = getBit(iLink);
      DnsNameTrace        = getBit(iDnsName);
     DnsQueryTrace        = getBit(iDnsQuery);
     DnsReplyTrace        = getBit(iDnsReply);
    DnsServerTrace        = getBit(iDnsServer);
          NtpTrace        = getBit(iNtp);
         DhcpTrace        = getBit(iDhcp);
           NsTraceRecvSol = getBit(iNsRecvSol);
           NsTraceRecvAdv = getBit(iNsRecvAdv);
           NsTraceSendSol = getBit(iNsSendSol);
          Nr4Trace        = getBit(iNr4);
          Nr6Trace        = getBit(iNr6);
    NtpClientTrace        = getBit(iNtpClient);
       ClkGovTrace        = getBit(iClkGov);
        Echo4Trace        = getBit(iEcho4);
        Echo6Trace        = getBit(iEcho6);
        Dest6Trace        = getBit(iDest6);
           RaTrace        = getBit(iRa);
           RsTrace        = getBit(iRs);
          Ar4Trace        = getBit(iAr4);
          Ar6Trace        = getBit(iAr6);
          ArpTrace        = getBit(iArp);
          Ip4Trace        = getBit(iIp4);
          Ip6Trace        = getBit(iIp6);
          UdpTrace        = getBit(iUdp);
          TcpTrace        = getBit(iTcp);
          WebTrace        = getBit(iHttp);
         TftpTrace        = getBit(iTftp);

    return 0;
}