mains-frequency-counter-stm32/cube/User/Src/networkAbstractionLayer.c

121 lines
3.2 KiB
C
Raw Normal View History

2021-02-16 10:37:09 +01:00
#include <networkAbstractionLayer.h>
2021-02-16 11:01:01 +01:00
#include <PontCoopScheduler.h>
#include <iwdg.h>
#include <logger.h>
2021-02-16 11:18:41 +01:00
#include <sinkStruct.h>
#include <config.h>
2021-02-16 10:37:09 +01:00
2021-02-16 11:26:49 +01:00
#define NETWORK_LAN 1
#define NETWORK_WiFi 2
#define NETWORK_GSM 3
#if NETWORK == NETWORK_LAN
2021-02-16 10:37:09 +01:00
#include <wizHelper.h>
2021-02-16 11:18:41 +01:00
#include <wizchip_conf.h>
2021-02-16 11:19:29 +01:00
#include <socket.h>
2021-02-16 11:26:49 +01:00
#endif
2021-02-16 10:37:09 +01:00
2021-02-16 11:26:49 +01:00
const uint16_t SINK_PORT = 20169;
2021-02-16 10:37:09 +01:00
2021-02-16 11:04:45 +01:00
static t_seconds seconds = { .seconds = 0, .missedUpdates = 0, .valid = false };
2021-02-16 11:18:41 +01:00
static t_configBlock *config;
2021-02-16 11:01:01 +01:00
2021-02-16 11:26:49 +01:00
#if NETWORK == NETWORK_LAN
static uint64_t networkSntpQuery() {
return wizSntpQuery();
}
#endif
2021-02-16 11:01:01 +01:00
static void networkSecondsHandler(void *handle) {
static bool tryAgain = false;
seconds.seconds += 1;
if (! seconds.valid) {
coloredMsg(LOG_YELLOW, "nsh, initially querying time");
2021-02-16 11:26:49 +01:00
uint64_t tmpSeconds = networkSntpQuery();
2021-02-16 11:01:01 +01:00
if (tmpSeconds != 0) {
coloredMsg(LOG_YELLOW, "nsh, success, time is %lu", tmpSeconds);
seconds.seconds = tmpSeconds;
2021-02-16 11:04:45 +01:00
seconds.missedUpdates = 0;
2021-02-16 11:01:01 +01:00
seconds.valid = true;
} else {
coloredMsg(LOG_YELLOW, "nsh, failed");
2021-02-16 11:04:45 +01:00
seconds.missedUpdates += 1;
2021-02-16 11:01:01 +01:00
}
} else if (tryAgain || ((seconds.seconds % 3600) == 0)) {
coloredMsg(LOG_YELLOW, "nsh, periodically querying time");
2021-02-16 11:26:49 +01:00
uint64_t tmpSeconds = networkSntpQuery();
2021-02-16 11:01:01 +01:00
if (tmpSeconds != 0) {
coloredMsg(LOG_YELLOW, "nsh, success, network time is %lu", tmpSeconds);
2021-02-16 11:04:45 +01:00
seconds.missedUpdates = 0;
2021-02-16 11:01:01 +01:00
tryAgain = false;
if (seconds.seconds != tmpSeconds) {
coloredMsg(LOG_YELLOW, "nsh, local time updated");
seconds.seconds = tmpSeconds;
} else {
coloredMsg(LOG_YELLOW, "nsh, local time still in sync");
}
} else {
coloredMsg(LOG_YELLOW, "nsh, failed, trying again ...");
2021-02-16 11:04:45 +01:00
seconds.missedUpdates += 1;
2021-02-16 11:01:01 +01:00
tryAgain = true;
}
}
HAL_IWDG_Refresh(&hiwdg);
}
t_seconds* networkGetSeconds() {
return &seconds;
}
2021-02-16 11:26:49 +01:00
#if NETWORK == NETWORK_LAN
2021-02-16 11:18:41 +01:00
extern uint8_t SINK_SOCK;
2021-02-16 11:26:49 +01:00
static int8_t networkUdpSend(char *hostname, uint16_t port, uint8_t *buf, uint16_t bufLen) {
2021-02-16 11:18:41 +01:00
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, SINK_PORT, 0);
uint8_t sockState = getSn_SR(SINK_SOCK);
if (sockState == SOCK_UDP) {
sendto(SINK_SOCK, buf, bufLen, sinkAddr, SINK_PORT);
coloredMsg(LOG_BLUE, "nus, sent");
} else {
coloredMsg(LOG_BLUE, "nus, socket in unexpected state: %d", sockState);
return -2;
}
close(SINK_SOCK);
return 1;
}
2021-02-16 11:26:49 +01:00
#endif
2021-02-16 11:18:41 +01:00
int8_t networkSendMinuteBuffer(t_minuteBuffer *minuteBuffer) {
return networkUdpSend(config->sinkServer, SINK_PORT, minuteBuffer->b, sizeof(minuteBuffer->b));
}
2021-02-16 10:37:09 +01:00
void networkInit() {
2021-02-16 11:31:19 +01:00
#if NETWORK == NETWORK_LAN
2021-02-16 10:37:09 +01:00
wizInit();
2021-02-16 11:31:19 +01:00
#endif
2021-02-16 11:20:37 +01:00
config = getConfig();
2021-02-16 11:01:01 +01:00
schAdd(networkSecondsHandler, NULL, 0, 1000);
}