优化gps开关逻辑 2232/target/2 2236/1 2236/head 2237/target/1
authorpenglei <1624952103@qq.com>
Sat, 13 Sep 2025 08:52:36 +0000 (16:52 +0800)
committerpenglei <1624952103@qq.com>
Sat, 13 Sep 2025 08:52:36 +0000 (16:52 +0800)
code/sdk/zhihui/UI/producttest/src/testGPS.cpp
code/sdk/zhihui/UI/producttest/src/testPresenter.cpp
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c

index 692d047..98dc41e 100644 (file)
@@ -179,11 +179,25 @@ namespace OHOS
         if (gpsIsOn)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle: Turning ON (Button: Green '关')");
+            
+            // 检查GPS是否已经在运行
+            if (getPGnssServerStat() == 1) {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle: GPS already running, skipping start");
+                return;
+            }
+            
             gnss_start();
         }
         else
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle: Turning OFF (Button: Blue '开')");
+            
+            // 检查GPS是否已经停止
+            if (getPGnssServerStat() == 0) {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle: GPS already stopped, skipping stop");
+                return;
+            }
+            
             gnss_stop();
         }
     }
index 7653a62..ffed16d 100644 (file)
-#include "AppViewIDs.h"\r
-#include "components/ui_label_ext.h"\r
-#ifdef FD230\r
-    #include"ui_resource_string.h"\r
-#endif\r
-\r
-#include "NativeRegisterManager.h"\r
-#include "NativeAbility.h"\r
-#include "graphic_math.h"\r
-#include "string.h"\r
-#include "producttest/include/testPresenter.h"\r
-// #include "font/font_global_manager.h"\r
-// #include "font/ui_font.h"\r
-#ifdef FD230\r
-    #include "languagecode/LanguageInit.h"\r
-#endif\r
-#include "../../../../../../zhihui/utils/custom_utils.h"\r
-#include "power_display_service.h"\r
-#include "components/ui_slider.h"\r
-\r
-#include "audio_capture_wrapper.h"\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-#include "cywee_service.h"\r
-#endif\r
-\r
-#ifdef FD230\r
-    #include "factorytest_protocol.h"\r
-#endif\r
-\r
-\r
-\r
-#include "custom_runtime.h"\r
-\r
-#if defined(SUPPORT_GNSS)\r
-#include "gnss_ctl.h"\r
-#endif\r
-\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-#endif\r
-#include "pm_definition.h"\r
-#include "pm_veto.h"\r
-#include "pm.h"\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-}\r
-#endif\r
-#endif\r
-\r
-namespace OHOS\r
-{\r
-    REGIST_SLICE(VIEW_TEST, testView, testPresenter);\r
-    \r
-\r
-    static char* view_id_str[]=\r
-    {\r
-        "TP_1", "TP_2", "TP_3", "TP_4",\r
-        "TP_5", "TP_6", "TP_7", "TP_8",   \r
-        "TP_9","TP_10", "TP_11", "TP_12",\r
-        "TP_13","TP_14", "TP_15", "TP_16",\r
-    };\r
-\r
-\r
-    // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。\r
-        extern test_ext Test_ViewMapper_t[];\r
-        // {FACTORYRESETVIEW,"FactoryResetButton",true},\r
-        // {SYSTEMLUPGRADE,"systemupgread",true},\r
-        // {TEST,"testButton",true}};\r
-        \r
-        // {ABOUTTHEWATCHVIEW, &SystemView::ChangeSystemAboutView},\r
-        // {SUPERVISEVIEW, &SystemView::ChangeSystemSuperviseView},\r
-        // {SYSTEMLANGUAGEVIEW, &SystemView::ChangeSystemLanguageView},\r
-\r
-    // 当前Presenter属性实例化的内存指针\r
-    static testPresenter *g_pSystemPresenter = nullptr;\r
-\r
-    testPresenter::testPresenter()\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::testPresenter");\r
-        g_pSystemPresenter = this;\r
-        //systemModel = testModel::GetInstance();\r
-    }\r
-\r
-    testPresenter::~testPresenter()\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::~testPresenter");\r
-        g_pSystemPresenter = nullptr;\r
-    }\r
-\r
-    testPresenter *testPresenter::GetInstance()\r
-    {\r
-\r
-        return g_pSystemPresenter;\r
-    }\r
-    \r
-    void testPresenter::OnStart()\r
-    {\r
-    }\r
-\r
-    bool testPresenter::OnPress(UIView &view, const PressEvent &event)\r
-    {\r
-        return true;\r
-    }\r
-\r
-    bool testPresenter::OnDrag(UIView &view, const DragEvent &event)\r
-    {\r
-       // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemPresenter::");\r
-            if(strcmp(view.GetViewId(),"BrightnessControl") == 0 || strcmp(view.GetViewId(),"Brightnesview") == 0 )\r
-            {\r
-                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "xxxxxxxxxxxxx::");\r
-                uint8_t value= testLUMView::GetInstance()->get_slider_value();\r
-\r
-                const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
-\r
-                if (display_api->set_brightness(value) != ERRCODE_SUCC)\r
-                {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChangeBrightness: set_brightness  fail!");\r
-                    return false;\r
-                }\r
-\r
-            }\r
-            \r
-        \r
-            if(strcmp(view.GetViewId(),"TP_test") == 0)\r
-            {\r
-                testTPView::GetInstance()->ChangeViewcolor(event.GetLastPoint().x,event.GetLastPoint().y);\r
-               \r
-            }\r
-        return true;\r
-    }\r
-\r
-    bool testPresenter::OnDragEnd(UIView &view, const DragEvent &event)\r
-    {\r
-        testView *p_SystemView = testView::GetInstance();\r
-\r
-        if(strcmp(view.GetViewId(),"TP_test") == 0 || strcmp(view.GetViewId(),"BrightnessControl") == 0)\r
-        {\r
-            return true;\r
-        }\r
-        \r
-        // æ\9b´ä¸¥æ ¼ç\9a\84å·¦æ»\91é\80\80å\87ºé\99\90å\88¶æ\9d¡ä»¶\r
-        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)\r
-        {\r
-            // 获取拖拽的起始点和结束点\r
-            Point startPoint = event.GetStartPoint();\r
-            Point endPoint = event.GetLastPoint();\r
-            \r
-            // 计算拖拽距离和速度\r
-            int dragDistance = endPoint.x - startPoint.x;\r
-            int dragHeight = abs(endPoint.y - startPoint.y);\r
-            \r
-            // 严格的退出条件:\r
-            // 1. æ°´å¹³æ\8b\96æ\8b½è·\9d离å¿\85须大äº\8e150å\83\8fç´ \r
-            // 2. å\9e\82ç\9b´å\81\8fç§»ä¸\8dè\83½è¶\85è¿\8750å\83\8fç´ ï¼\88ä¿\9dè¯\81æ\98¯æ°´å¹³æ»\91å\8a¨ï¼\89\r
-            // 3. èµ·å§\8bç\82¹å¿\85é¡»å\9c¨å±\8få¹\95左侧30%å\8cºå\9f\9få\86\85\r
-            // 4. æ°´å¹³æ\8b\96æ\8b½è·\9d离å¿\85须大äº\8eå\9e\82ç\9b´å\81\8fç§»ç\9a\843å\80\8dï¼\88ç¡®ä¿\9dæ\98¯æ\98\8eç¡®ç\9a\84æ°´å¹³æ»\91å\8a¨ï¼\89\r
-            int screenWidth = Screen::GetInstance().GetWidth();\r
-            \r
-            if (dragDistance > 150 &&                          // 最小拖拽距离150像素\r
-                dragHeight < 50 &&                             // 垂直偏移不超过50像素\r
-                startPoint.x < screenWidth * 0.3 &&           // 起始点在左侧30%区域\r
-                dragDistance > dragHeight * 3)                 // 水平距离是垂直距离的3倍以上\r
-            {\r
-                for (int i = 1; i < MAX_TESTVIEWID; i++)\r
-                {\r
-                    if (p_SystemView->GetSystemScrollView(i))\r
-                    {\r
-                        p_SystemView->ChangeView(i, TESTVIEW);\r
-                        break;\r
-                    }\r
-                }\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    }\r
-\r
-    // 该点击回调主要用于在系统视图界面进行跳转视图\r
-    bool testPresenter::OnClick(UIView &view, const ClickEvent &event)\r
-    {\r
-        // === VIEWID 点击追踪调试 ===\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"=== ONCLICK VIEWID DEBUG ===\n");\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮被点击,view.GetViewId() = %s\n", view.GetViewId());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"view.GetViewId() 地址 = %p\n", view.GetViewId());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"view.GetViewId() 长度 = %zu\n", strlen(view.GetViewId()));\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮类型 = %d\n", view.GetViewType());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮位置 = (%d, %d)\n", view.GetX(), view.GetY());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮大小 = %dx%d\n", view.GetWidth(), view.GetHeight());\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"=== ONCLICK VIEWID DEBUG END ===\n");\r
-        \r
-        testView *p_SystemView = testView::GetInstance();\r
-        int len=MAX_TESTVIEWID;//sizeof(Test_ViewMapper_t)/sizeof(Test_ViewMapper_t[0]);\r
-        //int len=5;\r
-        // 根据控件id查找是哪个控件触发了点击回调\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick %s",view.GetViewId());\r
- \r
-        if(strcmp(view.GetViewId(),"xxxx") == 0)  \r
-        { \r
-            //testSPEAKView::GetInstance()->Changspeak(true);\r
-            testView::GetInstance()->ChangeView(SEChipTest,TESTVIEW);\r
-            return true;\r
-        }\r
-        \r
-        if(strcmp(view.GetViewId(),"oldtestexit") == 0)  \r
-        { \r
-            //testSPEAKView::GetInstance()->Changspeak(true);\r
-            testView::GetInstance()->ChangeView(OLDTEST,TESTVIEW);\r
-            return true;\r
-        }\r
-        if(strcmp(view.GetViewId(),"shutdown") == 0)\r
-        {\r
-            // #ifdef FD230_650\r
-            uapi_poweroff_device();\r
-            // #endif\r
-            return true;\r
-        }\r
-        if(strcmp(view.GetViewId(),"reset") == 0)\r
-        {\r
-            // #ifdef FD230_650\r
-            uapi_reboot_device();\r
-            // #endif\r
-\r
-            return true;\r
-        }\r
-        if(strcmp(view.GetViewId(),"deepsleep") == 0)\r
-        {\r
-            //TODO: close bt and cat1 , then deepsleep\r
-            #ifdef SUPPORT_CYWEE_SERVICE\r
-            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_STOP_ACC,NULL);\r
-            #endif\r
-            stop_custom_ble_service();\r
-            LOS_Msleep(50);\r
-            uapi_set4GCapability(false);\r
-            LOS_Msleep(50);\r
-\r
-            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_P_TEST);\r
-            if (cnt == 1) {\r
-                uapi_pm_remove_sleep_veto(PM_ID_P_TEST);\r
-            } else {\r
-                // WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"CAT1 SERVICE MCU has got pm_id_cat1 vote\r\n");\r
-            }\r
-\r
-\r
-            // mcu_pm_lcd_off(NULL,NULL);\r
-            \r
-            const power_display_svr_api_t * display_api = power_display_svr_get_api();\r
-            if (display_api)\r
-            {\r
-                display_api->turn_off_screen();    \r
-            }\r
-            \r
-            return true;\r
-        }\r
-        \r
-        if(strcmp(view.GetViewId(),"FactoryReset") == 0)\r
-        {\r
-            //TODO: close bt and cat1 , then deepsleep\r
-            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);\r
-            return true;\r
-        }\r
-\r
-         for(int i=0;i<len;i++)\r
-        {\r
-            if(strcmp(view.GetViewId(),Test_ViewMapper_t[i].viewid_str) == 0)\r
-            {\r
-                if(Test_ViewMapper_t[i].enable_falg==true) {\r
-                    testView::GetInstance()->ChangeView(TESTVIEW, Test_ViewMapper_t[i].viewId);\r
-                }\r
-                return true;\r
-            }\r
-            if(strcmp(view.GetViewId(),Test_ViewMapper_t[i].viewid_str_next) == 0)\r
-            {\r
-                if(Test_ViewMapper_t[i+1].enable_falg==true) {\r
-                    testView::GetInstance()->ChangeView(Test_ViewMapper_t[i].viewId, Test_ViewMapper_t[i+1].viewId);\r
-                }\r
-                return true;\r
-            }\r
-\r
-        }\r
-        \r
-        // 处理各测试界面的 成功/失败 按钮\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"view.GetViewId() %s ",view.GetViewId());\r
-        if (strncmp(view.GetViewId(), "TestOK", 6) == 0 || strncmp(view.GetViewId(), "TestNO", 6) == 0)\r
-        {\r
-\r
-            std::string vid = view.GetViewId();\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"view.GetViewId() %s ",vid.c_str());\r
-\r
-            if(testModel::GetInstance()->SetResult(vid))\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"SetResult成功");\r
-                \r
-                // 实时更新按钮颜色\r
-                testView::GetInstance()->UpdateButtonColorByViewId(view.GetViewId());\r
-                \r
-                return true;\r
-            }\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"SetResult失败");\r
-            return false;\r
-        }\r
-\r
-\r
-\r
-        if(strcmp(view.GetViewId(),"speak_play") == 0)\r
-        { \r
-            testSPEAKView::GetInstance()->Changspeak(true);\r
-        }\r
-        else if (strcmp(view.GetViewId(),"speak_puase") == 0)\r
-        {\r
-            testSPEAKView::GetInstance()->Changspeak(false);\r
-        }\r
-        \r
-        if(strcmp(view.GetViewId(),"MOTOR_play") == 0)\r
-        { \r
-            testMOTORView::GetInstance()->Changstatr(true);\r
-        }\r
-\r
-       if(strcmp(view.GetViewId(),"testmicrohoneView") == 0)\r
-        { \r
-            testmicrohoneView::GetInstance()->buttoncallback();\r
-        } \r
-\r
-        if(strcmp(view.GetViewId(),"dial_112") == 0)\r
-        { \r
-            #ifdef SUPPORT_CAT1_SERVICE\r
-            testcat1View::GetInstance()->dial_112(true);\r
-            #endif\r
-        } \r
-\r
-        if(strcmp(view.GetViewId(),"gray_card") == 0)\r
-        { \r
-\r
-            testhrsenson1View::GetInstance()->gray_test(true);\r
-        }\r
-\r
-        \r
-        if(strcmp(view.GetViewId(),"leeklight") == 0)\r
-        { \r
-\r
-            testhrsenson1View::GetInstance()->leeklight_test(true);\r
-        }\r
-         \r
-        if(strcmp(view.GetViewId(),"discovery") == 0)\r
-        { \r
-\r
-            testBTView::GetInstance()->BT_discovery_callback();\r
-        }\r
-        if(strcmp(view.GetViewId(),"addvolume") == 0)\r
-        { \r
-            testmicrohoneView::GetInstance()->addvolumebuttoncallback();\r
-        }\r
-        if(strcmp(view.GetViewId(),"start") == 0)\r
-        { \r
-            if(uapi_dev_runtime_get_cat1_powerstat())\r
-                uapi_set4GCapability(false);\r
-            #ifdef SUPPORT_FACTORY_SERVICE\r
-                factorytest_start_aging_test();\r
-            #endif\r
-        }\r
-        if(strcmp(view.GetViewId(),"stop") == 0)\r
-        { \r
-#ifdef SUPPORT_FACTORY_SERVICE\r
-            factorytest_stop_aging_test();\r
-#endif\r
-        }\r
-        if(strcmp(view.GetViewId(),"exit") == 0)\r
-        { \r
-            for (int i = 1; i < MAX_TESTVIEWID; i++)\r
-            {\r
-                if (p_SystemView->GetSystemScrollView(i))\r
-                {\r
-                    p_SystemView->ChangeView(i, TESTVIEW);\r
-                    break;\r
-                }\r
-            }\r
-            return true;\r
-        }\r
-        if(strcmp(view.GetViewId(),"deep") == 0)\r
-        { \r
-            #ifdef SUPPORT_CYWEE_SERVICE\r
-            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_STOP_ACC,NULL);\r
-            #endif\r
-            stop_custom_ble_service();\r
-            LOS_Msleep(50);\r
-            uapi_set4GCapability(false);\r
-            LOS_Msleep(50);\r
-\r
-            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_P_TEST);\r
-            if (cnt == 1) {\r
-                uapi_pm_remove_sleep_veto(PM_ID_P_TEST);\r
-            } else {\r
-                // WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"CAT1 SERVICE MCU has got pm_id_cat1 vote\r\n");\r
-            }\r
-\r
-\r
-            // mcu_pm_lcd_off(NULL,NULL);\r
-            \r
-            const power_display_svr_api_t * display_api = power_display_svr_get_api();\r
-            if (display_api)\r
-            {\r
-                display_api->turn_off_screen();    \r
-            }\r
-\r
-            return true;\r
-        }\r
-        #ifdef SUPPORT_A5133_SERVICE\r
-        if(strcmp(view.GetViewId(),"receive") == 0)\r
-        { \r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "strcmp(view.GetViewId()recevie");\r
-            testA5133View::GetInstance()->a5133_receive_callback();\r
-        }\r
-      \r
-        if(strcmp(view.GetViewId(),"transmit") == 0)\r
-        { \r
-            testA5133View::GetInstance()->a5133_receive_callback();\r
-        }\r
-        if(strcmp(view.GetViewId(),"send_data_1") == 0)\r
-        { \r
-\r
-            testA5133View::GetInstance()->a5133_receive_callback();\r
-        }\r
-        if(strcmp(view.GetViewId(),"send_data_2") == 0)\r
-        { \r
-\r
-            testA5133View::GetInstance()->a5133_receive_callback();\r
-        }\r
-\r
-     \r
-\r
-\r
-        #endif\r
-\r
-        #if defined(SUPPORT_GNSS)\r
-        if (strcmp(view.GetViewId(), GPS_OPEN_CONFIRM_BUTTON) == 0)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle Button OnClick");\r
-            \r
-            // 切换GPS开关状态\r
-            testGPSView* gpsView = testGPSView::GetInstance();\r
-            if (gpsView != nullptr)\r
-            {\r
-                gpsView->ToggleGPSState();\r
-            }\r
-        }\r
-        #endif\r
-        return false;\r
-    }\r
-\r
-    bool testPresenter::OnKeyAct(UIView &view, const KeyEvent &event)\r
-    {\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmPresenter::OnKeyAct");\r
-    uint8_t keyID = event.GetKeyId();\r
-    uint8_t keystate=event.GetState();\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, ":xxxxxxx:%d",keyID);\r
-    // 如果是power键就返回上一级\r
-    if(testbuttonView::GetInstance())\r
-    {\r
-        if (keyID == 41 )\r
-        {\r
-            if(keystate)\r
-            testbuttonView::GetInstance()-> Changbutton(0,true);\r
-            else\r
-            testbuttonView::GetInstance()-> Changbutton(0,false);\r
-        \r
-            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
-            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-        }\r
-        if (keyID == 0)\r
-        {\r
-        if(keystate)\r
-            testbuttonView::GetInstance()-> Changbutton(1,true);\r
-            else\r
-            testbuttonView::GetInstance()-> Changbutton(1,false);\r
-        \r
-            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
-            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-        }\r
-\r
-#ifdef BOARD_U8\r
-        if (keyID == 1)\r
-        {\r
-\r
-            if(keystate)\r
-                testbuttonView::GetInstance()-> Changbutton(2,true);\r
-            else\r
-                testbuttonView::GetInstance()-> Changbutton(2,false);\r
-            \r
-            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
-            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-        }\r
-#endif\r
-\r
-    }\r
- \r
-    return true;\r
-    }\r
-\r
-    bool testPresenter::OnRotate(UIView &view, const RotateEvent &event)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::OnRotate %d",event.GetRotate());\r
-         testbuttonView::GetInstance()->Changbutton(event.GetRotate());\r
-      \r
-        testbuttonView::GetInstance()->Changbutton(true);\r
-        return true;\r
-    }\r
-\r
-    bool testPresenter::OnRotateEnd(UIView &view, const RotateEvent &event)\r
-    {\r
-        UNUSED(view);\r
-        UNUSED(event);\r
-        testbuttonView::GetInstance()->Changbutton(false);\r
-        return true;\r
-    }\r
-\r
-    // 该拖拽是用来处理系统视图(slice)的左滑退出事件和子视图的左滑退出到系统视图区分开\r
-    \r
-\r
-    /// @brief 简体中文单选按钮被选中\r
-    /// @param  void\r
-    /// @return true 表示选中 ,false 表示未选中\r
-    \r
-\r
-    /// @brief 英语单选按钮被选中\r
-    /// @param  void\r
-    /// @return true 表示选中 ,false 表示未选中\r
-  \r
-\r
-    /* -------------------------------------------------------------------------- */\r
-    // 获取语言类\r
-    //language *g_planguage = new language;\r
-    /* -------------------------------------------------------------------------- */\r
-    // 用来监听语言切换\r
-\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-extern "C"\r
-{\r
-#endif /* __cplusplus */\r
-#endif /* __cplusplus */\r
-\r
-    void factorytest_enter_test_tp_view(void)\r
-    {\r
-        if(testView::GetInstance())\r
-            testView::GetInstance()->ChangeView(TESTVIEW,TP);\r
-        else\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxx\r\n");\r
-    }\r
-\r
-    void factorytest_enter_test_lcd_view(void)\r
-    {\r
-        if( testView::GetInstance())\r
-            testView::GetInstance()->ChangeView(TESTVIEW,LCD);\r
-        else\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxx\r\n");\r
-    }\r
-\r
-    void factorytest_enter_test_button_view(void)\r
-    {\r
-        testView::GetInstance()->ChangeView(TESTVIEW,BUTTON);\r
-    }\r
-\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-}\r
-#endif /* __cplusplus */\r
-#endif /* __cplusplus */\r
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#ifdef FD230
+    #include"ui_resource_string.h"
+#endif
+
+#include "NativeRegisterManager.h"
+#include "NativeAbility.h"
+#include "graphic_math.h"
+#include "string.h"
+#include "producttest/include/testPresenter.h"
+// #include "font/font_global_manager.h"
+// #include "font/ui_font.h"
+#ifdef FD230
+    #include "languagecode/LanguageInit.h"
+#endif
+#include "../../../../../../zhihui/utils/custom_utils.h"
+#include "power_display_service.h"
+#include "components/ui_slider.h"
+
+#include "audio_capture_wrapper.h"
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_service.h"
+#endif
+
+#ifdef FD230
+    #include "factorytest_protocol.h"
+#endif
+
+
+
+#include "custom_runtime.h"
+
+#if defined(SUPPORT_GNSS)
+#include "gnss_ctl.h"
+#endif
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif
+#endif
+#include "pm_definition.h"
+#include "pm_veto.h"
+#include "pm.h"
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif
+
+namespace OHOS
+{
+    REGIST_SLICE(VIEW_TEST, testView, testPresenter);
+    
+
+    static char* view_id_str[]=
+    {
+        "TP_1", "TP_2", "TP_3", "TP_4",
+        "TP_5", "TP_6", "TP_7", "TP_8",   
+        "TP_9","TP_10", "TP_11", "TP_12",
+        "TP_13","TP_14", "TP_15", "TP_16",
+    };
+
+
+    // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。
+        extern test_ext Test_ViewMapper_t[];
+        // {FACTORYRESETVIEW,"FactoryResetButton",true},
+        // {SYSTEMLUPGRADE,"systemupgread",true},
+        // {TEST,"testButton",true}};
+        
+        // {ABOUTTHEWATCHVIEW, &SystemView::ChangeSystemAboutView},
+        // {SUPERVISEVIEW, &SystemView::ChangeSystemSuperviseView},
+        // {SYSTEMLANGUAGEVIEW, &SystemView::ChangeSystemLanguageView},
+
+    // 当前Presenter属性实例化的内存指针
+    static testPresenter *g_pSystemPresenter = nullptr;
+
+    testPresenter::testPresenter()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::testPresenter");
+        g_pSystemPresenter = this;
+        //systemModel = testModel::GetInstance();
+    }
+
+    testPresenter::~testPresenter()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::~testPresenter");
+        g_pSystemPresenter = nullptr;
+    }
+
+    testPresenter *testPresenter::GetInstance()
+    {
+
+        return g_pSystemPresenter;
+    }
+    
+    void testPresenter::OnStart()
+    {
+    }
+
+    bool testPresenter::OnPress(UIView &view, const PressEvent &event)
+    {
+        return true;
+    }
+
+    bool testPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+       // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemPresenter::");
+            if(strcmp(view.GetViewId(),"BrightnessControl") == 0 || strcmp(view.GetViewId(),"Brightnesview") == 0 )
+            {
+                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "xxxxxxxxxxxxx::");
+                uint8_t value= testLUMView::GetInstance()->get_slider_value();
+
+                const power_display_svr_api_t *display_api = power_display_svr_get_api();
+
+                if (display_api->set_brightness(value) != ERRCODE_SUCC)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChangeBrightness: set_brightness  fail!");
+                    return false;
+                }
+
+            }
+            
+        
+            if(strcmp(view.GetViewId(),"TP_test") == 0)
+            {
+                testTPView::GetInstance()->ChangeViewcolor(event.GetLastPoint().x,event.GetLastPoint().y);
+               
+            }
+        return true;
+    }
+
+    bool testPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        testView *p_SystemView = testView::GetInstance();
+
+        if(strcmp(view.GetViewId(),"TP_test") == 0 || strcmp(view.GetViewId(),"BrightnessControl") == 0)
+        {
+            return true;
+        }
+        
+        // æ\94¾å®½ç\9a\84å·¦æ»\91é\80\80å\87ºé\99\90å\88¶æ\9d¡ä»¶
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+        {
+            // 获取拖拽的起始点和结束点
+            Point startPoint = event.GetStartPoint();
+            Point endPoint = event.GetLastPoint();
+            
+            // 计算拖拽距离和速度
+            int dragDistance = endPoint.x - startPoint.x;
+            int dragHeight = abs(endPoint.y - startPoint.y);
+            
+            // 放宽的退出条件:
+            // 1. æ°´å¹³æ\8b\96æ\8b½è·\9d离大äº\8e80å\83\8fç´ ï¼\88ä»\8e150é\99\8dä½\8eå\88°80ï¼\89
+            // 2. å\9e\82ç\9b´å\81\8fç§»ä¸\8dè\85è¿\8780å\83\8fç´ ï¼\88ä»\8e50æ\94¾å®½å\88°80ï¼\89
+            // 3. èµ·å§\8bç\82¹å\9c¨å±\8få¹\95左侧50%å\8cºå\9f\9få\86\85ï¼\88ä»\8e30%æ\94¾å®½å\88°50%ï¼\89
+            // 4. æ°´å¹³æ\8b\96æ\8b½è·\9d离大äº\8eå\9e\82ç\9b´å\81\8fç§»ç\9a\842å\80\8dï¼\88ä»\8e3å\80\8dé\99\8dä½\8eå\88°2å\80\8dï¼\89
+            int screenWidth = Screen::GetInstance().GetWidth();
+            
+            if (dragDistance > 80 &&                           // 最小拖拽距离80像素
+                dragHeight < 80 &&                             // 垂直偏移不超过80像素
+                startPoint.x < screenWidth * 0.5 &&           // 起始点在左侧50%区域
+                dragDistance > dragHeight * 2)                 // 水平距离是垂直距离的2倍以上
+            {
+                for (int i = 1; i < MAX_TESTVIEWID; i++)
+                {
+                    if (p_SystemView->GetSystemScrollView(i))
+                    {
+                        p_SystemView->ChangeView(i, TESTVIEW);
+                        break;
+                    }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // 该点击回调主要用于在系统视图界面进行跳转视图
+    bool testPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        // === VIEWID 点击追踪调试 ===
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"=== ONCLICK VIEWID DEBUG ===\n");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮被点击,view.GetViewId() = %s\n", view.GetViewId());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"view.GetViewId() 地址 = %p\n", view.GetViewId());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"view.GetViewId() 长度 = %zu\n", strlen(view.GetViewId()));
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮类型 = %d\n", view.GetViewType());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮位置 = (%d, %d)\n", view.GetX(), view.GetY());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"按钮大小 = %dx%d\n", view.GetWidth(), view.GetHeight());
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"=== ONCLICK VIEWID DEBUG END ===\n");
+        
+        testView *p_SystemView = testView::GetInstance();
+        int len=MAX_TESTVIEWID;//sizeof(Test_ViewMapper_t)/sizeof(Test_ViewMapper_t[0]);
+        //int len=5;
+        // 根据控件id查找是哪个控件触发了点击回调
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick %s",view.GetViewId());
+ 
+        if(strcmp(view.GetViewId(),"xxxx") == 0)  
+        { 
+            //testSPEAKView::GetInstance()->Changspeak(true);
+            testView::GetInstance()->ChangeView(SEChipTest,TESTVIEW);
+            return true;
+        }
+        
+        if(strcmp(view.GetViewId(),"oldtestexit") == 0)  
+        { 
+            //testSPEAKView::GetInstance()->Changspeak(true);
+            testView::GetInstance()->ChangeView(OLDTEST,TESTVIEW);
+            return true;
+        }
+        if(strcmp(view.GetViewId(),"shutdown") == 0)
+        {
+            // #ifdef FD230_650
+            uapi_poweroff_device();
+            // #endif
+            return true;
+        }
+        if(strcmp(view.GetViewId(),"reset") == 0)
+        {
+            // #ifdef FD230_650
+            uapi_reboot_device();
+            // #endif
+
+            return true;
+        }
+        if(strcmp(view.GetViewId(),"deepsleep") == 0)
+        {
+            //TODO: close bt and cat1 , then deepsleep
+            #ifdef SUPPORT_CYWEE_SERVICE
+            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_STOP_ACC,NULL);
+            #endif
+            stop_custom_ble_service();
+            LOS_Msleep(50);
+            uapi_set4GCapability(false);
+            LOS_Msleep(50);
+
+            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_P_TEST);
+            if (cnt == 1) {
+                uapi_pm_remove_sleep_veto(PM_ID_P_TEST);
+            } else {
+                // WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"CAT1 SERVICE MCU has got pm_id_cat1 vote\r\n");
+            }
+
+
+            // mcu_pm_lcd_off(NULL,NULL);
+            
+            const power_display_svr_api_t * display_api = power_display_svr_get_api();
+            if (display_api)
+            {
+                display_api->turn_off_screen();    
+            }
+            
+            return true;
+        }
+        
+        if(strcmp(view.GetViewId(),"FactoryReset") == 0)
+        {
+            //TODO: close bt and cat1 , then deepsleep
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);
+            return true;
+        }
+
+         for(int i=0;i<len;i++)
+        {
+            if(strcmp(view.GetViewId(),Test_ViewMapper_t[i].viewid_str) == 0)
+            {
+                if(Test_ViewMapper_t[i].enable_falg==true) {
+                    testView::GetInstance()->ChangeView(TESTVIEW, Test_ViewMapper_t[i].viewId);
+                }
+                return true;
+            }
+            if(strcmp(view.GetViewId(),Test_ViewMapper_t[i].viewid_str_next) == 0)
+            {
+                if(Test_ViewMapper_t[i+1].enable_falg==true) {
+                    testView::GetInstance()->ChangeView(Test_ViewMapper_t[i].viewId, Test_ViewMapper_t[i+1].viewId);
+                }
+                return true;
+            }
+
+        }
+        
+        // 处理各测试界面的 成功/失败 按钮
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"view.GetViewId() %s ",view.GetViewId());
+        if (strncmp(view.GetViewId(), "TestOK", 6) == 0 || strncmp(view.GetViewId(), "TestNO", 6) == 0)
+        {
+
+            std::string vid = view.GetViewId();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"view.GetViewId() %s ",vid.c_str());
+
+            if(testModel::GetInstance()->SetResult(vid))
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"SetResult成功");
+                
+                // 实时更新按钮颜色
+                testView::GetInstance()->UpdateButtonColorByViewId(view.GetViewId());
+                
+                return true;
+            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"SetResult失败");
+            return false;
+        }
+
+
+
+        if(strcmp(view.GetViewId(),"speak_play") == 0)
+        { 
+            testSPEAKView::GetInstance()->Changspeak(true);
+        }
+        else if (strcmp(view.GetViewId(),"speak_puase") == 0)
+        {
+            testSPEAKView::GetInstance()->Changspeak(false);
+        }
+        
+        if(strcmp(view.GetViewId(),"MOTOR_play") == 0)
+        { 
+            testMOTORView::GetInstance()->Changstatr(true);
+        }
+
+       if(strcmp(view.GetViewId(),"testmicrohoneView") == 0)
+        { 
+            testmicrohoneView::GetInstance()->buttoncallback();
+        } 
+
+        if(strcmp(view.GetViewId(),"dial_112") == 0)
+        { 
+            #ifdef SUPPORT_CAT1_SERVICE
+            testcat1View::GetInstance()->dial_112(true);
+            #endif
+        } 
+
+        if(strcmp(view.GetViewId(),"gray_card") == 0)
+        { 
+
+            testhrsenson1View::GetInstance()->gray_test(true);
+        }
+
+        
+        if(strcmp(view.GetViewId(),"leeklight") == 0)
+        { 
+
+            testhrsenson1View::GetInstance()->leeklight_test(true);
+        }
+         
+        if(strcmp(view.GetViewId(),"discovery") == 0)
+        { 
+
+            testBTView::GetInstance()->BT_discovery_callback();
+        }
+        if(strcmp(view.GetViewId(),"addvolume") == 0)
+        { 
+            testmicrohoneView::GetInstance()->addvolumebuttoncallback();
+        }
+        if(strcmp(view.GetViewId(),"start") == 0)
+        { 
+            if(uapi_dev_runtime_get_cat1_powerstat())
+                uapi_set4GCapability(false);
+            #ifdef SUPPORT_FACTORY_SERVICE
+                factorytest_start_aging_test();
+            #endif
+        }
+        if(strcmp(view.GetViewId(),"stop") == 0)
+        { 
+#ifdef SUPPORT_FACTORY_SERVICE
+            factorytest_stop_aging_test();
+#endif
+        }
+        if(strcmp(view.GetViewId(),"exit") == 0)
+        { 
+            for (int i = 1; i < MAX_TESTVIEWID; i++)
+            {
+                if (p_SystemView->GetSystemScrollView(i))
+                {
+                    p_SystemView->ChangeView(i, TESTVIEW);
+                    break;
+                }
+            }
+            return true;
+        }
+        if(strcmp(view.GetViewId(),"deep") == 0)
+        { 
+            #ifdef SUPPORT_CYWEE_SERVICE
+            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_STOP_ACC,NULL);
+            #endif
+            stop_custom_ble_service();
+            LOS_Msleep(50);
+            uapi_set4GCapability(false);
+            LOS_Msleep(50);
+
+            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_P_TEST);
+            if (cnt == 1) {
+                uapi_pm_remove_sleep_veto(PM_ID_P_TEST);
+            } else {
+                // WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"CAT1 SERVICE MCU has got pm_id_cat1 vote\r\n");
+            }
+
+
+            // mcu_pm_lcd_off(NULL,NULL);
+            
+            const power_display_svr_api_t * display_api = power_display_svr_get_api();
+            if (display_api)
+            {
+                display_api->turn_off_screen();    
+            }
+
+            return true;
+        }
+        #ifdef SUPPORT_A5133_SERVICE
+        if(strcmp(view.GetViewId(),"receive") == 0)
+        { 
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "strcmp(view.GetViewId()recevie");
+            testA5133View::GetInstance()->a5133_receive_callback();
+        }
+      
+        if(strcmp(view.GetViewId(),"transmit") == 0)
+        { 
+            testA5133View::GetInstance()->a5133_receive_callback();
+        }
+        if(strcmp(view.GetViewId(),"send_data_1") == 0)
+        { 
+
+            testA5133View::GetInstance()->a5133_receive_callback();
+        }
+        if(strcmp(view.GetViewId(),"send_data_2") == 0)
+        { 
+
+            testA5133View::GetInstance()->a5133_receive_callback();
+        }
+
+     
+
+
+        #endif
+
+        #if defined(SUPPORT_GNSS)
+        if (strcmp(view.GetViewId(), GPS_OPEN_CONFIRM_BUTTON) == 0)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS Toggle Button OnClick");
+            
+            // 切换GPS开关状态
+            testGPSView* gpsView = testGPSView::GetInstance();
+            if (gpsView != nullptr)
+            {
+                gpsView->ToggleGPSState();
+            }
+        }
+        #endif
+        return false;
+    }
+
+    bool testPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmPresenter::OnKeyAct");
+    uint8_t keyID = event.GetKeyId();
+    uint8_t keystate=event.GetState();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, ":xxxxxxx:%d",keyID);
+    // 如果是power键就返回上一级
+    if(testbuttonView::GetInstance())
+    {
+        if (keyID == 41 )
+        {
+            if(keystate)
+            testbuttonView::GetInstance()-> Changbutton(0,true);
+            else
+            testbuttonView::GetInstance()-> Changbutton(0,false);
+        
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        }
+        if (keyID == 0)
+        {
+        if(keystate)
+            testbuttonView::GetInstance()-> Changbutton(1,true);
+            else
+            testbuttonView::GetInstance()-> Changbutton(1,false);
+        
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        }
+
+#ifdef BOARD_U8
+        if (keyID == 1)
+        {
+
+            if(keystate)
+                testbuttonView::GetInstance()-> Changbutton(2,true);
+            else
+                testbuttonView::GetInstance()-> Changbutton(2,false);
+            
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        }
+#endif
+
+    }
+ 
+    return true;
+    }
+
+    bool testPresenter::OnRotate(UIView &view, const RotateEvent &event)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "testPresenter::OnRotate %d",event.GetRotate());
+         testbuttonView::GetInstance()->Changbutton(event.GetRotate());
+      
+        testbuttonView::GetInstance()->Changbutton(true);
+        return true;
+    }
+
+    bool testPresenter::OnRotateEnd(UIView &view, const RotateEvent &event)
+    {
+        UNUSED(view);
+        UNUSED(event);
+        testbuttonView::GetInstance()->Changbutton(false);
+        return true;
+    }
+
+    // 该拖拽是用来处理系统视图(slice)的左滑退出事件和子视图的左滑退出到系统视图区分开
+    
+
+    /// @brief 简体中文单选按钮被选中
+    /// @param  void
+    /// @return true 表示选中 ,false 表示未选中
+    
+
+    /// @brief 英语单选按钮被选中
+    /// @param  void
+    /// @return true 表示选中 ,false 表示未选中
+  
+
+    /* -------------------------------------------------------------------------- */
+    // 获取语言类
+    //language *g_planguage = new language;
+    /* -------------------------------------------------------------------------- */
+    // 用来监听语言切换
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+    void factorytest_enter_test_tp_view(void)
+    {
+        if(testView::GetInstance())
+            testView::GetInstance()->ChangeView(TESTVIEW,TP);
+        else
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxx\r\n");
+    }
+
+    void factorytest_enter_test_lcd_view(void)
+    {
+        if( testView::GetInstance())
+            testView::GetInstance()->ChangeView(TESTVIEW,LCD);
+        else
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxx\r\n");
+    }
+
+    void factorytest_enter_test_button_view(void)
+    {
+        testView::GetInstance()->ChangeView(TESTVIEW,BUTTON);
+    }
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
 }
\ No newline at end of file
index 26ba504..a7768cc 100644 (file)
@@ -57,6 +57,7 @@ static int g_is_pgnss_start=0;
 static int g_is_pgnss_logon=0;
 static int g_pgnss_stopflag=0;
 static int g_cold_start_pgnss_stopflag = 0;
+static int g_is_listening_data = 0;  // 添加数据监听状态标志
 
 static char *pgnss_log = NULL;
 
@@ -288,6 +289,11 @@ static int32_t StopGnss(tiot_handle handle)
 static void ListenGnssData(tiot_handle handle)
 {
     int32_t i = 0;
+    
+    // 设置监听状态标志
+    g_is_listening_data = 1;
+    printf("GPS data listening started\r\n");
+    
     // 写日志
     for (;;) {  // 写日志条件
 
@@ -345,11 +351,38 @@ static void ListenGnssData(tiot_handle handle)
         }
 
     }
+    
+    // 清除监听状态标志
+    g_is_listening_data = 0;
+    printf("GPS data listening stopped\r\n");
 }
 
 void PGnssServerStop(void)
 {
-    g_pgnss_stopflag=1;
+    printf("PGnssServerStop: Attempting to stop GPS...\r\n");
+    
+    // 检查GPS是否已经启动
+    if (g_is_pgnss_poweron == 0) {
+        printf("PGnssServerStop: GPS is not powered on, nothing to stop\r\n");
+        return;
+    }
+
+    // 等待数据监听停止(最多等待6秒)
+    int wait_count = 0;
+    const int max_wait_ms = 6000;  // 最大等待6秒
+    const int check_interval_ms = 500;  // 每500ms检查一次
+    
+    while (g_is_listening_data == 0 && wait_count < (max_wait_ms / check_interval_ms)) {
+        LOS_Msleep(check_interval_ms);
+        wait_count++;
+        if (wait_count % 2 == 0) {  // 每秒打印一次状态(500ms * 2 = 1秒)
+            printf("PGnssServerStop: Waiting for data listening to stop... (%d/%d)\r\n", 
+                   wait_count * check_interval_ms, max_wait_ms);
+        }
+    }
+    
+    // 设置停止标志
+    g_pgnss_stopflag = 1;
     
     // 清理pgnss_sample模块的内存
     cleanup_agnss_folder_path();
@@ -357,12 +390,6 @@ void PGnssServerStop(void)
     // 清理pgnss_encode模块的内存
     cleanup_pgnss_encode_agnss_folder_path();
     
-    if (pgnss_log != NULL) {
-        printf("pgnss_log:%s\r\n",pgnss_log);
-        free(pgnss_log);
-        pgnss_log = NULL;
-    }
-    
     printf("PGnssServerStop: Force stop completed\r\n");
 }
 
