2016-10-23 3 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은 기능을 기대합니다. 함수와 메쏘드는 메쏘드가 조작중인 특정 클래스 인스턴스를 알아야하기 때문에 기억해야 할 다른 것들이 있습니다.

하지만 당신의 코드를 찾고, 그것은 클래스에 특정 아무것도에 의존하지 않는 getNtpTime처럼 보이는, 그래서 당신은로 선언 할 수 :

이 같은 기능으로 사용할 수있게된다
static time_t Konnec::getNtpTime(); 

그것은 사실 그 시점에 있습니다.

+0

유효한 포인트, Nonanon. 사실, 내가 정적이라면 나는 UDP 클래스에 접근 할 수 없다. 하지만 그 방법은 수업 시간에 TIMEZONE이라는 변수 하나를 사용했습니다. 그래서 내가 한 일은 함수를 (내 수업에서 꺼내서) 만들었고 수업 시간에 변수를 수정하는 메서드를 만들었습니다 (내 메서드에서 TIMEZONE 변수의 값을 가져옴). 그것은 그것을 고쳤다. –