SNTP V2.01 code problem today?
MJHanagan            
            
                Posts: 189            
            
            
                            
                                  in Accessories             
        
                    Is anyone else having a problem with SNP V2.01 today?  Mine has been working just foie for the past 6 months then this morning i tried syncing and got this as the "human time": 00/227/2016 214:242:255 (GMT -5:00).
This is the "human time" SNTP code in V2.01:
                
                            This is the "human time" SNTP code in V2.01:
OBJ
{{
******************************************************************
* SNTP Simple Network Time Protocol                       v2.01  *
* Author: Beau Schwabe                                           *
*                                                                *
* Recognition: Benjamin Yaroch, A.G.Schmidt                      *
*                                                                *
* Copyright (c) 2011 Parallax                                    *
* See end of file for terms of use.                              *
******************************************************************
Revision History:
v1      04-07-2011              - File created
v1.01   09-08-2011              - Minor code update to correct days in Month rendering
                                - and replace bytefill with bytemove for the 'ref-id' string                               
v2      01-29-2013              - Fixed an illusive bug that caused problems around the first of the year
v2.01   02-02-2013              - Logic order error with previous bug fix
Buffer bytes 0-3 contain the IP address of thre SNTP server
                           1                   2                   3      Buffer bytes
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  0  1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision    |  4-7
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          Root  Delay                           |  8-11
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Root  Dispersion                         |  12-15
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Reference Identifier                       |  16-19
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                                |  20-23
      |                    Reference Timestamp (64)                    |
      |                                                                |  24-27
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                                |  28-31
      |                    Originate Timestamp (64)                    |
      |                                                                |  32-35
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                                |  36-39
      |                     Receive Timestamp (64)                     |
      |                                                                |  40-43
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                                |  48-51
      |                     Transmit Timestamp (64)                    |
      |                                                                |  52-55
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                 Key Identifier (optional) (32)                 |  
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                                |
      |                                                                |
      |                 Message Digest (optional) (128)                |
      |                                                                |
      |                                                                |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
}}
    
PUB HumanTime(Offset,TimeStampAddress)|i,Seconds,Days,Years,LYrs,DW,DD,HH,MM,SS,Month,Date,Year
' The NTP timestamp is GMT so add the UTC offset (-4 for EDT and -5 fro EST)
  Seconds := long[TimeStampAddress] + Offset * 3600  'Local epoch time in seconds
    Days    := ((Seconds >>= 7)/675) + 1 '<- Days since Jan 1, 1900 ... divide by 86,400 and add 1
' 1-Jan-1900 was a Monday (i.e. Day=1 is Monday, Day=2 is Tuesday, etc
' Days//7 is 0 for Sunday, 1 for Monday, 2 for Tuesday... 6 for Saturday.
'    DW      := (Days-1) // 7
     DW      := Days // 7         '<-- Day of the week ranges from 0 (Sunday) to 6 (Saturday)
'    DW      :=  ((Days+1) // 7 ) '<-- Changed addind one after // makes the day range 1-7
       
    Years := Days / 365         '   Number of Days THIS year and
    Days -= (Years * 365)       '   number of years since 1900.
    LYrs := Years / 4           '<- Leap years since 1900
    Year := Years + 1900        '<- Current Year                   
    Days -= LYrs                '<- Leap year Days correction
                                '   for THIS year
    repeat
      repeat i from 1 to 12     '<- Calculate number of days 
        Month := 30             '   in each month.  Stop if
         if i&1 <> (i&8)>>3     '   Month has been reached
           Month += 1
        if i == 2
           Month := 28 
        if Days =< Month        '<- When done, Days will contain
           quit                 '   the number of days so far this 
        if Days > Month         '   month.  In other words, the Date.
           Days -= Month     
{
        if Days > Month         '<- When done, Days will contain
           Days -= Month        '   the number of days so far this 
        if Days =< Month        '   month.  In other words, the Date.
           quit     
}
    until Days =< Month
    Month := i                  '<- Current Month               
    Date  := Days               '<- Current Date
    SS := long[TimeStampAddress] + Offset * 3600
    SS := SS -(((Years*365)*675)<<7) '<- seconds this year
         
    MM := SS / 60                        '<- minutes this year
    SS := SS - (MM * 60)                 '<- current seconds
    HH := MM / 60                        '<- hours this year
    MM := MM - (HH * 60)                 '<- current minutes
    DD := HH / 24                        '<- days this year
    HH := HH - (DD * 24)                 '<- current hour
    DD -= LYrs                           '<- Leap year Days correction
                                         '   for THIS year
    long[TimeStampAddress][2] := Month<<24+Date<<16+Year
    long[TimeStampAddress][3] := DW<<24+HH<<16+MM<<8+SS                                     
'    DD is redundant but I included it for completion...
'    If you subtract the number of days so far this year from
'    DD and add one, you should get today's date.  This is calculated
'    from another angle above from Days
     

                            
Comments
This is his updated code dated 12-08-2013:
PUB HumanTime(Offset,TimeStampAddress) | dow, seconds, t1, i,days,lastLeap,Month,day,Year,minutes, hours, daysSinceJan1,numberOfLeapYears,date,years, daysSinceEpoch, secondsSinceEpoch, secondsToday ' The returned SNTP timestamp is for UTC so add the local time zone offset to get local time (e.g. EST=-5 hours, EDT=-4 hours) seconds := long[TimeStampAddress] + Offset * 3600 ' seconds is elapsed time since Monday, 1-Jan-1900 00:00:00 (12:00 AM) ' There are 86400 seconds in a day so dividing seconds by 86400 yields the number of whole days past since 1-Jan-1900 00:00:00. ' 86400=128*675 so shifting bits 7 places to the right is the same as dividing by 128. This also taskes care of the sign problem. days := ( seconds >> 7 ) / 675 ' 01-Jan-1900 was a Monday (dw=1) so add one to days and divide by 7 and the remainder (0-6) represents the day of the week (0=Sun, 1=Mon... 6=Sat). dow := (days+1) // 7 'Calculate the number of leap years in days by dividing by (4*365+1) numberOfLeapYears := days / DAYS_IN_FOUR_YEARS year := days year -= days/DAYS_IN_FOUR_YEARS 'Subtract the number of normal 365 day years from total years := year /= DAYS_IN_A_YEAR year += 1900 lastLeap := days // DAYS_IN_FOUR_YEARS if(IsLeapYear(year) AND lastLeap < (31+29)) numberOfLeapYears-- daysSinceJan1 := lastLeap // DAYS_IN_A_YEAR daysSinceEpoch := (years * DAYS_IN_A_YEAR) + numberOfLeapYears + daysSinceJan1 'Calc Day and Month daysSinceJan1++ if(IsLeapYear(year) AND daysSinceJan1 < 31+29) daysSinceJan1++ repeat i from 0 to MONTHS_IN_A_YEAR - 1 t1 := daysInMonth[i] if(IsLeapYear(year) AND i == 1) t1++ if(t1 => daysSinceJan1) day := daysSinceJan1 month := i+1 quit else daysSinceJan1 -= t1 'Calc hours, seconds, minutes secondsSinceEpoch := daysSinceEpoch*SECONDS_IN_ONE_DAY secondsToday := seconds - secondsSinceEpoch minutes := secondsToday/60 seconds := secondsToday - minutes*60 hours := minutes/60 minutes := minutes // 60 year -= 2000 long[TimeStampAddress][2] := Month<<24+day<<16+year long[TimeStampAddress][3] := dow<<24+hours<<16+minutes<<8+seconds