netTaskErr getEpochTime(void) { uint8_t count; netTaskErr result = errOK; netStatus sntpStatus, dnsStatus; osEvent statusNtpWait, statusDnsWait; // getting IP of NTP server for (count = 0; count < DNS_WAIT_TRIES; count++) { osSignalClear(netTaskId, FLAG_DNS_RESOLVED); dnsStatus = get_host_by_name (ntpHostName, dnsCBack); if (dnsStatus == netOK) { statusDnsWait = osSignalWait(FLAG_DNS_RESOLVED, DNS_TIMEOUT_MS); if ((statusDnsWait.status == osEventSignal) && ((ntpHostIP[0] != 0) || (ntpHostIP[1] != 0) || (ntpHostIP[2] != 0) || (ntpHostIP[3] != 0)) ) { result = errOK; break; } else { osSignalClear(netTaskId, FLAG_DNS_RESOLVED); result = errDnsTOut; } } else { result = errDnsResolve; } osDelay(DNS_WAIT_DELAY_MS); } if (result != errOK) return result; // requesting Unix time from NTP server for (count = 0; count < SNTP_WAIT_TRIES; count++) { osSignalClear(netTaskId, FLAG_UDP_PACKET_RECV); sntpStatus = sntp_get_time (&ntpHostIP[0], sntpCBack); if (sntpStatus == netOK) { statusNtpWait = osSignalWait(FLAG_UDP_PACKET_RECV, UDP_TIMEOUT_MS); if ((statusNtpWait.status == osEventSignal) && (ntpEpochTime != 0)) { result = errOK; break; } else { osSignalClear(netTaskId, FLAG_UDP_PACKET_RECV); result = errNtpCBackTOut; } } else { result = errNtpNotReady; // SNTP not ready or bad parameters. } osDelay(SNTP_WAIT_DELAY_MS); } return result; }
void main(void) { uint8_t eth_init = ETH_INIT_DEFAULT; uint32_t server; struct timespec time; strncpy(_tz.tzname, TIMEZONE_CODE, sizeof(_tz.tzname) - 1); _tz.timezone = TIMEZONE_SECS; if (doesclrscrafterexit()) { atexit(confirm_exit); } #ifdef __APPLE2__ { int file; printf("\nSetting slot "); file = open("ethernet.slot", O_RDONLY); if (file != -1) { read(file, ð_init, 1); close(file); eth_init &= ~'0'; } printf("- %d\n", eth_init); } #endif printf("\nInitializing "); if (ip65_init(eth_init)) { error_exit(); } printf("- Ok\n\nObtaining IP address "); if (dhcp_init()) { error_exit(); } printf("- Ok\n\nResolving %s ", NTP_SERVER); server = dns_resolve(NTP_SERVER); if (!server) { error_exit(); } printf("- Ok\n\nGetting %s ", _tz.tzname); time.tv_sec = sntp_get_time(server); if (!time.tv_sec) { error_exit(); } // Convert time from seconds since 1900 to // seconds since 1970 according to RFC 868 time.tv_sec -= 2208988800UL; printf("- %s", ctime(&time.tv_sec)); time.tv_nsec = 0; clock_settime(CLOCK_REALTIME, &time); }