* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-20 15:14:50
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-10-17 10:18:24
+ * @LastEditTime: 2024-10-17 15:19:15
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
*/
#include "aivoice/include/AiVoiceModel.h"
}
static void ai_start_screen60s_timer_callback(int data)
{
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(ai_start_screen60s_timer_callbackProc, data));
+ // GraphicService::GetInstance()->PostGraphicEvent(std::bind(ai_start_screen60s_timer_callbackProc, data));
+ ai_start_screen60s_timer_callbackProc(data);
}
void AiVoiceModel::ai_start_screen60s_timer(uint32_t interval)
{
}
void AiVoiceModel::reset_ai_screen60s_timer_time()
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reset_ai_screen60s_timer_time");
SCREEN_60S_TIME = 60;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reset_ai_screen60s_timer_time %d",SCREEN_60S_TIME);
if (nullptr == g_screen60s_timer)
{
ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 重新常亮屏
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-20 15:11:17
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-10-16 18:29:25
+ * @LastEditTime: 2024-10-18 10:58:29
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
*/
#include "AppViewIDs.h"
#include "gfx_utils/mem_check.h"
#include "bleService.h"
+#include "player/include/PlayersModel.h"
namespace OHOS
{
+#define BLE_CONNECT_INTERVAL_HIGH_AI 10
// 当前Presenter属性实例化的内存指针
static AiVoicePresenter *g_pAiVoicePresenter = nullptr;
// 开启一个60s取消长亮屏timer
model->ai_start_screen60s_timer();
- uapi_ble_connect_param_update(10);
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH_AI);
}
// 页面已经展示后的调用逻辑
model->stop_listening_timer();
model->stop_ai_isready_timer();
- uapi_ble_connect_param_update(50);
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
}
/*调转到返回结果界面*/
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::ChangeToAIVoiceListeningView");
if (view_->GetAiVoiceScrollView(AIVOICE_AIMODE_CONNECTING) != nullptr && view_->GetAiVoiceScrollView(AIVOICE_AIMODE_CONNECTING)->IsVisible())
{
- model->stop_ai_isready_timer();// 停止定时器
- if (val) /*如果查询的AI模型可用跳转到聆听中界面*/
+ model->stop_ai_isready_timer(); // 停止定时器
+ if (val) /*如果查询的AI模型可用跳转到聆听中界面*/
{
ChangeViewAndLogicOperator(AIVOICE_AIMODE_CONNECTING, AIVOICE_LISTENING_VIEWID);
}
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::index = %d", index);
model->SetSelectAiModel(index);
view_->ChangeAiModelAndUpdateComponentsStatus();
- model->reset_ai_screen60s_timer_time();//重置60s取消常亮屏timer
+ model->reset_ai_screen60s_timer_time(); // 重置60s取消常亮屏timer
return;
}
return false;
}
+ /* ------------------------ 进行界面切换的时候重置60s取消常亮屏timer ------------------------ */
+ model->reset_ai_screen60s_timer_time();
+ /* -------------------------------------------------------------------------- */
view_->ChangeView(hideView, showView); // 默认先进行视图切换
switch (hideView)
}
else if (showView == AIVOICE_AIMODE_CONNECTING)
{
- model->start_ai_isready_timer();/*开启一个查询AI模型是否连接成功定时器*/
+ model->start_ai_isready_timer(); /*开启一个查询AI模型是否连接成功定时器*/
}
break;
}
else if (viewId == AIVOICE_START_CHAT_BUTTON_VIEW_ID) // 如果点击的是开始对话按钮
{
+ PlayersModel::GetInstance()->HandPausePhoneMusci(); // 暂停手机音乐
/*
* 进入对话流程:
* 1.当手表4G网络正常+与app连接正常 -> 通过4G调用大模型
auto it = viewIdMap.find(viewId);
if (it != viewIdMap.end())
{
- if(it->first == AIVOICERETURNRESULTTEXT_CONTINUECHAT_BUTTON_VIEW_ID) //点击继续对话按钮要发取消当前对话指令,避免AI回应中途按继续对话按钮没有取消上一次对话问题
+ if (it->first == AIVOICERETURNRESULTTEXT_CONTINUECHAT_BUTTON_VIEW_ID) // 点击继续对话按钮要发取消当前对话指令,避免AI回应中途按继续对话按钮没有取消上一次对话问题
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CancelCurAIChat");
+ PlayersModel::GetInstance()->HandPausePhoneMusci(); // 暂停手机音乐
AiVoiceModel::GetInstance().CancelCurAIChat();
}
ChangeViewAndLogicOperator(it->second.first, it->second.second);
return false;
}
- model->reset_ai_screen60s_timer_time();//重置60s取消常亮屏timer
+ model->reset_ai_screen60s_timer_time(); // 重置60s取消常亮屏timer
if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) /*左滑*/
{
\r
HandleAlarmOnTime(&curTime);\r
HandleSleepReminder(&curTime);\r
+ HandleMusicUpdate();\r
\r
//以下弹窗被控制\r
if (HandleCanShowDialog()) {\r
\r
HandleDrinkReminder(&curTime); \r
HandleHeartRateDetection(&curTime); \r
- HandleMusicUpdate();\r
}\r
\r
//判断是否绑定\r
if (curviewid != VIEW_MAIN && OHOS::PlayersView::GetInstance()) { // 当前不在主界面且音乐界面不为空 \r
OHOS::UICheckBox::UICheckBoxState state = OHOS::PlayersView::GetInstance()->GetPlayerButtonState(); \r
if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) { \r
- SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0); \r
+ SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0);//音乐进度条更新 \r
} \r
} else if (OHOS::RecordingPlayerView::GetInstance()) { \r
OHOS::UICheckBox::UICheckBoxState state = OHOS::RecordingPlayerView::GetInstance()->GetPlayerButtonState(); \r
if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) { \r
- SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0); \r
+ SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0);//录音进度条更新 \r
} \r
}\r
}\r
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-08-05 15:20:03
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-28 14:58:16
+ * @LastEditTime: 2024-10-18 10:55:54
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
*/
void get_avrcp_ct_get_element_attributes(void);
void set_player_state(bool value);
bool get_player_state();
+ bool get_a2dp_sink_connect_state(void);
+ void HandPausePhoneMusci(void);
+ void HandPlayPhoneMusci(void);
// /* -------------------------------------------------------------------------- */
std::unordered_map<uint16_t, std::pair<std::string,std::string>> &getIdToMusicNameMap(void);
std::string getRealMusicNameById(int id);
#include "MainViewSample.h"
#include "settings/include/SettingModel.h"
#include "bluetooth/include/BluetoothHeadsetEvent.h"
+#include <bts_a2dp_sink.h>
namespace OHOS {
static constexpr int VOLUME_MAXIMUM = 100;
return false;
}
+ // 获取手机音乐播放状态
+ bool PlayersModel::get_a2dp_sink_connect_state(void)
+ {
+ bd_addr_t active_bd_addr = a2dp_snk_get_active_device();
+ int state = a2dp_snk_get_playing_state(&active_bd_addr);
+ if (state == A2DP_IS_PLAYING) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "A2DP_IS_PLAYING");
+ return true;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "A2DP_NOT_PLAYING");
+ return false;
+ }
+
+
+ //暂停播放手机音乐
+ void PlayersModel::HandPausePhoneMusci(void)
+ {
+ if (get_avrcp_ct_or_tg_is_connected() && get_a2dp_sink_connect_state())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PAUSE");
+ set_phone_music_play_state(AVRCP_KEY_PAUSE); // 控制手机音乐暂停
+ }
+ }
+
+ //播放手机音乐
+ void PlayersModel::HandPlayPhoneMusci(void)
+ {
+ if (get_avrcp_ct_or_tg_is_connected() && get_a2dp_sink_connect_state())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AVRCP_KEY_PLAY");
+ set_phone_music_play_state(AVRCP_KEY_PLAY); // 控制手机音乐暂停
+ }
+ }
//用来控制手机音乐的播放,暂停,下一首,上一首音乐
void PlayersModel::set_phone_music_play_state(avrcp_key_operation_t notify)
{
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-03-25 17:33:47
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-10-10 11:50:28
+ * @LastEditTime: 2024-10-18 18:02:00
* @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/findwatch_notification.cpp
* @details:实现查找手表的功能一般需要手表和智能手机之间的配合,通常是通过手机上的应用(App)或其他设备发送指令给手表,触发手表的查找功能。
* 以下是基本的实现步骤:
void FindWatchViewEventListener::SetFindWatchNotifyFlag(bool flag)
{
FindWatchNotifyFlag = flag;
- // if(FindWatchNotifyFlag)
- // {
- // FindWatch_StartTimer();
- // }
- // else
- // {
- // FindWatch_StopTimer();
- // }
}
// 获取查找手表通知状态
return FindWatchNotifyFlag;
}
+ // 震动
void FindWatchViewEventListener::SetVibration(void)
{
- // if(true == ConfigModel::GetInstance()->GetDnotdisturb() || (uapi_sleep_mode_flag_get()))
- // {
- // return;
- // }
-
- if(nullptr != FindWatchGroupView)
+ if (nullptr != FindWatchGroupView)
{
ui_api_vibrate_once_func();
}
}
+ // 闪烁屏幕
void FindWatchViewEventListener::SetLCDFlicker(bool state)
{
- if(nullptr != FindWatchGroupView)
+ if (nullptr != FindWatchGroupView)
{
FindWatchGroupView->SetStyle(STYLE_BACKGROUND_COLOR, state ? 0xff000000 : 0xffffffff);
FindWatchGroupView->Invalidate();
}
}
+ /*设置屏幕亮度100%*/
void FindWatchViewEventListener::SetScreenBrightness(void)
{
const power_display_svr_api_t *display_api = power_display_svr_get_api();
if (display_api)
{
int brightnessValue;
- if(uapi_dev_runtime_get_saveele_status()) //如果是省电模式状态下退出要把亮度设置为最低
+ if (uapi_dev_runtime_get_saveele_status()) // 如果是省电模式状态下退出要把亮度设置为最低
{
- brightnessValue = MIN_BRIGHTNESS;//恢复到最低亮度
+ brightnessValue = MIN_BRIGHTNESS; // 恢复到最低亮度
}
else
{
- brightnessValue= ConfigModel::GetInstance()->GetBrightness();
+ brightnessValue = ConfigModel::GetInstance()->GetBrightness();
}
if (display_api->set_brightness(brightnessValue) != ERRCODE_SUCC)
{
{
// 本地播放文件路径和状态
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RingPlayerInit start!,%s", path);
- // std::string strSrcMusic("/music/ring");
- // std::string tempStr("/");
- // std::string strName = RingMusicName;
- // uri = strSrcMusic + tempStr + strName;
uri = path;
// 创建 AM
playerCtr = std::make_shared<Player>();
- if (playerCtr.get() == nullptr)
+ if (playerCtr == nullptr || playerCtr.get() == nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr new fail");
return OHOS_FAILURE;
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindWatchRing Player url:%s", uri.c_str());
playerCtr->SetSource(*source);
/* --------------------------------- 4.配置播放器 -------------------------------- */
- playerCtr->SetAudioStreamType(AUDIO_STREAM_MUSIC); // 设置播放器的音频流类型为闹钟音乐。
- playerCtr->Prepare(); // 准备播放器对象以播放音频。
+ playerCtr->SetAudioStreamType(AUDIO_STREAM_NOTIFICATION_SYSTEM); // 设置播放器的音频流类型,支持混音
+ playerCtr->Prepare(); // 准备播放器对象以播放音频。
/* -------------------------------- 5.请求音频焦点 -------------------------------- */
AudioManager &amIntance = AudioManager::GetInstance();
sessionId = amIntance.MakeSessionId();
return OHOS_FAILURE;
}
playerInterruptListener->SetOwner(playerCtr);
- interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};
+ interrupt = {AUDIO_STREAM_NOTIFICATION_SYSTEM, sessionId, playerInterruptListener};
// 激活音频中断 5s超时
if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED)
{
playerCtr->SetAudioSessionId(sessionId);
// 播放
playerCtr->Play();
+ playerCtr->EnableSingleLooping(true); // 设置是否循环播放
return OHOS_SUCCESS;
}
/*
{
path_ = path;
ScreenTurnOn(-1); // 亮屏操作
-
- // if(true == ConfigModel::GetInstance()->GetDnotdisturb() || (uapi_sleep_mode_flag_get()))
- // {
- // return;
- // }
-
// 将"开启查找手表铃声"任务发布到异步线程
GraphicService::GetInstance()->PostGraphicEvent(
std::bind(&FindWatchViewEventListener::FindWatchRingPlayStart, &FindWatchViewEventListener::GetInstance(), path_));
}
// 声明定时器变量
- static osTimerId_t g_timer = NULL;
+ static osTimerId_t g_timer = nullptr;
static bool findwatch_time = true;
/*定时器到期时的处理*/
static void FindWatch_TimerCallbackProc(int data)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindWatchViewEventListener::FindWatch_StartTimer");
/* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
- if (g_timer != NULL)
+ if (g_timer != nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " Timer already exists!!");
return;
}
/* --------------------------------- 2.创建定时器 -------------------------------- */
- g_timer = osTimerNew((osTimerFunc_t)FindWatch_TimerCallback, osTimerPeriodic, NULL, NULL);
+ g_timer = osTimerNew((osTimerFunc_t)FindWatch_TimerCallback, osTimerPeriodic, nullptr, nullptr);
// 检查定时器创建是否成功
- if (g_timer == NULL)
+ if (g_timer == nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
return;
/* --------------------------------- 4.启动定时器 -------------------------------- */
osStatus_t ret = osTimerStart(g_timer, tick);
- /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 NULL -------------------- */
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */
if (ret != osOK)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
- if (g_timer != NULL)
+ if (g_timer != nullptr)
{
ret = osTimerDelete(g_timer);
}
- g_timer = NULL;
+ g_timer = nullptr;
return;
}
void FindWatchViewEventListener::FindWatch_StopTimer(void)
{
// 检查定时器是否存在
- if (g_timer != NULL)
+ if (g_timer != nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindWatchViewEventListener::FindWatch_StopTimer");
osTimerStop(g_timer);
- // 删除定时器并置为 NULL
+ // 删除定时器并置为 nullptr
osStatus_t ret = osTimerDelete(g_timer);
if (ret != osOK)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
}
- g_timer = NULL;
+ g_timer = nullptr;
}
}
FindWatchViewEventListener::GetInstance().FindWatch_StartTimer(700);
FindWatchViewEventListener::GetInstance().SetScreenBrightness();
-
+
NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeFindWatchView);
return FindWatchGroupView;
}
void FindWatchRingPlayerCallbackImpl::OnPlaybackComplete(void)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnPlaybackComplete");
- FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
- const char *path = FindWatchViewEventListener::GetInstance().GetPath();
- FindWatchViewEventListener::GetInstance().PopInterPlayMusic((path != nullptr) ? path : nullptr);
+ // FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
+ // const char *path = FindWatchViewEventListener::GetInstance().GetPath();
+ // FindWatchViewEventListener::GetInstance().PopInterPlayMusic((path != nullptr) ? path : nullptr);
}
void FindWatchRingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode)