* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/ThunderBirdModel.cpp
*/
-#include "thunderbird/include/ThunderBirdModel.h"
-#include "thunderbird/include/ThunderBirdReminderView.h"
-#include "thunderbird/include/ThunderBirdOtaView.h"
-#include "thunderbird/include/ThunderBirdLullabyView.h"
-#include "thunderbird/include/ThunderBirdMainView.h"
-#include "wearable_log.h"
-#include <sys/time.h>
-#include <service/graphic_service.h>
-#include "wearable_log.h"
-#include "custom_utils.h"
-#include <string.h>
-namespace OHOS
-{
- enum OTA_STATUS
- {
- OTA_STATUS_LOW_BATTERY = 0,
- OTA_STATUS_DOW,
- OTA_STATUS_UPDATING,
- OTA_STATUS_SUCCESS,
- };
- ThunderBirdModel::ThunderBirdModel() {}
- ThunderBirdModel::~ThunderBirdModel() {}
-
- ThunderBirdModel *ThunderBirdModel::GetInstance()
- {
- static ThunderBirdModel instance;
- return &instance;
- }
- // 获取当前时间戳字符串
- std::string ThunderBirdModel::GetCurrentTimeStr()
- {
- uint32_t timeStamp = 0;
- if (uapi_get_timestampe_ss(&timeStamp) != ERRCODE_SUCC)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
- return "----/--/-- \n --/--";
- }
- // 将时间戳转换为 time_t 类型
- time_t rawtime = static_cast<time_t>(timeStamp);
- struct tm *timeinfo = localtime(&rawtime);
-
- if (timeinfo == NULL)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time");
- return "----/--/-- \n --/--";
- }
-
- // 格式化时间为字符串 (HH:MM:SS format)
- char buffer[20]; // 格式: HH:MM:SS
- std::strftime(buffer, sizeof(buffer), "%H:%M", timeinfo);
- return std::string(buffer);
- }
- void ThunderBirdModel::timer_callback_proc()
- {
- ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
- if (view)
- {
- view->UpdateTimeText(GetCurrentTimeStr().c_str());
- }
- }
-
-
-
- /* ---------------------- 状态栏时间刷新定时器 ---------------------- */
- static osTimerId_t g_timer = nullptr;
- /*定时器到期时的处理*/
- static void TimerCallbackProc(uint8_t data)
- {
- // 倒计时
- ThunderBirdModel::GetInstance()->timer_callback_proc();
- ThunderBirdMainView::GetInstance()->updateSignalDisplay();
- ThunderBirdMainView::GetInstance()->UpdateBatteryProcess();
- }
- /*
- * @brief 回调函数
- */
- static void TimerCallback(uint8_t data)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerCallback %d", data);
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(TimerCallbackProc, data));
- }
-
- /*
- * @brief 开启定时器函数
- * @param interval 时间间隔,单位ms
- */
- void ThunderBirdModel::StartTimer(uint32_t interval)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartTimer");
- /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回
- * ------------------------- */
- if (g_timer != nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
- return;
- }
-
- /* --------------------------------- 2.创建定时器
- * -------------------------------- */
- g_timer = osTimerNew((osTimerFunc_t)TimerCallback, osTimerPeriodic,
- nullptr, nullptr);
- // 检查定时器创建是否成功
- if (g_timer == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
- return;
- }
-
- /* ----------------------------- 3.将毫秒转换为系统时钟节拍数
- * ---------------------------- */
- /* --------------------------------- 4.启动定时器
- * -------------------------------- */
- osStatus_t ret = osTimerStart(g_timer, interval);
- /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为
- * nullptr -------------------- */
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "osTimerDelete failed, ret = %lx!!", ret);
- if (g_timer != nullptr)
- {
- ret = osTimerDelete(g_timer);
- }
- g_timer = nullptr;
- return;
- }
- }
- /*
- * @brief 停止定时器
- */
- void ThunderBirdModel::StopTimer(void)
- {
- // 检查定时器是否存在
- if (g_timer != nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::BP_StopTimer");
- osTimerStop(g_timer);
- // 删除定时器并置为 nullptr
- osStatus_t ret = osTimerDelete(g_timer);
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "osTimerDelete failed, ret = %lx!!", ret);
- }
- g_timer = nullptr;
- }
- }
-
- /*----------------------提醒界面定时器----------------------------------*/
- static osTimerId_t g_reminderHideTimer = nullptr;
- static void ReminderHideTimerCallbackProc(uint8_t data)
- {
- (void)data;
- auto *reminder = ThunderBirdReminderView::GetInstance();
- if (reminder != nullptr)
- {
- reminder->HideAll();
- }
- int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
- int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentView = %d, currentSubView = %d", currentView, currentSubView);
- // 隐藏后切回之前的界面
- // auto *mainv = ThunderBirdReminderView::GetInstance();
- // if (mainv != nullptr)//判断条件需要修改
- // {
- // mainv->Show(-1);
- // }
- }
- static void ReminderHideTimerCallback(uint8_t data)
- {
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(ReminderHideTimerCallbackProc, data));
- }
- void ThunderBirdModel::StartReminderHideTimer(uint32_t intervalMs)
- {
- if (g_reminderHideTimer != nullptr)
- {
- osTimerStop(g_reminderHideTimer);
- osStatus_t ret = osTimerDelete(g_reminderHideTimer);
- (void)ret;
- g_reminderHideTimer = nullptr;
- }
- g_reminderHideTimer = osTimerNew((osTimerFunc_t)ReminderHideTimerCallback, osTimerOnce, nullptr, nullptr);
- if (g_reminderHideTimer == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer new timer failed!!");
- return;
- }
- osStatus_t ret = osTimerStart(g_reminderHideTimer, intervalMs);
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer start failed, ret = %lx!!", ret);
- osTimerDelete(g_reminderHideTimer);
- g_reminderHideTimer = nullptr;
- }
- auto *reminder = ThunderBirdReminderView::GetInstance();//先隐藏全部提醒界面
- if (reminder != nullptr)
- {
- reminder->HideAll();
- }
- }
-
- // ---------------------- OTA 倒计时定时器(5 -> 1,每步1秒) ----------------------
- static osTimerId_t g_otaCountdownTimer = nullptr;
- static int g_otaCountdownValue = 0;
- static void OtaCountdownTimerProc(uint8_t data)
- {
- (void)data;
- if (g_otaCountdownValue < 1)
- {
- // 停止并删除
- if (g_otaCountdownTimer != nullptr)
- {
- osTimerStop(g_otaCountdownTimer);
- osTimerDelete(g_otaCountdownTimer);
- g_otaCountdownTimer = nullptr;
- }
- g_otaCountdownValue = 0;
- //自动跳转到开始OTA界面
- ThunderBirdMainView::GetInstance()->ChangeView(THUNDERBIRD_OTAVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING);
- return;
-
-
- }
- g_otaCountdownValue -= 1;
- GraphicService::GetInstance()->PostGraphicEvent([](){
- if (ThunderBirdOtaView::GetInstance())
- {
- ThunderBirdOtaView::GetInstance()->UpdateCountdown(g_otaCountdownValue);
- }
- });
- }
- static void OtaCountdownTimerCb(uint8_t data)
- {
- OtaCountdownTimerProc(data);
- }
- void ThunderBirdModel::StartOtaCountdown(uint32_t startVal)
- {
- // 范围保护
- if (startVal < 1) { startVal = 1; }
- if (startVal > 5) { startVal = 5; }
- // 先停旧定时器
- if (g_otaCountdownTimer != nullptr)
- {
- osTimerStop(g_otaCountdownTimer);
- osTimerDelete(g_otaCountdownTimer);
- g_otaCountdownTimer = nullptr;
- }
- g_otaCountdownValue = (int)startVal;
- // 立即刷新一次当前值
- if (ThunderBirdOtaView::GetInstance())
- {
- ThunderBirdOtaView::GetInstance()->UpdateCountdown(g_otaCountdownValue);
- }
- // 创建1s周期定时器
- uint32_t oneSecond = 1000;
- g_otaCountdownTimer = osTimerNew((osTimerFunc_t)OtaCountdownTimerCb, osTimerPeriodic, nullptr, nullptr);
- if (g_otaCountdownTimer == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartOtaCountdown new timer failed!!");
- return;
- }
- osStatus_t ret = osTimerStart(g_otaCountdownTimer, oneSecond);
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartOtaCountdown start failed, ret = %lx!!", ret);
- osTimerDelete(g_otaCountdownTimer);
- g_otaCountdownTimer = nullptr;
- }
- }
- void ThunderBirdModel::StopOtaCountdown(void)
- {
- if (g_otaCountdownTimer != nullptr)
- {
- osTimerStop(g_otaCountdownTimer);
- osTimerDelete(g_otaCountdownTimer);
- g_otaCountdownTimer = nullptr;
- }
- g_otaCountdownValue = 0;
- }
+ #include "thunderbird/include/ThunderBirdModel.h"
+ #include "thunderbird/include/ThunderBirdReminderView.h"
+ #include "thunderbird/include/ThunderBirdOtaView.h"
+ #include "thunderbird/include/ThunderBirdLullabyView.h"
+ #include "thunderbird/include/ThunderBirdMainView.h"
+ #include "wearable_log.h"
+ #include <sys/time.h>
+ #include <service/graphic_service.h>
+ #include "wearable_log.h"
+ #include "custom_utils.h"
+ #include <string.h>
+ #include <algorithm>
+ #include <ctime>
+ #include "custom_runtime.h"
+ #include "ln_api.h"
+ namespace OHOS
+ {
+ enum OTA_STATUS
+ {
+ OTA_STATUS_LOW_BATTERY = 0,
+ OTA_STATUS_DOW,
+ OTA_STATUS_UPDATING,
+ OTA_STATUS_SUCCESS,
+ };
+ static bool g_isRecording = false;//是否正在录音
+ ThunderBirdModel::ThunderBirdModel() : m_nextReminderId(1)
+ {
+ // 初始化时加载提醒数据
+ // LoadRemindersFromFile();
+ }
+
+ ThunderBirdModel::~ThunderBirdModel()
+ {
+ // 析构时保存提醒数据
+ // SaveRemindersToFile();
+ }
-
- // ---------------------- 通用计时加一定时器(0 -> targetSeconds,每步1秒) ----------------------
- static osTimerId_t g_countUpTimer = nullptr;
- static int g_countUpTargetSeconds = 0;
- static int g_countUpValue = 0;
- static void CountUpTimerProc(uint8_t data)
- {
- (void)data;
- if (g_countUpValue >= g_countUpTargetSeconds)
- {
- if (g_countUpTimer != nullptr)
- {
- osTimerStop(g_countUpTimer);
- osTimerDelete(g_countUpTimer);
- g_countUpTimer = nullptr;
- }
- return;
- }
- g_countUpValue += 1;
- ThunderBirdLullabyView::GetInstance()->UpdateTimeText(g_countUpValue, g_countUpTargetSeconds);
- }
- static void CountUpTimerCb(uint8_t data)
- {
- CountUpTimerProc(data);
- }
- void ThunderBirdModel::StartCountUpTimer(uint32_t targetSeconds)
- {
- // 参数保护:至少为1秒
- if (targetSeconds < 1) { targetSeconds = 1; }
- // 停止旧定时器
- if (g_countUpTimer != nullptr)
- {
- osTimerStop(g_countUpTimer);
- osStatus_t ret = osTimerDelete(g_countUpTimer);
- (void)ret;
- g_countUpTimer = nullptr;
- }
- // 初始化
- g_countUpTargetSeconds = (int)targetSeconds;
- g_countUpValue = 0;
- // 创建1s周期定时器
- uint32_t oneSecond = 1000;
- g_countUpTimer = osTimerNew((osTimerFunc_t)CountUpTimerCb, osTimerPeriodic, nullptr, nullptr);
- if (g_countUpTimer == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCountUpTimer new timer failed!!");
- return;
- }
- osStatus_t ret = osTimerStart(g_countUpTimer, oneSecond);
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCountUpTimer start failed, ret = %lx!!", ret);
- osTimerDelete(g_countUpTimer);
- g_countUpTimer = nullptr;
- }
- }
- void ThunderBirdModel::StopCountUpTimer(void)
- {
- if (g_countUpTimer != nullptr)
- {
- osTimerStop(g_countUpTimer);
- osStatus_t ret = osTimerDelete(g_countUpTimer);
- if (ret != osOK)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopCountUpTimer delete failed, ret = %lx!!", ret);
- }
- g_countUpTimer = nullptr;
- }
- }
- int ThunderBirdModel::GetCountUpValue() const
- {
- return g_countUpValue;
- }
-
-}
+ ThunderBirdModel *ThunderBirdModel::GetInstance()
+ {
+ static ThunderBirdModel instance;
+ return &instance;
+ }
+ // 获取当前时间戳字符串
+ std::string ThunderBirdModel::GetCurrentTimeStr()
+ {
+ uint32_t timeStamp = 0;
+ if (uapi_get_timestampe_ss(&timeStamp) != ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+ return "----/--/-- \n --/--";
+ }
+ // 将时间戳转换为 time_t 类型
+ time_t rawtime = static_cast<time_t>(timeStamp);
+ struct tm *timeinfo = localtime(&rawtime);
+
+ if (timeinfo == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time");
+ return "----/--/-- \n --/--";
+ }
+
+ // 格式化时间为字符串 (HH:MM:SS format)
+ char buffer[20]; // 格式: HH:MM:SS
+ std::strftime(buffer, sizeof(buffer), "%H:%M", timeinfo);
+ return std::string(buffer);
+ }
+ void ThunderBirdModel::timer_callback_proc()
+ {
+ ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
+ if (view)
+ {
+ view->UpdateTimeText(GetCurrentTimeStr().c_str());
+ }
+ }
+
+
+
+ /* ---------------------- 状态栏时间刷新定时器 ---------------------- */
+ static osTimerId_t g_timer = nullptr;
+ /*定时器到期时的处理*/
+ static void TimerCallbackProc(uint8_t data)
+ {
+ // 倒计时
+ ThunderBirdModel::GetInstance()->timer_callback_proc();
+ ThunderBirdMainView::GetInstance()->updateSignalDisplay();
+ ThunderBirdMainView::GetInstance()->UpdateBatteryProcess();
+ }
+ /*
+ * @brief 回调函数
+ */
+ static void TimerCallback(uint8_t data)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerCallback %d", data);
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(TimerCallbackProc, data));
+ }
+
+ /*
+ * @brief 开启定时器函数
+ * @param interval 时间间隔,单位ms
+ */
+ void ThunderBirdModel::StartTimer(uint32_t interval)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartTimer");
+ /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回
+ * ------------------------- */
+ if (g_timer != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+ return;
+ }
+
+ /* --------------------------------- 2.创建定时器
+ * -------------------------------- */
+ g_timer = osTimerNew((osTimerFunc_t)TimerCallback, osTimerPeriodic,
+ nullptr, nullptr);
+ // 检查定时器创建是否成功
+ if (g_timer == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+ return;
+ }
+
+ /* ----------------------------- 3.将毫秒转换为系统时钟节拍数
+ * ---------------------------- */
+ /* --------------------------------- 4.启动定时器
+ * -------------------------------- */
+ osStatus_t ret = osTimerStart(g_timer, interval);
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为
+ * nullptr -------------------- */
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "osTimerDelete failed, ret = %lx!!", ret);
+ if (g_timer != nullptr)
+ {
+ ret = osTimerDelete(g_timer);
+ }
+ g_timer = nullptr;
+ return;
+ }
+ }
+ /*
+ * @brief 停止定时器
+ */
+ void ThunderBirdModel::StopTimer(void)
+ {
+ // 检查定时器是否存在
+ if (g_timer != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::BP_StopTimer");
+ osTimerStop(g_timer);
+ // 删除定时器并置为 nullptr
+ osStatus_t ret = osTimerDelete(g_timer);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "osTimerDelete failed, ret = %lx!!", ret);
+ }
+ g_timer = nullptr;
+ }
+ }
+
+ /*----------------------提醒界面定时器----------------------------------*/
+ static osTimerId_t g_reminderHideTimer = nullptr;
+ static void ReminderHideTimerCallbackProc(uint8_t data)
+ {
+ (void)data;
+ auto *reminder = ThunderBirdReminderView::GetInstance();
+ if (reminder != nullptr)
+ {
+ reminder->HideAll();
+ }
+ int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
+ int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentView = %d, currentSubView = %d", currentView, currentSubView);
+ // 隐藏后切回之前的界面
+ // auto *mainv = ThunderBirdReminderView::GetInstance();
+ // if (mainv != nullptr)//判断条件需要修改
+ // {
+ // mainv->Show(-1);
+ // }
+ }
+ static void ReminderHideTimerCallback(uint8_t data)
+ {
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(ReminderHideTimerCallbackProc, data));
+ }
+ void ThunderBirdModel::StartReminderHideTimer(uint32_t intervalMs)
+ {
+ if (g_reminderHideTimer != nullptr)
+ {
+ osTimerStop(g_reminderHideTimer);
+ osStatus_t ret = osTimerDelete(g_reminderHideTimer);
+ (void)ret;
+ g_reminderHideTimer = nullptr;
+ }
+ g_reminderHideTimer = osTimerNew((osTimerFunc_t)ReminderHideTimerCallback, osTimerOnce, nullptr, nullptr);
+ if (g_reminderHideTimer == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer new timer failed!!");
+ return;
+ }
+ osStatus_t ret = osTimerStart(g_reminderHideTimer, intervalMs);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer start failed, ret = %lx!!", ret);
+ osTimerDelete(g_reminderHideTimer);
+ g_reminderHideTimer = nullptr;
+ }
+ auto *reminder = ThunderBirdReminderView::GetInstance();//先隐藏全部提醒界面
+ if (reminder != nullptr)
+ {
+ reminder->HideAll();
+ }
+ }
+
+ // ---------------------- OTA 倒计时定时器(5 -> 1,每步1秒) ----------------------
+ static osTimerId_t g_otaCountdownTimer = nullptr;
+ static int g_otaCountdownValue = 0;
+ static void OtaCountdownTimerProc(uint8_t data)
+ {
+ (void)data;
+ if (g_otaCountdownValue < 1)
+ {
+ // 停止并删除
+ if (g_otaCountdownTimer != nullptr)
+ {
+ osTimerStop(g_otaCountdownTimer);
+ osTimerDelete(g_otaCountdownTimer);
+ g_otaCountdownTimer = nullptr;
+ }
+ g_otaCountdownValue = 0;
+ //自动跳转到开始OTA界面
+ ThunderBirdMainView::GetInstance()->ChangeView(THUNDERBIRD_OTAVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING);
+ return;
+
+
+ }
+ g_otaCountdownValue -= 1;
+ GraphicService::GetInstance()->PostGraphicEvent([](){
+ if (ThunderBirdOtaView::GetInstance())
+ {
+ ThunderBirdOtaView::GetInstance()->UpdateCountdown(g_otaCountdownValue);
+ }
+ });
+ }
+ static void OtaCountdownTimerCb(uint8_t data)
+ {
+ OtaCountdownTimerProc(data);
+ }
+ void ThunderBirdModel::StartOtaCountdown(uint32_t startVal)
+ {
+ // 范围保护
+ if (startVal < 1) { startVal = 1; }
+ if (startVal > 5) { startVal = 5; }
+ // 先停旧定时器
+ if (g_otaCountdownTimer != nullptr)
+ {
+ osTimerStop(g_otaCountdownTimer);
+ osTimerDelete(g_otaCountdownTimer);
+ g_otaCountdownTimer = nullptr;
+ }
+ g_otaCountdownValue = (int)startVal;
+ // 立即刷新一次当前值
+ if (ThunderBirdOtaView::GetInstance())
+ {
+ ThunderBirdOtaView::GetInstance()->UpdateCountdown(g_otaCountdownValue);
+ }
+ // 创建1s周期定时器
+ uint32_t oneSecond = 1000;
+ g_otaCountdownTimer = osTimerNew((osTimerFunc_t)OtaCountdownTimerCb, osTimerPeriodic, nullptr, nullptr);
+ if (g_otaCountdownTimer == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartOtaCountdown new timer failed!!");
+ return;
+ }
+ osStatus_t ret = osTimerStart(g_otaCountdownTimer, oneSecond);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartOtaCountdown start failed, ret = %lx!!", ret);
+ osTimerDelete(g_otaCountdownTimer);
+ g_otaCountdownTimer = nullptr;
+ }
+ }
+ void ThunderBirdModel::StopOtaCountdown(void)
+ {
+ if (g_otaCountdownTimer != nullptr)
+ {
+ osTimerStop(g_otaCountdownTimer);
+ osTimerDelete(g_otaCountdownTimer);
+ g_otaCountdownTimer = nullptr;
+ }
+ g_otaCountdownValue = 0;
+ }
+
+
+ // ---------------------- 通用计时加一定时器(0 -> targetSeconds,每步1秒) ----------------------
+ static osTimerId_t g_countUpTimer = nullptr;
+ static int g_countUpTargetSeconds = 0;
+ static int g_countUpValue = 0;
+ static void CountUpTimerProc(uint8_t data)
+ {
+ (void)data;
+ if (g_countUpValue >= g_countUpTargetSeconds)
+ {
+ if (g_countUpTimer != nullptr)
+ {
+ osTimerStop(g_countUpTimer);
+ osTimerDelete(g_countUpTimer);
+ g_countUpTimer = nullptr;
+ }
+ return;
+ }
+ g_countUpValue += 1;
+ ThunderBirdLullabyView::GetInstance()->UpdateTimeText(g_countUpValue, g_countUpTargetSeconds);
+ }
+ static void CountUpTimerCb(uint8_t data)
+ {
+ CountUpTimerProc(data);
+ }
+ void ThunderBirdModel::StartCountUpTimer(uint32_t targetSeconds)
+ {
+ // 参数保护:至少为1秒
+ if (targetSeconds < 1) { targetSeconds = 1; }
+ // 停止旧定时器
+ if (g_countUpTimer != nullptr)
+ {
+ osTimerStop(g_countUpTimer);
+ osStatus_t ret = osTimerDelete(g_countUpTimer);
+ (void)ret;
+ g_countUpTimer = nullptr;
+ }
+ // 初始化
+ g_countUpTargetSeconds = (int)targetSeconds;
+ g_countUpValue = 0;
+ // 创建1s周期定时器
+ uint32_t oneSecond = 1000;
+ g_countUpTimer = osTimerNew((osTimerFunc_t)CountUpTimerCb, osTimerPeriodic, nullptr, nullptr);
+ if (g_countUpTimer == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCountUpTimer new timer failed!!");
+ return;
+ }
+ osStatus_t ret = osTimerStart(g_countUpTimer, oneSecond);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCountUpTimer start failed, ret = %lx!!", ret);
+ osTimerDelete(g_countUpTimer);
+ g_countUpTimer = nullptr;
+ }
+ }
+ void ThunderBirdModel::StopCountUpTimer(void)
+ {
+ if (g_countUpTimer != nullptr)
+ {
+ osTimerStop(g_countUpTimer);
+ osStatus_t ret = osTimerDelete(g_countUpTimer);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopCountUpTimer delete failed, ret = %lx!!", ret);
+ }
+ g_countUpTimer = nullptr;
+ }
+ }
+ int ThunderBirdModel::GetCountUpValue() const
+ {
+ return g_countUpValue;
+ }
+ // ==================== 开机操作函数 ====================
+ int ThunderBirdModel::StartBootOperation()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartBootOperation");
+ //绑定设备提示 > 配置更新成功>OTA升级>其他(按触发时间先后提示)
+ /*************************用户是否绑定*************************/
+ do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_GET_USER_ID, nullptr, 0);//获取用户是否绑定
+ if(uapi_ln_is_device_bound() == 0)//未绑定
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartBootOperation: 未绑定");
+ ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_1);
+ return 0;
+ }
+ else if(uapi_ln_is_device_bound() == 1)//已绑定
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartBootOperation: 已绑定");
+ ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
+ return 1;
+ }
+
+ /*************************更新角色配置*************************/
+ //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_GET_CHARACTER, nullptr, 0);//获取角色配置
+
+
+ /*************************OTA升级*************************/
+ do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_GET_TASK, nullptr, 0);//获取是否需要OTA升级
+ if(uapi_ln_ota_get_update_type() == 1)//强制OTA升级
+ {
+ ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW);
+ return 3;
+ }
+ if(uapi_ln_ota_get_update_type() == 0)//可选OTA升级
+ {
+ ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL);
+ //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD, NULL, 0);
+ return 5;
+ }
+ return -1;
+ }
+
+ // ==================== 新手引导相关函数 ====================
+ ThunderBirdModel::BindingStatus ThunderBirdModel::CheckBindingStatus()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::CheckBindingStatus");
+
+ // TODO: 实现实际的绑定状态检查逻辑
+ // 这里需要根据实际的网络状态和设备绑定状态来判断
+ //if(uapi_dev_runtime_get_cat1_signal() == 99)
+ // 模拟实现 - 实际应该检查网络连接和绑定状态
+ // 返回未绑定状态作为默认值
+ return BindingStatus::NOT_BOUND;
+ }
+ #ifdef __cplusplus
+ extern "C"
+ {
+ #endif
+ int32_t AudioCaptureSample(int32_t argc, const char *argv[]);
+
+ #ifdef __cplusplus
+ };
+ #endif
+ // ==================== 对话相关函数 ====================
+ bool ThunderBirdModel::StartRecording()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording");
+
+ // TODO: 实现开始录音逻辑
+ // 1. 初始化录音设备
+ // 2. 开始录音
+ // 3. 设置录音状态
+ if(g_isRecording == true)
+ {
+ return false;
+ }
+ g_isRecording = true;//设置录音状态
+ std::string audioPath = "/user/123.mp3";//故事选择的录音文件路径
+ // uapi_ln_get_story_choose_audio_path();
+ // audioPath = "/user/audio/test.pcm";//修改为实际的录音文件路径
+
+ // // 确保目录存在
+ //std::string dirPath = "/user/123.mp3";
+ // 这里可以添加目录创建逻辑
+
+ const char *defaultArgs[6] = {"01", "mp3", "16000", "1", "16", audioPath.c_str()};
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 开始录音,路径: %s", audioPath.c_str());
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 参数 - 格式: %s, 采样率: %s, 声道: %s, 位宽: %s",
+ defaultArgs[1], defaultArgs[2], defaultArgs[3], defaultArgs[4]);
+
+ int32_t ret = AudioCaptureSample(6, defaultArgs);
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: AudioCaptureSample 失败,返回值: %d", ret);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 可能的原因 - 音频设备被占用、权限不足或音频服务未初始化");
+ g_isRecording = false;
+ return false;
+ }
+
+ return true; // 模拟成功
+ }
+
+ bool ThunderBirdModel::StopRecording()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StopRecording");
+
+ // TODO: 实现停止录音逻辑
+ // 1. 停止录音设备
+ // 2. 保存录音文件
+ // 3. 清理录音状态
+ if(g_isRecording == false)
+ {
+ return false;
+ }
+ g_isRecording = false;//设置录音状态
+ int32_t argc = 1;
+ uint8_t *argv = (uint8_t *)"stop";
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StopRecording: 停止录音");
+ int32_t ret = AudioCaptureSample(argc, (const char **)&argv);
+ if (ret != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StopRecording: AudioCaptureSample 停止失败,返回值: %d", ret);
+ return false;
+ }
+
+ return true; // 模拟成功
+ }
+
+ bool ThunderBirdModel::SendRecording()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SendRecording");
+
+ // TODO: 实现发送录音逻辑
+ // 1. 读取录音文件
+ // 2. 通过网络发送到服务器
+ // 3. 等待服务器响应
+ //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM, NULL, 0);//开始对话
+ do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_STORY_CHOOSE, NULL, 0);//选择故事
+
+ return true; // 模拟成功
+ }
+
+ bool ThunderBirdModel::ReceiveAnswer()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ReceiveAnswer");
+
+ // TODO: 实现接收回答逻辑
+ // 1. 监听服务器响应
+ // 2. 解析回答数据
+ // 3. 更新对话状态
+ if(g_isRecording == false && 1/*服务器相应*/)
+ {
+
+ }
+ return true; // 模拟成功
+ }
+
+ std::string ThunderBirdModel::GetConversationText()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::GetConversationText");
+
+ // TODO: 实现获取对话文本逻辑
+ // 1. 从缓存或存储中获取对话文本
+ // 2. 格式化文本
+ // 3. 返回文本内容
+
+ return "模拟对话文本"; // 模拟返回
+ }
+
+ bool ThunderBirdModel::EndConversation()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::EndConversation");
+
+ // TODO: 实现结束对话逻辑
+ // 1. 清理对话状态
+ // 2. 保存对话记录
+ // 3. 释放相关资源
+
+ return true; // 模拟成功
+ }
+
+ // ==================== 哄睡模式相关函数 ====================
+ bool ThunderBirdModel::StartLullabyMode()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartLullabyMode");
+
+ // TODO: 实现开始哄睡模式逻辑
+ // 1. 初始化哄睡模式状态
+ // 2. 开始播放哄睡音频
+ // 3. 设置定时器
+ // 4. 更新UI状态
+
+ return true; // 模拟成功
+ }
+
+ bool ThunderBirdModel::StopLullabyMode()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StopLullabyMode");
+
+ // TODO: 实现停止哄睡模式逻辑
+ // 1. 停止播放哄睡音频
+ // 2. 清理哄睡模式状态
+ // 3. 停止相关定时器
+ // 4. 更新UI状态
+
+ return true; // 模拟成功
+ }
+
+ bool ThunderBirdModel::IsLullabyModeActive() const
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsLullabyModeActive");
+
+ // TODO: 实现检查哄睡模式是否激活的逻辑
+ // 1. 检查哄睡模式状态标志
+ // 2. 检查音频播放状态
+ // 3. 返回当前状态
+
+ return false; // 模拟未激活
+ }
+
+ // ==================== 事项提醒相关函数 ====================
+ bool ThunderBirdModel::AddReminder(const std::string& content, uint32_t timestamp)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::AddReminder: %s, timestamp: %u",
+ content.c_str(), timestamp);
+
+ // 验证输入参数
+ if (content.empty() || content.length() >= 255) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid reminder content");
+ return false;
+ }
+
+ if (timestamp == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp");
+ return false;
+ }
+
+ // 创建提醒对象
+ ReminderData reminder;
+ reminder.id = GenerateReminderId();
+ reminder.timestamp = timestamp;
+ reminder.isActive = true;
+ reminder.createTime = static_cast<uint32_t>(time(nullptr));
+
+ // 复制内容(确保不超过255字符)
+ strncpy(reminder.content, content.c_str(), sizeof(reminder.content) - 1);
+ reminder.content[sizeof(reminder.content) - 1] = '\0';
+
+ // 添加到列表
+ m_reminders.push_back(reminder);
+
+ // 保存到文件
+ if (!SaveRemindersToFile()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to save reminders to file");
+ // 从列表中移除(回滚)
+ m_reminders.pop_back();
+ return false;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Added reminder with ID: %u", reminder.id);
+ return true;
+ }
+
+ bool ThunderBirdModel::RemoveReminder(uint32_t reminderId)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::RemoveReminder: %u", reminderId);
+
+ // 查找提醒
+ auto it = std::find_if(m_reminders.begin(), m_reminders.end(),
+ [reminderId](const ReminderData& reminder) {
+ return reminder.id == reminderId;
+ });
+
+ if (it == m_reminders.end()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "Reminder not found: %u", reminderId);
+ return false;
+ }
+
+ // 从列表中删除
+ m_reminders.erase(it);
+
+ // 保存到文件
+ if (!SaveRemindersToFile()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to save reminders to file after removal");
+ return false;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Removed reminder with ID: %u", reminderId);
+ return true;
+ }
+
+ bool ThunderBirdModel::UpdateReminder(uint32_t reminderId, const std::string& content, uint32_t timestamp)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::UpdateReminder: %u, %s, %u",
+ reminderId, content.c_str(), timestamp);
+
+ // 验证输入参数
+ if (content.empty() || content.length() >= 255) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid reminder content");
+ return false;
+ }
+
+ if (timestamp == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp");
+ return false;
+ }
+
+ // 查找提醒
+ auto it = std::find_if(m_reminders.begin(), m_reminders.end(),
+ [reminderId](const ReminderData& reminder) {
+ return reminder.id == reminderId;
+ });
+
+ if (it == m_reminders.end()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "Reminder not found: %u", reminderId);
+ return false;
+ }
+
+ // 更新提醒内容和时间
+ it->timestamp = timestamp;
+ strncpy(it->content, content.c_str(), sizeof(it->content) - 1);
+ it->content[sizeof(it->content) - 1] = '\0';
+
+ // 保存到文件
+ if (!SaveRemindersToFile()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to save reminders to file after update");
+ return false;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Updated reminder with ID: %u", reminderId);
+ return true;
+ }
+
+ std::vector<std::string> ThunderBirdModel::GetReminders()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::GetReminders");
+
+ // TODO: 实现获取提醒列表逻辑
+ // 1. 从存储系统读取所有提醒
+ // 2. 按时间排序
+ // 3. 格式化为字符串列表
+ // 4. 返回提醒列表
+
+ std::vector<std::string> reminders;
+ for (const auto& reminder : m_reminders) {
+ if (reminder.isActive) {
+ char timeStr[32];
+ time_t time = static_cast<time_t>(reminder.timestamp);
+ struct tm* timeinfo = localtime(&time);
+ if (timeinfo) {
+ strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M", timeinfo);
+ std::string reminderStr = std::string(timeStr) + ": " + reminder.content;
+ reminders.push_back(reminderStr);
+ }
+ }
+ }
+ return reminders;
+ }
+
+ // ==================== 文件存储相关函数 ====================
+ std::string ThunderBirdModel::GetReminderFilePath() const
+ {
+ // 返回提醒数据文件的完整路径
+ return "/user/reminders/reminder_data.bin";
+ }
+
+ uint32_t ThunderBirdModel::GenerateReminderId()
+ {
+ return m_nextReminderId++;
+ }
+
+ bool ThunderBirdModel::SaveRemindersToFile()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SaveRemindersToFile");
+
+ std::string filePath = GetReminderFilePath();
+
+ // 创建目录(如果不存在)
+ std::string dirPath = filePath.substr(0, filePath.find_last_of('/'));
+ // TODO: 实现目录创建逻辑
+
+ // 打开文件进行二进制写入
+ std::ofstream file(filePath, std::ios::binary);
+ if (!file.is_open()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing: %s", filePath.c_str());
+ return false;
+ }
+
+ // 写入提醒数量
+ uint32_t count = static_cast<uint32_t>(m_reminders.size());
+ file.write(reinterpret_cast<const char*>(&count), sizeof(count));
+
+ // 写入每个提醒数据
+ for (const auto& reminder : m_reminders) {
+ file.write(reinterpret_cast<const char*>(&reminder), sizeof(ReminderData));
+ }
+
+ file.close();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Saved %u reminders to file", count);
+ return true;
+ }
+
+ bool ThunderBirdModel::LoadRemindersFromFile()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::LoadRemindersFromFile");
+
+ std::string filePath = GetReminderFilePath();
+
+ // 打开文件进行二进制读取
+ std::ifstream file(filePath, std::ios::binary);
+ if (!file.is_open()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "Reminder file not found: %s", filePath.c_str());
+ return false; // 文件不存在不算错误
+ }
+
+ // 清空现有数据
+ m_reminders.clear();
+
+ // 读取提醒数量
+ uint32_t count = 0;
+ file.read(reinterpret_cast<char*>(&count), sizeof(count));
+
+ if (count > 1000) { // 防止异常数据
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid reminder count: %u", count);
+ return false;
+ }
+
+ // 读取每个提醒数据
+ for (uint32_t i = 0; i < count; i++) {
+ ReminderData reminder;
+ file.read(reinterpret_cast<char*>(&reminder), sizeof(ReminderData));
+
+ // 验证数据有效性
+ if (reminder.id > 0 && reminder.timestamp > 0) {
+ m_reminders.push_back(reminder);
+ // 更新下一个ID
+ if (reminder.id >= m_nextReminderId) {
+ m_nextReminderId = reminder.id + 1;
+ }
+ }
+ }
+
+ file.close();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Loaded %u reminders from file", static_cast<uint32_t>(m_reminders.size()));
+ return true;
+ }
+
+ /*
+ 1、新手引导
+ 判断是否绑定 返回,0:绑定,1:未绑定;2:没有网络 使用枚举
+ 2、对话
+ 2.1 录音
+ 开始录音接口
+ 停止录音接口
+ 2.2 发送录音接口
+ 2.3 接收回答数据
+ 2.4 对话文本获取接口
+ 2.5 对话结束接口
+ 3、哄睡模式
+ 4、事项提醒
+ */
+ }
+
\ No newline at end of file