/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved. * * Description: * * Author: wuchangxin * * Create: 2024-6-23 *--------------------------------------------------------------------------*/ #include "TjdUiAppBloodOxygenPresenter.h" #include "TjdUiAppBloodOxygenView.h" #include "TjdUiAppMainView.h" #include "TjdUiRegisterManager.h" #include "TjdUiScreenManage.h" #include "hal_tick.h" #include "los_typedef.h" #include "motor.h" #include "power_display_service.h" #include "rtc_api.h" #include "service_hrsensor.h" #include "sql_fit.h" #include "sql_setting.h" #include "sys_config.h" #include "ui_screennotify.h" #include #define ENABLE_PRINT_INFO 1 #if ENABLE_PRINT_INFO #define static_print_info(...) sys_ui_log_i(__VA_ARGS__) // 一般信息打印宏控制 #define static_print_warn(...) sys_ui_log_w(__VA_ARGS__) // 警告信息打印一般常开 #define static_print_error(...) sys_ui_log_e(__VA_ARGS__) // 错误信息打印一般常开 #else #define static_print_info(...) #define static_print_warn(...) #define static_print_error(...) #endif #define SPO2_SCREEN_AUTO_OFF_TIME (1000 * 60 * 60) #define SPO2_SWIPEVIEW_ID "swipeContainer_" namespace TJD { TJD_REGIST_NATIVE_MENU(TJD_APP_VIEW_SPO2, TjdUiAppSpO2View, TjdUiAppSpO2Presenter, IMG_MENU_LIST_MENU_SPO2, STR_ID_01); static TjdUiAppSpO2Presenter *g_pv_AppSpO2Presenter = nullptr; TjdUiAppSpO2Presenter::TjdUiAppSpO2Presenter() { g_pv_AppSpO2Presenter = this; } TjdUiAppSpO2Presenter::~TjdUiAppSpO2Presenter() { if (timer_ != nullptr) { delete timer_; timer_ = nullptr; } g_pv_AppSpO2Presenter = nullptr; } TjdUiAppSpO2Presenter *TjdUiAppSpO2Presenter::GetInstance(void) { return g_pv_AppSpO2Presenter; } void TjdUiAppSpO2Presenter::Notify() { if (timerFlag) { SpO2Process(); } } void TjdUiAppSpO2Presenter::OnStart() { static_print_info("TjdUiAppSpO2Presenter::OnStart..."); TjdUiCommonOnKeyListener::GetInstance()->SetOnKeyActListener(this, KeyModelType::APP_KEY_TYPE); TimeTaskStart(); SetPeriod(1000); } void TjdUiAppSpO2Presenter::OnPause() { Presenter::OnPause(); } void TjdUiAppSpO2Presenter::OnResume() { Presenter::OnResume(); } void TjdUiAppSpO2Presenter::OnStop() { static_print_info("TjdUiAppSpO2Presenter::OnStop..."); TjdUiCommonOnKeyListener::GetInstance()->ClearOnKeyActListener(KeyModelType::APP_KEY_TYPE); TimeTaskStop(); } bool TjdUiAppSpO2Presenter::OnClick(OHOS::UIView &view, const OHOS::ClickEvent &event) { printf("TjdUiAppSpO2Presenter::OnClick animator view [view.GetViewId() = %s] [%s]]\n", view.GetViewId(), TjdUiAppSpO2View::GetInstance()->GetAnimatorView()->GetViewId()); if (view.GetViewId() == std::string(TjdUiAppSpO2View::GetInstance()->GetAnimatorView()->GetViewId())) { TimeTaskStart(); return true; } return false; } void TjdUiAppSpO2Presenter::OnSwipe(OHOS::UISwipeView &view) { static_print_info("swipeView page:%d", view.GetCurrentPage()); } bool TjdUiAppSpO2Presenter::OnKeyAct(OHOS::UIView &view, const OHOS::KeyEvent &event) { if (!TjdUiCommonOnKeyListener::CheckIsExitEvent(event)) { return true; } ExitSpO2View(); return false; } void TjdUiAppSpO2Presenter::TimeTaskStart(void) { if (timerFlag != true) { SpO2ControlHandler(SpO2Action::Start, nullptr); TjdUiScreenManage::SetScreenKeepOnTimeout(SPO2_SCREEN_AUTO_OFF_TIME); timerFlag = true; exitTimerCount_ = 0; refreshStatus = true; OHOS::UIImageAnimatorView *animator = TjdUiAppSpO2View::GetInstance()->GetAnimatorView(); if (animator != nullptr) { if (animator->GetState() == 0) animator->Resume(); } if (TjdUiAppSpO2View::GetInstance()->flickerTimer_) { TjdUiAppSpO2View::GetInstance()->flickerTimer_->Start(); } } } uint8_t TjdUiAppSpO2Presenter::SpO2ControlHandler(SpO2Action action, void *param) { uint8_t ret = 0; service_hrs_api *hrsensorInfo = tjd_service_hrs_get_ops(); hr_api_info_t hr_api_info = {HR_SERVICE_UI_BO, 0xffffffff}; switch (action) { case SpO2Action::Start: needsUpdate_ = true; hrsensorInfo->open(hr_api_info); break; case SpO2Action::Stop: needsUpdate_ = false; hrsensorInfo->close(); break; case SpO2Action::GetStatus: ret = SpO2GetWearStatus(); break; default: break; } return ret; } uint8_t TjdUiAppSpO2Presenter::SpO2GetWearStatus(void) { service_hrs_api *hrsensorInfo = tjd_service_hrs_get_ops(); uint8_t wearStatus = hrsensorInfo->hrs_wear_status(); sys_ui_log_i("wearStatus is %s", wearStatus ? (wearStatus == 1 ? "weared" : "init") : "no wear"); if (wearStatus == 0) { if (refreshStatus && refreshCount++ > 3) { refreshStatus = false; refreshCount = 0; TimeTaskStop(); TjdUiAppSpO2View::GetInstance()->ChangedView(SPO2UNWEAR_VIEW, SPO2SWIPE_VIEW); } return 0; } refreshCount = 0; // 若已配带,刷新计数 if (wearStatus == 1) { return 1; } return 2; } void TjdUiAppSpO2Presenter::TimeTaskStop(void) { if (timerFlag != false) { timerFlag = false; refreshCount = 0; exitTimerCount_ = 0; TjdUiAppSpO2View::spo2WaitTime_ = 0; TjdUiScreenManage::ResetScreenKeepOnTimeout(); SpO2ControlHandler(SpO2Action::Stop, nullptr); OHOS::UIImageAnimatorView *animator = TjdUiAppSpO2View::GetInstance()->GetAnimatorView(); if (animator != nullptr) { animator->Stop(); } if (TjdUiAppSpO2View::GetInstance()->flickerTimer_) { TjdUiAppSpO2View::GetInstance()->flickerTimer_->Stop(); } TjdUiAppSpO2View::GetInstance()->InitRodViewInfo(); TjdUiAppSpO2View::GetInstance()->UpdateRodViewGroup(); } } void TjdUiAppSpO2Presenter::SpO2Process(void) { spo2CurValue = tjd_service_hrsensor_get_cur_spo2value(); // uint8_t *tempArray = nullptr; // sql_fit_get_spo2_daydata(&tempArray); uint32_t index = GetCurTimeIndex(); // uint8_t spo2Value = tempArray[index]; SpO2ControlHandler(SpO2Action::GetStatus, nullptr); printf("TjdUiAppSpO2Presenter::SpO2Process spo2CurValue:%d, index:%d\n", spo2CurValue, index); if (needsUpdate_ && TjdUiAppSpO2View::spo2WaitTime_ >= 10)//5s内先不更新数据 TjdUiAppSpO2View::GetInstance()->UpdateSpO2ViewData(index, spo2CurValue); if (spo2CurValue && exitTimerCount_++ > 5) { TimeTaskStop(); motor_param_t motorParam = {.cycle1_on = 250, .cycle1_off = 750, .cycle1_cnt = 1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); } } uint32_t TjdUiAppSpO2Presenter::GetCurTimeIndex(void) { struct rtc_time local_time; struct rtc_class_ops *handel = tjd_driver_rtc_get_ops(); handel->get_rtc_time(&local_time); uint32_t totalMinutes = local_time.tm_hour * 60 + local_time.tm_min; // 计算索引值(每5分钟一个索引) uint32_t index = totalMinutes / 60; return index; } void TjdUiAppSpO2Presenter::SpO2PointArrayInit(void) { uint8_t *storeArray; static OHOS::Point array[24]; int32_t num = sql_fit_get_spo2_daydata(&storeArray); for (int i = 0; i < 24; ++i) { array[i].x = i; array[i].y = storeArray[i] * 39 / 100; } SpO2PointArray = array; } OHOS::Point *TjdUiAppSpO2Presenter::GetSpO2PointArray(void) { return SpO2PointArray; } void TjdUiAppSpO2Presenter::ExitSpO2View(void) { OHOS::NativeAbility::GetInstance().ChangePreSlice(); } } // namespace TJD