mains-frequency-counter-stm32/cube/User/Src/networkAbstractionLayer_lan.c
2021-02-28 12:53:43 +01:00

115 lines
3.3 KiB
C

#include <networkAbstractionLayer_impl.h>
#include <logger.h>
#include <PontCoopScheduler.h>
#include <wizHelper.h>
#include <wizchip_conf.h>
#include <socket.h>
#include <config.h>
#include <sntp.h>
static t_configBlock *config;
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()) {
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, "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, "nes, time update failed");
sntpState = SNTP_STATE_ERROR;
}
} else {
coloredMsg(LOG_BLUE, "nes, error when querying ntp server name");
sntpState = SNTP_STATE_ERROR;
}
default:
coloredMsg(LOG_BLUE, "nes, unexpected state");
}
}
}
uint64_t networkSntpQuery() {
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 res;
}
extern uint8_t SINK_SOCK;
int8_t networkUdpSend(char *hostname, uint16_t port, uint8_t *buf, uint16_t bufLen) {
uint8_t sinkAddr[4];
if (! wizDnsQuery(hostname, sinkAddr)) {
coloredMsg(LOG_BLUE, "nus, failed to resolve sink server name");
return -1;
} else {
coloredMsg(LOG_BLUE, "nus, sink server at %d.%d.%d.%d", sinkAddr[0], sinkAddr[1], sinkAddr[2], sinkAddr[3]);
}
socket(SINK_SOCK, Sn_MR_UDP, port, 0);
uint8_t sockState = getSn_SR(SINK_SOCK);
if (sockState == SOCK_UDP) {
sendto(SINK_SOCK, buf, bufLen, sinkAddr, port);
coloredMsg(LOG_BLUE, "nus, sent");
} else {
coloredMsg(LOG_BLUE, "nus, socket in unexpected state: %d", sockState);
return -2;
}
close(SINK_SOCK);
return 1;
}
void networkImplInit() {
config = getConfig();
wizInit();
}