增加触摸电极判断
authorxue <2144439972@qq.com>
Fri, 12 Jun 2026 07:32:05 +0000 (15:32 +0800)
committerxue <2144439972@qq.com>
Fri, 12 Jun 2026 07:32:05 +0000 (15:32 +0800)
code/sdk/application/wearable/n9/nativeapp/nativeui/bloodpressure/src/BPMainPresenter.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/ecg/include/ECGMainPresenter.h
code/sdk/application/wearable/n9/nativeapp/nativeui/ecg/src/ECGMainPresenter.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/ecg/src/ECGMainView.cpp
code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a

index 2e7b85b..23f714f 100644 (file)
@@ -227,10 +227,10 @@ bool BPMainPresenter::PollPpgResult() {
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BP] PollPpgResult mode=%d status=%u touch=%u sbp=%d dbp=%d",
                 static_cast<int>(progressMode_), status, touchFlag, sbp, dbp);
 
-  // if (status == PPG_ECG_BP_STATUS_MEASURING && touchFlag == 0) {
-  //   OnWeakSignalDetected();
-  //   return true;
-  // }
+  if (status == PPG_ECG_BP_STATUS_MEASURING && touchFlag == 0) {
+    OnWeakSignalDetected();
+    return true;
+  }
 
   if (status == PPG_ECG_BP_STATUS_WEAK_SIGNAL) {
     OnWeakSignalDetected();
index 92f779b..83fec2a 100644 (file)
@@ -35,8 +35,9 @@ public:
   void StopMeasureTimer();
   void StopContactGoodTimer();
   void OnMeasureTimerTick();
+  void OnEnterMeasuringView();
   void FinishMeasuringFlow(ECGMainView *mainView);
-  void OnBottomButtonPressed(ECGMainView *mainView);
+  bool IsMeasureSessionActive() const { return measureSessionActive_; }
 
 private:
   void NavigateBack();
@@ -50,6 +51,7 @@ private:
   void StartPpgAfibSession();
   void StopPpgAfibSession();
   bool PollAfibResult();
+  void PollTouchDuringWait();
   void OnMeasureTimeout();
 
   static constexpr int32_t kMeasureTickMs = 200; // 测量定时器周期
index 241a12d..4df4411 100644 (file)
@@ -78,9 +78,7 @@ void ECGMainPresenter::OnPause(void) {}
 
 void ECGMainPresenter::OnResume(void) {
   RootView::GetInstance()->SetOnKeyActListener(this);
-  ECGMainView *mainView = ECGMainView::GetInstance();
-  if (mainView != nullptr && mainView->GetCurrentViewId() == ECG_MEASURING_VIEW &&
-      !measureDataReceived_) {
+  if (measureSessionActive_) {
     SetScreenAlwaysOnForEcg(true);
   }
 }
@@ -127,13 +125,6 @@ void ECGMainPresenter::ShowContactGood(ECGMainView *mainView) {
   }
 }
 
-void ECGMainPresenter::OnBottomButtonPressed(ECGMainView *mainView) {
-  if (!IsWaitingContact(mainView)) {
-    return;
-  }
-  ShowContactGood(mainView);
-}
-
 void ECGMainPresenter::NavigateBack() {
   StopMeasureTimer();
   NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
@@ -151,7 +142,8 @@ bool ECGMainPresenter::HandleSwipeBack() {
     return true;
   }
   int16_t current = mainView->GetCurrentViewId();
-  if (current == ECG_MEASURING_VIEW) {
+  if (measureSessionActive_ &&
+      (current == ECG_MEASURING_VIEW || current == ECG_INSTRUCTION_VIEW)) {
     StopMeasureTimer();
   }
   if (current == ECG_ENTRY_VIEW) {
@@ -190,7 +182,11 @@ void ECGMainPresenter::StopPpgAfibSession() {
 }
 
 void ECGMainPresenter::StartMeasureTimer() {
-  StopMeasureTimer();
+  if (measureSessionActive_) {
+    uapi_set_screen_on_api();
+    SetScreenAlwaysOnForEcg(true);
+    return;
+  }
   measureDataReceived_ = false;
   measureSessionActive_ = true;
   pollElapsedMs_ = 0;
@@ -204,6 +200,10 @@ void ECGMainPresenter::StartMeasureTimer() {
   }
 }
 
+void ECGMainPresenter::OnEnterMeasuringView() {
+  pollElapsedMs_ = 0;
+}
+
 void ECGMainPresenter::StopMeasureTimer() {
   SetScreenAlwaysOnForEcg(false);
   StopPpgAfibSession();
@@ -247,11 +247,11 @@ bool ECGMainPresenter::PollAfibResult() {
     view->AppendHeartRatePoint(ecgHr);
   }
 
-  // if (status == PPG_ECG_AFIB_STATUS_MEASURING && touchFlag == 0) {
-  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ECG] touch lost during measure");
-  //   OnMeasureTimeout();
-  //   return false;
-  // }
+  if (status == PPG_ECG_AFIB_STATUS_MEASURING && touchFlag == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ECG] touch lost during measure");
+    OnMeasureTimeout();
+    return false;
+  }
 
   if (status == PPG_ECG_AFIB_STATUS_FAILED) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ECG] measure failed (status=2)");
@@ -272,6 +272,25 @@ bool ECGMainPresenter::PollAfibResult() {
   return false;
 }
 
+void ECGMainPresenter::PollTouchDuringWait() {
+#ifdef SUPPORT_PPG_SERVICE
+  uint8_t ecgHr = 0;
+  uint8_t afibResult = PPG_ECG_AFIB_RESULT_INVALID;
+  uint8_t status = PPG_ECG_AFIB_STATUS_IDLE;
+  uint8_t touchFlag = 0;
+  ppg_get_ecg_afib(&ecgHr, &afibResult, &status, &touchFlag);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ECG] wait contact touch=%u status=%u", touchFlag, status);
+  if (touchFlag == 1) {
+    ECGMainView *mainView = ECGMainView::GetInstance();
+    if (mainView != nullptr && IsWaitingContact(mainView)) {
+      ShowContactGood(mainView);
+    }
+  }
+#else
+  (void)0;
+#endif
+}
+
 /** 测量超时 */
 void ECGMainPresenter::OnMeasureTimeout() {
   StopMeasureTimer();
@@ -288,9 +307,18 @@ void ECGMainPresenter::OnMeasureTimerTick() {
   }
 
   ECGMainView *mainView = ECGMainView::GetInstance();
+  if (mainView == nullptr) {
+    return;
+  }
+
+  if (mainView->GetCurrentViewId() == ECG_INSTRUCTION_VIEW &&
+      mainView->GetInstructionSubType() == ECG_INSTRUCTION_TYPE_WAIT_CONTACT) {
+    PollTouchDuringWait();
+    return;
+  }
+
   ECGMeasuringView *view = ECGMeasuringView::GetInstance();
-  if (mainView == nullptr || view == nullptr ||
-      mainView->GetCurrentViewId() != ECG_MEASURING_VIEW) {
+  if (view == nullptr || mainView->GetCurrentViewId() != ECG_MEASURING_VIEW) {
     return;
   }
 
@@ -316,6 +344,7 @@ void ECGMainPresenter::OnMeasureTimerTick() {
 
 void ECGMainPresenter::StartMeasureFlow(ECGMainView *mainView) {
   ShowWaitContact(mainView);
+  StartMeasureTimer();
 }
 
 void ECGMainPresenter::FinishMeasuringFlow(ECGMainView *mainView) {
@@ -389,6 +418,10 @@ bool ECGMainPresenter::OnClick(UIView &view, const ClickEvent &event) {
     return true;
   }
   if (viewId == ECG_CLICK_INSTRUCTION_BACK) {
+    if (measureSessionActive_) {
+      StopMeasureTimer();
+      StopContactGoodTimer();
+    }
     mainView->ChangeView(ECG_INSTRUCTION_VIEW, ECG_ENTRY_VIEW);
     return true;
   }
@@ -402,8 +435,10 @@ bool ECGMainPresenter::OnClick(UIView &view, const ClickEvent &event) {
     return true;
   }
   if (viewId == ECG_CLICK_EXIT) {
-    if (current == ECG_MEASURING_VIEW) {
+    if (measureSessionActive_ &&
+        (current == ECG_MEASURING_VIEW || current == ECG_INSTRUCTION_VIEW)) {
       StopMeasureTimer();
+      StopContactGoodTimer();
     }
     mainView->ChangeView(current, ECG_ENTRY_VIEW);
     return true;
@@ -445,11 +480,6 @@ bool ECGMainPresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
   unsigned short keyState = event.GetState();
   ECGMainView *mainView = ECGMainView::GetInstance();
 
-  if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 &&
-      mainView != nullptr && mainView->GetCurrentViewId() == ECG_INSTRUCTION_VIEW) {
-    OnBottomButtonPressed(mainView);
-    return true;
-  }
   if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 &&
       uapi_get_screen_state() == 0) {
     HandleSwipeBack();
index c0aa819..2136d80 100644 (file)
@@ -251,6 +251,12 @@ void ECGMainView::ChangeView(int16_t hideView, int16_t showView, int16_t type) {
       measuringView_->StopMeasurement();
       ECGMainPresenter::GetInstance()->StopMeasureTimer();
     }
+    if (hideView == ECG_INSTRUCTION_VIEW &&
+        ECGMainPresenter::GetInstance()->IsMeasureSessionActive() &&
+        showView != ECG_MEASURING_VIEW) {
+      ECGMainPresenter::GetInstance()->StopMeasureTimer();
+      ECGMainPresenter::GetInstance()->StopContactGoodTimer();
+    }
     if (hideView == ECG_MEASURE_COMPLETE_VIEW && measureCompleteView_ != nullptr) {
       measureCompleteView_->StopAnimation();
     }
@@ -263,6 +269,7 @@ void ECGMainView::ChangeView(int16_t hideView, int16_t showView, int16_t type) {
   currentViewId_ = showView;
   if (showView == ECG_MEASURING_VIEW && measuringView_ != nullptr) {
     measuringView_->ResetMeasurement();
+    ECGMainPresenter::GetInstance()->OnEnterMeasuringView();
     ECGMainPresenter::GetInstance()->StartMeasureTimer();
   }
   if (showView == ECG_MEASURE_COMPLETE_VIEW && measureCompleteView_ != nullptr) {
index 515ce65..d1adaf5 100644 (file)
Binary files a/code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a and b/code/sdk/interim_binary/brandy/libs/media/evb_standard/libjs_audio_recorder.a differ