Browse Source

Merge f35e43167d into 5120aa473b

pull/1771/merge
DanielR92 1 month ago
committed by GitHub
parent
commit
ac8f165e97
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 54
      src/network/AhoyNetwork.h
  2. 26
      src/utils/helper.cpp

54
src/network/AhoyNetwork.h

@ -13,6 +13,9 @@
#include "AsyncJson.h" #include "AsyncJson.h"
#include <lwip/dns.h> #include <lwip/dns.h>
#include <vector>
#include <algorithm>
#define NTP_PACKET_SIZE 48 #define NTP_PACKET_SIZE 48
class AhoyNetwork { class AhoyNetwork {
public: public:
@ -91,6 +94,7 @@ class AhoyNetwork {
ip_addr_t ipaddr; ip_addr_t ipaddr;
mNtpIp = WiFi.gatewayIP(); mNtpIp = WiFi.gatewayIP();
// dns_gethostbyname runs asynchronous and sets the member mNtpIp which is then checked on // dns_gethostbyname runs asynchronous and sets the member mNtpIp which is then checked on
// next call of updateNtpTime // next call of updateNtpTime
err_t err = dns_gethostbyname(mConfig->ntp.addr, &ipaddr, dnsCallback, this); err_t err = dns_gethostbyname(mConfig->ntp.addr, &ipaddr, dnsCallback, this);
@ -102,6 +106,10 @@ class AhoyNetwork {
mNtpIp = ipaddr.addr; mNtpIp = ipaddr.addr;
#endif #endif
startNtpUpdate(); startNtpUpdate();
} else if (err != ERR_INPROGRESS) {
// Handle DNS error (other than ERR_INPROGRESS)
DPRINTLN(DBG_ERROR, F("DNS lookup failed"));
mOnTimeCB(0); // Signal failure
} }
} }
@ -110,6 +118,7 @@ class AhoyNetwork {
DPRINTLN(DBG_INFO, F("get time from: ") + mNtpIp.toString()); DPRINTLN(DBG_INFO, F("get time from: ") + mNtpIp.toString());
if (!mUdp.connected()) { if (!mUdp.connected()) {
if (!mUdp.connect(mNtpIp, mConfig->ntp.port)) { if (!mUdp.connect(mNtpIp, mConfig->ntp.port)) {
DPRINTLN(DBG_ERROR, F("UDP connection failed"));
mOnTimeCB(0); mOnTimeCB(0);
return; return;
} }
@ -224,13 +233,28 @@ class AhoyNetwork {
} }
} }
/**
* @brief Sorts the indices of WiFi networks based on their RSSI values in descending order.
*
* This function takes an array of integers and its size, and sorts the array such that
* the indices correspond to WiFi networks sorted by their RSSI values from highest to lowest.
*
* @param sort Pointer to an array of integers where the sorted indices will be stored.
* @param n The number of WiFi networks (size of the array).
*/
void sortRSSI(int *sort, int n) { void sortRSSI(int *sort, int n) {
for (int i = 0; i < n; i++) std::vector<int> indices(n);
sort[i] = i; for (int i = 0; i < n; ++i) {
for (int i = 0; i < n; i++) indices[i] = i;
for (int j = i + 1; j < n; j++) }
if (WiFi.RSSI(sort[j]) > WiFi.RSSI(sort[i]))
std::swap(sort[i], sort[j]); std::sort(indices.begin(), indices.end(), [](int a, int b) {
return WiFi.RSSI(a) > WiFi.RSSI(b);
});
for (int i = 0; i < n; ++i) {
sort[i] = indices[i];
}
} }
protected: protected:
@ -246,13 +270,21 @@ class AhoyNetwork {
mUdp.write(buf, NTP_PACKET_SIZE); mUdp.write(buf, NTP_PACKET_SIZE);
} }
/**
* @brief Handles an incoming NTP packet and extracts the time.
*
* This function processes an NTP packet received via UDP. It checks if the packet
* is of valid length, extracts the NTP timestamp, and invokes a callback with the
* extracted time. If the packet is too small to contain valid NTP data, it signals
* an error via the callback.
*
* @param packet The received UDP packet containing NTP data.
*/
void handleNTPPacket(AsyncUDPPacket packet) { void handleNTPPacket(AsyncUDPPacket packet) {
char buf[80]; const uint8_t* data = packet.data();
memcpy(buf, packet.data(), sizeof(buf));
unsigned long highWord = word(buf[40], buf[41]); unsigned long highWord = word(data[40], data[41]);
unsigned long lowWord = word(buf[42], buf[43]); unsigned long lowWord = word(data[42], data[43]);
// combine the four bytes (two words) into a long integer // combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900): // this is NTP time (seconds since Jan 1 1900):

26
src/utils/helper.cpp

@ -6,6 +6,7 @@
#include "helper.h" #include "helper.h"
#include "dbg.h" #include "dbg.h"
#include "../plugins/plugin_lang.h" #include "../plugins/plugin_lang.h"
#include <cmath>
#define dt_SHORT_STR_LEN_i18n 3 // the length of short strings #define dt_SHORT_STR_LEN_i18n 3 // the length of short strings
static char buffer_i18n[dt_SHORT_STR_LEN_i18n + 1]; // must be big enough for longest string and the terminating null static char buffer_i18n[dt_SHORT_STR_LEN_i18n + 1]; // must be big enough for longest string and the terminating null
@ -14,15 +15,16 @@ const char dayShortNames_P[] PROGMEM = STR_DAYNAME_3_CHAR_LIST;
namespace ah { namespace ah {
void ip2Arr(uint8_t ip[], const char *ipStr) { void ip2Arr(uint8_t ip[], const char *ipStr) {
uint8_t p = 1;
memset(ip, 0, 4); memset(ip, 0, 4);
for(uint8_t i = 0; i < 16; i++) { const char *start = ipStr;
if(ipStr[i] == 0)
return; for (uint8_t i = 0; i < 4; i++) {
if(0 == i) ip[i] = (uint8_t)strtol(start, (char**)&start, 10);
ip[0] = atoi(ipStr); if (*start == '.') {
else if(ipStr[i] == '.') start++;
ip[p++] = atoi(&ipStr[i+1]); } else if (*start == '\0') {
break;
}
} }
} }
@ -35,11 +37,15 @@ namespace ah {
} }
double round1(double value) { double round1(double value) {
return (int)(value * 10 + 0.5) / 10.0; return round(value * 10) / 10.0;
}
double round2(double value) {
return round(value * 100) / 100.0;
} }
double round3(double value) { double round3(double value) {
return (int)(value * 1000 + 0.5) / 1000.0; return round(value * 1000) / 1000.0;
} }
String getDateTimeStr(time_t t) { String getDateTimeStr(time_t t) {

Loading…
Cancel
Save