@@ -143,6 +143,36 @@ bool Agent::del()
143143 return ret;
144144}
145145
146+ bool Agent::pause ()
147+ {
148+ ESP_UTILS_LOG_TRACE_GUARD_WITH_THIS ();
149+
150+ if (_flags.is_paused ) {
151+ ESP_UTILS_LOGW (" Already paused" );
152+ return true ;
153+ }
154+
155+ coze_chat_app_pause ();
156+ _flags.is_paused = true ;
157+
158+ return true ;
159+ }
160+
161+ bool Agent::resume ()
162+ {
163+ ESP_UTILS_LOG_TRACE_GUARD_WITH_THIS ();
164+
165+ if (!_flags.is_paused ) {
166+ ESP_UTILS_LOGW (" Not paused" );
167+ return true ;
168+ }
169+
170+ coze_chat_app_resume ();
171+ _flags.is_paused = false ;
172+
173+ return true ;
174+ }
175+
146176bool Agent::setCurrentRobotIndex (int index)
147177{
148178 ESP_UTILS_LOG_TRACE_GUARD_WITH_THIS ();
@@ -189,7 +219,7 @@ bool Agent::sendChatEvent(const ChatEvent &event, bool clear_queue, int wait_fin
189219 ESP_UTILS_LOG_TRACE_GUARD_WITH_THIS ();
190220
191221 ESP_UTILS_LOGD (
192- " Param: event(%d ), clear_queue(%d), wait_finish_timeout_ms(%d)" , static_cast < int > (event),
222+ " Param: event(%s ), clear_queue(%d), wait_finish_timeout_ms(%d)" , chatEventToString (event). c_str ( ),
193223 clear_queue, wait_finish_timeout_ms
194224 );
195225 ESP_UTILS_CHECK_FALSE_RETURN (_flags.is_begun , false , " Not begun" );
@@ -210,7 +240,7 @@ bool Agent::sendChatEvent(const ChatEvent &event, bool clear_queue, int wait_fin
210240 while (!_chat_event_queue.empty ()) {
211241 auto event_wrapper_tmp = _chat_event_queue.front ();
212242 _chat_event_queue.pop ();
213- ESP_UTILS_LOGD (" Pop event: %d " , static_cast < int > (event_wrapper_tmp.event ));
243+ ESP_UTILS_LOGD (" Pop event: %s " , chatEventToString (event_wrapper_tmp.event ). c_str ( ));
214244 }
215245 }
216246 _chat_event_queue.push (event_wrapper);
@@ -223,7 +253,8 @@ bool Agent::sendChatEvent(const ChatEvent &event, bool clear_queue, int wait_fin
223253 }
224254
225255 ESP_UTILS_LOGD (
226- " Wait chat event finish: %d, timeout_ms(%d)" , static_cast <int >(event_wrapper.event ), wait_finish_timeout_ms
256+ " Wait chat event finish: %s, timeout_ms(%d)" , chatEventToString (event_wrapper.event ).c_str (),
257+ wait_finish_timeout_ms
227258 );
228259 auto future = event_wrapper.promise ->get_future ();
229260 ESP_UTILS_CHECK_FALSE_RETURN (
@@ -257,6 +288,56 @@ void Agent::releaseInstance()
257288 }
258289}
259290
291+ std::string Agent::chatStateToString (const ChatState &state)
292+ {
293+ switch (state) {
294+ case ChatState::ChatStateDeinit:
295+ return " Deinit" ;
296+ case ChatState::ChatStateIniting:
297+ return " Initing" ;
298+ case ChatState::ChatStateInited:
299+ return " Inited" ;
300+ case ChatState::ChatStateStopping:
301+ return " Stopping" ;
302+ case ChatState::ChatStateStopped:
303+ return " Stopped" ;
304+ case ChatState::ChatStateStarting:
305+ return " Starting" ;
306+ case ChatState::ChatStateStarted:
307+ return " Started" ;
308+ case ChatState::ChatStateSleeping:
309+ return " Sleeping" ;
310+ case ChatState::ChatStateSlept:
311+ return " Slept" ;
312+ case ChatState::ChatStateWaking:
313+ return " Waking" ;
314+ case ChatState::ChatStateWaked:
315+ return " Waked" ;
316+ default :
317+ return " Unknown" ;
318+ }
319+ }
320+
321+ std::string Agent::chatEventToString (const ChatEvent &event)
322+ {
323+ switch (event) {
324+ case ChatEvent::Deinit:
325+ return " Deinit" ;
326+ case ChatEvent::Init:
327+ return " Init" ;
328+ case ChatEvent::Stop:
329+ return " Stop" ;
330+ case ChatEvent::Start:
331+ return " Start" ;
332+ case ChatEvent::Sleep:
333+ return " Sleep" ;
334+ case ChatEvent::WakeUp:
335+ return " WakeUp" ;
336+ default :
337+ return " Unknown" ;
338+ }
339+ }
340+
260341bool Agent::isTimeSync ()
261342{
262343 time_t now;
@@ -271,22 +352,24 @@ bool Agent::processChatEvent(const ChatEvent &event)
271352{
272353 ESP_UTILS_LOG_TRACE_GUARD_WITH_THIS ();
273354
274- ESP_UTILS_LOGD (" Process chat event: %d " , static_cast < int > (event));
355+ ESP_UTILS_LOGD (" Process chat event: %s " , chatEventToString (event). c_str ( ));
275356 ESP_UTILS_LOGD (
276- " Current chat state(%d ), last chat event(%d )" , static_cast < int > (_chat_state),
277- static_cast < int > (_last_chat_event)
357+ " Current chat state(%s ), last chat event(%s )" , chatStateToString (_chat_state). c_str ( ),
358+ chatEventToString (_last_chat_event). c_str ( )
278359 );
279360
361+ if (event == _last_chat_event) {
362+ ESP_UTILS_LOGW (" Chat event already processed" );
363+ return true ;
364+ }
365+
280366 chat_event_process_start_signal (event, _last_chat_event);
281367
282368 switch (event) {
283369 case ChatEvent::Deinit:
284370 break ;
285371 case ChatEvent::Init: {
286- if (hasChatState (_ChatStateInit)) {
287- ESP_UTILS_LOGW (" Chat already initing or inited" );
288- return true ;
289- }
372+ ESP_UTILS_CHECK_FALSE_RETURN (isChatState (ChatStateDeinit), false , " Chat not deinit" );
290373
291374 {
292375 esp_utils::value_guard chat_state_guard (_chat_state);
@@ -315,19 +398,12 @@ bool Agent::processChatEvent(const ChatEvent &event)
315398 break ;
316399 }
317400 case ChatEvent::Stop: {
318- if (hasChatState (_ChatStateStop)) {
319- ESP_UTILS_LOGW (" Chat already stopping or stopped" );
320- return true ;
321- }
322- ESP_UTILS_CHECK_FALSE_RETURN (
323- hasChatState (_ChatStateStart), false , " Invalid chat state(%d)" , static_cast <int >(_chat_state)
324- );
401+ ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (ChatStateStarted), false , " Invalid chat state" );
325402
326403 {
327404 esp_utils::value_guard chat_state_guard (_chat_state);
328405 chat_state_guard.set (ChatStateStopping);
329406
330- coze_chat_app_pause ();
331407 ESP_UTILS_CHECK_FALSE_RETURN (coze_chat_app_stop () == ESP_OK, false , " Stop chat failed" );
332408
333409 chat_state_guard.set (ChatStateStopped);
@@ -336,13 +412,11 @@ bool Agent::processChatEvent(const ChatEvent &event)
336412 break ;
337413 }
338414 case ChatEvent::Start: {
339- if (hasChatState (_ChatStateStart )) {
340- ESP_UTILS_LOGW (" Chat already starting or started" );
415+ if (hasChatState (ChatStateStarted )) {
416+ ESP_UTILS_LOGW (" Chat already started" );
341417 return true ;
342418 }
343- ESP_UTILS_CHECK_FALSE_RETURN (
344- hasChatState (ChatStateInited), false , " Invalid chat state(%d)" , static_cast <int >(_chat_state)
345- );
419+ ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (ChatStateInited), false , " Invalid chat state" );
346420
347421 {
348422 esp_utils::value_guard chat_state_guard (_chat_state);
@@ -370,58 +444,38 @@ bool Agent::processChatEvent(const ChatEvent &event)
370444 chat_event_process_special_signal (ChatEventSpecialSignalType::StartMaxRetry);
371445 ESP_UTILS_CHECK_FALSE_RETURN (false , false , " Start chat failed after %d retries" , max_retries);
372446 }
373- coze_chat_app_resume ();
374- _flags.is_sleep = false ;
375- _flags.is_paused = false ;
376447
377448 chat_state_guard.set (ChatStateStarted);
378449 chat_state_guard.release ();
379450 }
380451 break ;
381452 }
382- case ChatEvent::Pause: {
383- if (_flags.is_paused ) {
384- ESP_UTILS_LOGW (" Chat already paused" );
385- return true ;
386- }
387- ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (_ChatStateStart), false , " Chat not started" );
388-
389- coze_chat_app_pause ();
390- _flags.is_paused = true ;
391- break ;
392- }
393- case ChatEvent::Resume: {
394- if (!_flags.is_paused ) {
395- ESP_UTILS_LOGW (" Chat not paused" );
396- return true ;
397- }
398- ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (_ChatStateStart), false , " Chat not started" );
399-
400- coze_chat_app_resume ();
401- _flags.is_paused = false ;
402- break ;
403- }
404453 case ChatEvent::Sleep: {
405- if (_flags.is_sleep ) {
406- ESP_UTILS_LOGW (" Chat already sleep" );
407- return true ;
408- }
409- ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (_ChatStateStart), false , " Chat not started" );
454+ ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (ChatStateStarted), false , " Chat not started" );
455+
456+ esp_utils::value_guard chat_state_guard (_chat_state);
457+ chat_state_guard.set (ChatStateSleeping);
410458
411- // Should be called before set chat state to sleep
412459 coze_chat_app_sleep ();
413- _flags.is_sleep = true ;
460+
461+ chat_state_guard.set (ChatStateSlept);
462+ chat_state_guard.release ();
414463 break ;
415464 }
416465 case ChatEvent::WakeUp: {
417- if (!_flags. is_sleep ) {
418- ESP_UTILS_LOGW (" Chat not sleep " );
466+ if (isChatState (ChatStateStarted) ) {
467+ ESP_UTILS_LOGW (" Chat already woke up " );
419468 return true ;
420469 }
421- ESP_UTILS_CHECK_FALSE_RETURN (hasChatState (_ChatStateStart), false , " Chat not started" );
470+ ESP_UTILS_CHECK_FALSE_RETURN (isChatState (ChatStateSlept), false , " Chat not slept" );
471+
472+ esp_utils::value_guard chat_state_guard (_chat_state);
473+ chat_state_guard.set (ChatStateWaking);
422474
423475 coze_chat_app_wakeup ();
424- _flags.is_sleep = false ;
476+
477+ chat_state_guard.set (ChatStateWaked);
478+ chat_state_guard.release ();
425479 break ;
426480 }
427481 default :
0 commit comments