Lots of debugging and experimentation going on!
This commit is contained in:
parent
72434b0151
commit
d7b938c970
|
|
@ -56,6 +56,10 @@ SoftwareSerial gps(GPS_RX_PIN, GPS_TX_PIN, false, SERIAL_BUFFER_SIZE);
|
|||
char nmeaBuffer[NMEA_BUFFER_SIZE];
|
||||
MicroNMEA nmea(nmeaBuffer, NMEA_BUFFER_SIZE);
|
||||
|
||||
#if defined(USE_OLED_DISPLAY)
|
||||
SSD1306Wire display(0x3c, SDA, SCL);
|
||||
#endif
|
||||
|
||||
#ifdef NTP_PACKET_DEBUG
|
||||
void dumpNTPPacket(NTPPacket* ntp)
|
||||
{
|
||||
|
|
@ -142,18 +146,6 @@ void oneSecondInterrupt()
|
|||
#endif
|
||||
}
|
||||
|
||||
void waitForEdge(int edge)
|
||||
{
|
||||
while (digitalRead(SYNC_PIN) == edge)
|
||||
{
|
||||
delay(0);
|
||||
}
|
||||
while (digitalRead(SYNC_PIN) != edge)
|
||||
{
|
||||
delay(0);
|
||||
}
|
||||
}
|
||||
|
||||
void getNTPTime(NTPTime *time)
|
||||
{
|
||||
time->seconds = toNTP(seconds);
|
||||
|
|
@ -197,6 +189,7 @@ void recievePacket(AsyncUDPPacket aup)
|
|||
void recievePacket()
|
||||
#endif
|
||||
{
|
||||
static NTPPacket ntp;
|
||||
NTPTime recv_time;
|
||||
getNTPTime(&recv_time);
|
||||
#if defined(USE_ASYNC_UDP)
|
||||
|
|
@ -219,7 +212,6 @@ void recievePacket()
|
|||
return;
|
||||
}
|
||||
|
||||
NTPPacket ntp;
|
||||
#if defined(USE_ASYNC_UDP)
|
||||
memcpy(&ntp, aup.data(), sizeof(ntp));
|
||||
#else
|
||||
|
|
@ -278,11 +270,6 @@ void recievePacket()
|
|||
void badChecksum(MicroNMEA& mn)
|
||||
{
|
||||
const char* s = mn.getSentence();
|
||||
if (s == NULL || s[0] == '\0')
|
||||
{
|
||||
//dbprintf("badChecksum: NULL sentence!!!!");
|
||||
return;
|
||||
}
|
||||
dbprintf("badChecksum: (length:%d 1stbyte:%02x) '%s'\n", strlen(s), s[0], s);
|
||||
}
|
||||
|
||||
|
|
@ -296,7 +283,7 @@ void unknownSentence(MicroNMEA& mn)
|
|||
}
|
||||
|
||||
sentence_unknown = true;
|
||||
dbprintf("unknownSentence: %s\n", mn.getSentence());
|
||||
dbprintf("unknownSentence: %s\n", sentence);
|
||||
}
|
||||
|
||||
void resetGPS()
|
||||
|
|
@ -346,7 +333,7 @@ void processGPS()
|
|||
{
|
||||
if (nmea.isValid() && nmea.getYear() > 2000)
|
||||
{
|
||||
struct tm tm;
|
||||
static struct tm tm;
|
||||
tm.tm_year = nmea.getYear() - 1900;
|
||||
tm.tm_mon = nmea.getMonth() - 1;
|
||||
tm.tm_mday = nmea.getDay();
|
||||
|
|
@ -382,7 +369,7 @@ void processGPS()
|
|||
|
||||
void sendSentence(const char* sentence)
|
||||
{
|
||||
char cksum[3];
|
||||
static char cksum[3];
|
||||
MicroNMEA::generateChecksum(sentence, cksum);
|
||||
cksum[2] = '\0';
|
||||
dbprintf("sendSentence: '%s*%s'\n", sentence, cksum);
|
||||
|
|
@ -411,13 +398,21 @@ void setup()
|
|||
micros_history_index = 0;
|
||||
#endif
|
||||
|
||||
#if !defined(USE_NO_WIFI)
|
||||
WiFiManager wifi;
|
||||
//wifi.setDebugOutput(false);
|
||||
String ssid = "SynchroClock" + String(ESP.getChipId());
|
||||
wifi.autoConnect(ssid.c_str(), NULL);
|
||||
#endif
|
||||
|
||||
Wire.begin();
|
||||
Wire.setClockStretchLimit(1500);
|
||||
#if defined(USE_OLED_DISPLAY)
|
||||
if (!display.init())
|
||||
{
|
||||
dbprintln("display.init() failed!");
|
||||
}
|
||||
display.flipScreenVertically();
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
#endif
|
||||
|
||||
gps.begin(9600);
|
||||
nmea.setBadChecksumHandler(&badChecksum);
|
||||
|
|
@ -483,12 +478,25 @@ void loop()
|
|||
stdev = sqrt(stdev / micros_history_count);
|
||||
dbprintf("mean:%f stdev:%f ", mean, stdev);
|
||||
#endif
|
||||
double disp = us2s(max(abs(MICROS_PER_SEC-max_micros), abs(MICROS_PER_SEC-min_micros)));
|
||||
dbprintf("min:%f max:%f jitter:%f dispersion:%f valid_count:%lu valid:%s\n",
|
||||
us2s(min_micros), us2s(max_micros), us2s(max_micros-min_micros), disp,
|
||||
valid_count, valid?"true":"false");
|
||||
double disp = us2s(MAX(abs(MICROS_PER_SEC-max_micros), abs(MICROS_PER_SEC-min_micros)));
|
||||
dispersion = (uint32_t)(disp * 65536.0);
|
||||
dbprintf("min:%lu max:%lu jitter:%lu valid_count:%lu valid:%s\n",
|
||||
min_micros, max_micros, max_micros-min_micros,
|
||||
valid_count, valid?"true":"false");
|
||||
}
|
||||
last_seconds = seconds;
|
||||
//delay(1);
|
||||
|
||||
//
|
||||
// Update the display
|
||||
//
|
||||
display.clear();
|
||||
display.setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
const char* s = ctime(&last_seconds);
|
||||
display.drawString(0, 0, WiFi.localIP().toString());
|
||||
display.drawString(0, 10, s);
|
||||
// write the buffer to the display
|
||||
display.display();
|
||||
|
||||
delay(1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,18 +20,25 @@
|
|||
* Author: liebman
|
||||
*/
|
||||
|
||||
//#define USE_ASYNC_UDP
|
||||
#define USE_ASYNC_UDP
|
||||
#define USE_OLED_DISPLAY
|
||||
//#define USE_NO_WIFI
|
||||
|
||||
#ifndef _ESPNTPServer_H_
|
||||
#define _ESPNTPServer_H_
|
||||
#include "Arduino.h"
|
||||
#include "Ticker.h"
|
||||
#include "Wire.h"
|
||||
#if !defined(USE_NO_WIFI)
|
||||
#include "WiFiManager.h"
|
||||
#endif
|
||||
#include "SoftwareSerial.h"
|
||||
#include "MicroNMEA.h"
|
||||
#include <time.h>
|
||||
|
||||
#if defined(USE_OLED_DISPLAY)
|
||||
#include "SSD1306Wire.h"
|
||||
#endif
|
||||
|
||||
#if defined(USE_ASYNC_UDP)
|
||||
#include "ESPAsyncUDP.h"
|
||||
#else
|
||||
|
|
@ -53,7 +60,7 @@
|
|||
#define WARMUP_SECONDS 2
|
||||
#define PRECISION_COUNT 10000
|
||||
#define MICROS_PER_SEC 1000000
|
||||
#define SERIAL_BUFFER_SIZE 256
|
||||
#define SERIAL_BUFFER_SIZE 128
|
||||
#define NMEA_BUFFER_SIZE 128
|
||||
#define VALIDITY_CHECK_MS 1100
|
||||
//#define MICROS_HISTORY_SIZE 1000
|
||||
|
|
@ -112,7 +119,7 @@ typedef struct ntp_packet
|
|||
#define toNTP(t) ((uint32_t)t+SEVENTY_YEARS)
|
||||
|
||||
// simple versions - we don't worry about side effects
|
||||
#define max(a, b) ((a) < (b) ? (b) : (a))
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a, b) ((a) < (b) ? (b) : (a))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#endif /* _ESPNTPServer_H_ */
|
||||
|
|
|
|||
|
|
@ -76,7 +76,9 @@ void Logger::println(const char* message)
|
|||
snprintf(_buffer, LOGGER_BUFFER_SIZE-1, "%s\n", message);
|
||||
Serial.print(_buffer);
|
||||
Serial.flush();
|
||||
#if defined(USE_NETWORK)
|
||||
send(_buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
extern int vsnprintf(char* buffer, size_t size, const char* fmt, va_list args);
|
||||
|
|
@ -91,7 +93,9 @@ void Logger::printf(const char* fmt, ...)
|
|||
|
||||
Serial.print(_buffer);
|
||||
Serial.flush();
|
||||
#if defined(USE_NETWORK)
|
||||
send(_buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Logger::flush()
|
||||
|
|
@ -105,9 +109,9 @@ void Logger::flush()
|
|||
#endif
|
||||
}
|
||||
|
||||
#if defined(USE_NETWORK)
|
||||
void Logger::send(const char* message)
|
||||
{
|
||||
#if defined(USE_NETWORK)
|
||||
// if we are not configured for TCP then just return
|
||||
if (_host == NULL)
|
||||
{
|
||||
|
|
@ -153,7 +157,7 @@ void Logger::send(const char* message)
|
|||
dbprintln("Logger::log failed to send packet!");
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
Logger logger;
|
||||
|
|
|
|||
5
Logger.h
5
Logger.h
|
|
@ -27,7 +27,7 @@
|
|||
#include <ESP8266WiFi.h>
|
||||
|
||||
#define USE_TCP
|
||||
#define USE_NETWORK
|
||||
//#define USE_NETWORK
|
||||
|
||||
#ifdef USE_NETWORK
|
||||
#ifdef USE_TCP
|
||||
|
|
@ -63,8 +63,9 @@ private:
|
|||
uint16_t _port;
|
||||
uint16_t _failed;
|
||||
char _buffer[LOGGER_BUFFER_SIZE];
|
||||
|
||||
#ifdef USE_NETWORK
|
||||
void send(const char* message);
|
||||
#endif
|
||||
};
|
||||
|
||||
extern Logger logger;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# ESPNTPServer
|
||||
GPS fueled ESP8266 based NTP Server
|
||||
|
||||
Don't have a GPS unit yet so I'm using a DS3231 as a PPS source to workout
|
||||
some of the software. I'm actually using one of my [AnalogClock](https://github.com/liebman/AnalogClock) boards as it has the DS3231 1hz routed to an ESP8266 GPIO pin.
|
||||
GPS: Adafruit Untimate GPS
|
||||
|
||||
Work in progress....
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user