SNTP Client

Fork of SNTPClient by Raphael Kwon

Committer:
dgriffin65
Date:
Thu Jun 15 20:17:11 2017 +0000
Revision:
1:a5a91530712d
Parent:
0:137fc24033c4
Updated for mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xeon011 0:137fc24033c4 1 #include "SNTPClient.h"
dgriffin65 1:a5a91530712d 2 #include "DNSClient.h"
xeon011 0:137fc24033c4 3
xeon011 0:137fc24033c4 4 #define MAX_TRY_WRITE 20
xeon011 0:137fc24033c4 5 #define MAX_TRY_READ 10
xeon011 0:137fc24033c4 6
xeon011 0:137fc24033c4 7 //Debug is disabled by default
xeon011 0:137fc24033c4 8 #ifdef _SNTP_DEBUG_
xeon011 0:137fc24033c4 9 #define DBG(x, ...) std::printf("[SNTPClient : DBG]"x"\r\n", ##__VA_ARGS__);
xeon011 0:137fc24033c4 10 #define WARN(x, ...) std::printf("[SNTPClient : WARN]"x"\r\n", ##__VA_ARGS__);
xeon011 0:137fc24033c4 11 #define ERR(x, ...) std::printf("[SNTPClient : ERR]"x"\r\n", ##__VA_ARGS__);
xeon011 0:137fc24033c4 12 #else
xeon011 0:137fc24033c4 13 #define DBG(x, ...)
xeon011 0:137fc24033c4 14 #define WARN(x, ...)
xeon011 0:137fc24033c4 15 #define ERR(x, ...)
xeon011 0:137fc24033c4 16 #endif
xeon011 0:137fc24033c4 17
xeon011 0:137fc24033c4 18 #define INFO(x, ...) printf("[SNTPClient : INFO]"x"\r\n", ##__VA_ARGS__);
xeon011 0:137fc24033c4 19
dgriffin65 1:a5a91530712d 20 SNTPClient::SNTPClient(NetworkStack *ns, const char* url, uint8_t time_zone) {
dgriffin65 1:a5a91530712d 21 DNSClient dns(ns);
dgriffin65 1:a5a91530712d 22
dgriffin65 1:a5a91530712d 23 if (dns.lookup(url)) {
dgriffin65 1:a5a91530712d 24 const char* dns_addr = dns.get_ip_address();
dgriffin65 1:a5a91530712d 25 memcpy(host, dns_addr, strlen(dns_addr));
dgriffin65 1:a5a91530712d 26 host[strlen(dns_addr)] = '\0';
dgriffin65 1:a5a91530712d 27 } else {
dgriffin65 1:a5a91530712d 28 memcpy(host, url, strlen(url));
dgriffin65 1:a5a91530712d 29 host[strlen(url)] = '\0';
dgriffin65 1:a5a91530712d 30 }
dgriffin65 1:a5a91530712d 31
xeon011 0:137fc24033c4 32 port = ntp_port;
dgriffin65 1:a5a91530712d 33 m_ns = ns;
dgriffin65 1:a5a91530712d 34 m_udp = NULL;
xeon011 0:137fc24033c4 35 tz = time_zone;
xeon011 0:137fc24033c4 36 }
xeon011 0:137fc24033c4 37
xeon011 0:137fc24033c4 38 bool SNTPClient::connect() {
dgriffin65 1:a5a91530712d 39 if (m_udp == NULL) {
dgriffin65 1:a5a91530712d 40 m_udp = new UDPSocket;
dgriffin65 1:a5a91530712d 41 m_udp->open(m_ns);
dgriffin65 1:a5a91530712d 42 }
dgriffin65 1:a5a91530712d 43
dgriffin65 1:a5a91530712d 44 m_udp->set_blocking(false);
dgriffin65 1:a5a91530712d 45 m_udp->set_timeout(3000);
dgriffin65 1:a5a91530712d 46 m_udp->bind(rand()&0x7fff);
xeon011 0:137fc24033c4 47
dgriffin65 1:a5a91530712d 48 sntp_server.set_ip_address(host);
dgriffin65 1:a5a91530712d 49 sntp_server.set_port(port);
dgriffin65 1:a5a91530712d 50
dgriffin65 1:a5a91530712d 51 nsapi_addr_t na = sntp_server.get_addr();
dgriffin65 1:a5a91530712d 52 NTPformat.dstaddr[0] = na.bytes[0];
dgriffin65 1:a5a91530712d 53 NTPformat.dstaddr[1] = na.bytes[1];
dgriffin65 1:a5a91530712d 54 NTPformat.dstaddr[2] = na.bytes[2];
dgriffin65 1:a5a91530712d 55 NTPformat.dstaddr[3] = na.bytes[3];
dgriffin65 1:a5a91530712d 56 DBG("NTP Server: %s\r\n", sntp_server.get_ip_address());
xeon011 0:137fc24033c4 57
xeon011 0:137fc24033c4 58 uint8_t Flag;
xeon011 0:137fc24033c4 59 NTPformat.leap = 0; /* leap indicator */
xeon011 0:137fc24033c4 60 NTPformat.version = 4; /* version number */
xeon011 0:137fc24033c4 61 NTPformat.mode = 3; /* mode */
xeon011 0:137fc24033c4 62 NTPformat.stratum = 0; /* stratum */
xeon011 0:137fc24033c4 63 NTPformat.poll = 0; /* poll interval */
xeon011 0:137fc24033c4 64 NTPformat.precision = 0; /* precision */
xeon011 0:137fc24033c4 65 NTPformat.rootdelay = 0; /* root delay */
xeon011 0:137fc24033c4 66 NTPformat.rootdisp = 0; /* root dispersion */
xeon011 0:137fc24033c4 67 NTPformat.refid = 0; /* reference ID */
xeon011 0:137fc24033c4 68 NTPformat.reftime = 0; /* reference time */
xeon011 0:137fc24033c4 69 NTPformat.org = 0; /* origin timestamp */
xeon011 0:137fc24033c4 70 NTPformat.rec = 0; /* receive timestamp */
xeon011 0:137fc24033c4 71 NTPformat.xmt = 1; /* transmit timestamp */
xeon011 0:137fc24033c4 72
xeon011 0:137fc24033c4 73 Flag = (NTPformat.leap<<6)+(NTPformat.version<<3)+NTPformat.mode; //one byte Flag
xeon011 0:137fc24033c4 74 memcpy(ntpmessage,(void const*)(&Flag),1);
xeon011 0:137fc24033c4 75
xeon011 0:137fc24033c4 76 return true;
xeon011 0:137fc24033c4 77 }
xeon011 0:137fc24033c4 78
xeon011 0:137fc24033c4 79 bool SNTPClient::getTime(datetime *time) {
dgriffin65 1:a5a91530712d 80 if (!m_udp) return false;
dgriffin65 1:a5a91530712d 81
xeon011 0:137fc24033c4 82 uint16_t startindex = 40; //last 8-byte of data_buf[size is 48 byte] is xmt, so the startindex should be 40
xeon011 0:137fc24033c4 83
dgriffin65 1:a5a91530712d 84 int n = m_udp->sendto(sntp_server, (char *)ntpmessage, sizeof(ntpmessage));
dgriffin65 1:a5a91530712d 85
xeon011 0:137fc24033c4 86 char in_buffer[MAX_SNTP_BUF_SIZE];
dgriffin65 1:a5a91530712d 87 n = m_udp->recvfrom(&sntp_server, in_buffer, sizeof(in_buffer));
xeon011 0:137fc24033c4 88
dgriffin65 1:a5a91530712d 89 if(n <= 0) {
xeon011 0:137fc24033c4 90 return false;
dgriffin65 1:a5a91530712d 91 }
xeon011 0:137fc24033c4 92
xeon011 0:137fc24033c4 93 get_seconds_from_ntp_server((uint8_t *)in_buffer,startindex);
xeon011 0:137fc24033c4 94
xeon011 0:137fc24033c4 95 time->yy = Nowdatetime.yy;
xeon011 0:137fc24033c4 96 time->mo = Nowdatetime.mo;
xeon011 0:137fc24033c4 97 time->dd = Nowdatetime.dd;
xeon011 0:137fc24033c4 98 time->hh = Nowdatetime.hh;
xeon011 0:137fc24033c4 99 time->mm = Nowdatetime.mm;
xeon011 0:137fc24033c4 100 time->ss = Nowdatetime.ss;
xeon011 0:137fc24033c4 101
xeon011 0:137fc24033c4 102 return true;
xeon011 0:137fc24033c4 103 }
xeon011 0:137fc24033c4 104
xeon011 0:137fc24033c4 105 bool SNTPClient::close() {
dgriffin65 1:a5a91530712d 106 if (m_udp) {
dgriffin65 1:a5a91530712d 107 delete m_udp;
dgriffin65 1:a5a91530712d 108 m_udp = NULL;
xeon011 0:137fc24033c4 109 }
xeon011 0:137fc24033c4 110 return true;
xeon011 0:137fc24033c4 111 }
xeon011 0:137fc24033c4 112
xeon011 0:137fc24033c4 113 char* SNTPClient::getHost() {
xeon011 0:137fc24033c4 114 return host;
xeon011 0:137fc24033c4 115 }
xeon011 0:137fc24033c4 116
xeon011 0:137fc24033c4 117 /*
xeon011 0:137fc24033c4 118 00)UTC-12:00 Baker Island, Howland Island (both uninhabited)
xeon011 0:137fc24033c4 119 01) UTC-11:00 American Samoa, Samoa
xeon011 0:137fc24033c4 120 02) UTC-10:00 (Summer)French Polynesia (most), United States (Aleutian Islands, Hawaii)
xeon011 0:137fc24033c4 121 03) UTC-09:30 Marquesas Islands
xeon011 0:137fc24033c4 122 04) UTC-09:00 Gambier Islands;(Summer)United States (most of Alaska)
xeon011 0:137fc24033c4 123 05) UTC-08:00 (Summer)Canada (most of British Columbia), Mexico (Baja California)
xeon011 0:137fc24033c4 124 06) UTC-08:00 United States (California, most of Nevada, most of Oregon, Washington (state))
xeon011 0:137fc24033c4 125 07) UTC-07:00 Mexico (Sonora), United States (Arizona); (Summer)Canada (Alberta)
xeon011 0:137fc24033c4 126 08) UTC-07:00 Mexico (Chihuahua), United States (Colorado)
xeon011 0:137fc24033c4 127 09) UTC-06:00 Costa Rica, El Salvador, Ecuador (Galapagos Islands), Guatemala, Honduras
xeon011 0:137fc24033c4 128 10) UTC-06:00 Mexico (most), Nicaragua;(Summer)Canada (Manitoba, Saskatchewan), United States (Illinois, most of Texas)
xeon011 0:137fc24033c4 129 11) UTC-05:00 Colombia, Cuba, Ecuador (continental), Haiti, Jamaica, Panama, Peru
xeon011 0:137fc24033c4 130 12) UTC-05:00 (Summer)Canada (most of Ontario, most of Quebec)
xeon011 0:137fc24033c4 131 13) UTC-05:00 United States (most of Florida, Georgia, Massachusetts, most of Michigan, New York, North Carolina, Ohio, Washington D.C.)
xeon011 0:137fc24033c4 132 14) UTC-04:30 Venezuela
xeon011 0:137fc24033c4 133 15) UTC-04:00 Bolivia, Brazil (Amazonas), Chile (continental), Dominican Republic, Canada (Nova Scotia), Paraguay,
xeon011 0:137fc24033c4 134 16) UTC-04:00 Puerto Rico, Trinidad and Tobago
xeon011 0:137fc24033c4 135 17) UTC-03:30 Canada (Newfoundland)
xeon011 0:137fc24033c4 136 18) UTC-03:00 Argentina; (Summer) Brazil (Brasilia, Rio de Janeiro, Sao Paulo), most of Greenland, Uruguay
xeon011 0:137fc24033c4 137 19) UTC-02:00 Brazil (Fernando de Noronha), South Georgia and the South Sandwich Islands
xeon011 0:137fc24033c4 138 20) UTC-01:00 Portugal (Azores), Cape Verde
xeon011 0:137fc24033c4 139 21) UTC&#177;00:00 Cote d'Ivoire, Faroe Islands, Ghana, Iceland, Senegal; (Summer) Ireland, Portugal (continental and Madeira)
xeon011 0:137fc24033c4 140 22) UTC&#177;00:00 Spain (Canary Islands), Morocco, United Kingdom
xeon011 0:137fc24033c4 141 23) UTC+01:00 Angola, Cameroon, Nigeria, Tunisia; (Summer)Albania, Algeria, Austria, Belgium, Bosnia and Herzegovina,
xeon011 0:137fc24033c4 142 24) UTC+01:00 Spain (continental), Croatia, Czech Republic, Denmark, Germany, Hungary, Italy, Kinshasa, Kosovo,
xeon011 0:137fc24033c4 143 25) UTC+01:00 Macedonia, France (metropolitan), the Netherlands, Norway, Poland, Serbia, Slovakia, Slovenia, Sweden, Switzerland
xeon011 0:137fc24033c4 144 26) UTC+02:00 Libya, Egypt, Malawi, Mozambique, South Africa, Zambia, Zimbabwe, (Summer)Bulgaria, Cyprus, Estonia,
xeon011 0:137fc24033c4 145 27) UTC+02:00 Finland, Greece, Israel, Jordan, Latvia, Lebanon, Lithuania, Moldova, Palestine, Romania, Syria, Turkey, Ukraine
xeon011 0:137fc24033c4 146 28) UTC+03:00 Belarus, Djibouti, Eritrea, Ethiopia, Iraq, Kenya, Madagascar, Russia (Kaliningrad Oblast), Saudi Arabia,
xeon011 0:137fc24033c4 147 29) UTC+03:00 South Sudan, Sudan, Somalia, South Sudan, Tanzania, Uganda, Yemen
xeon011 0:137fc24033c4 148 30) UTC+03:30 (Summer)Iran
xeon011 0:137fc24033c4 149 31) UTC+04:00 Armenia, Azerbaijan, Georgia, Mauritius, Oman, Russia (European), Seychelles, United Arab Emirates
xeon011 0:137fc24033c4 150 32) UTC+04:30 Afghanistan
xeon011 0:137fc24033c4 151 33) UTC+05:00 Kazakhstan (West), Maldives, Pakistan, Uzbekistan
xeon011 0:137fc24033c4 152 34) UTC+05:30 India, Sri Lanka
xeon011 0:137fc24033c4 153 35) UTC+05:45 Nepal
xeon011 0:137fc24033c4 154 36) UTC+06:00 Kazakhstan (most), Bangladesh, Russia (Ural: Sverdlovsk Oblast, Chelyabinsk Oblast)
xeon011 0:137fc24033c4 155 37) UTC+06:30 Cocos Islands, Myanmar
xeon011 0:137fc24033c4 156 38) UTC+07:00 Jakarta, Russia (Novosibirsk Oblast), Thailand, Vietnam
xeon011 0:137fc24033c4 157 39) UTC+08:00 China, Hong Kong, Russia (Krasnoyarsk Krai), Malaysia, Philippines, Singapore, Taiwan, most of Mongolia, Western Australia
xeon011 0:137fc24033c4 158 40) UTC+09:00 Korea, East Timor, Russia (Irkutsk Oblast), Japan
xeon011 0:137fc24033c4 159 41) UTC+09:30 Australia (Northern Territory);(Summer)Australia (South Australia))
xeon011 0:137fc24033c4 160 42) UTC+10:00 Russia (Zabaykalsky Krai); (Summer)Australia (New South Wales, Queensland, Tasmania, Victoria)
xeon011 0:137fc24033c4 161 43) UTC+10:30 Lord Howe Island
xeon011 0:137fc24033c4 162 44) UTC+11:00 New Caledonia, Russia (Primorsky Krai), Solomon Islands
xeon011 0:137fc24033c4 163 45) UTC+11:30 Norfolk Island
xeon011 0:137fc24033c4 164 46) UTC+12:00 Fiji, Russia (Kamchatka Krai);(Summer)New Zealand
xeon011 0:137fc24033c4 165 47) UTC+12:45 (Summer)New Zealand
xeon011 0:137fc24033c4 166 48) UTC+13:00 Tonga
xeon011 0:137fc24033c4 167 49) UTC+14:00 Kiribati (Line Islands)
xeon011 0:137fc24033c4 168 */
xeon011 0:137fc24033c4 169 void SNTPClient::get_seconds_from_ntp_server(uint8_t *buf, uint16_t idx)
xeon011 0:137fc24033c4 170 {
xeon011 0:137fc24033c4 171 tstamp seconds = 0;
xeon011 0:137fc24033c4 172 uint8_t i=0;
xeon011 0:137fc24033c4 173 for (i = 0; i < 4; i++)
xeon011 0:137fc24033c4 174 {
xeon011 0:137fc24033c4 175 seconds = (seconds << 8) | buf[idx + i];
xeon011 0:137fc24033c4 176 }
xeon011 0:137fc24033c4 177 switch (tz) // Time Zone
xeon011 0:137fc24033c4 178 {
xeon011 0:137fc24033c4 179 case 0:
xeon011 0:137fc24033c4 180 seconds -= 12*3600;
xeon011 0:137fc24033c4 181 break;
xeon011 0:137fc24033c4 182 case 1:
xeon011 0:137fc24033c4 183 seconds -= 11*3600;
xeon011 0:137fc24033c4 184 break;
xeon011 0:137fc24033c4 185 case 2:
xeon011 0:137fc24033c4 186 seconds -= 10*3600;
xeon011 0:137fc24033c4 187 break;
xeon011 0:137fc24033c4 188 case 3:
xeon011 0:137fc24033c4 189 seconds -= (9*3600+30*60);
xeon011 0:137fc24033c4 190 break;
xeon011 0:137fc24033c4 191 case 4:
xeon011 0:137fc24033c4 192 seconds -= 9*3600;
xeon011 0:137fc24033c4 193 break;
xeon011 0:137fc24033c4 194 case 5:
xeon011 0:137fc24033c4 195 case 6:
xeon011 0:137fc24033c4 196 seconds -= 8*3600;
xeon011 0:137fc24033c4 197 break;
xeon011 0:137fc24033c4 198 case 7:
xeon011 0:137fc24033c4 199 case 8:
xeon011 0:137fc24033c4 200 seconds -= 7*3600;
xeon011 0:137fc24033c4 201 break;
xeon011 0:137fc24033c4 202 case 9:
xeon011 0:137fc24033c4 203 case 10:
xeon011 0:137fc24033c4 204 seconds -= 6*3600;
xeon011 0:137fc24033c4 205 break;
xeon011 0:137fc24033c4 206 case 11:
xeon011 0:137fc24033c4 207 case 12:
xeon011 0:137fc24033c4 208 case 13:
xeon011 0:137fc24033c4 209 seconds -= 5*3600;
xeon011 0:137fc24033c4 210 break;
xeon011 0:137fc24033c4 211 case 14:
xeon011 0:137fc24033c4 212 seconds -= (4*3600+30*60);
xeon011 0:137fc24033c4 213 break;
xeon011 0:137fc24033c4 214 case 15:
xeon011 0:137fc24033c4 215 case 16:
xeon011 0:137fc24033c4 216 seconds -= 4*3600;
xeon011 0:137fc24033c4 217 break;
xeon011 0:137fc24033c4 218 case 17:
xeon011 0:137fc24033c4 219 seconds -= (3*3600+30*60);
xeon011 0:137fc24033c4 220 break;
xeon011 0:137fc24033c4 221 case 18:
xeon011 0:137fc24033c4 222 seconds -= 3*3600;
xeon011 0:137fc24033c4 223 break;
xeon011 0:137fc24033c4 224 case 19:
xeon011 0:137fc24033c4 225 seconds -= 2*3600;
xeon011 0:137fc24033c4 226 break;
xeon011 0:137fc24033c4 227 case 20:
xeon011 0:137fc24033c4 228 seconds -= 1*3600;
xeon011 0:137fc24033c4 229 break;
xeon011 0:137fc24033c4 230 case 21: //?
xeon011 0:137fc24033c4 231 case 22:
xeon011 0:137fc24033c4 232 break;
xeon011 0:137fc24033c4 233 case 23:
xeon011 0:137fc24033c4 234 case 24:
xeon011 0:137fc24033c4 235 case 25:
xeon011 0:137fc24033c4 236 seconds += 1*3600;
xeon011 0:137fc24033c4 237 break;
xeon011 0:137fc24033c4 238 case 26:
xeon011 0:137fc24033c4 239 case 27:
xeon011 0:137fc24033c4 240 seconds += 2*3600;
xeon011 0:137fc24033c4 241 break;
xeon011 0:137fc24033c4 242 case 28:
xeon011 0:137fc24033c4 243 case 29:
xeon011 0:137fc24033c4 244 seconds += 3*3600;
xeon011 0:137fc24033c4 245 break;
xeon011 0:137fc24033c4 246 case 30:
xeon011 0:137fc24033c4 247 seconds += (3*3600+30*60);
xeon011 0:137fc24033c4 248 break;
xeon011 0:137fc24033c4 249 case 31:
xeon011 0:137fc24033c4 250 seconds += 4*3600;
xeon011 0:137fc24033c4 251 break;
xeon011 0:137fc24033c4 252 case 32:
xeon011 0:137fc24033c4 253 seconds += (4*3600+30*60);
xeon011 0:137fc24033c4 254 break;
xeon011 0:137fc24033c4 255 case 33:
xeon011 0:137fc24033c4 256 seconds += 5*3600;
xeon011 0:137fc24033c4 257 break;
xeon011 0:137fc24033c4 258 case 34:
xeon011 0:137fc24033c4 259 seconds += (5*3600+30*60);
xeon011 0:137fc24033c4 260 break;
xeon011 0:137fc24033c4 261 case 35:
xeon011 0:137fc24033c4 262 seconds += (5*3600+45*60);
xeon011 0:137fc24033c4 263 break;
xeon011 0:137fc24033c4 264 case 36:
xeon011 0:137fc24033c4 265 seconds += 6*3600;
xeon011 0:137fc24033c4 266 break;
xeon011 0:137fc24033c4 267 case 37:
xeon011 0:137fc24033c4 268 seconds += (6*3600+30*60);
xeon011 0:137fc24033c4 269 break;
xeon011 0:137fc24033c4 270 case 38:
xeon011 0:137fc24033c4 271 seconds += 7*3600;
xeon011 0:137fc24033c4 272 break;
xeon011 0:137fc24033c4 273 case 39:
xeon011 0:137fc24033c4 274 seconds += 8*3600;
xeon011 0:137fc24033c4 275 break;
xeon011 0:137fc24033c4 276 case 40:
xeon011 0:137fc24033c4 277 seconds += 9*3600;
xeon011 0:137fc24033c4 278 break;
xeon011 0:137fc24033c4 279 case 41:
xeon011 0:137fc24033c4 280 seconds += (9*3600+30*60);
xeon011 0:137fc24033c4 281 break;
xeon011 0:137fc24033c4 282 case 42:
xeon011 0:137fc24033c4 283 seconds += 10*3600;
xeon011 0:137fc24033c4 284 break;
xeon011 0:137fc24033c4 285 case 43:
xeon011 0:137fc24033c4 286 seconds += (10*3600+30*60);
xeon011 0:137fc24033c4 287 break;
xeon011 0:137fc24033c4 288 case 44:
xeon011 0:137fc24033c4 289 seconds += 11*3600;
xeon011 0:137fc24033c4 290 break;
xeon011 0:137fc24033c4 291 case 45:
xeon011 0:137fc24033c4 292 seconds += (11*3600+30*60);
xeon011 0:137fc24033c4 293 break;
xeon011 0:137fc24033c4 294 case 46:
xeon011 0:137fc24033c4 295 seconds += 12*3600;
xeon011 0:137fc24033c4 296 break;
xeon011 0:137fc24033c4 297 case 47:
xeon011 0:137fc24033c4 298 seconds += (12*3600+45*60);
xeon011 0:137fc24033c4 299 break;
xeon011 0:137fc24033c4 300 case 48:
xeon011 0:137fc24033c4 301 seconds += 13*3600;
xeon011 0:137fc24033c4 302 break;
xeon011 0:137fc24033c4 303 case 49:
xeon011 0:137fc24033c4 304 seconds += 14*3600;
xeon011 0:137fc24033c4 305 break;
xeon011 0:137fc24033c4 306
xeon011 0:137fc24033c4 307 }
xeon011 0:137fc24033c4 308
xeon011 0:137fc24033c4 309 //calculation for date
xeon011 0:137fc24033c4 310 calcdatetime(seconds);
xeon011 0:137fc24033c4 311 }
xeon011 0:137fc24033c4 312
xeon011 0:137fc24033c4 313 void SNTPClient::calcdatetime(tstamp seconds)
xeon011 0:137fc24033c4 314 {
xeon011 0:137fc24033c4 315 uint8_t yf=0;
xeon011 0:137fc24033c4 316 tstamp n=0,d=0,total_d=0,rz=0;
xeon011 0:137fc24033c4 317 uint16_t y=0,r=0,yr=0;
xeon011 0:137fc24033c4 318 signed long long yd=0;
xeon011 0:137fc24033c4 319
xeon011 0:137fc24033c4 320 n = seconds;
xeon011 0:137fc24033c4 321 total_d = seconds/(SECS_PERDAY);
xeon011 0:137fc24033c4 322 d=0;
xeon011 0:137fc24033c4 323 uint32_t p_year_total_sec=SECS_PERDAY*365;
xeon011 0:137fc24033c4 324 uint32_t r_year_total_sec=SECS_PERDAY*366;
xeon011 0:137fc24033c4 325 while(n>=p_year_total_sec)
xeon011 0:137fc24033c4 326 {
xeon011 0:137fc24033c4 327 if((EPOCH+r)%400==0 || ((EPOCH+r)%100!=0 && (EPOCH+r)%4==0))
xeon011 0:137fc24033c4 328 {
xeon011 0:137fc24033c4 329 n = n -(r_year_total_sec);
xeon011 0:137fc24033c4 330 d = d + 366;
xeon011 0:137fc24033c4 331 }
xeon011 0:137fc24033c4 332 else
xeon011 0:137fc24033c4 333 {
xeon011 0:137fc24033c4 334 n = n - (p_year_total_sec);
xeon011 0:137fc24033c4 335 d = d + 365;
xeon011 0:137fc24033c4 336 }
xeon011 0:137fc24033c4 337 r+=1;
xeon011 0:137fc24033c4 338 y+=1;
xeon011 0:137fc24033c4 339
xeon011 0:137fc24033c4 340 }
xeon011 0:137fc24033c4 341
xeon011 0:137fc24033c4 342 y += EPOCH;
xeon011 0:137fc24033c4 343
xeon011 0:137fc24033c4 344 Nowdatetime.yy = y;
xeon011 0:137fc24033c4 345
xeon011 0:137fc24033c4 346 yd=0;
xeon011 0:137fc24033c4 347 yd = total_d - d;
xeon011 0:137fc24033c4 348
xeon011 0:137fc24033c4 349 yf=1;
xeon011 0:137fc24033c4 350 while(yd>=28)
xeon011 0:137fc24033c4 351 {
xeon011 0:137fc24033c4 352
xeon011 0:137fc24033c4 353 if(yf==1 || yf==3 || yf==5 || yf==7 || yf==8 || yf==10 || yf==12)
xeon011 0:137fc24033c4 354 {
xeon011 0:137fc24033c4 355 yd -= 31;
xeon011 0:137fc24033c4 356 if(yd<0)break;
xeon011 0:137fc24033c4 357 rz += 31;
xeon011 0:137fc24033c4 358 }
xeon011 0:137fc24033c4 359
xeon011 0:137fc24033c4 360 if (yf==2)
xeon011 0:137fc24033c4 361 {
xeon011 0:137fc24033c4 362 if (y%400==0 || (y%100!=0 && y%4==0))
xeon011 0:137fc24033c4 363 {
xeon011 0:137fc24033c4 364 yd -= 29;
xeon011 0:137fc24033c4 365 if(yd<0)break;
xeon011 0:137fc24033c4 366 rz += 29;
xeon011 0:137fc24033c4 367 }
xeon011 0:137fc24033c4 368 else
xeon011 0:137fc24033c4 369 {
xeon011 0:137fc24033c4 370 yd -= 28;
xeon011 0:137fc24033c4 371 if(yd<0)break;
xeon011 0:137fc24033c4 372 rz += 28;
xeon011 0:137fc24033c4 373 }
xeon011 0:137fc24033c4 374 }
xeon011 0:137fc24033c4 375 if(yf==4 || yf==6 || yf==9 || yf==11 )
xeon011 0:137fc24033c4 376 {
xeon011 0:137fc24033c4 377 yd -= 30;
xeon011 0:137fc24033c4 378 if(yd<0)break;
xeon011 0:137fc24033c4 379 rz += 30;
xeon011 0:137fc24033c4 380 }
xeon011 0:137fc24033c4 381 yf += 1;
xeon011 0:137fc24033c4 382
xeon011 0:137fc24033c4 383 }
xeon011 0:137fc24033c4 384 Nowdatetime.mo=yf;
xeon011 0:137fc24033c4 385 yr = total_d-d-rz;
xeon011 0:137fc24033c4 386
xeon011 0:137fc24033c4 387 yr += 1;
xeon011 0:137fc24033c4 388
xeon011 0:137fc24033c4 389 Nowdatetime.dd=yr;
xeon011 0:137fc24033c4 390
xeon011 0:137fc24033c4 391 //calculation for time
xeon011 0:137fc24033c4 392 seconds = seconds%SECS_PERDAY;
xeon011 0:137fc24033c4 393 Nowdatetime.hh = seconds/3600;
xeon011 0:137fc24033c4 394 Nowdatetime.mm = (seconds%3600)/60;
xeon011 0:137fc24033c4 395 Nowdatetime.ss = (seconds%3600)%60;
xeon011 0:137fc24033c4 396
xeon011 0:137fc24033c4 397 }
xeon011 0:137fc24033c4 398
xeon011 0:137fc24033c4 399 tstamp SNTPClient::changedatetime_to_seconds(void)
xeon011 0:137fc24033c4 400 {
xeon011 0:137fc24033c4 401 tstamp seconds=0;
xeon011 0:137fc24033c4 402 uint32_t total_day=0;
xeon011 0:137fc24033c4 403 uint16_t i=0,run_year_cnt=0,l=0;
xeon011 0:137fc24033c4 404
xeon011 0:137fc24033c4 405 l = Nowdatetime.yy;//low
xeon011 0:137fc24033c4 406
xeon011 0:137fc24033c4 407
xeon011 0:137fc24033c4 408 for(i=EPOCH;i<l;i++)
xeon011 0:137fc24033c4 409 {
xeon011 0:137fc24033c4 410 if((i%400==0) || ((i%100!=0) && (i%4==0)))
xeon011 0:137fc24033c4 411 {
xeon011 0:137fc24033c4 412 run_year_cnt += 1;
xeon011 0:137fc24033c4 413 }
xeon011 0:137fc24033c4 414 }
xeon011 0:137fc24033c4 415
xeon011 0:137fc24033c4 416 total_day=(l-EPOCH-run_year_cnt)*365+run_year_cnt*366;
xeon011 0:137fc24033c4 417
xeon011 0:137fc24033c4 418 for(i=1;i<=Nowdatetime.mo;i++)
xeon011 0:137fc24033c4 419 {
xeon011 0:137fc24033c4 420 if(i==5 || i==7 || i==10 || i==12)
xeon011 0:137fc24033c4 421 {
xeon011 0:137fc24033c4 422 total_day += 30;
xeon011 0:137fc24033c4 423 }
xeon011 0:137fc24033c4 424 if (i==3)
xeon011 0:137fc24033c4 425 {
xeon011 0:137fc24033c4 426 if (l%400==0 && l%100!=0 && l%4==0)
xeon011 0:137fc24033c4 427 {
xeon011 0:137fc24033c4 428 total_day += 29;
xeon011 0:137fc24033c4 429 }
xeon011 0:137fc24033c4 430 else
xeon011 0:137fc24033c4 431 {
xeon011 0:137fc24033c4 432 total_day += 28;
xeon011 0:137fc24033c4 433 }
xeon011 0:137fc24033c4 434 }
xeon011 0:137fc24033c4 435 if(i==2 || i==4 || i==6 || i==8 || i==9 || i==11)
xeon011 0:137fc24033c4 436 {
xeon011 0:137fc24033c4 437 total_day += 31;
xeon011 0:137fc24033c4 438 }
xeon011 0:137fc24033c4 439 }
xeon011 0:137fc24033c4 440
xeon011 0:137fc24033c4 441 seconds = (total_day+Nowdatetime.dd-1)*24*3600;
xeon011 0:137fc24033c4 442 seconds += Nowdatetime.ss;//seconds
xeon011 0:137fc24033c4 443 seconds += Nowdatetime.mm*60;//minute
xeon011 0:137fc24033c4 444 seconds += Nowdatetime.hh*3600;//hour
xeon011 0:137fc24033c4 445
xeon011 0:137fc24033c4 446 return seconds;
xeon011 0:137fc24033c4 447 }