diff --git a/esphome/components/gps/gps.cpp b/esphome/components/gps/gps.cpp index 0391a9a955..26371565f3 100644 --- a/esphome/components/gps/gps.cpp +++ b/esphome/components/gps/gps.cpp @@ -8,5 +8,41 @@ static const char *TAG = "gps"; TinyGPSPlus &GPSListener::get_tiny_gps() { return this->parent_->get_tiny_gps(); } +void GPS::loop() { + while (this->available() && !this->has_time_) { + if (this->tiny_gps_.encode(this->read())) { + if (tiny_gps_.location.isUpdated()) { + ESP_LOGD(TAG, "Location:"); + ESP_LOGD(TAG, " Lat: %f", tiny_gps_.location.lat()); + ESP_LOGD(TAG, " Lon: %f", tiny_gps_.location.lng()); + } + + if (tiny_gps_.speed.isUpdated()) { + ESP_LOGD(TAG, "Speed:"); + ESP_LOGD(TAG, " %f km/h", tiny_gps_.speed.kmph()); + } + if (tiny_gps_.course.isUpdated()) { + ESP_LOGD(TAG, "Course:"); + ESP_LOGD(TAG, " %f °", tiny_gps_.course.deg()); + } + if (tiny_gps_.altitude.isUpdated()) { + ESP_LOGD(TAG, "Altitude:"); + ESP_LOGD(TAG, " %f m", tiny_gps_.altitude.meters()); + } + if (tiny_gps_.satellites.isUpdated()) { + ESP_LOGD(TAG, "Satellites:"); + ESP_LOGD(TAG, " %d", tiny_gps_.satellites.value()); + } + if (tiny_gps_.satellites.isUpdated()) { + ESP_LOGD(TAG, "HDOP:"); + ESP_LOGD(TAG, " %.2f", tiny_gps_.hdop.hdop()); + } + + for (auto *listener : this->listeners_) + listener->on_update(this->tiny_gps_); + } + } +} + } // namespace gps } // namespace esphome diff --git a/esphome/components/gps/gps.h b/esphome/components/gps/gps.h index 7d845d1bed..84a9248bc6 100644 --- a/esphome/components/gps/gps.h +++ b/esphome/components/gps/gps.h @@ -27,14 +27,7 @@ class GPS : public Component, public uart::UARTDevice { this->listeners_.push_back(listener); } float get_setup_priority() const override { return setup_priority::HARDWARE; } - void loop() override { - while (this->available() && !this->has_time_) { - if (this->tiny_gps_.encode(this->read())) { - for (auto *listener : this->listeners_) - listener->on_update(this->tiny_gps_); - } - } - } + void loop() override; TinyGPSPlus &get_tiny_gps() { return this->tiny_gps_; } protected: diff --git a/esphome/components/gps/time/gps_time.cpp b/esphome/components/gps/time/gps_time.cpp index c6aa8adc67..468ad09bac 100644 --- a/esphome/components/gps/time/gps_time.cpp +++ b/esphome/components/gps/time/gps_time.cpp @@ -6,5 +6,29 @@ namespace gps { static const char *TAG = "gps.time"; +void GPSTime::from_tiny_gps_(TinyGPSPlus &tiny_gps) { + if (!tiny_gps.time.isValid() || !tiny_gps.date.isValid()) + return; + if (!tiny_gps.time.isUpdated() || !tiny_gps.date.isUpdated()) + return; + if (tiny_gps.date.year() < 2019) + return; + + time::ESPTime val{}; + val.year = tiny_gps.date.year(); + val.month = tiny_gps.date.month(); + val.day_of_month = tiny_gps.date.day(); + // Set these to valid value for recalc_timestamp_utc - it's not used for calculation + val.day_of_week = 1; + val.day_of_year = 1; + + val.hour = tiny_gps.time.hour(); + val.minute = tiny_gps.time.minute(); + val.second = tiny_gps.time.second(); + val.recalc_timestamp_utc(false); + this->synchronize_epoch_(val.timestamp); + this->has_time_ = true; +} + } // namespace gps } // namespace esphome diff --git a/esphome/components/gps/time/gps_time.h b/esphome/components/gps/time/gps_time.h index b09aee364f..f6462be3e0 100644 --- a/esphome/components/gps/time/gps_time.h +++ b/esphome/components/gps/time/gps_time.h @@ -18,20 +18,7 @@ class GPSTime : public time::RealTimeClock, public GPSListener { } protected: - void from_tiny_gps_(TinyGPSPlus &tiny_gps) { - if (!tiny_gps.time.isValid() || !tiny_gps.date.isValid()) - return; - time::ESPTime val{}; - val.year = tiny_gps.date.year(); - val.month = tiny_gps.date.month(); - val.day_of_month = tiny_gps.date.day(); - val.hour = tiny_gps.time.hour(); - val.minute = tiny_gps.time.minute(); - val.second = tiny_gps.time.second(); - val.recalc_timestamp_utc(false); - this->synchronize_epoch_(val.timestamp); - this->has_time_ = true; - } + void from_tiny_gps_(TinyGPSPlus &tiny_gps); bool has_time_{false}; }; diff --git a/esphome/components/time/__init__.py b/esphome/components/time/__init__.py index 2097be3a26..ca1ac375ba 100644 --- a/esphome/components/time/__init__.py +++ b/esphome/components/time/__init__.py @@ -115,8 +115,9 @@ def convert_tz(pytz_obj): _tz_dst_str(dst_begins_local), _tz_dst_str(dst_ends_local)) _LOGGER.info("Detected timezone '%s' with UTC offset %s and daylight savings time from " "%s to %s", - tzname_off, _tz_timedelta(utcoffset_off), dst_begins_local.strftime("%x %X"), - dst_ends_local.strftime("%x %X")) + tzname_off, _tz_timedelta(utcoffset_off), + dst_begins_local.strftime("%d %B %X"), + dst_ends_local.strftime("%d %B %X")) return tzbase + tzext diff --git a/esphome/components/time/real_time_clock.cpp b/esphome/components/time/real_time_clock.cpp index 96722229b1..cb66dc3ce6 100644 --- a/esphome/components/time/real_time_clock.cpp +++ b/esphome/components/time/real_time_clock.cpp @@ -84,12 +84,12 @@ template bool increment_time_value(T ¤t, uint16_t begin, uint1 static bool is_leap_year(uint32_t year) { return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0); } -static bool days_in_month(uint8_t month, uint16_t year) { +static uint8_t days_in_month(uint8_t month, uint16_t year) { static const uint8_t DAYS_IN_MONTH[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - uint8_t days_in_month = DAYS_IN_MONTH[month]; + uint8_t days = DAYS_IN_MONTH[month]; if (month == 2 && is_leap_year(year)) - days_in_month = 29; - return days_in_month; + return 29; + return days; } void ESPTime::increment_second() { @@ -127,13 +127,13 @@ void ESPTime::recalc_timestamp_utc(bool use_day_of_year) { return; } - for (uint16_t i = 1970; i < this->year; i++) + for (int i = 1970; i < this->year; i++) res += is_leap_year(i) ? 366 : 365; if (use_day_of_year) { res += this->day_of_year - 1; } else { - for (uint8_t i = 1; i < this->month; ++i) + for (int i = 1; i < this->month; i++) res += days_in_month(i, this->year); res += this->day_of_month - 1; diff --git a/esphome/components/uart/uart.cpp b/esphome/components/uart/uart.cpp index 5e0bc3277e..ea15af5053 100644 --- a/esphome/components/uart/uart.cpp +++ b/esphome/components/uart/uart.cpp @@ -291,12 +291,12 @@ void ICACHE_RAM_ATTR HOT ESP8266SoftwareSerial::write_byte(uint8_t data) { this->write_bit_(true, &wait, start); enable_interrupts(); } -void ESP8266SoftwareSerial::wait_(uint32_t *wait, const uint32_t &start) { +void ICACHE_RAM_ATTR ESP8266SoftwareSerial::wait_(uint32_t *wait, const uint32_t &start) { while (ESP.getCycleCount() - start < *wait) ; *wait += this->bit_time_; } -bool ESP8266SoftwareSerial::read_bit_(uint32_t *wait, const uint32_t &start) { +bool ICACHE_RAM_ATTR ESP8266SoftwareSerial::read_bit_(uint32_t *wait, const uint32_t &start) { this->wait_(wait, start); return this->rx_pin_->digital_read(); } diff --git a/esphome/components/uart/uart.h b/esphome/components/uart/uart.h index f642d4ee81..93caaf3006 100644 --- a/esphome/components/uart/uart.h +++ b/esphome/components/uart/uart.h @@ -24,9 +24,9 @@ class ESP8266SoftwareSerial { protected: static void gpio_intr(ESP8266SoftwareSerial *arg); - inline void wait_(uint32_t *wait, const uint32_t &start); - inline bool read_bit_(uint32_t *wait, const uint32_t &start); - inline void write_bit_(bool bit, uint32_t *wait, const uint32_t &start); + void wait_(uint32_t *wait, const uint32_t &start); + bool read_bit_(uint32_t *wait, const uint32_t &start); + void write_bit_(bool bit, uint32_t *wait, const uint32_t &start); uint32_t bit_time_{0}; uint8_t *rx_buffer_{nullptr};