${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceChatContentListAdapter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp
+ #Ai Models
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsModel.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsView.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsPresenter.cpp
+
#声音与震动
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationView.cpp
VIEW_RESPIRATORY_TRAINING, // 呼吸训练
VIEW_THEME_STYLE, // 主题样式
VIEW_AI_VOICE, // AI Voice(人工智能语音)
+ VIEW_AI_MODELS, // AI模型选择界面
VIEW_SET_DESKTOP, // 显示方式
VIEW_RECORD,
/* ----------------------------------------------------------------------------- */
void InitRespiratoryTrainingSlice(void);
void InitThemeStyleSlice(void);
void InitAiVoiceSlice(void);
+ void InitAiModelsSlice(void);
/* --------------------------------界面------------------------------------ */
void InitRotateSlice(void);
void InitBloodSlice(void);
#include "aivoice/include/AiVoicePresenter.h"
#include "aivoice/include/AiVoiceView.h"
+
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
/* -------------------------------------------------------------------------- */
#include "traing/include/TraingView.h"
#include "traing/include/TraingPresenter.h"
{VIEW_RESPIRATORY_TRAINING, &NativeLauncher::InitRespiratoryTrainingSlice}, // 呼吸训练界面
{VIEW_THEME_STYLE, &NativeLauncher::InitThemeStyleSlice}, // 主题样式界面
{VIEW_AI_VOICE, &NativeLauncher::InitAiVoiceSlice}, // Ai Voice(人工智能语音)
+ {VIEW_AI_MODELS, &NativeLauncher::InitAiModelsSlice}, // Ai Models(Ai模型选择界面)
// {VIEW_SECONDARY_FUNCTION, &NativeLauncher::InitSecondaryFunction},
// {VIEW_FAST_TRAINING, &NativeLauncher::InitFastTrainingSlice},
ScreenModels::GetInstance()->PreLoadAppimages();
// NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
// 注册按键事件
- RebootModel::GetInstance()->RegisterKeyEvents();
+ RebootModel::GetInstance()->RegisterAllKeyEvents();
// 开机检测充电状态
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_charge_stat is %d", get_charge_stat());
}
NativeAbility::GetInstance().AddSliceProxy(VIEW_AI_VOICE, AiVoice);
}
+
+ /*Ai模型选择界面*/
+ void NativeLauncher::InitAiModelsSlice(void)
+ {
+ SliceProxy *AiModels = new AbilitySliceProxy<AiModelsView, AiModelsPresenter>;
+ if (AiModels == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModels");
+ return;
+ }
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_AI_MODELS, AiModels);
+ }
/* -------------------------------------------------------------------------- */
void NativeLauncher::InitSetDesktopSlice(void)
{
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:31
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 21:20:02
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsModel.h
+ */
+
+#ifndef AI_MODELS_MODEL_H
+#define AI_MODELS_MODEL_H
+
+#include <iostream>
+#include "string"
+
+namespace OHOS
+{
+ class AiModelsModel
+ {
+ public:
+ static AiModelsModel &GetInstance(void);
+ int GetSelectAiModel(void);
+ void SetSelectAiModel(int index);
+ bool ChangeAiModel(void);
+ int GetAiModelTextId(void);
+ void SetAiModelTextId(int textId);
+
+ private:
+ AiModelsModel();
+ ~AiModelsModel();
+ AiModelsModel(const AiModelsModel &) = delete;
+ AiModelsModel &operator=(const AiModelsModel &) = delete;
+
+ int selectAiModel; // 选择的ai模型
+ int textId;
+ };
+}
+
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:10
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:21:57
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsPresenter.h
+ */
+
+#ifndef AI_MODELS_PRESENTER_H
+#define AI_MODELS_PRESENTER_H
+
+#include "Presenter.h"
+#include "View.h"
+#include "aimodels/include/AiModelsModel.h"
+
+namespace OHOS
+{
+ class AiModelsView;
+ class AiModelsModel;
+ class AiModelsPresenter : public Presenter<AiModelsView>,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener,
+ public RootView::OnKeyActListener
+ {
+ public:
+ AiModelsPresenter();
+ virtual ~AiModelsPresenter();
+ static AiModelsPresenter *GetInstance();
+
+ /*获取选择的ai模型*/
+ int16_t GetSelectAiModel(void);
+ /*单击func key切换ai模型*/
+ void ChangeAiModel(void);
+ void SetAiModelTextId(int16_t id);
+
+ void OnStart() override;
+ void OnResume() override;
+ void OnPause() override;
+ void OnStop() override;
+
+ private:
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnDrag(UIView &view, const DragEvent &event) override;
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+ AiModelsModel *model;
+ bool X_DRAG_FLAG{false};
+ };
+}
+
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:38:50
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:11:28
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsView.h
+ */
+
+#ifndef AI_MODELS_VIEW_H
+#define AI_MODELS_VIEW_H
+
+#include "BaseView.h"
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_button.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label_ext.h"
+#include "language/font/ui_resource_string.h"
+#include <map>
+namespace OHOS
+{
+#define AIMODELS_IMAGE_PATH "/user/res/AIVoice/aimodels"
+ typedef enum : uint8_t
+ {
+ AIMODES_DOUBAO = 0, /*豆包*/
+ AIMODES_WENXINYIYAN, /*wenxinyiyan*/
+ AIMODES_KIMI, /*kimi*/
+ AIMODES_CHATGPT, /*chatgpt*/
+ AIMODES_MAX_NUM,
+ } aimodels;
+
+ static constexpr char *AIMODES_DOUBAO_BUTTONVIEWID = "doubao_button";
+ static constexpr char *AIMODES_WENXINYIYAN_BUTTONVIEWID = "wenxinyiyan_button";
+ static constexpr char *AIMODES_KIMI_BUTTONVIEWID = "kimi_button";
+ static constexpr char *AIMODES_CHATGPT_BUTTONVIEWID = "chatgpt_button";
+
+ static constexpr char *AiModels_Bg = AIMODELS_IMAGE_PATH "/aimodels_bg.bin"; /*整个模型背景*/
+ static constexpr char *AiModels_title_Bg = AIMODELS_IMAGE_PATH "/aimodels_title_bg.bin"; /*标题背景*/
+ static constexpr char *AiModels_select = AIMODELS_IMAGE_PATH "/aimodels_select.bin"; /*模型选中状态*/
+ static constexpr char *AiModelsImagePath[AIMODES_MAX_NUM] = {
+ AIMODELS_IMAGE_PATH "/aimodels_doubao.bin", /*豆包*/
+ AIMODELS_IMAGE_PATH "/aimodels_wenxinyiyan.bin", /*文心一言*/
+ AIMODELS_IMAGE_PATH "/aimodels_kimi.bin", /*Kimi*/
+ AIMODELS_IMAGE_PATH "/aimode_lschatgpt_on.bin", /*ChatGPT*/
+ };
+
+ static constexpr char *AiModelsButtonViewId[AIMODES_MAX_NUM] = {
+ AIMODES_DOUBAO_BUTTONVIEWID, /*豆包*/
+ AIMODES_WENXINYIYAN_BUTTONVIEWID, /*文心一言*/
+ AIMODES_KIMI_BUTTONVIEWID, /*Kimi*/
+ AIMODES_CHATGPT_BUTTONVIEWID, /*ChatGPT*/
+ };
+
+ class AiModelsPresenter;
+ class AiModelsView : public View<AiModelsPresenter>
+ {
+ public:
+ struct LabelConfig
+ {
+ int16_t left;
+ int16_t top;
+ int16_t width;
+ int16_t height;
+ int16_t fontSize;
+ int16_t lineHeigh;
+ uint16_t textId;
+ uint8_t lineBreakMode;
+ };
+
+ struct ImageConfig
+ {
+ int16_t x;
+ int16_t y;
+ int16_t w;
+ int16_t h;
+ const char *src;
+ };
+
+ struct ButtonConfig
+ {
+ int16_t x;
+ int16_t y;
+ int16_t w;
+ int16_t h;
+ const char *viewId;
+ };
+
+ AiModelsView();
+ ~AiModelsView();
+ static AiModelsView *GetInstance(void);
+ void UpdateAiModelsSelectStateAndTitleId();
+
+ void OnStart() override;
+ void OnSetUpView() override;
+ void OnTearDownView() override;
+ void OnStop() override;
+
+ private:
+ UILabelExt *AiModelsViewLabelInit(const LabelConfig &labelconfig);
+ UIImageView *AiModelsViewImageViewInit(const ImageConfig &imageconfig);
+ UIButton *AiModelsViewButtonInit(const ButtonConfig &buttonconfig);
+ bool CreateAiModelsViewLabel(void);
+ bool CreateAiModelsViewImageView(void);
+ bool CreateAiModelsViewButton(void);
+ bool CreateAiModelsScrollView(void);
+ void CreateAiModelsView(void);
+ void ClearAll(void);
+
+ UIScrollView *AiModelsScrollView{nullptr};
+ UIImageView *AiModelsBackGroundImage{nullptr};
+ UIImageView *AiModelsTitleBackGroundImage{nullptr};
+ UILabelExt *AiModelsTitle{nullptr}; // au模型标题
+ UIButton *AiModelsButtons[AIMODES_MAX_NUM]{nullptr};
+ UIImageView *AiModelsImages[AIMODES_MAX_NUM]{nullptr};
+ static const int AimodelsTextId[AIMODES_MAX_NUM];
+ bool viewInitStatus{false};
+ };
+}
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 21:20:06
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsModel.cpp
+ */
+
+#include "aimodels/include/AiModelsModel.h"
+#include "aimodels/include/AiModelsPresenter.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+ AiModelsModel::AiModelsModel() {}
+
+ AiModelsModel::~AiModelsModel() {}
+
+ AiModelsModel &AiModelsModel::GetInstance()
+ {
+ static AiModelsModel instance;
+ return instance;
+ }
+
+ /*获取选择的ai模型*/
+ int AiModelsModel::GetSelectAiModel(void)
+ {
+ return selectAiModel;
+ }
+
+ // 设置选择的ai模型
+ void AiModelsModel::SetSelectAiModel(int index)
+ {
+ selectAiModel = index;
+ }
+
+ /*单击func key切换ai模型*/
+ bool AiModelsModel::ChangeAiModel(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsModel::ChangeAiModel");
+ AiModelsPresenter *aiModelsPresenter = AiModelsPresenter::GetInstance();
+ if (aiModelsPresenter == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsModel::ChangeAiModel - AiModelsPresenter instance is nullptr");
+ return false;
+ }
+ aiModelsPresenter->ChangeAiModel();
+ return true;
+ }
+
+ /*获取已选择的ai模型的textid*/
+ int AiModelsModel::GetAiModelTextId(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsModel::GetAiModelTextId - textId = %d", textId);
+ return textId;
+ }
+
+ void AiModelsModel::SetAiModelTextId(int id)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsModel::SetAiModelTextId - id = %d", id);
+ textId = id;
+ }
+}
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-20 15:11:17
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:22:18
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiModelsPresenter.cpp
+ */
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include <custom_utils.h>
+#include "UiConfig.h"
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
+
+namespace OHOS
+{
+
+ // 当前Presenter属性实例化的内存指针
+ static AiModelsPresenter *g_pAiModelsPresenter = nullptr;
+
+ AiModelsPresenter::AiModelsPresenter()
+ {
+ model = &AiModelsModel::GetInstance();
+ g_pAiModelsPresenter = this;
+ }
+
+ AiModelsPresenter::~AiModelsPresenter()
+ {
+ g_pAiModelsPresenter = nullptr;
+ }
+
+ AiModelsPresenter *AiModelsPresenter::GetInstance()
+ {
+ return g_pAiModelsPresenter;
+ }
+
+ int16_t AiModelsPresenter::GetSelectAiModel(void)
+ {
+ return model->GetSelectAiModel();
+ }
+
+ void AiModelsPresenter::ChangeAiModel(void)
+ {
+ int index = GetSelectAiModel() + 1;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::index = %d", index);
+ if (index >= AIMODES_MAX_NUM)
+ {
+ index = AIMODES_DOUBAO;
+ }
+ model->SetSelectAiModel(index);
+ view_->UpdateAiModelsSelectStateAndTitleId();
+ }
+
+ void AiModelsPresenter::SetAiModelTextId(int16_t id)
+ {
+ model->SetAiModelTextId(id);
+ }
+
+ // 启动时执行的逻辑
+ void AiModelsPresenter::OnStart()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnStart");
+ Presenter<AiModelsView>::OnStart();
+ }
+
+ // 页面已经展示后的调用逻辑
+ void AiModelsPresenter::OnResume(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnResume");
+ Presenter<AiModelsView>::OnResume();
+ if (view_ == nullptr)
+ {
+ return;
+ }
+ }
+
+ // 页面准备切换到后台前执行的逻辑
+ void AiModelsPresenter::OnPause(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnPause");
+ Presenter<AiModelsView>::OnPause();
+ }
+
+ // 页面完全置于后台时的逻辑。
+ void AiModelsPresenter::OnStop(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnStop");
+ Presenter<AiModelsView>::OnStop();
+ }
+
+ bool AiModelsPresenter::OnClick(UIView &view, const ClickEvent &event)
+ {
+ UNUSED(event);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnClick");
+ std::string viewId = view.GetViewId();
+ // 定义视图ID与文本ID的映射关系
+ std::map<std::string, int> viewIdToTextId = {
+ {AIMODES_DOUBAO_BUTTONVIEWID, AIMODES_DOUBAO},
+ {AIMODES_WENXINYIYAN_BUTTONVIEWID, AIMODES_WENXINYIYAN},
+ {AIMODES_KIMI_BUTTONVIEWID, AIMODES_KIMI},
+ {AIMODES_CHATGPT_BUTTONVIEWID, AIMODES_CHATGPT}};
+
+ // 根据视图ID设置文本ID
+ auto it = viewIdToTextId.find(viewId);
+ if (it != viewIdToTextId.end())
+ {
+ model->SetSelectAiModel(it->second);
+ }
+ if (model->GetSelectAiModel() == it->second) // 点击重复ai模型不执行更新
+ {
+ view_->UpdateAiModelsSelectStateAndTitleId();
+ }
+
+ return true;
+ }
+
+ bool AiModelsPresenter::OnDrag(UIView &view, const DragEvent &event)
+ {
+ UNUSED(view);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnDrag");
+ if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动
+ {
+ AiModelsPresenter::X_DRAG_FLAG = true;
+ }
+ return true;
+ }
+
+ bool AiModelsPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+ {
+ UNUSED(view);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnDragEnd");
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && AiModelsPresenter::X_DRAG_FLAG)
+ {
+ NativeAbility::GetInstance().Back();
+ AiModelsPresenter::X_DRAG_FLAG = false;
+ }
+ return true;
+ }
+
+ bool AiModelsPresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件
+ {
+ UNUSED(view);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnKeyAct");
+ uint16_t keyID = event.GetKeyId();
+ uint16_t keyState = event.GetState();
+ // 如果是power键,且是亮屏状态,按键释放就返回上一级
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+ {
+ NativeAbility::GetInstance().Back();
+ }
+ return true;
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:24:57
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiModels/src/AiModelsView.cpp
+ */
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+ const int AiModelsView::AimodelsTextId[AIMODES_MAX_NUM] = {STR_AIMODELS_DOUBAO, STR_AIMODES_WENXINYIYAN, STR_AIMODES_KIMI, STR_AIMODES_CHATGPT};
+ static AiModelsView *g_pAiModelsView{nullptr};
+ AiModelsView::AiModelsView()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsView");
+ g_pAiModelsView = this;
+ }
+
+ AiModelsView::~AiModelsView()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::~AiModelsView");
+ g_pAiModelsView = nullptr;
+ }
+
+ AiModelsView *AiModelsView::GetInstance()
+ {
+ if (!g_pAiModelsView)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::GetInstance - Instance not initialized!");
+ }
+ return g_pAiModelsView;
+ }
+
+ /*更新模型选中状态和title的textid*/
+ void AiModelsView::UpdateAiModelsSelectStateAndTitleId()
+ {
+ int index = presenter_->GetSelectAiModel();
+ int textId = AimodelsTextId[index];
+ presenter_->SetAiModelTextId(textId);
+ if (AiModelsTitle != nullptr)
+ {
+ AiModelsTitle->SetTextId(textId);
+ AiModelsTitle->ForceResetText();
+ }
+ // 更新模型选中状态的函数中的循环优化
+ for (int i = 0; i < AIMODES_MAX_NUM; ++i)
+ {
+ if (AiModelsImages[i] != nullptr)
+ {
+ bool shouldBeVisible = (index == i);
+ if (AiModelsImages[i])
+ {
+ AiModelsImages[i]->SetVisible(shouldBeVisible);
+ }
+ }
+ }
+ }
+
+ void AiModelsView::ClearAll(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::ClearAll");
+ if (viewInitStatus)
+ {
+ if (container_ != nullptr)
+ {
+ container_->Remove(AiModelsScrollView);
+ if (AiModelsScrollView != nullptr)
+ {
+ AiModelsScrollView->RemoveAll();
+
+ if (AiModelsBackGroundImage != nullptr)
+ {
+ delete AiModelsBackGroundImage;
+ AiModelsBackGroundImage = nullptr;
+ }
+
+ if (AiModelsTitleBackGroundImage != nullptr)
+ {
+ delete AiModelsTitleBackGroundImage;
+ AiModelsTitleBackGroundImage = nullptr;
+ }
+
+ if (AiModelsTitle != nullptr)
+ {
+ delete AiModelsTitle;
+ AiModelsTitle = nullptr;
+ }
+
+ for (int i = 0; i < AIMODES_MAX_NUM; i++)
+ {
+ if (AiModelsButtons[i] != nullptr)
+ {
+ delete AiModelsButtons[i];
+ AiModelsButtons[i] = nullptr;
+ }
+
+ if (AiModelsImages[i] != nullptr)
+ {
+ delete AiModelsImages[i];
+ AiModelsImages[i] = nullptr;
+ }
+ }
+
+ delete AiModelsScrollView;
+ AiModelsScrollView = nullptr;
+ }
+
+ delete container_;
+ container_ = nullptr;
+ }
+ }
+ }
+
+ UILabelExt *AiModelsView::AiModelsViewLabelInit(const LabelConfig &labelconfig)
+ {
+ UILabelExt *label = new UILabelExt();
+ if (label == nullptr)
+ {
+ return nullptr;
+ }
+ label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height);
+ label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize);
+ label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh);
+ label->SetTextId(labelconfig.textId);
+ label->SetLineBreakMode(labelconfig.lineBreakMode);
+ label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ label->SetRollSpeed(70);
+ label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+ return label;
+ }
+
+ UIImageView *AiModelsView::AiModelsViewImageViewInit(const ImageConfig &imageconfig)
+ {
+ UIImageView *Image = new UIImageView();
+ if (Image == nullptr)
+ {
+ return nullptr;
+ }
+ Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+ Image->SetSrc(imageconfig.src);
+ Image->SetStyle(STYLE_BORDER_RADIUS, 100);
+ Image->SetAutoEnable(false);
+ Image->SetResizeMode(UIImageView::FILL);
+ return Image;
+ }
+
+ UIButton *AiModelsView::AiModelsViewButtonInit(const ButtonConfig &buttonconfig)
+ {
+ UIButton *button = new UIButton();
+ if (button == nullptr)
+ {
+ return nullptr;
+ }
+ button->SetPosition(buttonconfig.x, buttonconfig.y, buttonconfig.w, buttonconfig.h);
+ button->SetViewId(buttonconfig.viewId);
+ button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
+ button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+ button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED);
+ button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);
+ button->SetOnClickListener(presenter_);
+
+ return button;
+ }
+
+ bool AiModelsView::CreateAiModelsViewLabel(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewLabel");
+ LabelConfig labelConfig = {
+ .left = 83,
+ .top = 50,
+ .width = 300,
+ .height = 35,
+ .fontSize = 30,
+ .lineHeigh = 35,
+ .textId = 0,
+ .lineBreakMode = UILabel::LINE_BREAK_OSCILLATION,
+ };
+ AiModelsTitle = AiModelsViewLabelInit(labelConfig);
+ if (AiModelsTitle == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsTitle new fail!");
+ return false;
+ }
+
+ return true;
+ }
+
+ bool AiModelsView::CreateAiModelsViewImageView(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewImageView");
+ ImageConfig imagecinfig = {
+ .x = 63,
+ .y = 63,
+ .w = 340,
+ .h = 340,
+ .src = AiModels_Bg,
+ };
+ AiModelsBackGroundImage = AiModelsViewImageViewInit(imagecinfig);
+ if (AiModelsBackGroundImage == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsBackGroundImage is nullptr!!");
+ return false;
+ }
+ /* -------------------------------------------------------------------------- */
+ imagecinfig = {
+ .x = 149,
+ .y = 38,
+ .w = 168,
+ .h = 79,
+ .src = AiModels_title_Bg,
+ };
+ AiModelsTitleBackGroundImage = AiModelsViewImageViewInit(imagecinfig);
+ if (AiModelsTitleBackGroundImage == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsTitleBackGroundImage is nullptr!!");
+ return false;
+ }
+ /* -------------------------------------------------------------------------- */
+ imagecinfig.w = 36;
+ imagecinfig.h = 36;
+ imagecinfig.src = AiModels_select;
+ for (uint8_t i = 0; i < AIMODES_MAX_NUM; i++)
+ {
+ if (i % 2 == 0)
+ {
+ imagecinfig.x = 187;
+ }
+ else
+ {
+ imagecinfig.x = 307;
+ }
+
+ if (i < 2)
+ {
+ imagecinfig.y = 187;
+ }
+ else
+ {
+ imagecinfig.y = 307;
+ }
+
+ AiModelsImages[i] = AiModelsViewImageViewInit(imagecinfig);
+ if (AiModelsImages[i] == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsImages[%d] new fail!", i);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool AiModelsView::CreateAiModelsViewButton(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewButton");
+
+ ButtonConfig buttonconfig;
+ buttonconfig.w = 120;
+ buttonconfig.h = 120;
+ for (uint8_t i = 0; i < AIMODES_MAX_NUM; i++)
+ {
+ if (i % 2 == 0)
+ {
+ buttonconfig.x = 113;
+ }
+ else
+ {
+ buttonconfig.x = 233;
+ }
+
+ if (i < 2)
+ {
+ buttonconfig.y = 113;
+ }
+ else
+ {
+ buttonconfig.y = 233;
+ }
+ buttonconfig.viewId = AiModelsButtonViewId[i];
+ AiModelsButtons[i] = AiModelsViewButtonInit(buttonconfig);
+ if (AiModelsButtons[i] == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsButtons[%d] new fail!", i);
+ return false;
+ }
+ AiModelsButtons[i]->SetImageSrc(AiModelsImagePath[i], AiModelsImagePath[i]);
+ }
+
+ return true;
+ }
+
+ bool AiModelsView::CreateAiModelsScrollView(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsScrollView");
+ AiModelsScrollView = new UIScrollView();
+ if (AiModelsScrollView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsScrollView new fail!");
+ return false;
+ }
+ AiModelsScrollView->SetPosition(0, 0, 466, 466);
+ AiModelsScrollView->SetTouchable(true);
+ AiModelsScrollView->SetDraggable(true);
+
+ return true;
+ }
+
+ /*创建Ai模型视图*/
+ void AiModelsView::CreateAiModelsView(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsView");
+ if (!CreateAiModelsScrollView() || !CreateAiModelsViewLabel() ||
+ !CreateAiModelsViewImageView() || !CreateAiModelsViewButton())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsView fail!");
+ return;
+ }
+
+ UpdateAiModelsSelectStateAndTitleId();
+
+ AiModelsScrollView->Add(AiModelsBackGroundImage);
+ AiModelsScrollView->Add(AiModelsTitleBackGroundImage);
+ AiModelsScrollView->Add(AiModelsTitle);
+ for (int8_t i = 0; i < AIMODES_MAX_NUM; i++)
+ {
+ AiModelsScrollView->Add(AiModelsButtons[i]);
+ AiModelsScrollView->Add(AiModelsImages[i]);
+ }
+ container_->Add(AiModelsScrollView);
+ }
+
+ void AiModelsView::OnStart()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnStart");
+ View<AiModelsPresenter>::OnStart();
+ SetContainerView(new UIViewGroup());
+ if (GetContainer() == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetContainerView fail!!");
+ return;
+ }
+ container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ container_->SetOnDragListener(presenter_);
+ container_->SetTouchable(true);
+ container_->SetDraggable(true);
+
+ if (!viewInitStatus)
+ {
+ CreateAiModelsView();
+ viewInitStatus = true;
+ }
+
+ RootView::GetInstance()->SetOnKeyActListener(presenter_);
+
+ return;
+ }
+ void AiModelsView::OnSetUpView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnSetUpView");
+ View<AiModelsPresenter>::OnSetUpView();
+ Draw();
+ return;
+ }
+
+ void AiModelsView::OnTearDownView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnTearDownView");
+ View<AiModelsPresenter>::OnTearDownView();
+ return;
+ }
+
+ void AiModelsView::OnStop()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnStop");
+ View<AiModelsPresenter>::OnStop();
+ RootView::GetInstance()->ClearOnKeyActListener();
+ ClearAll();
+ return;
+ }
+}
\ No newline at end of file
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-20 15:14:43
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-04 18:31:22
+ * @LastEditTime: 2024-07-11 14:35:27
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
*/
#ifndef AI_VOICE_MODEL_H
void StopListenAndRecordingUserQuestion(void);
// 定时器管理
- void AIVoice_StartTimer(uint32_t interval = 1000);
+ void AIVoice_StartTimer(uint32_t interval = 2000);
void AIVoice_StopTimer(void);
private:
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-20 15:14:50
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-05 20:34:32
+ * @LastEditTime: 2024-07-11 14:36:14
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
*/
#include "aivoice/include/AiVoiceModel.h"
{
// 声明定时器变量
static osTimerId_t g_timer = NULL;
- static constexpr uint16_t THIRTY_TIME = 30; // 30秒超时
+ static constexpr uint16_t THIRTY_TIME = 32;
static int Time = THIRTY_TIME;
AiVoiceModel::AiVoiceModel() {}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetChatContentListCount() - 1 = %d,line = %d", GetChatContentListCount() - 1, __LINE__);
// 将更新后的 AI 回答内容添加到列表
adapter->GetChatContentItem().push_back(chatTtems[GetChatContentListCount() - 1]);
- p_AivoiceReturnResultTextView->GetChatContentList()->RefreshList();
+ p_AivoiceReturnResultTextView->GetChatContentList()->RefreshList();
}
else
{
usleep(50000); // 延时等待创建完成,0.05秒
}
/* -------------------------------------------------------------------------- */
- userQuestionStr = str;
+ userQuestionStr += str;
/* -------------------------------------------------------------------------- */
if (!UpdateUserQuestionStr())
{
static void AIVoice_TimerCallbackProc(int data)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AIVoice_TimerCallbackProc,Time = %d", Time);
- Time -= 1;
- AiVoiceView *view_ = AiVoiceView::GetInstance();
- if (view_ == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::GetInstance fail!!");
- return;
- }
-
- AiVoicePresenter *p_AiVoicePresenter = AiVoicePresenter::GetInstance();
- if (p_AiVoicePresenter == nullptr)
+ Time -= 2;
+ if (Time == 30)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::GetInstance fail!!");
- return;
+ AiVoiceModel::GetInstance().CheckFileAndSendAIIsReady();
}
-
if (Time < 0) // 如果思考时间超时30s,进入连接超时界面
{
+ AiVoiceView *view_ = AiVoiceView::GetInstance();
+ if (view_ == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::GetInstance fail!!");
+ AiVoiceModel::GetInstance().AIVoice_StopTimer();
+ return;
+ }
+ AiVoicePresenter *p_AiVoicePresenter = AiVoicePresenter::GetInstance();
+ if (p_AiVoicePresenter == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::GetInstance fail!!");
+ AiVoiceModel::GetInstance().AIVoice_StopTimer();
+ return;
+ }
+ bool flag = false;
if ((view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID) != nullptr) &&
(view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID)->IsVisible()))
{
p_AiVoicePresenter->ChangeViewAndLogicOperator(AIVOICE_THINKING_VIEWID, AIVOICE_CONNECT_TIMEOUT_VIEWID);
+ flag = true;
+ }
+ if (!flag)
+ {
+ AiVoiceModel::GetInstance().AIVoice_StopTimer();
}
- AiVoiceModel::GetInstance().AIVoice_StopTimer();
}
return;
/*
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-20 15:11:17
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-07-05 10:35:34
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-09 18:27:33
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
*/
#include "AppViewIDs.h"
if (showView == AIVOICE_THINKING_VIEWID) // 聆听中->思考中界面
{
// osal_msleep(500);
- model->CheckFileAndSendAIIsReady();
+ //model->CheckFileAndSendAIIsReady();
model->AIVoice_StartTimer();
}
else if (showView == AIVOICE_STARTCHAT_VIEWID) // 聆听中->开始对话界面:(右滑不想录音了)
STR_CANCEL$Cancel\r
STR_CONNECT_TIMEOUT$Connection Timeout\r
STR_PLEASE_RESTART_CHAT$Please restart the conversation\r
-STR_CONTINUE_CHAT$Continue the conversation
\ No newline at end of file
+STR_CONTINUE_CHAT$Continue the conversation\r
+STR_AIMODELS_DOUBAO$Cici\r
+STR_AIMODES_WENXINYIYAN$ERNIE Bot\r
+STR_AIMODES_KIMI$Kimi\r
+STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
STR_CANCEL$取消\r
STR_CONNECT_TIMEOUT$连接超时\r
STR_PLEASE_RESTART_CHAT$请重新开始对话\r
-STR_CONTINUE_CHAT$继续对话
\ No newline at end of file
+STR_CONTINUE_CHAT$继续对话\r
+STR_AIMODELS_DOUBAO$豆包\r
+STR_AIMODES_WENXINYIYAN$文心一言\r
+STR_AIMODES_KIMI$Kimi\r
+STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
<lanstr id="STR_CONNECT_TIMEOUT" value="Connection Timeout"/>
<lanstr id="STR_PLEASE_RESTART_CHAT" value="Please restart the conversation"/>
<lanstr id="STR_CONTINUE_CHAT" value="Continue the conversation"/>
+ <lanstr id="STR_AIMODELS_DOUBAO" value="Cici"/>
+ <lanstr id="STR_AIMODES_WENXINYIYAN" value="ERNIE Bot"/>
+ <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+ <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
</language>
+++ /dev/null
-<language id="language" direct="ltr" languageinfo="ja">
- <lanstr id="STR_EXERCISE_GENERAL" value="一般的なトレーニング"/>
- <lanstr id="STR_EXERCISE_FREETRAINING" value="フリートレーニング"/>
- <lanstr id="STR_EXERCISE_RESISTANCETRAINING" value="筋力トレーニング"/>
- <lanstr id="STR_EXERCISE_SPINBIKE" value="フライカート/室内フィットネスカート"/>
- <lanstr id="STR_EXERCISE_TREADMILL" value="ステッパー"/>
- <lanstr id="STR_EXERCISE_STROLLMACHINE" value="ウォークマン"/>
- <lanstr id="STR_EXERCISE_HIIT" value="HIIT/高強度インターバルトレーニング"/>
- <lanstr id="STR_EXERCISE_CROSSFIT" value="フィットネス"/>
- <lanstr id="STR_EXERCISE_GROUPCALISTHENICS" value="マステ"/>
- <lanstr id="STR_EXERCISE_YOGA" value="ヨガ"/>
- <lanstr id="STR_EXERCISE_YOGACAT" value="ヨガ猫式"/>
- <lanstr id="STR_EXERCISE_YOGACOW" value="ヨガ牛式"/>
- <lanstr id="STR_EXERCISE_YOGACOBRA" value="ヨガコブラ式"/>
- <lanstr id="STR_EXERCISE_YOGAHERO1" value="ヨガヒーロー式1"/>
- <lanstr id="STR_EXERCISE_YOGAHERO2" value="ヨガヒーロー式2"/>
- <lanstr id="STR_EXERCISE_YOGAHERO3" value="ヨガヒーロー式3"/>
- <lanstr id="STR_EXERCISE_YOGAROLLING" value="ヨガローラー"/>
- <lanstr id="STR_EXERCISE_OUTDOORWALKING" value="屋外ウォーキング"/>
- <lanstr id="STR_EXERCISE_OUTDOORRUNNING" value="屋外ランニング"/>
- <lanstr id="STR_EXERCISE_INDOORWALKING" value="インドアウォーキング"/>
- <lanstr id="STR_EXERCISE_INDOORRUNNING" value="インドアランニング"/>
- <lanstr id="STR_EXERCISE_OUTDOORBIKING" value="屋外サイクリング"/>
- <lanstr id="STR_EXERCISE_JUMPINGROPE" value="縄跳び"/>
- <lanstr id="STR_EXERCISE_PILATES" value="ピラティス"/>
- <lanstr id="STR_EXERCISE_CROSS_FIT" value="ミックスフィットネス"/>
- <lanstr id="STR_EXERCISE_FUNCTIONALTRAINING" value="機能的トレーニング"/>
- <lanstr id="STR_EXERCISE_PHYSICALTRAINING" value="体力トレーニング"/>
- <lanstr id="STR_EXERCISE_TAEKWONDO" value="テコンドー/キックボクシング"/>
- <lanstr id="STR_EXERCISE_BOXING" value="ボクシング"/>
- <lanstr id="STR_EXERCISE_KICKBOXING" value="キックボクシング"/>
- <lanstr id="STR_EXERCISE_KARATE" value="空手"/>
- <lanstr id="STR_EXERCISE_FENCING" value="フェンシング"/>
- <lanstr id="STR_EXERCISE_CORETRAINING" value="コアトレーニング"/>
- <lanstr id="STR_EXERCISE_BODYCOMBAT" value="ボクシング有酸素"/>
- <lanstr id="STR_EXERCISE_KENDO" value="剣道"/>
- <lanstr id="STR_EXERCISE_HORIZONTALBAR" value="鉄棒"/>
- <lanstr id="STR_EXERCISE_PARALLELBARS" value="平行棒"/>
- <lanstr id="STR_EXERCISE_CIRCUIT" value="サイクルトレーニング"/>
- <lanstr id="STR_EXERCISE_AEROBICS" value="エアロビクス"/>
- <lanstr id="STR_EXERCISE_CALISTHENICE" value="エアロビクス"/>
- <lanstr id="STR_EXERCISE_P90X" value="P90X"/>
- <lanstr id="STR_EXERCISE_KETTLEBELTRAINING" value="ポットベルトレーニング"/>
- <lanstr id="STR_EXERCISE_MIXEDMARTIALARTS" value="総合格闘技"/>
- <lanstr id="STR_EXERCISE_STAIRCLIMBINGMACHINE" value="階段昇降機"/>
- <lanstr id="STR_EXERCISE_WEIGHTLIFTING" value="ウエイトリフティング"/>
- <lanstr id="STR_EXERCISE_BARRE" value="Barre"/>
- <lanstr id="STR_EXERCISE_HANDCYCLING" value="ハンドホイール"/>
- <lanstr id="STR_EXERCISE_TRACKFIELD" value="陸上"/>
- <lanstr id="STR_EXERCISE_WRESTLING" value="角力"/>
- <lanstr id="STR_EXERCISE_MINDBODY" value="心身運動"/>
- <lanstr id="STR_EXERCISE_FLEXIBILITY" value="柔軟体操"/>
- <lanstr id="STR_EXERCISE_MIXEDCARDIO" value="混合有酸素"/>
- <lanstr id="STR_EXERCISE_TRADITIONALSTRENGTHTRAINING" value="従来の筋力トレーニング"/>
- <lanstr id="STR_EXERCISE_CROSSTRAINING" value="クロストレーニング"/>
- <lanstr id="STR_EXERCISE_GYMNASTICS" value="体操"/>
- <lanstr id="STR_EXERCISE_STEPTRAINING" value="ステップトレーニング"/>
- <lanstr id="STR_EXERCISE_ELLIPTICALTRAINER" value="楕円マシン"/>
- <lanstr id="STR_EXERCISE_ROWINGMACHINE" value="ローイングマシン"/>
- <lanstr id="STR_DANCING_GENERAL" value="一般ダンス"/>
- <lanstr id="STR_DANCING_BELLY" value="ベリーダンス"/>
- <lanstr id="STR_DANCING_JAZZ" value="ジャズダンス"/>
- <lanstr id="STR_DANCING_LATIN" value="ラテンダンス"/>
- <lanstr id="STR_DANCING_BALLET" value="バレエ"/>
- <lanstr id="STR_DANCING_STREET" value="ストリートダンス"/>
- <lanstr id="STR_DANCING_PUBLICSQUARE" value="スクエアダンス"/>
- <lanstr id="STR_DANCING_ZUMBA" value="ズンバ"/>
- <lanstr id="STR_DANCING_SOCIALDANCE" value="ソシアルダンス"/>
- <lanstr id="STR_DANCING_TAPDANCE" value="タップダンス"/>
- <lanstr id="STR_RECREATIONAL_SPORTS" value="一般レジャースポーツ"/>
- <lanstr id="STR_RECREATIONAL_SKATING" value="ローラースケート"/>
- <lanstr id="STR_RECREATIONAL_MARTIALARTS" value="武道"/>
- <lanstr id="STR_RECREATIONAL_TAICHI" value="太極拳"/>
- <lanstr id="STR_RECREATIONAL_HULAHOOP" value="フラフープ"/>
- <lanstr id="STR_RECREATIONAL_DISCSPORT" value="フリスビー"/>
- <lanstr id="STR_RECREATIONAL_DARTS" value="ダーツ"/>
- <lanstr id="STR_RECREATIONAL_ARCHERY" value="アーチェリー"/>
- <lanstr id="STR_RECREATIONAL_HORSERIDING" value="馬に乗る"/>
- <lanstr id="STR_RECREATIONAL_BATTLEGAME" value="対戦ゲーム"/>
- <lanstr id="STR_RECREATIONAL_KITE" value="凧揚げ"/>
- <lanstr id="STR_RECREATIONAL_TUGOFWAR" value="綱引き"/>
- <lanstr id="STR_RECREATIONAL_SWING" value="ブランコ"/>
- <lanstr id="STR_RECREATIONAL_STAIRCLIMBING" value="階段を登る"/>
- <lanstr id="STR_RECREATIONAL_OBSTACLERACE" value="障害レース"/>
- <lanstr id="STR_RECREATIONAL_FISHING" value="フィッシング"/>
- <lanstr id="STR_RECREATIONAL_HUNTING" value="狩り"/>
- <lanstr id="STR_RECREATIONAL_SCOOTERRIDING" value="カート"/>
- <lanstr id="STR_RECREATIONAL_PARAGLIDING" value="パラグライダー"/>
- <lanstr id="STR_RECREATIONAL_TEAMSPORTS" value="チーム競技"/>
- <lanstr id="STR_RECREATIONAL_FINESSGAMING" value="フィットネスゲーム"/>
- <lanstr id="STR_RECREATIONAL_HIKING" value="健行"/>
- <lanstr id="STR_RECREATIONAL_EQUESTRIANSPORTS" value="馬術スポーツ"/>
- <lanstr id="STR_RECREATIONAL_PLAY" value="遊び"/>
- <lanstr id="STR_BALL_GAMES" value="一般的な球技"/>
- <lanstr id="STR_BALL_BADMINTON" value="バドミントン"/>
- <lanstr id="STR_BALL_TABLETENNIS" value="卓球"/>
- <lanstr id="STR_BALL_TENNIS" value="テニス"/>
- <lanstr id="STR_BALL_BILLIARDS" value="ボール"/>
- <lanstr id="STR_BALL_BOWLING" value="ボウリング"/>
- <lanstr id="STR_BALL_VOLLEYBALL" value="バレーボール"/>
- <lanstr id="STR_BALL_SHUTTLECOCK" value="けん玉"/>
- <lanstr id="STR_BALL_HANDBALL" value="ハンドボール"/>
- <lanstr id="STR_BALL_BASEBALL" value="野球"/>
- <lanstr id="STR_BALL_SOFTBALL" value="ソフトボール"/>
- <lanstr id="STR_BALL_CRICKET" value="クリケット"/>
- <lanstr id="STR_BALL_FOOTBALL" value="アメリカンフットボール"/>
- <lanstr id="STR_BALL_BEACHSOCCER" value="ビーチサッカー"/>
- <lanstr id="STR_BALL_BEACHVOLLEYBALL" value="ビーチバレーボール"/>
- <lanstr id="STR_BALL_CROQUET" value="クロケット"/>
- <lanstr id="STR_BALL_HOCKEY" value="ホッケー"/>
- <lanstr id="STR_BALL_SQUASH" value="英国式スカッシュ"/>
- <lanstr id="STR_BALL_SEPAKTAKRAW" value="フジボール"/>
- <lanstr id="STR_BALL_DODGEBALL" value="ドッジボール"/>
- <lanstr id="STR_BALL_BASKETBALL" value="バスケットボール"/>
- <lanstr id="STR_BALL_SOCCER" value="サッカーボール"/>
- <lanstr id="STR_BALL_GOLF" value="ゴルフボール"/>
- <lanstr id="STR_BALL_POLO" value="ポロ"/>
- <lanstr id="STR_BALL_RACQUETBALL" value="スカッシュ"/>
- <lanstr id="STR_BALL_RUGBY" value="ラグビー"/>
- <lanstr id="STR_BALL_GATEBALL" value="ゲートボール"/>
- <lanstr id="STR_BALL_PICKLEBALL" value="ピックボール"/>
- <lanstr id="STR_BALL_LACROSSE" value="バッグスティック"/>
- <lanstr id="STR_WATER_ACTIVITIES" value="一般水上アクティビティ"/>
- <lanstr id="STR_WATER_SAILING" value="ヨット"/>
- <lanstr id="STR_WATER_SURFING" value="サーフィン"/>
- <lanstr id="STR_WATER_WHITEWATERRAFTING" value="ロービング"/>
- <lanstr id="STR_WATER_CANOEING" value="ドラゴンボート漕ぎ"/>
- <lanstr id="STR_WATER_KAYAKING" value="ボート"/>
- <lanstr id="STR_WATER_ROWING" value="ローイング"/>
- <lanstr id="STR_WATER_MOTORBOAT" value="水上バイク"/>
- <lanstr id="STR_WATER_SUP" value="パドルサーフィン"/>
- <lanstr id="STR_WATER_SCUBADIVING" value="ダイビング"/>
- <lanstr id="STR_WATER_DIVING" value="飛び込み"/>
- <lanstr id="STR_WATER_KITESURFING" value="パラグライダーサーフィン"/>
- <lanstr id="STR_WATER_WAKEBOARDING" value="ウェイクボード"/>
- <lanstr id="STR_WATER_POLO" value="水球"/>
- <lanstr id="STR_WATER_WINDSURFING" value="ウィンドサーフィン"/>
- <lanstr id="STR_WATER_DRIFTING" value="ラフティングアクティビティ"/>
- <lanstr id="STR_WATER_FITNESS" value="ウォーターフィットネス"/>
- <lanstr id="STR_WATER_SPORTS" value="ウォータースポーツ"/>
- <lanstr id="STR_WATER_OUTDOORSWIM" value="アウトドアスイミング"/>
- <lanstr id="STR_WATER_INDOORSWIM" value="インドアスイム"/>
- <lanstr id="STR_WATER_SWIMFREESTYLE" value="水泳_フリースタイル"/>
- <lanstr id="STR_WATER_SWIMBREASTSTROKE" value="水泳_カエル式"/>
- <lanstr id="STR_WATER_SWIMBACKSTROKE" value="水泳_仰向け"/>
- <lanstr id="STR_WATER_SWIMBUTTERFLY" value="スイム_バタフライ"/>
- <lanstr id="STR_ICE_SPORTS" value="一般氷上スポーツ"/>
- <lanstr id="STR_ICE_SKATING" value="スケート"/>
- <lanstr id="STR_ICE_HOCKEY" value="アイスホッケー"/>
- <lanstr id="STR_ICE_CURLING" value="アイスストーン/カーリング"/>
- <lanstr id="STR_ICE_SNOWMOBILING" value="スノーモービル"/>
- <lanstr id="STR_ICE_SLED" value="そり"/>
- <lanstr id="STR_ICE_BIATHLON" value="冬の2つ"/>
- <lanstr id="STR_ICE_CROSSCOUNTRYSKING" value="クロスカントリースキー"/>
- <lanstr id="STR_ICE_SKIING" value="スキー"/>
- <lanstr id="STR_ICE_SNOWBOARDING" value="スノーボード/スノーボード"/>
- <lanstr id="STR_ICE_SNOWSHOEING" value="スノーシュー健行"/>
- <lanstr id="STR_ICE_SNOWSPORTS" value="スノースポーツ"/>
- <lanstr id="STR_EXTREME_SPORTS" value="一般エクストリームスポーツ"/>
- <lanstr id="STR_EXTREME_SKATEBOARDING" value="スケートボード"/>
- <lanstr id="STR_EXTREME_ROCKCLIMBING" value="ロッククライミング"/>
- <lanstr id="STR_EXTREME_BUNGEEJUMPING" value="ハイジャンプ/バンジージャンプイベント"/>
- <lanstr id="STR_EXTREME_PARKOUR" value="パルクール"/>
- <lanstr id="STR_EXTREME_BMX" value="BMX"/>
- <lanstr id="STR_EXTREME_ORIENTERING" value="オリエンテーリング"/>
- <lanstr id="STR_EXTREME_PARACHUTE" value="スカイダイビング"/>
- <lanstr id="STR_EXTREME_RACING" value="レース"/>
- <lanstr id="STR_EXTREME_TRIATHLONS" value="トライアスロン"/>
- <lanstr id="STR_OTHER_ELEVATOR" value="エレベーターに乗る"/>
- <lanstr id="STR_OTHER_ESCALATOR" value="エスカレーター"/>
- <lanstr id="STR_OTHER_GARDENING" value="ガーデニングをする"/>
- <lanstr id="STR_OTHER_HORSEWORK" value="家事をする"/>
- <lanstr id="STR_OTHER_INVEHICLE" value="車の中で"/>
- <lanstr id="STR_OTHER_MEDITATION" value="瞑想する"/>
- <lanstr id="STR_OTHER_STILL" value="静止"/>
- <lanstr id="STR_OTHER_TILTING" value="傾斜"/>
- <lanstr id="STR_OTHER_WHEELCHAIR" value="車椅子で移動"/>
- <lanstr id="STR_EXERCISE_LIST" value="フィットネスクラス"/>
- <lanstr id="STR_BALL_LIST" value="ボール"/>
- <lanstr id="STR_WATER_LIST" value="ウォータースポーツ"/>
- <lanstr id="STR_DANCING_LIST" value="ダンスクラス"/>
- <lanstr id="STR_EXTREME_LIST" value="エクストリームスポーツ"/>
- <lanstr id="STR_ICE_LIST" value="アイススポーツ"/>
- <lanstr id="STR_RECREATIONAL_LIST" value="レジャースポーツ"/>
- <lanstr id="STR_OTHER_LIST" value="その他"/>
- <lanstr id="STR_DANCING_TITLE" value="ダンススポーツ"/>
- <lanstr id="STR_BALL_LIST_TITLE" value="球技"/>
- <lanstr id="STR_OTHER_TITLE" value="その他のスポーツ"/>
- <lanstr id="STR_EXERCISE_TITLE" value="フィットネススポーツ"/>
- <lanstr id="STR_TRAINING" value="トレーニング"/>
- <lanstr id="STR_RAPID_TRAINING" value="クイックトレーニング"/>
- <lanstr id="STR_SET_GOALS" value="目標の設定"/>
- <lanstr id="STR_DURATION" value="期間"/>
- <lanstr id="STR_DURATION_SETTING" value="期間設定"/>
- <lanstr id="STR_MINUTES" value="分"/>
- <lanstr id="STR_CALORIE" value="カロリー"/>
- <lanstr id="STR_CALORIE_SETTING" value="カロリー設定"/>
- <lanstr id="STR_KILOCALORIE" value="kcal"/>
- <lanstr id="STR_DISTANCE" value="距離"/>
- <lanstr id="STR_RANGE_SETTING" value="距離設定{{STR_RANGE_SETTING"/>
- <lanstr id="STR_METER" value="メートル"/>
- <lanstr id="STR_KILOMETRE" value="キロメートル"/>
- <lanstr id="STR_STEP_NUMBER" value="ステップ数"/>
- <lanstr id="STR_STEP_SETTING" value="ステップ設定"/>
- <lanstr id="STR_STEP" value="ステップ"/>
- <lanstr id="STR_HEART_RATE" value="心拍数"/>
- <lanstr id="STR_MEAN_HEART_RATE" value="平均心拍数"/>
- <lanstr id="STR_TIMES_PER_MIN" value="回/分"/>
- <lanstr id="STR_MEAN_HEART_RATE_MIN" value="平均心拍数(回/分)"/>
- <lanstr id="STR_IN_THE" value="で"/>
- <lanstr id="STR_LOWER_STRENGTH" value="低強度"/>
- <lanstr id="STR_MEDIUM_STRENGTH" value="中程度の強さ"/>
- <lanstr id="STR_HIGH_STRENGTH" value="高強度"/>
- <lanstr id="STR_ULTRA_HIGH_STRENGTH" value="超高強度"/>
- <lanstr id="STR_TRAINING_INTENSITY" value="トレーニング強度"/>
- <lanstr id="STR_TRAINING_INTENSITY_DESCRIPTION" value="トレーニング強度は、トレーニング不足かトレーニング過多かを判断するために用いられ、心拍数をどれだけ増加させる運動強度が最適であるかを判断する。"/>
- <lanstr id="STR_INTENSITY_INTERVAL_DESCRIPTION" value="この強度区間は目標心拍数(個人基本資料から計算)の強弱に対応するリアルタイム状態表示であり、訓練の質を高めるのに役立つ。"/>
- <lanstr id="STR_TRAINING_STATE_MEANING" value="トレーニング状態代表の意味"/>
- <lanstr id="STR_WARM_UP_EXERCISE" value="ウォーミングアップ"/>
- <lanstr id="STR_FAT_BURNING_ZONE" value="脂肪燃焼ゾーン"/>
- <lanstr id="STR_IMPROVE_CARDIOPULMONARY_FUNCTION" value="心肺機能の向上"/>
- <lanstr id="STR_PROFESSIONAL_ATHLETE" value="プロスポーツ選手"/>
- <lanstr id="STR_TRAINING_INTENSITY_NOTE" value="注:このトレーニング強度はプロの運動評価ではなく、データは参考にしてください。"/>
- <lanstr id="STR_TRAINING_IN_PROGRESS" value="トレーニング中"/>
- <lanstr id="STR_BREAK_TRAINING" value="トレーニング一時停止"/>
- <lanstr id="STR_FINISH" value="の終了"/>
- <lanstr id="STR_PAUSE" value="一時停止"/>
- <lanstr id="STR_RESUME" value="続行"/>
- <lanstr id="STR_GOAL_ACHIEVED" value="目標を達成しました"/>
- <lanstr id="STR_ACCOMPLISH_GOAL" value="完了目標"/>
- <lanstr id="STR_OK" value="OK"/>
- <lanstr id="STR_LOOK_OUT" value="注意"/>
- <lanstr id="STR_INSUFFICENT_EXERCISE_AMOUNT" value="現在の運動量が小さすぎて記録できません。運動を終了するかどうか"/>
- <lanstr id="STR_END_MOVEMENT" value="モーションの終了"/>
- <lanstr id="STR_END_THIS_MOVEMENT" value="この運動を終了するかどうか"/>
- <lanstr id="STR_GOAL_ACCOMPLISHMENT_DEGREE" value="目標達成度"/>
- <lanstr id="STR_TRAINING_DURATION" value="トレーニング時間"/>
- <lanstr id="STR_OFF" value="オフ"/>
- <lanstr id="STR_MORE" value="以上"/>
-</language>
<lanstr id="STR_CONNECT_TIMEOUT" value="连接超时"/>
<lanstr id="STR_PLEASE_RESTART_CHAT" value="请重新开始对话"/>
<lanstr id="STR_CONTINUE_CHAT" value="继续对话"/>
+ <lanstr id="STR_AIMODELS_DOUBAO" value="豆包"/>
+ <lanstr id="STR_AIMODES_WENXINYIYAN" value="文心一言"/>
+ <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+ <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
</language>
STR_CONNECT_TIMEOUT = 468,\r
STR_PLEASE_RESTART_CHAT = 469,\r
STR_CONTINUE_CHAT = 470,\r
- STR_MAX_ID = 471,\r
+ STR_AIMODELS_DOUBAO = 471,\r
+ STR_AIMODES_WENXINYIYAN = 472,\r
+ STR_AIMODES_KIMI = 473,\r
+ STR_AIMODES_CHATGPT = 474,\r
+ STR_MAX_ID = 475,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {
- LANGUAGE_ID_ZH,\r
LANGUAGE_ID_EN,\r
+ LANGUAGE_ID_ZH,\r
LANGUAGE_ID_MAX\r
}; // UITextLanguageTextId\r
}\r
free(timeStr);
return;
}
- PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
+ if (PullUpDownView::GetInstance() != nullptr)
+ PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
free(timeStr);
}
}
}
- PullUpDownView::GetInstance()->GetProgress()->SetImage(progressImageSrc, nullptr);
- PullUpDownView::GetInstance()->GetProgress()->SetValue(value);
- PullUpDownView::GetInstance()->GetDateLabel()->SetText(dateStr);
- PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
- PullUpDownView::GetInstance()->GetWeekLabel()->SetText(weekStr);
+ if (PullUpDownView::GetInstance() != nullptr)
+ {
+ PullUpDownView::GetInstance()->GetProgress()->SetImage(progressImageSrc, progressImageSrc);
+ PullUpDownView::GetInstance()->GetProgress()->SetValue(value);
+ PullUpDownView::GetInstance()->GetDateLabel()->SetText(dateStr);
+ PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
+ PullUpDownView::GetInstance()->GetWeekLabel()->SetText(weekStr);
+ }
// 释放动态分配的内存
free(dateStr);
/* -------------------------------------------------------------------------- */
// 声明定时器变量
static osTimerId_t g_timer = NULL;
- static uint8_t UPDATETIME = 2;
- uint8_t MainPresenterSample::g_PullUpDownTimes = UPDATETIME; // 2秒
+ static uint8_t UPDATETIME = 2; // 2秒
+ uint8_t MainPresenterSample::g_PullUpDownTimes = UPDATETIME;
/*定时器到期时的处理*/
static void PullUpDown_TimerCallbackProc(int data)
if (MainPresenterSample::g_PullUpDownTimes <= 0)
{
MainPresenterSample::g_PullUpDownTimes = UPDATETIME; //
- MainPresenterSample::GetInstance()->UpdataTime();
- PullUpDownView::GetInstance()->UpdateSignalStrengthStatusAndBatteryPosition();
+ if (MainPresenterSample::GetInstance() != nullptr)
+ {
+ MainPresenterSample::GetInstance()->UpdataTime();
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainPresenterSample::GetInstance fail!!");
+ }
+
+ if (PullUpDownView::GetInstance() != nullptr)
+ {
+ PullUpDownView::GetInstance()->UpdateSignalStrengthStatusAndBatteryPosition();
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PullUpDownView::GetInstance fail!!");
+ }
}
if (uapi_get_screen_state() == 1) // 息屏停止更新数据
// progress->SetValue(value);
const char *progressImageSrc = "/user/res/Battery/Battery_Normal.bin";
- progress->SetImage(progressImageSrc, nullptr);
+ progress->SetImage(progressImageSrc, progressImageSrc);
progress->SetBackgroundStyle(STYLE_BACKGROUND_OPA, 0x00);
progress->SetBackgroundStyle(STYLE_TEXT_COLOR, 0xff000000);
progress->SetForegroundStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-12 11:44:04
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-13 19:09:49
+ * @LastEditTime: 2024-07-10 21:13:23
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/rebootdevice/include/RebootModel.h
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
*/
void SetSelectViewId(int16_t value);
bool GetExitsView(void);
void SetExitsView(bool value);
- bool RegisterLongPressEvents(void);
- bool RegisterDoubleClickEvents(void);
- void RegisterKeyEvents(void);
+ bool RegisterPowerKeyLongPressEvent(void);
+ bool RegisterPowerKeyDoubleClickEvent(void);
+ bool RegisterFuncKeyClickEvent(void);
+ bool RegisterFuncKeyDoubleClickEvent(void);
+ void RegisterAllKeyEvents(void);
private:
RebootModel();
int16_t selectView{0};
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-03-28 11:50:42
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-14 18:42:57
+ * @LastEditTime: 2024-07-11 14:41:49
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/rebootdevice/src/RebootModel.cpp
*/
#include <NativeAbility.h>
#include <AppViewIDs.h>
#include "power_display_service.h"
+#include "aimodels/include/AiModelsModel.h"
namespace OHOS
{
RebootModel::RebootModel() {}
}
#endif
- /*
- * @brief 长按四秒关机回调函数
- */
- static void OnKeyLongPress4s_Callback(void)
+ static void HandlePowerKeyLongPress(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnKeyLongPress4s_Callback");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKeyLongPress");
const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ if (!display_api)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+ return;
+ }
+
if (display_api->get_screen_state() != SCREEN_ON)
{
display_api->turn_on_screen();
}
+
// 切换到关机/重启卡片
NativeAbility::GetInstance().ChangeSlice(VIEW_SHUTDOWN_OR_REBOOT);
-
- return;
}
- /*
- * @brief 注册长按监听事件
- * @return 注册成功返回true,反之返回false
- */
- bool RebootModel::RegisterLongPressEvents(void)
+ /*注册电源键的长按事件*/
+ bool RebootModel::RegisterPowerKeyLongPressEvent(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterLongPressEvents");
- int32_t ret = uapi_button_register_event_cb(OnKeyLongPress4s_Callback, BUTTON_PWR_LONGPRESS_3S);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterPowerKeyLongPressEvent");
+ int32_t ret = uapi_button_register_event_cb(HandlePowerKeyLongPress, BUTTON_PWR_LONGPRESS_3S);
if (ret != ERRCODE_SUCC)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register LongPress Events err,ret = %d", ret);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register PowerKey LongPress Event error, ret = %d", ret);
return false;
}
return true;
}
- /*
- * @brief 双击事件回调函数
- */
- static void OnKeyDoubleClick_Callback(void)
+ static void HandlePowerKeyDoubleClick(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandlePowerKeyDoubleClick");
+ // Handle PowerKey DoubleClick logic here
+ }
+
+ /*注册电源键的双击事件*/
+ bool RebootModel::RegisterPowerKeyDoubleClickEvent(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterPowerKeyDoubleClickEvent");
+ // Register PowerKey DoubleClick event here
+ return true;
+ }
+
+ static void HandleFuncKeyOnClick(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnKeyDoubleClick_Callback");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleFuncKeyOnClick");
+
const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ if (!display_api)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+ return;
+ }
+
if (display_api->get_screen_state() == SCREEN_ON)
{
- // 切换到主题样式界面
- NativeAbility::GetInstance().EnterSlice(VIEW_THEME_STYLE);
- //NativeAbility::GetInstance().ChangeSlice(VIEW_SET_DESKTOP);
+ AiModelsModel &aiModelsModel = AiModelsModel::GetInstance();
+ if (!aiModelsModel.ChangeAiModel())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to change AI model");
+ }
+ }
+ else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Screen is not on, skipping AI model change");
}
+ }
+
+ /*注册功能键的单击事件*/
+ bool RebootModel::RegisterFuncKeyClickEvent(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterFuncKeyClickEvent");
+ int32_t ret = uapi_button_register_event_cb(HandleFuncKeyOnClick, BUTTON1_CLICKUP);
+ if (ret != ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register FuncKey Click Event error, ret = %d", ret);
+ return false;
+ }
+ return true;
+ }
- return;
+ static void HandleFuncKeyDoubleClick(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKeyDoubleClick");
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ if (!display_api)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+ return;
+ }
+ if (display_api->get_screen_state() == SCREEN_ON)
+ {
+ // 切换到显示方式界面
+ NativeAbility::GetInstance().EnterSlice(VIEW_AI_MODELS);
+ }
+ else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Screen is not on, skipping Slice change");
+ }
}
- /*
- * @brief 注册双击事件
- * @return 注册成功返回true,反之返回false
- */
- bool RebootModel::RegisterDoubleClickEvents(void)
+ /*注册功能键双击事件*/
+ bool RebootModel::RegisterFuncKeyDoubleClickEvent(void)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterDoubleClickEvents");
- int32_t ret = uapi_button_register_event_cb(OnKeyDoubleClick_Callback, BUTTON1_CLICKUP_2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterFuncKeyDoubleClickEvent");
+ int32_t ret = uapi_button_register_event_cb(HandleFuncKeyDoubleClick, BUTTON1_CLICKUP_2);
if (ret != ERRCODE_SUCC)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register DoubleClick Events err,ret = %d", ret);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register FuncKey DoubleClick Event error, ret = %d", ret);
return false;
}
return true;
}
- // 注册按键事件
- void RebootModel::RegisterKeyEvents(void)
+ void RebootModel::RegisterAllKeyEvents(void)
{
- RegisterLongPressEvents();
- RegisterDoubleClickEvents();
+ RegisterPowerKeyDoubleClickEvent();
+ RegisterPowerKeyLongPressEvent();
+ RegisterFuncKeyClickEvent();
+ RegisterFuncKeyDoubleClickEvent();
}
}
\ No newline at end of file
void Recording_StartTimer(uint32_t interval);
void Recording_StopTimer(void);
char *DisplayRecordDuration(void);
- const char * GetRecordDirectory() const;
+ const char *GetRecordDirectory() const;
+
private:
RecordingModel();
RecordingModel(const RecordingModel &) = delete;
std::vector<RecordingListItem> Recordings; // 存放录音信息的动态数组
std::string recordDuration; // 录音时长
int index; // 保存被点击录音的下标
- std::string yyyymmhhh_date; // 保存年月日时间
+ char *yyyymmhhh_date; // 保存年月日时间
std::string TotalRecordDuration; // 保存录音的总时长
std::string RecordingTimeAndDuration; // 录音日期和录音时长
};
void RecordingModel::InitRecordingListItem(void)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem");
- yyyymmhhh_date = uapi_get_local_yyyymmdd_date(); // 获取日期
+ // 获取日期
+ char *yyyymmhhh_date_new = uapi_get_local_yyyymmdd_date();
+ if (yyyymmhhh_date_new == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get local date");
+ return; // 或者进行适当的错误处理
+ }
+ // 释放之前分配的日期字符串内存(如果之前有)
+ if (yyyymmhhh_date != nullptr)
+ {
+ free(yyyymmhhh_date);
+ }
+ // 更新日期字符串成员
+ yyyymmhhh_date = yyyymmhhh_date_new;
RecordingMp3FileCount = 0;
if (!fileNames.empty())
{
// 对 Recordings 数组进行操作
for (int i = 0; i < RecordingMp3FileCount; i++)
{
- Recordings.push_back({i, fileNames[i].c_str(), "09:51", yyyymmhhh_date.c_str()});
+ Recordings.push_back({i, fileNames[i].c_str(), "09:51", yyyymmhhh_date});
}
}
}
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:fa5149094c14526b56913b4267664319b80efaaa2c25b502efbc040bfcfe823e
+size 9624
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:88c0f9a3719468cfab7a7396d43edaba4a1ce2b313e0e1f95833f0ef0032f52b
+size 77544
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b091fbb1ad5c7188b4a2e0348fedc8a97cc37b446068021db7ab5bc2144dad8
+size 9624
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1b1d55d2cdecc4310e0c1ac70cd87d3fb72da284d54b61a82dc2c7abac22e2c
+size 9624
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:2edeb79f68820099d597ccfbeabd81466a2e5dec856792fa6cdc5cc5e3130e41
+size 9624
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:f08808b0413214c93e9f596a4bbfd7103ec7b2f592c5aba308792951969ee07f
+size 888
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2d49375658ab31058d0190983d0594d9b3492dcc4ceca3db889e6a17def56a7
+size 8984
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:2d3243a22c2a00ee51eecd8e04e2549a0b16d933026dd6fe1fa119d29fa03f4b
+size 9624
STR_CONNECT_TIMEOUT = 468,\r
STR_PLEASE_RESTART_CHAT = 469,\r
STR_CONTINUE_CHAT = 470,\r
- STR_MAX_ID = 471,\r
+ STR_AIMODELS_DOUBAO = 471,\r
+ STR_AIMODES_WENXINYIYAN = 472,\r
+ STR_AIMODES_KIMI = 473,\r
+ STR_AIMODES_CHATGPT = 474,\r
+ STR_MAX_ID = 475,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {
- LANGUAGE_ID_ZH,\r
LANGUAGE_ID_EN,\r
+ LANGUAGE_ID_ZH,\r
LANGUAGE_ID_MAX\r
}; // UITextLanguageTextId\r
}\r