DBtimesync (experimental)
This commit is contained in:
		
							parent
							
								
									bc4b4184a9
								
							
						
					
					
						commit
						79d931bf50
					
				| @ -4,6 +4,7 @@ | ||||
| #include "globals.h" | ||||
| #include "rcommand.h" | ||||
| #include "timekeeper.h" | ||||
| #include "DBtimesync.h" | ||||
| 
 | ||||
| // LMIC-Arduino LoRaWAN Stack
 | ||||
| #include <lmic.h> | ||||
|  | ||||
| @ -8,6 +8,8 @@ | ||||
| #include "macsniff.h" | ||||
| #include <rom/rtc.h> | ||||
| #include "cyclic.h" | ||||
| #include "timekeeper.h" | ||||
| #include "DBtimesync.h" | ||||
| 
 | ||||
| // table of remote commands and assigned functions
 | ||||
| typedef struct { | ||||
|  | ||||
| @ -31,5 +31,7 @@ time_t tmConvert(uint16_t YYYY, uint8_t MM, uint8_t DD, uint8_t hh, uint8_t mm, | ||||
|                  uint8_t ss); | ||||
| TickType_t tx_Ticks(uint32_t framesize, unsigned long baud, uint32_t config, | ||||
|                     int8_t rxPin, int8_t txPins); | ||||
| time_t TimeSyncAns(uint8_t seqNo, uint64_t unixTime); | ||||
| void TimeSyncReq(uint8_t seqNo); | ||||
| 
 | ||||
| #endif // _timekeeper_H
 | ||||
| @ -81,8 +81,10 @@ time_t get_gpstime(void) { | ||||
| 
 | ||||
|   time_t t = 0; | ||||
| 
 | ||||
|   if ((gps.time.age() < gpsDelay_ms) && (gps.time.isValid()) && | ||||
|       (gps.date.isValid())) { | ||||
|   if ((gps.time.age() < gpsDelay_ms) && gps.time.isValid() && | ||||
|       gps.date.isValid() && gps.time.isUpdated()) { | ||||
| 
 | ||||
|     gps.time.value(); // trigger isUpdated()
 | ||||
| 
 | ||||
|     ESP_LOGD(TAG, "GPS time age: %dms, is valid: %s, second: %d", | ||||
|              gps.time.age(), | ||||
|  | ||||
| @ -5,19 +5,21 @@ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| //#define HAS_BME 0x77  // BME680 sensor on I2C bus (SDI=21/SCL=22); comment out
 | ||||
| //if not present
 | ||||
| // Hardware related definitions for Heltec V2 LoRa-32 Board
 | ||||
| 
 | ||||
| //#define HAS_BME GPIO_NUM_21, GPIO_NUM_22 // SDA, SCL
 | ||||
| //#define BME_ADDR BME680_I2C_ADDR_PRIMARY // connect SDIO of BME680 to GND
 | ||||
| 
 | ||||
| // Hardware related definitions for Heltec LoRa-32 Board
 | ||||
| #define HAS_LORA 1 // comment out if device shall not send data via LoRa
 | ||||
| #define CFG_sx1276_radio 1 | ||||
| 
 | ||||
| #define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C // OLED-Display on board
 | ||||
| #define HAS_LED LED_BUILTIN                           // white LED on board
 | ||||
| #define HAS_BUTTON KEY_BUILTIN                        // button "PROG" on board
 | ||||
| 
 | ||||
| // Pins for I2C interface of OLED Display
 | ||||
| #define MY_OLED_SDA (4) | ||||
| #define MY_OLED_SCL (15) | ||||
| #define MY_OLED_SDA (21) | ||||
| #define MY_OLED_SCL (22) | ||||
| #define MY_OLED_RST (16) | ||||
| 
 | ||||
| // Pins for LORA chip SPI interface come from board file, we need some
 | ||||
|  | ||||
| @ -7,8 +7,8 @@ | ||||
| 
 | ||||
| // Hardware related definitions for Heltec V2 LoRa-32 Board
 | ||||
| 
 | ||||
| //#define HAS_BME 0x77  // BME680 sensor on I2C bus (SDI=21/SCL=22); comment out
 | ||||
| //if not present
 | ||||
| //#define HAS_BME GPIO_NUM_21, GPIO_NUM_22 // SDA, SCL
 | ||||
| //#define BME_ADDR BME680_I2C_ADDR_PRIMARY // connect SDIO of BME680 to GND
 | ||||
| 
 | ||||
| #define HAS_LORA 1       // comment out if device shall not send data via LoRa
 | ||||
| #define CFG_sx1276_radio 1 | ||||
| @ -18,8 +18,8 @@ | ||||
| #define HAS_BUTTON KEY_BUILTIN                        // button "PROG" on board
 | ||||
| 
 | ||||
| // Pins for I2C interface of OLED Display
 | ||||
| #define MY_OLED_SDA (21) | ||||
| #define MY_OLED_SCL (22) | ||||
| #define MY_OLED_SDA (4) | ||||
| #define MY_OLED_SCL (15) | ||||
| #define MY_OLED_RST (16) | ||||
| 
 | ||||
| // Pins for LORA chip SPI interface come from board file, we need some
 | ||||
|  | ||||
| @ -224,6 +224,12 @@ void onEvent(ev_t ev) { | ||||
|     break; | ||||
| 
 | ||||
|   case EV_TXCOMPLETE: | ||||
| 
 | ||||
| #ifdef DBTIMESYNC | ||||
|     if (!(LMIC.txrxFlags & TXRX_ACK) && time_sync_seqNo) | ||||
|       time_sync_messages[time_sync_seqNo - 1] = LMIC.txend; | ||||
| #endif | ||||
| 
 | ||||
|     strcpy_P(buff, (LMIC.txrxFlags & TXRX_ACK) ? PSTR("RECEIVED_ACK") | ||||
|                                                : PSTR("TX_COMPLETE")); | ||||
|     sprintf(display_line6, " "); // clear previous lmic status
 | ||||
|  | ||||
| @ -36,6 +36,8 @@ looptask      1     1     arduino core -> runs the LMIC LoRa stack | ||||
| irqhandler    1     1     executes tasks triggered by timer irq | ||||
| gpsloop       1     2     reads data from GPS via serial or i2c | ||||
| bmeloop       1     1     reads data from BME sensor via i2c | ||||
| timesync_ans  1     0     temporary task for receiving time sync requests | ||||
| timesync_req  1     0     temporary task for sending time sync requests | ||||
| IDLE          1     0     ESP32 arduino scheduler -> runs wifi channel rotator | ||||
| 
 | ||||
| Low priority numbers denote low priority tasks. | ||||
|  | ||||
| @ -66,8 +66,9 @@ | ||||
| #define RESPONSE_TIMEOUT_MS             60000   // firmware binary server connection timeout [milliseconds] | ||||
| 
 | ||||
| // settings for syncing time of node with external time source | ||||
| #define TIME_SYNC_INTERVAL              2      // sync time attempt each .. minutes from time source (GPS/LORA/RTC) [default = 60], comment out means off | ||||
| #define TIME_SYNC_LORA                  1       // use LORA network as time source, comment out means off [default = off] | ||||
| #define TIME_SYNC_INTERVAL              2       // sync time attempt each .. minutes from time source (GPS/LORA/RTC) [default = 60], comment out means off | ||||
| //#define TIME_SYNC_LORA                  1       // use LORA network as time source, comment out means off [default = off] | ||||
| #define DBTIMESYNC                      1       // use DB LORA timeserver with patented sync algorithm [default = off] | ||||
| 
 | ||||
| // time zone, see https://github.com/JChristensen/Timezone/blob/master/examples/WorldClock/WorldClock.ino | ||||
| #define DAYLIGHT_TIME                   {"CEST", Last, Sun, Mar, 2, 120}     // Central European Summer Time | ||||
|  | ||||
| @ -282,19 +282,35 @@ void get_time(uint8_t val[]) { | ||||
| // format: opcode, function, #bytes params,
 | ||||
| // flag (true = do make settings persistent / false = don't)
 | ||||
| //
 | ||||
| cmd_t table[] = { | ||||
|     {0x01, set_rssi, 1, true},          {0x02, set_countmode, 1, true}, | ||||
|     {0x03, set_gps, 1, true},           {0x04, set_display, 1, true}, | ||||
|     {0x05, set_lorasf, 1, true},        {0x06, set_lorapower, 1, true}, | ||||
|     {0x07, set_loraadr, 1, true},       {0x08, set_screensaver, 1, true}, | ||||
|     {0x09, set_reset, 1, true},         {0x0a, set_sendcycle, 1, true}, | ||||
|     {0x0b, set_wifichancycle, 1, true}, {0x0c, set_blescantime, 1, true}, | ||||
|     {0x0d, set_vendorfilter, 1, false}, {0x0e, set_blescan, 1, true}, | ||||
|     {0x0f, set_wifiant, 1, true},       {0x10, set_rgblum, 1, true}, | ||||
|     {0x11, set_monitor, 1, true},       {0x12, set_beacon, 7, false}, | ||||
|     {0x13, set_sensor, 2, true},        {0x80, get_config, 0, false}, | ||||
|     {0x81, get_status, 0, false},       {0x84, get_gps, 0, false}, | ||||
|     {0x85, get_bme, 0, false},          {0x86, get_time, 0, false}, | ||||
| cmd_t table[] = {{0x01, set_rssi, 1, true}, | ||||
|                  {0x02, set_countmode, 1, true}, | ||||
|                  {0x03, set_gps, 1, true}, | ||||
|                  {0x04, set_display, 1, true}, | ||||
|                  {0x05, set_lorasf, 1, true}, | ||||
|                  {0x06, set_lorapower, 1, true}, | ||||
|                  {0x07, set_loraadr, 1, true}, | ||||
|                  {0x08, set_screensaver, 1, true}, | ||||
|                  {0x09, set_reset, 1, true}, | ||||
|                  {0x0a, set_sendcycle, 1, true}, | ||||
|                  {0x0b, set_wifichancycle, 1, true}, | ||||
|                  {0x0c, set_blescantime, 1, true}, | ||||
|                  {0x0d, set_vendorfilter, 1, false}, | ||||
|                  {0x0e, set_blescan, 1, true}, | ||||
|                  {0x0f, set_wifiant, 1, true}, | ||||
|                  {0x10, set_rgblum, 1, true}, | ||||
|                  {0x11, set_monitor, 1, true}, | ||||
|                  {0x12, set_beacon, 7, false}, | ||||
|                  {0x13, set_sensor, 2, true}, | ||||
|                  {0x80, get_config, 0, false}, | ||||
|                  {0x81, get_status, 0, false}, | ||||
|                  {0x84, get_gps, 0, false}, | ||||
|                  {0x85, get_bme, 0, false}, | ||||
|                  {0x86, get_time, 0, false} | ||||
| #ifdef DBTIMESYNC | ||||
|                  , | ||||
|                  {TIME_ANS_OPCODE, recv_DBtime_ans, 0, false}, | ||||
|                  {TIME_SYNC_OPCODE, force_DBtime_sync, 0, false} | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| const uint8_t cmdtablesize = | ||||
|  | ||||
| @ -35,8 +35,11 @@ time_t timeProvider(void) { | ||||
|   } | ||||
| #endif | ||||
| 
 | ||||
| // kick off asychronous DB timesync if we have
 | ||||
| #ifdef DBTIMESYNC | ||||
|   send_DBtime_req(); | ||||
| // kick off asychronous lora sync if we have
 | ||||
| #if defined HAS_LORA && defined TIME_SYNC_LORA | ||||
| #elif defined HAS_LORA && defined TIME_SYNC_LORA | ||||
|   LMIC_requestNetworkTime(user_request_network_time_callback, &userUTCTime); | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user