GPS Timepulse handling by semaphore
This commit is contained in:
		
							parent
							
								
									5c7e4ab9e5
								
							
						
					
					
						commit
						1393e47052
					
				@ -101,7 +101,7 @@ extern uint8_t volatile channel;              // wifi channel rotation counter
 | 
			
		||||
extern uint16_t volatile macs_total, macs_wifi, macs_ble,
 | 
			
		||||
    batt_voltage; // display values
 | 
			
		||||
extern hw_timer_t *sendCycle, *displaytimer;
 | 
			
		||||
extern SemaphoreHandle_t I2Caccess;
 | 
			
		||||
extern SemaphoreHandle_t I2Caccess, TimePulse;
 | 
			
		||||
extern bool volatile BitsPending;
 | 
			
		||||
 | 
			
		||||
extern std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs;
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@ void doHousekeeping() {
 | 
			
		||||
  if ((millis() >= nextRTCTimeSync) && (timeStatus() == timeSet)) {
 | 
			
		||||
    nextRTCTimeSync = millis() + TIME_WRITE_INTERVAL_RTC *
 | 
			
		||||
                                     60000; // set up next time sync period
 | 
			
		||||
    if (!set_rtctime(now()))                // epoch time
 | 
			
		||||
    if (!set_rtctime(now()))    // epoch time
 | 
			
		||||
      ESP_LOGE(TAG, "RTC set time failure");
 | 
			
		||||
    else
 | 
			
		||||
      ESP_LOGI(TAG, "RTC time updated");
 | 
			
		||||
 | 
			
		||||
@ -90,16 +90,26 @@ time_t tmConvert_t(uint16_t YYYY, uint8_t MM, uint8_t DD, uint8_t hh,
 | 
			
		||||
time_t get_gpstime(void) {
 | 
			
		||||
  // never call now() in this function, this would break this function
 | 
			
		||||
  // to use as SyncProvider due to recursive call to now()
 | 
			
		||||
  time_t t = 0;
 | 
			
		||||
 | 
			
		||||
  time_t t;
 | 
			
		||||
  if ((gps.time.age() < 1500) && (gps.time.isValid())) {
 | 
			
		||||
    t = 1 + tmConvert_t(gps.date.year(), gps.date.month(), gps.date.day(),
 | 
			
		||||
                    gps.time.hour(), gps.time.minute(), gps.time.second());
 | 
			
		||||
    t = tmConvert_t(gps.date.year(), gps.date.month(), gps.date.day(),
 | 
			
		||||
                        gps.time.hour(), gps.time.minute(), gps.time.second());
 | 
			
		||||
    ESP_LOGD(TAG, "GPS time: %4d/%02d/%02d %02d:%02d:%02d", year(t), month(t),
 | 
			
		||||
             day(t), hour(t), minute(t), second(t));
 | 
			
		||||
  } else {
 | 
			
		||||
    ESP_LOGW(TAG, "GPS has no confident time");
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
  return t;
 | 
			
		||||
 | 
			
		||||
  // sync on top of next second bv timepulse
 | 
			
		||||
  if (xSemaphoreTake(TimePulse, pdMS_TO_TICKS(1000)) == pdTRUE)
 | 
			
		||||
    return t;
 | 
			
		||||
  else {
 | 
			
		||||
    ESP_LOGW(TAG, "No GPS timepulse, thus time can't be synced by GPS");
 | 
			
		||||
    return 0;
 | 
			
		||||
  } // failure
 | 
			
		||||
 | 
			
		||||
} // get_gpstime()
 | 
			
		||||
 | 
			
		||||
// GPS serial feed FreeRTos Task
 | 
			
		||||
 | 
			
		||||
@ -73,7 +73,7 @@ hw_timer_t *displaytimer = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TaskHandle_t irqHandlerTask;
 | 
			
		||||
SemaphoreHandle_t I2Caccess;
 | 
			
		||||
SemaphoreHandle_t I2Caccess, TimePulse;
 | 
			
		||||
 | 
			
		||||
// container holding unique MAC address hashes with Memory Alloctor using PSRAM,
 | 
			
		||||
// if present
 | 
			
		||||
@ -99,7 +99,12 @@ void setup() {
 | 
			
		||||
 | 
			
		||||
  I2Caccess = xSemaphoreCreateMutex(); // for access management of i2c bus
 | 
			
		||||
  if (I2Caccess)
 | 
			
		||||
    xSemaphoreGive((I2Caccess)); // Flag the i2c bus available for use
 | 
			
		||||
    xSemaphoreGive(I2Caccess); // Flag the i2c bus available for use
 | 
			
		||||
 | 
			
		||||
  TimePulse = xSemaphoreCreateMutex(); // for time pulse flip
 | 
			
		||||
  if (TimePulse)
 | 
			
		||||
    xSemaphoreTake(TimePulse, (TickType_t)10);
 | 
			
		||||
    // Block TimePulse since we have no pulse yet
 | 
			
		||||
 | 
			
		||||
    // disable brownout detection
 | 
			
		||||
#ifdef DISABLE_BROWNOUT
 | 
			
		||||
 | 
			
		||||
@ -191,5 +191,8 @@ time_t sync_clock(time_t t) {
 | 
			
		||||
// timer
 | 
			
		||||
void IRAM_ATTR CLOCKIRQ() {
 | 
			
		||||
  xTaskNotifyFromISR(ClockTask, xTaskGetTickCountFromISR(), eSetBits, NULL);
 | 
			
		||||
#ifdef GPS_INT
 | 
			
		||||
  xSemaphoreGiveFromISR(TimePulse, NULL);
 | 
			
		||||
#endif
 | 
			
		||||
  portYIELD_FROM_ISR();
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user