mirror of
https://github.com/esphome/esphome.git
synced 2026-09-01 18:46:02 +00:00
Merge branch 'voice-assistant-timer-vector' into integration
This commit is contained in:
@@ -861,35 +861,43 @@ void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) {
|
||||
}
|
||||
|
||||
void VoiceAssistant::on_timer_event(const api::VoiceAssistantTimerEventResponse &msg) {
|
||||
Timer timer = {
|
||||
.id = msg.timer_id,
|
||||
.name = msg.name,
|
||||
.total_seconds = msg.total_seconds,
|
||||
.seconds_left = msg.seconds_left,
|
||||
.is_active = msg.is_active,
|
||||
};
|
||||
this->timers_[timer.id] = timer;
|
||||
// Find existing timer or add a new one
|
||||
auto it = this->timers_.begin();
|
||||
for (; it != this->timers_.end(); ++it) {
|
||||
if (it->id == msg.timer_id)
|
||||
break;
|
||||
}
|
||||
if (it == this->timers_.end()) {
|
||||
this->timers_.push_back({});
|
||||
it = this->timers_.end() - 1;
|
||||
}
|
||||
it->id = msg.timer_id;
|
||||
it->name = msg.name;
|
||||
it->total_seconds = msg.total_seconds;
|
||||
it->seconds_left = msg.seconds_left;
|
||||
it->is_active = msg.is_active;
|
||||
|
||||
char timer_buf[Timer::TO_STR_BUFFER_SIZE];
|
||||
ESP_LOGD(TAG,
|
||||
"Timer Event\n"
|
||||
" Type: %" PRId32 "\n"
|
||||
" %s",
|
||||
msg.event_type, timer.to_str(timer_buf));
|
||||
msg.event_type, it->to_str(timer_buf));
|
||||
|
||||
switch (msg.event_type) {
|
||||
case api::enums::VOICE_ASSISTANT_TIMER_STARTED:
|
||||
this->timer_started_trigger_.trigger(timer);
|
||||
this->timer_started_trigger_.trigger(*it);
|
||||
break;
|
||||
case api::enums::VOICE_ASSISTANT_TIMER_UPDATED:
|
||||
this->timer_updated_trigger_.trigger(timer);
|
||||
this->timer_updated_trigger_.trigger(*it);
|
||||
break;
|
||||
case api::enums::VOICE_ASSISTANT_TIMER_CANCELLED:
|
||||
this->timer_cancelled_trigger_.trigger(timer);
|
||||
this->timers_.erase(timer.id);
|
||||
this->timer_cancelled_trigger_.trigger(*it);
|
||||
this->timers_.erase(it);
|
||||
break;
|
||||
case api::enums::VOICE_ASSISTANT_TIMER_FINISHED:
|
||||
this->timer_finished_trigger_.trigger(timer);
|
||||
this->timers_.erase(timer.id);
|
||||
this->timer_finished_trigger_.trigger(*it);
|
||||
this->timers_.erase(it);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -903,16 +911,12 @@ void VoiceAssistant::on_timer_event(const api::VoiceAssistantTimerEventResponse
|
||||
}
|
||||
|
||||
void VoiceAssistant::timer_tick_() {
|
||||
std::vector<Timer> res;
|
||||
res.reserve(this->timers_.size());
|
||||
for (auto &pair : this->timers_) {
|
||||
auto &timer = pair.second;
|
||||
for (auto &timer : this->timers_) {
|
||||
if (timer.is_active && timer.seconds_left > 0) {
|
||||
timer.seconds_left--;
|
||||
}
|
||||
res.push_back(timer);
|
||||
}
|
||||
this->timer_tick_trigger_.trigger(res);
|
||||
this->timer_tick_trigger_.trigger(this->timers_);
|
||||
}
|
||||
|
||||
void VoiceAssistant::on_announce(const api::VoiceAssistantAnnounceRequest &msg) {
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "esphome/components/socket/socket.h"
|
||||
|
||||
#include <span>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace esphome {
|
||||
@@ -228,7 +227,7 @@ class VoiceAssistant : public Component {
|
||||
Trigger<Timer> *get_timer_finished_trigger() { return &this->timer_finished_trigger_; }
|
||||
Trigger<std::vector<Timer>> *get_timer_tick_trigger() { return &this->timer_tick_trigger_; }
|
||||
void set_has_timers(bool has_timers) { this->has_timers_ = has_timers; }
|
||||
const std::unordered_map<std::string, Timer> &get_timers() const { return this->timers_; }
|
||||
const std::vector<Timer> &get_timers() const { return this->timers_; }
|
||||
|
||||
protected:
|
||||
bool allocate_buffers_();
|
||||
@@ -267,7 +266,7 @@ class VoiceAssistant : public Component {
|
||||
|
||||
api::APIConnection *api_client_{nullptr};
|
||||
|
||||
std::unordered_map<std::string, Timer> timers_;
|
||||
std::vector<Timer> timers_;
|
||||
void timer_tick_();
|
||||
Trigger<Timer> timer_started_trigger_;
|
||||
Trigger<Timer> timer_finished_trigger_;
|
||||
|
||||
Reference in New Issue
Block a user