@@ -405,6 +432,7 @@ void PGnssServerStartColdStart(void)
     g_is_pgnss_start = 1;
     g_pgnss_stopflag = 0;
     g_cold_start_pgnss_stopflag = 0;
+    g_is_listening_data = 0;  // 初始化监听状态
     sw_debug_uart_deinit();
     
     // Step1: init
@@ -498,6 +526,7 @@ void PGnssServerStartColdStart(void)
 
     g_is_pgnss_poweron = 0;
     g_is_pgnss_start = 0;
+    g_pgnss_stopflag = 0;  // 清除停止标志
     sw_debug_uart_deinit();
     uart_config_init();
     printf("finish cold start mode\r\n");
@@ -788,13 +817,47 @@ static int pgnss_startup_check(void)
 
 void PGnssServerStart(void)
 {
+    printf("PGnssServerStart: Attempting to start GPS...\r\n");
+    
+    // 检查是否正在停止过程中
+    if (g_pgnss_stopflag == 1) {
+        printf("PGnssServerStart: GPS is stopping, waiting for stop to complete...\r\n");
+        
+        // 等待停止完成(最多等待6秒)
+        int wait_count = 0;
+        const int max_wait_ms = 6000;
+        const int check_interval_ms = 500;
+        
+        while (g_pgnss_stopflag == 1 && wait_count < (max_wait_ms / check_interval_ms)) {
+            LOS_Msleep(check_interval_ms);
+            wait_count++;
+            if (wait_count % 2 == 0) {  // 每秒打印一次状态(500ms * 2 = 1秒)
+                printf("PGnssServerStart: Waiting for stop to complete... (%d/%d)\r\n", 
+                       wait_count * check_interval_ms, max_wait_ms);
+            }
+        }
+        
+        if (g_pgnss_stopflag == 1) {
+            printf("PGnssServerStart: Warning - Stop did not complete within timeout\r\n");
+            // 强制清除停止标志,继续启动
+            g_pgnss_stopflag = 0;
+        } else {
+            printf("PGnssServerStart: Stop completed, proceeding with start\r\n");
+        }
+    }
+    
     if(g_is_pgnss_poweron == 1)
     {
-        printf("gnss already on\r\n");
+        printf("PGnssServerStart: GPS already powered on\r\n");
         return ;
     }
 
     g_is_pgnss_poweron = 1;
+
+    g_pgnss_stopflag = 0;
+    g_cold_start_pgnss_stopflag = 0;
+    g_is_listening_data = 0;  // 初始化监听状态
+
     //未绑定直接冷启动
     if(cm_getisFirstTimeStart())
     {
@@ -807,7 +870,9 @@ void PGnssServerStart(void)
     int check_result = pgnss_startup_check();
     if (check_result != 0) {
         printf("PGNSS startup check failed. Starting cold start mode\n");
-        PGnssServerStartColdStart();
+        if(!g_pgnss_stopflag)
+            PGnssServerStartColdStart();
+
         return;
     }
     
@@ -833,8 +898,7 @@ void PGnssServerStart(void)
     #endif
 
     g_is_pgnss_start = 1;
-    g_pgnss_stopflag = 0;
-    g_cold_start_pgnss_stopflag = 0;
+
     sw_debug_uart_deinit();
     // Step1: init
     int32_t ret = tiot_service_init();
@@ -929,6 +993,7 @@ void PGnssServerStart(void)
     {
         g_is_pgnss_start = 0;
         g_is_pgnss_poweron = 0;
+        g_pgnss_stopflag = 0;  // 清除停止标志
     }
 
     sw_debug_uart_deinit();