diff --git a/cube/User/Src/networkAbstractionLayer_lan.c b/cube/User/Src/networkAbstractionLayer_lan.c index d82ddd6..cc55d56 100644 --- a/cube/User/Src/networkAbstractionLayer_lan.c +++ b/cube/User/Src/networkAbstractionLayer_lan.c @@ -17,39 +17,66 @@ static uint8_t sntpBuffer[MAX_SNTP_BUF_SIZE]; static const uint64_t UNIX_NTP_EPOCH_DIFF = 2208988800; extern const uint8_t SNTP_SOCK; static uint64_t seconds; +static enum { + SNTP_STATE_IDLE, + SNTP_STATE_SEND, + SNTP_STATE_DONE, + SNTP_STATE_ERROR +} sntpState = SNTP_STATE_IDLE; + void networkSntpEngine(void *handle) { if (isNetworkAvailable()) { - coloredMsg(LOG_BLUE, "wizsq, about to call SNTP"); + switch (sntpState) { + case SNTP_STATE_SEND: + coloredMsg(LOG_BLUE, "nes, about to call SNTP"); - uint8_t ntpServer[4]; - if (wizDnsQuery(config->ntpServer, ntpServer)) { - SNTP_init(SNTP_SOCK, ntpServer, 0, sntpBuffer); - uint16_t cycles = 0; - uint32_t startTime = HAL_GetTick(); - while (1) { - cycles += 1; - datetime curTime; - if (1 == SNTP_run(&curTime)) { - seconds = curTime.seconds - UNIX_NTP_EPOCH_DIFF; - coloredMsg(LOG_BLUE, "wizsq, cycles: %u, curTime: %lu", cycles, seconds); - uint32_t stopTime = HAL_GetTick(); - coloredMsg(LOG_BLUE, "wizsq, duration: %u ms", stopTime - startTime); - break; + uint8_t ntpServer[4]; + if (wizDnsQuery(config->ntpServer, ntpServer)) { + SNTP_init(SNTP_SOCK, ntpServer, 0, sntpBuffer); + uint16_t cycles = 0; + uint32_t startTime = HAL_GetTick(); + while (1) { + cycles += 1; + datetime curTime; + if (1 == SNTP_run(&curTime)) { + seconds = curTime.seconds - UNIX_NTP_EPOCH_DIFF; + coloredMsg(LOG_BLUE, "nes, cycles: %u, curTime: %lu", cycles, seconds); + uint32_t stopTime = HAL_GetTick(); + coloredMsg(LOG_BLUE, "nes, duration: %u ms", stopTime - startTime); + sntpState = SNTP_STATE_DONE; + break; + } } - } - if (seconds == 0) { - coloredMsg(LOG_BLUE, "wizsq, time update failed"); + if (seconds == 0) { + coloredMsg(LOG_BLUE, "nes, time update failed"); + sntpState = SNTP_STATE_ERROR; + } + } else { + coloredMsg(LOG_BLUE, "nes, error when querying ntp server name"); + sntpState = SNTP_STATE_ERROR; } - } else { - coloredMsg(LOG_BLUE, "wizsq, error when querying ntp server name"); } } } uint64_t networkSntpQuery() { - networkSntpEngine(NULL); + uint64_t res = 0; + + if (sntpState == SNTP_STATE_IDLE) { + coloredMsg(LOG_BLUE, "nsq, start sntp request"); + sntpState = SNTP_STATE_SEND; + schAdd(networkSntpEngine, NULL, 1, 0); + } else if (sntpState == SNTP_STATE_DONE) { + coloredMsg(LOG_BLUE, "nsq, start sntp done"); + res = seconds; + sntpState = SNTP_STATE_IDLE; + } else if (sntpState == SNTP_STATE_ERROR) { + coloredMsg(LOG_BLUE, "nsq, start sntp failed"); + sntpState = SNTP_STATE_IDLE; + } + return seconds; }