The Library of SNTP Client for W5500 SNTP is short for Simple Network Time Protocol.

Dependents:   SNTP_Ethernet_W5500 SNTP_Ethernet_W5500 SNTP_SHT15_WIZwizki-W7500 Nucleo_SNTP_Ethernet_W5500 ... more

Committer:
xeon011
Date:
Fri Dec 19 05:46:22 2014 +0000
Revision:
0:137fc24033c4
The Library of SNTP Client for W5500

Who changed what in which revision?

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