--- /dev/null
+/*
+ * @Author: Assistant
+ * @Date: 2024-12-19
+ * @Description: OTA Model - 独立的OTA升级数据模型实现
+ */
+#include "ota/include/OtaModel.h"
+#include "wearable_log.h"
+#include "ln_api.h"
+#include "custom_utils.h"
+#include "battery_hal.h"
+#include "battery_service.h"
+#include "custom_runtime.h"
+#include <service/graphic_service.h>
+#include "ota/include/OtaView.h"
+#include "ota/include/OtaUpdatingView.h"
+
+namespace OHOS
+{
+ static OtaModel *g_pOtaModel = nullptr;
+
+ OtaModel::OtaModel()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::OtaModel");
+ g_pOtaModel = this;
+
+ m_otaStatus = 0;
+ m_otaProgress = 0;
+ m_countdownActive = false;
+ m_countdownValue = 0;
+ m_countdownTimer = nullptr;
+ }
+
+ OtaModel::~OtaModel()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::~OtaModel");
+ StopCountdownTimer();
+ g_pOtaModel = nullptr;
+ }
+
+ OtaModel *OtaModel::GetInstance()
+ {
+ if (g_pOtaModel == nullptr) {
+ g_pOtaModel = new OtaModel();
+ }
+ return g_pOtaModel;
+ }
+
+ void OtaModel::SetOtaStatus(int status)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::SetOtaStatus: %d", status);
+ m_otaStatus = status;
+ }
+
+ int OtaModel::GetOtaStatus() const
+ {
+ return m_otaStatus;
+ }
+
+ void OtaModel::SetOtaProgress(int progress)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::SetOtaProgress: %d", progress);
+ m_otaProgress = progress;
+ }
+
+ int OtaModel::GetOtaProgress() const
+ {
+ return m_otaProgress;
+ }
+
+ void OtaModel::SetCountdownActive(bool active)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::SetCountdownActive: %d", active);
+ m_countdownActive = active;
+ }
+
+ bool OtaModel::IsCountdownActive() const
+ {
+ return m_countdownActive;
+ }
+
+ void OtaModel::SetCountdownValue(int value)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::SetCountdownValue: %d", value);
+ m_countdownValue = value;
+ }
+
+ int OtaModel::GetCountdownValue() const
+ {
+ return m_countdownValue;
+ }
+
+ int OtaModel::StartOtaUpdate()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::StartOtaUpdate");
+
+ // 检查网络状态
+ if (!HasNetwork()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OtaModel::StartOtaUpdate: No network");
+ return -1;
+ }
+
+ // 检查电量
+ if (!IsBatterySufficient()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OtaModel::StartOtaUpdate: Low battery");
+ return -2;
+ }
+
+ // 检查内存
+ if (!IsMemorySufficient()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OtaModel::StartOtaUpdate: Insufficient memory");
+ return -3;
+ }
+
+ return 0;
+ }
+ bool OtaModel::HasNetwork() const
+ {
+ // 检查网络连接状态
+ int networkStatus = uapi_dev_runtime_get_cat1_networkstat();
+ return (networkStatus == 1);
+ }
+
+ bool OtaModel::IsBatterySufficient() const
+ {
+ float voltage = 0.0F;
+ int Batteryvalue = 0;
+#ifdef SUPPORT_BATTERY_SERVICE
+ Batteryvalue = battery_get_voltage(&voltage);
+#endif
+ return (Batteryvalue >= 20);
+ }
+
+ bool OtaModel::IsMemorySufficient() const
+ {
+ // 检查内存是否足够(至少100MB)
+ // TODO: 实现实际的内存检查
+ // int freeMemory = get_free_memory();
+ int freeMemory = 200; // 暂时返回200MB可用内存
+ return (freeMemory >= 100);
+ }
+
+ /**
+ * @brief 倒计时定时器回调函数
+ */
+ static void CountdownTimerCallback(uint8_t data)
+ {
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind([]() {
+ OtaModel::GetInstance()->CountdownCallback();
+ }));
+ }
+
+ /**
+ * @brief 启动倒计时定时器
+ * @param startVal 倒计时初始值,默认5秒
+ */
+ void OtaModel::StartCountdownTimer(uint32_t startVal)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::StartCountdownTimer: startVal=%u", startVal);
+
+ // 如果定时器已存在,先停止
+ if (m_countdownTimer != nullptr) {
+ StopCountdownTimer();
+ }
+
+ // 设置倒计时状态
+ m_countdownActive = true;
+ m_countdownValue = (int)startVal;
+
+ // 创建定时器
+ m_countdownTimer = osTimerNew((osTimerFunc_t)CountdownTimerCallback, osTimerPeriodic, nullptr, nullptr);
+ if (m_countdownTimer == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create countdown timer");
+ m_countdownActive = false;
+ return;
+ }
+
+ // 启动定时器,每秒触发一次
+ osStatus_t ret = osTimerStart(m_countdownTimer, 1000);
+ if (ret != osOK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to start countdown timer, ret=%d", ret);
+ osTimerDelete(m_countdownTimer);
+ m_countdownTimer = nullptr;
+ m_countdownActive = false;
+ return;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Countdown timer started: %d seconds", m_countdownValue);
+ }
+
+ /**
+ * @brief 停止倒计时定时器
+ */
+ void OtaModel::StopCountdownTimer()
+ {
+ if (m_countdownTimer != nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::StopCountdownTimer");
+ osTimerStop(m_countdownTimer);
+ osTimerDelete(m_countdownTimer);
+ m_countdownTimer = nullptr;
+ }
+
+ m_countdownActive = false;
+ m_countdownValue = 0;
+ }
+
+ /**
+ * @brief 倒计时回调处理
+ */
+ void OtaModel::CountdownCallback()
+ {
+ if (!m_countdownActive) {
+ return;
+ }
+
+ if (m_countdownValue <= 0) {
+ // 倒计时结束,停止定时器并跳转到升级界面
+ m_countdownActive = false;
+ m_countdownValue = 0;
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA countdown completed, switching to updating view");
+
+ // 跳转到升级中界面
+ if (OtaView::GetInstance()) {
+ do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD, NULL, 0);
+ OtaView::GetInstance()->ChangeView(OtaView::OTA_VIEW_COUNTDOWN, OtaView::OTA_VIEW_UPDATING);
+ }
+
+ // 停止定时器
+ StopCountdownTimer();
+ } else {
+ // 更新倒计时值
+ m_countdownValue--;
+ if (OtaCountdownView::GetInstance()) {
+ OtaCountdownView::GetInstance()->UpdateCountdown(m_countdownValue);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA countdown: %d", m_countdownValue);
+
+ // 这里可以通知UI更新倒计时显示
+ // 如果有倒计时界面的话,可以调用相应的更新方法
+ }
+ }
+ //判断升级结果函数
+ void OtaModel::CheckOtaResult(int status)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::CheckOtaResult");
+ if(status == 3)
+ {
+ OtaView::GetInstance()->ChangeView(OtaView::OTA_VIEW_UPDATING, OtaView::OTA_VIEW_UPDATE_SUCCESS);
+ } else if(status == 4) {
+ OtaView::GetInstance()->ChangeView(OtaView::OTA_VIEW_UPDATING, OtaView::OTA_VIEW_UPDATE_FAILED);
+ }
+ }
+ void OtaModel::UpdateOtaProgress(int progress)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OtaModel::UpdateOtaProgress: %d", progress);
+ OtaUpdatingView::GetInstance()->UpdateProgress(progress);
+ }
+
+
+}