#c #arduino #esp8266
#c #arduino #esp8266
Вопрос:
Я создаю эту библиотеку для ESP8266-Arduino, которая использует библиотеку TimeLib.h.
В моем заголовке у меня есть:
WiFiUDP *_UdpNTP = NULL;
void setupTime();
time_t getNtpTime();
void sendNTPpacket(WiFiUDP *u);
И это мои функции:
void Konnec::setupTime() {
setSyncProvider(getNtpTime);
setSyncInterval(NTP_POL_TIME);
}
time_t Konnec::getNtpTime() {
//WiFiUDP udp;
//udp.begin(localPort);
_UdpNTP = new WiFiUDP();
_UdpNTP->begin(localPort);
while (_UdpNTP->parsePacket() > 0); // discard any previously received packets
for (int i = 0; i < 5; i ) { // 5 retries.
sendNTPpacket(_UdpNTP);
uint32_t beginWait = millis();
while (millis() - beginWait < 1000) {
if (_UdpNTP->parsePacket()) {
Serial.println("");
Serial.println("Receive NTP Response");
_UdpNTP->read(packetBuffer, NTP_PACKET_SIZE);
// Extract seconds portion.
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
unsigned long secSince1900 = highWord << 16 | lowWord;
_UdpNTP->flush();
return secSince1900 - 2208988800UL TIMEZONE * SECS_PER_HOUR;
}
delay(10);
}
}
Serial.println("");
Serial.println("No NTP Response :-(");
return 0; // return 0 if unable to get the time
}
void Konnec::sendNTPpacket(WiFiUDP *u) {
// Zeroise the buffer.
memset(packetBuffer, 0, NTP_PACKET_SIZE);
memcpy(packetBuffer, sendBuffer, 16);
if (u->beginPacket(timeServer, 123)) {
u->write(packetBuffer, NTP_PACKET_SIZE);
u->endPacket();
}
}
И это ошибка, которую я получаю:
konnec.cpp: 991:28: error: cannot convert 'Konnec::getNtpTime' from type 'time_t (Konnec::)() {aka long int (Konnec::)()}' to type 'getExternalTime {aka long int (*)()}
setSyncProvider(getNtpTime)
Error compiling libraries
Кто-нибудь знает, каким было бы решение?
Ответ №1:
Проблема, похоже, в том, что Konnec::getNtpTime
это метод класса, и все же setSyncProvider
ожидает функцию. Функция и метод — это разные вещи, помните, поскольку методу также необходимо знать конкретный экземпляр класса, с которым он работает.
Однако, просматривая ваш код, похоже, что getNtpTime
он не зависит ни от чего конкретного для вашего класса, поэтому вы могли бы объявить его как:
static time_t Konnec::getNtpTime();
который позволит использовать его как функцию, какой она фактически является на данный момент.
Комментарии:
1. Верный аргумент, Неанон. На самом деле, если я сделаю его статичным, я не смогу получить доступ к классу UDP. Но этот метод использовал единственную переменную из моего класса: TIMEZONE. Итак, что я сделал, так это сделал их функциями (убрал их из моего класса) и создал метод в моем классе для изменения переменной timezone (взяв значение из переменной TIMEZONE из моего метода). Это исправлено.