2016-10-23 12 views
1

私はTimeLib.hライブラリを利用するESP8266-Arduino用にこのライブラリを作成しています。TimeLib.hを実装しているArduinoクラス

私が持っている私のヘッダーで

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は機能を期待しています。関数とメソッドは異なる方法であることを覚えておいてください。メソッドは、操作中の特定のクラスインスタンスも知る必要があるからです。

それは関数として使用されるようになる
static time_t Konnec::getNtpTime(); 

:あなたのようにそれを宣言することができるように

しかし、あなたのコードを見ると、それはgetNtpTimeのように見えますが、あなたのクラスに固有のものに依存しませんそれは事実上その時点です。

+0

有効なポイント、Nonanon。実際、私が静的にすると、私はUDPクラスにアクセスすることができません。しかし、その方法では私のクラスの1つの変数TIMEZONEを使用していました。だから、私がやったことは、それらを(クラスから取り除いて)機能させ、タイムゾーン変数(私のメソッドのTIMEZONE変数から値を取る)を変更するメソッドをクラス内に作成したことです。それはそれを修正した。 –

関連する問題