fd230文件夹下service文件夹合并提交
authorluozheng <1732036298@qq.com>
Thu, 24 Jul 2025 07:37:43 +0000 (15:37 +0800)
committerluozheng <1732036298@qq.com>
Thu, 24 Jul 2025 07:37:43 +0000 (15:37 +0800)
35 files changed:
code/sdk/application/wearable/fd230/service/CMakeLists.txt
code/sdk/application/wearable/fd230/service/app_store/CMakeLists.txt
code/sdk/application/wearable/fd230/service/app_store/app_store.cpp
code/sdk/application/wearable/fd230/service/app_store/app_store.h
code/sdk/application/wearable/fd230/service/app_store/app_store_msg.cpp
code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h
code/sdk/application/wearable/fd230/service/broadcast/src/broadcast_implement.c
code/sdk/application/wearable/fd230/service/device_msg/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/device_location.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/device_location.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/device_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/device_proxy.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/device_proxy.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/dial_market/CMakeLists.txt
code/sdk/application/wearable/fd230/service/dial_market/dial_market.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/dial_market/dial_market_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/msg_center/CMakeLists.txt
code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-cli/libmsg_center.a
code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-ser/libmsg_center.a
code/sdk/application/wearable/fd230/service/msg_center/brandy-native-js/libmsg_center.a
code/sdk/application/wearable/fd230/service/msg_center/brandy-xts/libmsg_center.a
code/sdk/application/wearable/fd230/service/msg_center/include/msg_center_protocol.h
code/sdk/application/wearable/fd230/service/msg_center/include/notify/notification_manager.h
code/sdk/application/wearable/fd230/service/msg_center/include/notify/phone_msg_notification.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/msg_center/src/common/msg_center_self_cmd.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/msg_center/src/notify/phone_msg_notification.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/power_manager/src/actions/display_action.c
code/sdk/application/wearable/fd230/service/power_manager/src/filters/gui_event_filter.c
code/sdk/application/wearable/fd230/service/remote_msg/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/xiaodu_voice/xiaodu_voice.cpp
code/sdk/application/wearable/fd230/service/xiaodu_voice/xiaodu_voice_msg.cpp

index 7b1691b..1137e9b 100644 (file)
@@ -8,6 +8,8 @@ add_subdirectory_if_exist(xiaodu_navi)
 add_subdirectory_if_exist(xiaodu_voice)
 add_subdirectory_if_exist(xiaodu_navi_vector)
 add_subdirectory_if_exist(hc_demo_msg)
+add_subdirectory_if_exist(device_msg)
+add_subdirectory_if_exist(remote_msg)
 add_subdirectory_if_exist(auto_ota_msg)
 add_subdirectory_if_exist(alipay_msg)
 add_subdirectory_if_exist(app_store)
index e679c53..5cfeb9a 100644 (file)
@@ -8,7 +8,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/uiservice/include
 )
 
 set(SOURCES
index ff050dc..c7cef19 100644 (file)
@@ -113,7 +113,13 @@ errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint1
         for (int32_t i = 0; i < count; i++) {
             (void)strncpy_s((char*)unitInfo[i].pkgName, PKG_NAME_MAX_LENGTH,
                             bundleInfos[i].bundleName, strlen(bundleInfos[i].bundleName));
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s", i, unitInfo[i].pkgName);
+            (void)strncpy_s((char*)unitInfo[i].versionName, VERSION_NAME_MAX_LENGTH,
+                            bundleInfos[i].versionName, strlen(bundleInfos[i].versionName));
+            (void)strncpy_s((char*)unitInfo[i].labelName, LABEL_NAME_MAX_LENGTH,
+                            bundleInfos[i].label, strlen(bundleInfos[i].label));
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s, versionName[%d] = %s,\
+                            labeName[%d] = %s", i, unitInfo[i].pkgName, i, unitInfo[i].versionName, i,
+                            unitInfo[i].labelName);
             unitInfo[i].versionCode = bundleInfos[i].versionCode;
         }
         ret = msg_center_send_data(MSGCENTER_CMD_APP_STORE, type, infoList, len);
@@ -128,6 +134,43 @@ errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint1
     }
     return ret;
 }
+
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    BundleInfo bundleInfo;
+    int32_t ret = ERRCODE_FAIL;
+
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+    uint16_t payload_len = usr_len - tl_len;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    char *bundleName = (char *)malloc(payload_len + 1);
+    (void)memcpy_s(bundleName, payload_len, tlv_payload, payload_len);
+    bundleName[payload_len] = '\0';
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bundleName = %s", bundleName);
+
+    uint8_t bundleRet = OHOS::BundleMsClient::GetInstance().GetBundleInfo(bundleName, 0, &bundleInfo);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get bundleInfo, ret = %d", bundleRet);
+
+    int32_t len = sizeof(PkgUnitInfo);
+    PkgUnitInfo *info = (PkgUnitInfo *)malloc(len);
+    if (info != nullptr) {
+        memset_s(info, len, 0, len);
+        (void)strncpy_s((char*)info->pkgName, PKG_NAME_MAX_LENGTH, bundleInfo.bundleName,
+                        strlen(bundleInfo.bundleName));
+        (void)strncpy_s((char*)info->versionName, VERSION_NAME_MAX_LENGTH, bundleInfo.versionName,
+                        strlen(bundleInfo.versionName));
+        (void)strncpy_s((char*)info->labelName, LABEL_NAME_MAX_LENGTH, bundleInfo.label, strlen(bundleInfo.label));
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetBundleInfo pkgName = %s, versionName = %s, labeName = %s",
+                      info->pkgName, info->versionName, info->labelName);
+        info->versionCode = bundleInfo.versionCode;
+        ret = msg_center_send_data(cmd_id, type, info, len);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "AppStoreGetBundleInfo send data ret = 0x%x", ret);
+        free(info);
+        free(bundleName);
+    }
+
+    return ret;
+}
 ///////////////////////////////////////////////////////////////////////////////////
 
 
index 4706473..811695b 100644 (file)
@@ -18,6 +18,8 @@ extern "C" {
 #endif
 
 #define PKG_NAME_MAX_LENGTH 128
+#define VERSION_NAME_MAX_LENGTH 128
+#define LABEL_NAME_MAX_LENGTH 256
 #define FS_DIR_APP_STORE    "/user/app_store/"
 
 typedef enum {
@@ -29,6 +31,7 @@ typedef enum {
     APP_STORE_OPERATION  = 0x01,
     APP_STORE_NOTIFY_PROGRESS = 0x02,
     APP_STORE_GET_PKG_LIST = 0x03,
+    APP_STORE_GET_BUNDLEINFO = 0x04,
 } AppStoreType;
 
 typedef enum {
@@ -60,10 +63,13 @@ typedef struct {
 typedef struct {
     uint8_t pkgName[PKG_NAME_MAX_LENGTH];
     int32_t versionCode;
+    uint8_t versionName[VERSION_NAME_MAX_LENGTH];
+    uint8_t labelName[LABEL_NAME_MAX_LENGTH];
 } PkgUnitInfo;
 
 errcode_t AppStorePkgOperation(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
 errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
 
 #ifdef BLE_INSTRUCT
 void ble_app_store_init(void);
index f34d838..d2f1f1a 100644 (file)
@@ -10,6 +10,7 @@ extern "C" {
 static const msg_center_cmd_map_t g_appStoreTbl[] = {
     { MSGCENTER_CMD_APP_STORE,  APP_STORE_OPERATION,                 AppStorePkgOperation },
     { MSGCENTER_CMD_APP_STORE,  APP_STORE_GET_PKG_LIST,              AppStoreGetPkgList },
+    { MSGCENTER_CMD_APP_STORE,  APP_STORE_GET_BUNDLEINFO,            AppStoreGetBundleInfo },
 };
 
 errcode_t AppStoreTypeDispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
index 80216b2..92b12f9 100644 (file)
@@ -47,6 +47,9 @@ typedef enum {
     TOPIC_EVENT_HFP_FINISHED,\r
     TOPIC_EVENT_HFP_PHONE_TO_WATCH,\r
     TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
+       TOPIC_EVENT_BLOODOXYGEN_UPDATA,\r
+    TOPIC_EVENT_SPORT_DISTANCE,\r
+    TOPIC_EVENT_LOCATION,\r
     TOPIC_EVENT_HFP_HINT,\r
 // #ifdef SUPPORT_CYWEE_SERVICE\r
     TOPIC_EVENT_ACTIVITY_UPDATE,\r
index 47e293e..d38325c 100644 (file)
@@ -32,6 +32,9 @@ static const TopicToCore topicToCoreArray[] = {
     {TOPIC_EVENT_HFP_FINISHED, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1},
+       {TOPIC_EVENT_BLOODOXYGEN_UPDATA, A_CORE_MASK, 1},
+    {TOPIC_EVENT_SPORT_DISTANCE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_LOCATION, A_CORE_MASK, 1},
     {TOPIC_EVENT_DEVICE_BIND, A_CORE_MASK, 1},
     {TOPIC_EVENT_BLE_TRANSMIT, A_CORE_MASK, 1},
     {TOPIC_EVENT_CHARGE_PLUG, A_CORE_MASK, 1},
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/CMakeLists.txt b/code/sdk/application/wearable/fd230/service/device_msg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9ea557d
--- /dev/null
@@ -0,0 +1,51 @@
+set(COMPONENT_NAME "device_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+set(PRIVATE_HEADER\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits\r
+    ${ROOT_DIR}/middleware/services/media/foundation/audiomanager/interfaces/kits/audiomanager\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits\r
+    ${ROOT_DIR}/middleware/chips/brandy/nv/include\r
+    ${ROOT_DIR}/middleware/chips/brandy/nv/nv_config\r
+    ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include\r
+    ${ROOT_DIR}/open_source/openharmony/base/sensors/location/interfaces/kits/include\r
+    ${ROOT_DIR}/middleware/utils/dfx/diag/\r
+)\r
+\r
+set(SOURCES\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/device_msg.cpp\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/device_proxy.cpp\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/msg_center_device.cpp\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/device_location.cpp\r
+)\r
+\r
+set(COMPONENT_PUBLIC_CCFLAGS\r
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+    -std=c++11\r
+    -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+    true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+    APP_PLATFORM_WATCHGT\r
+    CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/device_location.cpp b/code/sdk/application/wearable/fd230/service/device_msg/device_location.cpp
new file mode 100644 (file)
index 0000000..d24a14f
--- /dev/null
@@ -0,0 +1,174 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+#include "device_location.h"\r
+#include "wearable_log.h"\r
+#include "locator.h"\r
+\r
+using namespace OHOS::Location;\r
+\r
+LocationInfo_t g_locationInfo = {0};\r
+\r
+class GnssStatusCallback : public IGnssStatusCallback {\r
+public:\r
+    GnssStatusCallback() {}\r
+    ~GnssStatusCallback() {}\r
+\r
+    void OnStatusChange(const std::shared_ptr<SatelliteStatus> &statusInfo) override\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnStatusChange, num:%d\n", statusInfo->GetSatellitesNumber());\r
+        for (int32_t satIdx = 0; satIdx < statusInfo->GetSatellitesNumber(); satIdx++) {\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "sat index:%d svid:%d ele:%.3f az:%.3f  cnr:%.3f \n", satIdx,\r
+                          statusInfo->GetSatelliteIds()[satIdx], statusInfo->GetAltitudes()[satIdx],\r
+                          statusInfo->GetAzimuths()[satIdx], statusInfo->GetCarrierToNoiseDensitys()[satIdx]);\r
+        }\r
+    }\r
+\r
+private:\r
+};\r
+\r
+class NmeaMessageCallback : public INmeaMessageCallback {\r
+public:\r
+    NmeaMessageCallback() {}\r
+    ~NmeaMessageCallback() {}\r
+\r
+    void OnMessageChange(int64_t timestamp, const std::string msg) override\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnMessageChange timestamp :%lld msg:%s\n", timestamp, msg.c_str());\r
+    }\r
+\r
+private:\r
+};\r
+\r
+class LocatorCallback : public ILocatorCallback {\r
+public:\r
+    LocatorCallback() {}\r
+\r
+    ~LocatorCallback() {}\r
+\r
+    void OnLocationReport(const std::shared_ptr<Location> &location) override\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocationReport Lat:%.3f Long:%.3f Alt:%.3f Speed:%.3f dir:%.3f\n",\r
+                      location->GetLatitude(), location->GetLongitude(), location->GetAltitude(), location->GetSpeed(),\r
+                      location->GetDirection());\r
+    }\r
+\r
+    void OnErrorReport(const int errorCode) override\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "error code:%d\n", errorCode);\r
+    }\r
+\r
+    void OnLocatingStatusChange(const int status) override\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocatingStatusChange status:%d\n", status);\r
+    }\r
+\r
+private:\r
+};\r
+\r
+typedef struct {\r
+    Locator *locator;\r
+    bool isStarted;\r
+    LocatorCallback locatorCallback;\r
+    GnssStatusCallback gnssStatusCallback;\r
+    NmeaMessageCallback nmeaMessageCallback;\r
+} LocationSampleContext;\r
+\r
+static LocationSampleContext g_locationContext = {\r
+    .locator = nullptr,\r
+    .isStarted = false,\r
+};\r
+\r
+int32_t deviceLocationStartLocating()\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "LocationStartLocating\n");\r
+    if (g_locationContext.locator == nullptr) {\r
+        g_locationContext.locator = &Locator::GetInstance();\r
+    }\r
+    if (g_locationContext.locator == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is nullptr\n");\r
+        return ERRCODE_FAILURE;\r
+    }\r
+\r
+    bool isEnabled = false;\r
+    LocationErrCode errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+\r
+    if (!isEnabled) {\r
+        errCode = g_locationContext.locator->EnableAbility(true);\r
+        if (errCode != ERRCODE_SUCCESS) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
+            return errCode;\r
+        }\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterGnssStatusCallback\n");\r
+    errCode = g_locationContext.locator->RegisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterNmeaMessageCallback\n");\r
+    errCode = g_locationContext.locator->RegisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterNmeaMessageCallback failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating\n");\r
+    RequestConfig requestConfig;\r
+    requestConfig.SetPriority(PRIORITY_ACCURACY);\r
+    errCode = g_locationContext.locator->StartLocating(&requestConfig, &g_locationContext.locatorCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StartLocating failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    g_locationContext.isStarted = true;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating end\n");\r
+    return ERRCODE_SUCCESS;\r
+}\r
+\r
+int32_t deviceLocationStopLocating()\r
+{\r
+    if (!g_locationContext.isStarted) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is not started\n");\r
+        return ERRCODE_FAILURE;\r
+    }\r
+    LocationErrCode errCode =\r
+        g_locationContext.locator->UnregisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator UnregisterNmeaMessageCallback failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    errCode = g_locationContext.locator->UnregisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    errCode = g_locationContext.locator->StopLocating(&g_locationContext.locatorCallback);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StopLocating failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    g_locationContext.isStarted = false;\r
+\r
+    bool isEnabled = false;\r
+    errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    if (!isEnabled) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator Is not Enabled\n");\r
+        return ERRCODE_FAILURE;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "EnableAbility false\n");\r
+    errCode = g_locationContext.locator->EnableAbility(false);\r
+    if (errCode != ERRCODE_SUCCESS) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
+        return errCode;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Disable end\n");\r
+    return ERRCODE_SUCCESS;\r
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/device_location.h b/code/sdk/application/wearable/fd230/service/device_msg/device_location.h
new file mode 100644 (file)
index 0000000..3305d69
--- /dev/null
@@ -0,0 +1,20 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+#ifndef DEVICE_LOCATION_H\r
+#define DEVICE_LOCATION_H\r
+#include <cinttypes>\r
+\r
+typedef struct LocationInfo {\r
+    int32_t latitude_;\r
+    int32_t longitude_;\r
+    uint16_t altitude_;\r
+    uint16_t accuracy_;\r
+    uint16_t speed_;\r
+    uint16_t direction_;\r
+    int64_t timeStamp_;\r
+} LocationInfo_t;\r
+\r
+int32_t deviceLocationStartLocating();\r
+int32_t deviceLocationStopLocating();\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/device_msg.cpp b/code/sdk/application/wearable/fd230/service/device_msg/device_msg.cpp
new file mode 100644 (file)
index 0000000..3f54b45
--- /dev/null
@@ -0,0 +1,191 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "ohos_init.h"\r
+#include "msg_center_device.h"\r
+#ifdef PUBLISH_TEST_DATA\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include "graphic_timer.h"\r
+#include "broadcast_feature.h"\r
+#include "ohos_timer.h"\r
+#include "heartrate/HeartModel.h"\r
+#include "device_location.h"\r
+#endif\r
+namespace OHOS {\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#ifdef PUBLISH_TEST_DATA\r
+#define BLOODOXYGEN_LOWER 90\r
+#define BLOODOXYGEN_RANGE 10\r
+#define STEP_RANGE 5\r
+#define DISTANCE_RANGE 10\r
+#define HEARTRATE_LOWER 60\r
+#define HEARTRATE_RANGE 60\r
+static uint8_t g_rotation_publish = 0;\r
+static GraphicTimer *g_publishTestDataHandle = nullptr;\r
+enum publishDataType {\r
+    PUBLISH_SETP = 0,\r
+    PUBLISH_DISTANCE,\r
+    PUBLISH_HEARTRATE,\r
+    PUBLISH_BLOODOXYGEN,\r
+    PUBLISH_TYPE_MAX\r
+};\r
+\r
+static void PublishTopicTestDataEvent(uint16_t topic, const void *data, size_t len)\r
+{\r
+    int32_t ret;\r
+    uint16_t size = len;\r
+    BroadcastApi *broadcastApi = nullptr;\r
+    IUnknown *api = nullptr;\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent topic=%u!!", topic);\r
+\r
+    void *publishData = malloc(size);\r
+    if (publishData == nullptr) {\r
+        return;\r
+    }\r
+    ret = memcpy_s(publishData, size, data, size);\r
+    if (ret != EOK) {\r
+        free(publishData);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent memcpy_s fail! ret = %d", ret);\r
+        return;\r
+    }\r
+\r
+    Request request = {\r
+        .msgId = topic,\r
+        .len = size,\r
+        .msgValue = 0,\r
+        .data = publishData,\r
+    };\r
+\r
+    /* public request */\r
+    api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+    if (api == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
+        free(publishData);\r
+        return;\r
+    }\r
+    ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+    if (ret != 0 || broadcastApi == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
+        free(publishData);\r
+        return;\r
+    }\r
+    broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
+    broadcastApi->Release((IUnknown *)broadcastApi);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent end!!");\r
+\r
+    return;\r
+}\r
+\r
+static void PublishTestDataCallback(void *)\r
+{\r
+    switch (g_rotation_publish++ % PUBLISH_TYPE_MAX) {\r
+        case PUBLISH_BLOODOXYGEN: {\r
+            uint8_t blood_oxygen = BLOODOXYGEN_LOWER + rand() % BLOODOXYGEN_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_BLOODOXYGEN_UPDATA, &blood_oxygen, sizeof(uint8_t));\r
+            break;\r
+        }\r
+        case PUBLISH_SETP: {\r
+            uint32_t step = rand() % STEP_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_STEPDATA_UPDATE, &step, sizeof(uint32_t));\r
+            break;\r
+        }\r
+        case PUBLISH_HEARTRATE: {\r
+            HeartDatas heart_data = {0};\r
+            heart_data.perSec = HEARTRATE_LOWER + rand() % HEARTRATE_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_HEARTRATE_UPDATA, &heart_data, sizeof(HeartDatas));\r
+            break;\r
+        }\r
+        case PUBLISH_DISTANCE: {\r
+            uint32_t distance = rand() % DISTANCE_RANGE;\r
+            PublishTopicTestDataEvent(TOPIC_EVENT_SPORT_DISTANCE, &distance, sizeof(uint32_t));\r
+            break;\r
+        }\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+void PublishTestData()\r
+{\r
+    uint32 tick = GetOSTick(5000);  // 5秒发布一次测试数据\r
+    if (g_publishTestDataHandle == nullptr) {\r
+        g_publishTestDataHandle = new GraphicTimer(tick, PublishTestDataCallback, nullptr, true);\r
+    }\r
+    if (g_publishTestDataHandle == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData new GraphicTimer failed!!");\r
+        return;\r
+    }\r
+    bool retTimer = g_publishTestDataHandle->Start();\r
+    if (!retTimer) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData Start failed!!");\r
+        if (g_publishTestDataHandle != nullptr) {\r
+            delete g_publishTestDataHandle;\r
+            g_publishTestDataHandle = nullptr;\r
+        }\r
+        return;\r
+    }\r
+}\r
+#endif\r
+static const msg_center_cmd_map_t g_msg_center_device_tbl[] = {\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL, msg_center_get_battery_level},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_STORAGE_INFO, msg_center_get_storage_info},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_PRODUCT_INFO, msg_center_get_product_info},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_LANGUAGE_ID, msg_center_get_language_id},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_VOLUME_INFO, msg_center_get_volume_info},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_LANGUAGE_ID, msg_center_set_language_id},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_VOLUME_INFO, msg_center_set_volume_info},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_HEARTRATE, msg_center_device_heartrate},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_STEPDATA, msg_center_device_stepdata},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, msg_center_device_bloodoxygen},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH, msg_center_offline_log_switch},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_GET_INFO, msg_center_location_get_info},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_START, msg_center_location_start},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_STOP, msg_center_location_stop},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_ACTION, msg_center_sport_action},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_DATA, msg_center_sport_get_data},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, msg_center_sport_report_data},\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL, msg_center_set_online_log_channel},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL, msg_center_set_online_log_level},\r
+#endif\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_INIT, msg_center_ota_init},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_UPDATE, msg_center_ota_update},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFF_FIND_PHONE, msg_center_device_findphone},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT, msg_center_camera_exit},\r
+    {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS, msg_center_camera_online},\r
+};\r
+\r
+errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tbl_size = sizeof(g_msg_center_device_tbl) / sizeof(g_msg_center_device_tbl[0]);\r
+    uint8_t i;\r
+    for (i = 0; i < tbl_size; i++) {\r
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_device_tbl[i];\r
+        if ((item->type == type) && (item->handler != NULL)) {\r
+            item->handler(cmd_id, type, usr_data, usr_len);\r
+            return ERRCODE_SUCC;\r
+        }\r
+    }\r
+    return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void device_init(void)\r
+{\r
+    msg_center_register_cmd(MSGCENTER_CMD_DEVICE, msg_center_device_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(device_init, LAYER_INIT_LEVEL_4);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/device_proxy.cpp b/code/sdk/application/wearable/fd230/service/device_msg/device_proxy.cpp
new file mode 100644 (file)
index 0000000..336cfd7
--- /dev/null
@@ -0,0 +1,476 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include <cstdio>\r
+#include "device_proxy.h"\r
+#include "wearable_log.h"\r
+#include "common_def.h"\r
+#include "cpp/audio_manager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "ui_resource_string.h"\r
+#include <sys/statfs.h>\r
+#include <algorithm>\r
+#include "key_id.h"\r
+#include "common.h"\r
+#include "nv.h"\r
+#include "upg.h"\r
+#include "upg_porting.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *MOUNT_POINT[] = {"/system", "/user", "/update", "/music"};\r
+static constexpr const uint16_t language_protocol[] = {(uint8_t)(0x0u << 8) | LANGUAGE_ID_ZH,\r
+                                                       (uint8_t)(0x1u << 8) | LANGUAGE_ID_ZH,\r
+                                                       (uint8_t)(0x2u << 8) | LANGUAGE_ID_EN};\r
+static constexpr const uint8_t language_mask_bits = 8;\r
+static constexpr const uint16_t language_key_mask = 0xFF00;\r
+static constexpr const uint16_t language_val_mask = 0x00FF;\r
+\r
+static constexpr const uint8_t percentage_scale = 100;             // 百分比换算基数\r
+static constexpr const uint8_t percentage_max = 100;\r
+static constexpr const uint8_t percentage_min = 0;\r
+\r
+static constexpr const uint32_t adc_reference_ratio_numerator = 450U;          // 18 * 1000\r
+static constexpr const uint32_t adc_reference_ratio_denominator = 1024U / 2U;  // 40960 / (1000/18)/2U\r
+static constexpr const uint32_t millivolt_per_volt = 1000U;\r
+\r
+static constexpr const uint32_t def_samples_to_keep = 10;\r
+static constexpr const uint32_t def_samples_to_discard = 5;\r
+static constexpr const uint32_t def_adc_max_range_mv = 380;\r
+static constexpr const uint32_t def_adc_min_range_mv = 0;\r
+\r
+template <typename T>\r
+T clamp(const T &value, const T &min_val, const T &max_val)\r
+{\r
+    return (value < min_val) ? (min_val) : (value > max_val ? max_val : value);\r
+}\r
+\r
+void device_proxy::get_storage_info(storage_info &info)\r
+{\r
+    memset_s(&info, sizeof(storage_info), 0, sizeof(storage_info));\r
+    for (size_t i = 0; i < sizeof(MOUNT_POINT) / sizeof(MOUNT_POINT[0]); i++) {\r
+        struct statfs tmpStat = {0};\r
+        if (statfs(MOUNT_POINT[i], &tmpStat) != 0) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "无法获取%s的挂载点信息,%s", MOUNT_POINT[i], strerror(errno));\r
+            continue;\r
+        }\r
+\r
+        uint32_t total = static_cast<uint32_t>(tmpStat.f_blocks * tmpStat.f_bsize);\r
+        uint32_t used = static_cast<uint32_t>((tmpStat.f_blocks - tmpStat.f_bfree) * tmpStat.f_bsize);\r
+        uint32_t free = static_cast<uint32_t>(tmpStat.f_bfree * tmpStat.f_bsize);\r
+\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "挂载点%s信息, 总:%d(byte), 用:%d(byte), 剩:%d(byte)",\r
+                      MOUNT_POINT[i], total, used, free);\r
+        info.total_size += total;\r
+        info.used_size += used;\r
+        info.free_size += free;\r
+    }\r
+}\r
+void device_proxy::get_language_id(uint8_t &id)\r
+{\r
+    sys_language_id_t lang_id = {0};\r
+    uint16_t nvsize = 0;\r
+\r
+    errcode_t ret = uapi_nv_read(NV_ID_SYS_LANGUAGE_ID, sizeof(sys_language_id_t), &nvsize, (uint8_t *)&lang_id);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language nvsize=%u id = %u", nvsize, lang_id.language_id);\r
+\r
+    for (auto key : language_protocol) {\r
+        if (lang_id.language_id == (uint8_t)(key & language_val_mask)) {\r
+            id = (uint8_t)((key & language_key_mask) >> language_mask_bits);\r
+            return;\r
+        }\r
+    }\r
+    id = LANGUAGE_ID_ZH;\r
+}\r
+void device_proxy::set_language_id(uint8_t id)\r
+{\r
+    sys_language_id_t lang_id = {.language_id = LANGUAGE_ID_ZH};\r
+\r
+    for (auto key : language_protocol) {\r
+        if (id == (uint8_t)((key & language_key_mask) >> language_mask_bits)) {\r
+            lang_id.language_id = (uint8_t)(key & 0xFF);\r
+        }\r
+    }\r
+\r
+    errcode_t ret = uapi_nv_write(NV_ID_SYS_LANGUAGE_ID, (uint8_t *)&lang_id, sizeof(sys_language_id_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv set language id error, ret=%u", ret);\r
+        return;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set language id = %u", lang_id.language_id);\r
+    // 发送更新消息到uiservice\r
+    SendMsgToUIService(UI_UPDATE_LANGUAGE, 0, nullptr, 0);\r
+}\r
+void device_proxy::get_product_info(std::string &info_string)\r
+{\r
+    sys_product_info_t info = {0};\r
+    uint16_t nvsize = 0;\r
+    info_string.clear();\r
+\r
+    errcode_t ret = uapi_nv_read(NV_ID_SYS_PRODUCT_INFO, sizeof(sys_product_info_t), &nvsize, (uint8_t *)&info);\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get product info error, ret=%u", ret);\r
+        return;\r
+    }\r
+\r
+    if (nvsize < sizeof(sys_product_info_t) || info.size == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "invalid product info size: nvsize=%u, info.size=%u", nvsize, info.size);\r
+        return;\r
+    }\r
+\r
+    info_string.assign((const char *)info.name, info.size);\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "product info: nvsize=%u, strlen=%zu, data=%.*s", nvsize, info_string.size(),\r
+                  static_cast<int>(info_string.size()), info_string.c_str());\r
+}\r
+void device_proxy::get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info)\r
+{\r
+    std::vector<AudioStreamType> audio_types;\r
+\r
+    if (vol_type == vol_type_all_idx || vol_type > vol_type_max_idx) {\r
+        for (uint8_t i = 0; i < vol_type_max_idx; i++) {\r
+            uint8_t max_perc = 0;\r
+            trans_type_to_audio_stream_type(i, audio_types);\r
+            for (auto types : audio_types) {  // 每个类型也由多个音频类型组成, 取声音最大的\r
+                int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+                int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+                int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+                uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+                max_perc = max_perc > perc ? max_perc : perc;\r
+            }\r
+            volume_info info;\r
+            info.type = i;\r
+            info.perc = max_perc;\r
+\r
+            vol_info.push_back(info);\r
+        }\r
+    } else {\r
+        uint8_t max_perc = 0;\r
+        trans_type_to_audio_stream_type(vol_type, audio_types);\r
+        for (auto types : audio_types) {  // 每个类型也由多个音频类型组成, 取声音最大的\r
+            int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+            int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+            int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+            uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+            max_perc = max_perc > perc ? max_perc : perc;\r
+        }\r
+        volume_info info;\r
+        info.type = vol_type;\r
+        info.perc = max_perc;\r
+\r
+        vol_info.push_back(info);\r
+    }\r
+}\r
+void device_proxy::set_volume_info(volume_info &vol_info)\r
+{\r
+    std::vector<AudioStreamType> audio_types;\r
+    trans_type_to_audio_stream_type(vol_info.type, audio_types);\r
+    for (auto types : audio_types) {\r
+        int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+        int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+\r
+        int32_t vol = calc_vol_volume(min_vol, max_vol, vol_info.perc);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetVolume %08X, %d", types, vol);\r
+        Audio::AudioManager::GetInstance().SetVolume(types, vol);\r
+    }\r
+}\r
+OTA_ERR device_proxy::ota_init(ota_info &info)\r
+{\r
+    // 检查OTA的当前状态\r
+    upg_status status = uapi_upg_get_status();\r
+    if (status == UPG_STATUS_UPDATING) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:The update module is being upgraded.");\r
+        return OTA_ERR::OTA_ERR_STATUS_UPDATING;\r
+    }\r
+    // 清理并检查升级区空间大小\r
+    delete_file_with_cleanup(upg_get_pkg_file_dir(), upg_get_pkg_file_path());\r
+    uint32_t total_size = uapi_upg_get_storage_size();\r
+    if (total_size == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:OTA check storage size error, total_size is 0");\r
+        return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+    }\r
+    if (info.package_size >= total_size) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check size error, total size:%u, need size:%u", total_size,\r
+                      info.package_size);\r
+        return OTA_ERR::OTA_ERR_INSUFFICIENT_STORAGE_SPACE;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check succ");\r
+    return OTA_ERR::OTA_SUCC;\r
+}\r
+OTA_ERR device_proxy::ota_update(ota_info &info)\r
+{\r
+    uint32_t total_size = 0;\r
+    do {\r
+        FILE *fp = fopen(upg_get_pkg_file_path(), "rb");\r
+        if (fp == nullptr) {\r
+            break;\r
+        }\r
+        fseek(fp, 0L, SEEK_END);\r
+        total_size = ftell(fp);\r
+        fclose(fp);\r
+    } while (false);\r
+    if (total_size == 0) {\r
+        return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+    }\r
+    if (total_size != info.package_size) {\r
+        return OTA_ERR::OTA_ERR_PACKAGE_SIZE_ERROR;\r
+    }    \r
+    return OTA_ERR::OTA_SUCC;\r
+}\r
+\r
+void device_proxy::call_ui_ota_update()\r
+{\r
+    // 发送升级请求到uiservice\r
+    SendMsgToUIService(UI_OTA_UPDATE, 0, nullptr, 0);\r
+}\r
+\r
+int device_proxy::delete_file_with_cleanup(const char *ppath, const char *path)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "path:%s, ppath:%s", path, ppath);\r
+    // 1. 删除文件\r
+    if (unlink(path) == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink failed:%d", errno);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink succ");\r
+    // 2. 打开父目录文件描述符\r
+    int dir_fd = open(ppath, O_RDONLY);\r
+    if (dir_fd == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir failed:%d", errno);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir succ");\r
+    // 3. 同步父目录元数据到磁盘\r
+    if (fsync(dir_fd) == -1) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir failed:%d", errno);\r
+        close(dir_fd);\r
+        return 1;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir succ");\r
+    close(dir_fd);\r
+    return 0;\r
+}\r
+\r
+uint8_t device_proxy::calc_vol_percentage(int32_t min, int32_t max, int32_t curr)\r
+{\r
+    if (min >= max) {\r
+        return 0;\r
+    }\r
+    const int32_t clamped_curr = clamp(curr, min, max);\r
+    const int64_t range = static_cast<int64_t>(max) - min;\r
+\r
+    const int64_t scaled_value = (static_cast<int64_t>(clamped_curr - min) * percentage_scale);\r
+    return static_cast<uint8_t>(scaled_value / range);\r
+}\r
+int32_t device_proxy::calc_vol_volume(int32_t min, int32_t max, uint8_t percentage)\r
+{\r
+    if (min >= max) {\r
+        return min;\r
+    }\r
+    uint8_t clamped_percentage = clamp(percentage, percentage_min, percentage_max);\r
+\r
+    double range = static_cast<double>(max - min);\r
+    double percentage_ratio = static_cast<double>(clamped_percentage) / 100.0;\r
+    int32_t curr = static_cast<int32_t>(min + range * percentage_ratio);\r
+\r
+    return static_cast<int32_t>(clamp(curr, min, max));\r
+}\r
+void device_proxy::trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types)\r
+{\r
+    audio_types.clear();\r
+    switch (type) {\r
+        case vol_type_alarm:\r
+            audio_types.push_back(AUDIO_STREAM_ALARM);         // 通用报警音\r
+            audio_types.push_back(AUDIO_STREAM_ALARM_SYSTEM);  // 设备报警\r
+            audio_types.push_back(AUDIO_STREAM_ALARM_CLOCK);   // 闹钟报警\r
+            break;\r
+        case vol_type_ring:\r
+            audio_types.push_back(AUDIO_STREAM_RING);  // 来电铃声\r
+            break;\r
+        case vol_type_call:\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL);         // 普通语音通话\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOIP);    // 网络语音通话(如微信通话)\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_BT_SCO);  // 蓝牙语音通话\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOLTE);   // 4G VOLTE 高清语音通话\r
+            break;\r
+        case vol_type_assistant:\r
+            audio_types.push_back(AUDIO_STREAM_VOICE_ASSISTANT);  // 语音助手(如 Siri、Google Assistant)\r
+            audio_types.push_back(AUDIO_STREAM_TTS);              // 语音合成(如文本转语音)\r
+            break;\r
+        case vol_type_notification:\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION);  // 通用提示音\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION_SYSTEM);  // 设备提示音(如蓝牙连接/断开、低电量提示)\r
+            audio_types.push_back(AUDIO_STREAM_NOTIFICATION_PROMPT);  // 运动健康提示音(如运动完成提醒)\r
+            break;\r
+        case vol_type_music:\r
+            audio_types.push_back(AUDIO_STREAM_MUSIC);  // 本地音乐播放。\r
+            audio_types.push_back(AUDIO_STREAM_A2DP_MUSIC);  // 蓝牙传输的媒体音(如从手机传输到蓝牙耳机的音乐)。\r
+            break;\r
+        case vol_type_video:\r
+            audio_types.push_back(AUDIO_STREAM_FITNESS_VIDEO);  // 健身视频的指导音频。\r
+            break;\r
+    }\r
+}\r
+\r
+uint8_t battery_power::get_battery_percentage()\r
+{\r
+    battery_power *inst = get_instance();\r
+    if (inst == nullptr) {\r
+        return 0;\r
+    }\r
+    uint32_t voltage = 0;\r
+    // 从adc获取电压值\r
+    if (inst->adc_context_startup()) {\r
+        voltage = inst->calc_voltage();\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "calc_voltage:%u", voltage);\r
+    }\r
+    inst->adc_context_shutdown();\r
+    // 根据电压值计算电量百分比\r
+    return inst->calc_percentage(voltage);\r
+}\r
+\r
+battery_power *battery_power::get_instance()\r
+{\r
+    static battery_power *instance = nullptr;\r
+    if (instance == nullptr) {\r
+        battery_power *temp = new battery_power();\r
+        if (!temp->adc_context_init()) {\r
+            delete temp;\r
+            return nullptr;\r
+        }\r
+        instance = temp;\r
+    }\r
+    return instance;\r
+}\r
+\r
+battery_power::battery_power()\r
+{\r
+    // 数据由海思提供\r
+    channel = ADC_CHANNEL_3;\r
+    analog_pin = S_AGPIO_L27;\r
+    mode = PIN_MODE_0;\r
+    samples_to_keep = def_samples_to_keep;\r
+    samples_to_discard = def_samples_to_discard;\r
+    // 由测试检测而来, 测试中得到的数据应该是0.3744V(没有标注单位,猜测得到,未必准确)\r
+    // 因为要算百分比, 换算成毫伏更容易计算\r
+    adc_max_range_mv = def_adc_max_range_mv;\r
+    adc_min_range_mv = def_adc_min_range_mv;\r
+}\r
+\r
+battery_power::~battery_power()\r
+{\r
+    adc_context_shutdown();\r
+}\r
+\r
+bool battery_power::adc_context_init()\r
+{\r
+    // 初始化pin模块\r
+    uapi_pin_init();\r
+    // 初始化高精度计数器\r
+    errcode_t err = uapi_tcxo_init();\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init succ");\r
+    // 设置pin脚模式\r
+    err = uapi_pin_set_mode(analog_pin, mode);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode succ");\r
+    return true;\r
+}\r
+\r
+bool battery_power::adc_context_startup()\r
+{\r
+    errcode_t err = uapi_adc_init(ADC_CLOCK_500KHZ);  // 初始化adc\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init succ");\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en true");\r
+    err = uapi_adc_open_channel(channel);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel error %u", err);\r
+        return false;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel succ");\r
+    return true;\r
+}\r
+void battery_power::adc_context_shutdown()\r
+{\r
+    errcode_t err = uapi_adc_close_channel(channel);\r
+    if (err != ERRCODE_SUCC) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel error %u", err);\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel succ");\r
+    uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, false);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en false");\r
+    uapi_adc_deinit();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_deinit");\r
+}\r
+\r
+uint8_t battery_power::calc_percentage(uint32_t voltage)\r
+{\r
+    if (voltage >= adc_max_range_mv) {\r
+        return percentage_max;\r
+    }\r
+    if (voltage <= adc_min_range_mv) {\r
+        return percentage_min;\r
+    }\r
+\r
+    uint32_t voltage_range = adc_max_range_mv - adc_min_range_mv;\r
+    uint32_t rounding_term = voltage_range / 2;\r
+    uint32_t voltage_offset = voltage - adc_min_range_mv;\r
+    return static_cast<uint8_t>((voltage_offset * percentage_scale + rounding_term) / voltage_range);\r
+}\r
+\r
+uint32_t battery_power::calc_voltage()\r
+{\r
+    // 丢弃初始帧数据\r
+    for (uint32_t i = 0; i < samples_to_discard; i++) {\r
+        uapi_adc_manual_sample(ADC_CHANNEL_NONE);\r
+        uapi_tcxo_delay_ms((uint64_t)3);  // 延迟3ms\r
+    }\r
+\r
+    uint32_t stick = 0;\r
+    uint32_t stick_count = 0;\r
+    // 采集样本数\r
+    for (uint32_t i = 0; i < samples_to_keep; i++) {\r
+        uint32_t irq_sts = osal_irq_lock();\r
+        uint32_t sample_result =\r
+            (uint32_t)uapi_adc_manual_sample(ADC_CHANNEL_NONE);  // 每次读取CHANNEL_NONE? testsuit中是这样写的\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sample result = %u", sample_result);\r
+        if (sample_result != 0) {\r
+            stick += sample_result;\r
+            stick_count++;\r
+        }\r
+        osal_irq_restore(irq_sts);\r
+    }\r
+\r
+    if (stick_count == 0) {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "error, no result");\r
+        return 0;\r
+    }\r
+\r
+    uint32_t voltage = adc_trans_sytick_to_voltages(stick / stick_count);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "adc trans voltages:%u", voltage);\r
+    return voltage;\r
+}\r
+\r
+uint32_t battery_power::adc_trans_sytick_to_voltages(uint32_t sytick)\r
+{\r
+    // 整数运算公式:(sytick * numerator + denominator/2) / denominator\r
+    return (sytick * adc_reference_ratio_numerator + adc_reference_ratio_denominator) / adc_reference_ratio_denominator;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/device_proxy.h b/code/sdk/application/wearable/fd230/service/device_msg/device_proxy.h
new file mode 100644 (file)
index 0000000..7cedf80
--- /dev/null
@@ -0,0 +1,104 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef WATCH_SETTING_PROXY_H\r
+#define WATCH_SETTING_PROXY_H\r
+\r
+#include <vector>\r
+#include <string>\r
+#include "msg_center_protocol.h"\r
+#include "cpp/audio_manager.h"\r
+#include "adc.h"\r
+#include "tcxo.h"\r
+#include "pinctrl.h"\r
+#include "hal_adc.h"\r
+\r
+namespace OHOS {\r
+\r
+typedef struct storage_info {\r
+    uint32_t total_size;  // 总大小\r
+    uint32_t used_size;   // 已使用\r
+    uint32_t free_size;   // 未使用\r
+} storage_info_t;\r
+\r
+typedef struct volume_info {\r
+    uint8_t type;  // 类型\r
+    uint8_t perc;  // 百分比\r
+} volume_info_t;\r
+\r
+typedef struct ota_info {\r
+    uint32_t package_size;\r
+} ota_info_t;\r
+\r
+enum class OTA_ERR : uint32_t {\r
+    OTA_SUCC = 0x00000000u,                            //"成功"\r
+    OTA_ERR_INVALID_PARAM = 0x00000001u,               //"参数错误"\r
+    OTA_ERR_INITIALIZE_ERR = 0x00000002u,              //"OTA初始化错误"\r
+    OTA_ERR_STATUS_UPDATING = 0x00000003u,             //"OTA正在升级中"\r
+    OTA_ERR_INVAILD_STORAGE = 0x00000004u,             //"获取升级区信息错误"\r
+    OTA_ERR_INSUFFICIENT_STORAGE_SPACE = 0x00000005u,  //"升级区没有足够的空间"\r
+    OTA_ERR_PACKAGE_SIZE_ERROR = 0x00000006u,          //"升级包大小不匹配"\r
+};\r
+\r
+static constexpr const uint8_t vol_type_all_idx = 0;\r
+static constexpr const uint8_t vol_type_max_idx = 7;\r
+static constexpr const uint8_t vol_type_alarm = 1;      // 报警类\r
+static constexpr const uint8_t vol_type_ring = 2;       // 来电铃声\r
+static constexpr const uint8_t vol_type_call = 3;       // 语音通话\r
+static constexpr const uint8_t vol_type_assistant = 4;  // 语音助手\r
+static constexpr const uint8_t vol_type_notification = 5; // 通用提示音\r
+static constexpr const uint8_t vol_type_music = 6;      // 音乐\r
+static constexpr const uint8_t vol_type_video = 7;      // 视频\r
+\r
+\r
+class device_proxy {\r
+public:\r
+    static void get_storage_info(storage_info &info);\r
+    static void get_language_id(uint8_t &lang_id);\r
+    static void set_language_id(uint8_t lang_id);\r
+    static void get_product_info(std::string &info_string);\r
+    static void get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info);\r
+    static void set_volume_info(volume_info &vol_info);\r
+    static OTA_ERR ota_init(ota_info &info);\r
+    static OTA_ERR ota_update(ota_info &info);\r
+    static void call_ui_ota_update();\r
+public:\r
+    static uint32_t calc_stat_size(uint64_t size);\r
+    static uint8_t calc_vol_percentage(int32_t min, int32_t max, int32_t curr);\r
+    static int32_t calc_vol_volume(int32_t min, int32_t max, uint8_t percentage);\r
+    static void trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types);\r
+    static int delete_file_with_cleanup(const char *ppath, const char *path);\r
+};\r
+\r
+class battery_power {\r
+public:\r
+    static uint8_t get_battery_percentage();\r
+\r
+protected:\r
+    static battery_power *get_instance();\r
+\r
+private:\r
+    battery_power();\r
+    ~battery_power();\r
+    bool adc_context_init();\r
+    bool adc_context_startup();\r
+    void adc_context_shutdown();\r
+    uint8_t calc_percentage(uint32_t voltage);\r
+    uint32_t calc_voltage();\r
+    uint32_t adc_trans_sytick_to_voltages(uint32_t sytick);\r
+\r
+private:\r
+    adc_channel_t channel;        // ADC信道\r
+    pin_t analog_pin;             // ADC输入引脚\r
+    pin_mode_t mode;              // ADC管脚工作模式\r
+    uint32_t samples_to_keep;     // 总采样次数\r
+    uint32_t samples_to_discard;  // 丢弃的初始样本数\r
+    uint32_t adc_max_range_mv;    // ADC原始值上限(单位:毫伏)\r
+    uint32_t adc_min_range_mv;    // ADC原始值下限(单位:毫伏)\r
+};\r
+\r
+}  // namespace OHOS\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.cpp b/code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.cpp
new file mode 100644 (file)
index 0000000..56f89c1
--- /dev/null
@@ -0,0 +1,520 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.h"\r
+#include "device_proxy.h"\r
+#include "wearable_log.h"\r
+#include "device_location.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "sports/SportsModel.h"\r
+#include "findphone/FindPhoneMainPage.h"\r
+#include "camera/CameraMainPage.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#include "diag_msg.h"\r
+#include "diag_ind_src.h"\r
+\r
+uint8_t g_bloodoxygen = 0;\r
+uint16_t g_heartrate = 0;\r
+uint32_t g_stepdata = 0;\r
+uint32_t g_distance = 0;\r
+extern LocationInfo_t g_locationInfo;\r
+// 获取电量\r
+errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_battery_level");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    uint8_t battery_level = OHOS::battery_power::get_battery_percentage();\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &battery_level, sizeof(battery_level));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_battery_level_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 获取存储空间\r
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_storage_info");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+    uint8_t battery_level = 0;\r
+\r
+    OHOS::storage_info info;\r
+    OHOS::device_proxy::get_storage_info(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::storage_info));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_storage_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 获取手表类型\r
+errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_product_info");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+    uint8_t battery_level = 0;\r
+\r
+    std::string product_info;\r
+    OHOS::device_proxy::get_product_info(product_info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, (void *)product_info.c_str(), product_info.length());\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_product_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 获取语言\r
+errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_language_id");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+    uint8_t battery_level = 0;\r
+\r
+    uint8_t language_id = 0;\r
+    OHOS::device_proxy::get_language_id(language_id);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_language_id_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 获取音量\r
+errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_volume_info");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    uint8_t vol_type = 0;\r
+    if (v_len == sizeof(uint8_t)) {\r
+        vol_type = *(uint8_t *)v_data;\r
+    }\r
+\r
+    std::vector<OHOS::volume_info> vol_info;\r
+    OHOS::device_proxy::get_volume_info(vol_type, vol_info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &vol_info[0], vol_info.size() * sizeof(OHOS::volume_info));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_volume_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 设置语言\r
+errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_language_id");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    uint8_t language_id = 0;\r
+    if (v_len != sizeof(uint8_t)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    language_id = *(uint8_t *)v_data;\r
+    OHOS::device_proxy::set_language_id(language_id);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_language_id_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// 设置音量\r
+errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_volume_info");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    OHOS::volume_info info;\r
+    if (v_len != sizeof(OHOS::volume_info)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    memcpy_s(&info, sizeof(OHOS::volume_info), v_data, v_len);\r
+    OHOS::device_proxy::set_volume_info(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::volume_info));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// ota初始化\r
+errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_init");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    OHOS::ota_info info;\r
+    if (v_len != sizeof(OHOS::ota_info)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    memcpy_s(&info, sizeof(OHOS::ota_info), v_data, v_len);\r
+    OHOS::OTA_ERR err = OHOS::device_proxy::ota_init(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+// ota检测和本地升级\r
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_update");\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    void *v_data = msg_center_get_tlv_payload(usr_data);\r
+    uint8_t v_len = usr_len - tl_len;\r
+\r
+    OHOS::ota_info info;\r
+    if (v_len != sizeof(OHOS::ota_info)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    memcpy_s(&info, sizeof(OHOS::ota_info), v_data, v_len);\r
+    OHOS::OTA_ERR err = OHOS::device_proxy::ota_update(info);\r
+\r
+    errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ret = %d", ret);\r
+    OHOS::device_proxy::call_ui_ota_update();    \r
+\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ui over");\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+\r
+    ret = msg_center_send_data(cmd_id, type, &g_heartrate, sizeof(g_heartrate));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_heartrate:%d\r\n", g_heartrate);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+\r
+    ret = msg_center_send_data(cmd_id, type, &g_stepdata, sizeof(g_stepdata));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_stepdata:%d\r\n", g_stepdata);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+\r
+    ret = msg_center_send_data(cmd_id, type, &g_bloodoxygen, sizeof(g_bloodoxygen));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_bloodoxygen:%d\r\n", g_bloodoxygen);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+/* LOCATION */\r
+errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+\r
+    ret = msg_center_send_data(cmd_id, type, &g_locationInfo, sizeof(g_locationInfo));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_get_info latitude_:%d,longitude_:%d\n",\r
+                  g_locationInfo.latitude_, g_locationInfo.longitude_);\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t ack = 1;\r
+\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
+    ret = deviceLocationStartLocating();\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start fail\r\n");\r
+        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+        if (ret != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    } else {\r
+        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+        if (ret != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    }\r
+\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t ack = 1;\r
+\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
+    ret = deviceLocationStopLocating();\r
+    ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop fail\r\n");\r
+        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+        if (ret != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    } else {\r
+        ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+        if (ret != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    }\r
+\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
+    /* notify UI or call UI load */\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+/* SPORT */\r
+errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t ack = 1;\r
+    sport_action_t action = (sport_action_t)*tlv_payload;\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action : %d\r\n", action);\r
+\r
+    switch (action) {\r
+        case SPORT_ACTION_START:\r
+            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SPORTS);\r
+            OHOS::SportsModel::GetInstance()->ResetSportsData();\r
+            if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_start StartSportsTimer failed\r\n");\r
+                ret = ERRCODE_FAIL;\r
+            }\r
+            break;\r
+        case SPORT_ACTION_PAUSE:\r
+            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+            break;\r
+        case SPORT_ACTION_RESUME:\r
+            if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume StartSportsTimer failed\r\n");\r
+                ret = ERRCODE_FAIL;\r
+            }\r
+            break;\r
+        case SPORT_ACTION_STOP:\r
+            OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+            OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+            break;\r
+        default:\r
+            ret = ERRCODE_FAIL;\r
+            break;\r
+    }\r
+\r
+    ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume send data failed\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data\r\n");\r
+    OHOS::sport_data_t *sportData = OHOS::SportsModel::GetInstance()->GetSportsData();\r
+    ret = msg_center_send_data(cmd_id, type, sportData, sizeof(OHOS::sport_data_t));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data end data failed\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv exit camera from phone");\r
+    OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv connect success from phone");\r
+    if (OHOS::CameraMainPage::GetInstance() != nullptr) {\r
+        OHOS::CameraMainPage::GetInstance()->Refresh_page();\r
+        return ERRCODE_SUCC;\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "CameraMainPage not exist\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+}\r
+\r
+errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_offline_log_switch, data = %d\r\n", data);\r
+    if (data) {\r
+        uapi_zdiag_set_offline_log_enable(true); /*open offline log*/\r
+    } else {\r
+        uapi_zdiag_set_offline_log_enable(false); /*close offline log*/\r
+    }\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+errcode_t msg_center_set_online_log_channel(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_channel, data = %d\r\n", data);\r
+    change_log_diag_channel(data);\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    uint8_t data = *tlv_payload;\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_level, data = %d\r\n", data);\r
+    set_online_log_level(data);\r
+    ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+    if (ret != ERRCODE_SUCC) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+#endif\r
+\r
+errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    bool ret = true;\r
+    if ( OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
+        ret = OHOS::FindPhoneMainPage::GetInstance()->StopFindPhone();\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
+    }\r
+    if (!ret) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.h b/code/sdk/application/wearable/fd230/service/device_msg/msg_center_device.h
new file mode 100644 (file)
index 0000000..02f3c25
--- /dev/null
@@ -0,0 +1,114 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef MSG_CENTER_DEVICE_H\r
+#define MSG_CENTER_DEVICE_H\r
+\r
+#include "msg_center_protocol.h"\r
+#include "wearable_log.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef enum sport_action {\r
+    SPORT_ACTION_START = 1,\r
+    SPORT_ACTION_PAUSE = 2,\r
+    SPORT_ACTION_RESUME = 3,\r
+    SPORT_ACTION_STOP = 4,\r
+} sport_action_t;\r
+\r
+typedef enum msg_center_device_type_id {\r
+    MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x1,\r
+    MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x2,\r
+    MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x3,\r
+    MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x4,\r
+    MSGCENTER_TYPE_ID_GET_VOLUME_INFO = 0x5,\r
+    MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x6,\r
+    MSGCENTER_TYPE_ID_SET_VOLUME_INFO = 0x7,\r
+    MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x8,\r
+    MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x9,\r
+    MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0xa,\r
+    MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0xb,\r
+    MSGCENTER_TYPE_ID_LOCATION_GET_INFO = 0x20,\r
+    MSGCENTER_TYPE_ID_LOCATION_START = 0x21,\r
+    MSGCENTER_TYPE_ID_LOCATION_STOP = 0x22,\r
+    MSGCENTER_TYPE_ID_LOCATION_REPORT = 0x23,\r
+    MSGCENTER_TYPE_ID_SPORT_ACTION = 0x27,\r
+    MSGCENTER_TYPE_ID_SPORT_GET_DATA = 0x28,\r
+    MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x29,\r
+    MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x30,\r
+    MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x31,\r
+    MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x33,\r
+    MSGCENTER_TYPE_ID_OTA_INIT = 0x34,\r
+    MSGCENTER_TYPE_ID_OTA_UPDATE = 0x35,\r
+    MSGCENTER_TYPE_ID_ON_FIND_PHONE = 0x36,\r
+    MSGCENTER_TYPE_ID_OFF_FIND_PHONE = 0x37,\r
+    MSGCENTER_TYPE_ID_SLEEP_DATA = 0x38,\r
+    MSGCENTER_TYPE_ID_ON_CAMERA = 0x39,\r
+    MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT = 0x40,\r
+    MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT = 0x41,\r
+    MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE = 0x42,\r
+    MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS = 0x43,\r
+} msg_center_device_type_id_t;\r
+\r
+// 获取电量\r
+errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取存储空间\r
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取手表类型\r
+errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取语言\r
+errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取音量\r
+errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 设置语言\r
+errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 设置音量\r
+errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// ota初始化\r
+errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// ota检测和本地升级\r
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* LOCATION */\r
+errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* SPORT */\r
+errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 离线日志开关 */\r
+errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 查找手机 */\r
+errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* CAMERA */\r
+errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+/* 在线日志通道 */\r
+errcode_t msg_center_set_online_log_channel(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+/* 在线日志级数 */\r
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+#endif\r
+\r
+#ifdef PUBLISH_TEST_DATA\r
+void PublishTestData();\r
+#endif\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif /* MSG_CENTER_DEVICE_H */\r
index 058f8dc..8c61862 100644 (file)
@@ -11,7 +11,6 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
     ${ROOT_DIR}/open_source/openharmony/base/startup/syspara_lite/include
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/format/interfaces/include
-    ${ROOT_DIR}/application/wearable/nativeapp/nativeui/main/include/dial
 )
 
 set(SOURCES
diff --git a/code/sdk/application/wearable/fd230/service/dial_market/dial_market.cpp b/code/sdk/application/wearable/fd230/service/dial_market/dial_market.cpp
new file mode 100644 (file)
index 0000000..5d6de84
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
+ * Description: ota upgrade handle.
+ * This file should be changed only infrequently and with great care.
+ */
+#include <stdio.h>
+#include "securec.h"
+#include "msg_center.h"
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "wearable_log.h"
+#include "common_def.h"
+#include "dial_market.h"
+#include "parameter.h"
+#include "main/dial/WatchInterface.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+errcode_t msg_center_dial_market_get_sys_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_sys_info sys;
+    bool op_ret = false;
+
+    /* 组装信息 */
+    strcpy_s(sys.chip_platform, MAX_CHIP_PLAT_LEN, "hisi");
+    strcpy_s(sys.chip_model, MAX_CHIP_MODEL_LEN, "3321");
+    char *os_version = GetOsName();
+    if (os_version == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "os_version is NULL\r\n");
+        return ERRCODE_FAIL;
+    }
+    strcpy_s(sys.os_version, MAX_OS_LEN, os_version); // "OpenHarmony-5.0.1.115"
+
+    char *api_level = GetSdkApiLevel();
+    if (api_level == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "api_level is NULL\r\n");
+        free(os_version);
+        return ERRCODE_FAIL;
+    }
+    strcpy_s(sys.api_level, MAX_API_LEVEL_LEN, api_level); // "13"
+
+    op_ret = GetWatchSystemInfo(&sys);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchSystemInfo fail\r\n");
+        free(os_version);
+        free(api_level);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &sys, sizeof(watch_sys_info));
+    if (ret != ERRCODE_SUCC) {
+        free(os_version);
+        free(api_level);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    free(os_version);
+    free(api_level);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_dev_cap(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_dev_cap_info cap;
+    bool op_ret = false;
+
+    op_ret = GetWatchCapability(&cap);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchCapability fail\r\n");
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &cap, sizeof(watch_dev_cap_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_one_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+    bool op_ret = false;
+    watch_dial_info info;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = GetWatchFaceInfo(uuid, &info);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchFaceInfo fail\r\n");
+        (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+        info.uuid = uuid;
+        (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_install_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    uint32_t uuid = 0;
+    bool op_ret = false;
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+    uint16_t payload_len = usr_len - tl_len;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+
+    char *path = (char *)malloc(payload_len + 1);
+    if (path == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "malloc failed.\r\n");
+        return ERRCODE_FAIL;
+    }
+
+    (void)memcpy_s(path, payload_len, tlv_payload, payload_len);
+    path[payload_len] = '\0';
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "path = %s\r\n", path);
+
+    op_ret = GetUuidByPath(path, &uuid);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "install fail.\r\n");
+        free(path);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &uuid, sizeof(uint32_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        free(path);
+        return ERRCODE_FAIL;
+    }
+
+    free(path);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_uninstall_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = UninstallWatch(uuid);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uninstall ret : %d\r\n", op_ret);
+
+    ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_set_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+    uint32_t uuid = *(uint32_t *)tlv_payload;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+    op_ret = SetCurrentWatchFace(uuid);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "set_current_watch_face ret : %d\r\n", op_ret);
+
+    ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_all_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    watch_dial_info *info = nullptr;
+    uint8_t watch_num = 0;
+    bool op_ret = false;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_all_watch_info\r\n");
+    op_ret = GetAllWatchFaceInfo(&info, &watch_num);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetAllWatchFaceInfo fail\r\n");
+        watch_num = 0;
+        (void)msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        free(info);
+        return ERRCODE_FAIL;
+    }
+
+    free(info);
+    return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_cur_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    errcode_t ret = ERRCODE_SUCC;
+    bool op_ret = false;
+    watch_dial_info info;
+
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_cur_watch_info\r\n");
+    op_ret = GetCurrentWatchFaceInfo(&info);
+    if (op_ret == false) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetCurrentWatchFaceInfo fail\r\n");
+        (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+        info.uuid = 0xFFFFFFFF; // 异常时用全F的uuid表示
+        (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+        return ERRCODE_FAIL;
+    }
+
+    ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/dial_market/dial_market_msg.cpp b/code/sdk/application/wearable/fd230/service/dial_market/dial_market_msg.cpp
new file mode 100644 (file)
index 0000000..b30812e
--- /dev/null
@@ -0,0 +1,47 @@
+
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "dial_market.h"
+
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_dial_market_tbl[] = {
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_SYS_INFO, msg_center_dial_market_get_sys_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_DEV_CAP, msg_center_dial_market_get_dev_cap},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ONE_WATCH_INFO, msg_center_dial_market_get_one_watch_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_INSTALL_WATCH, msg_center_dial_market_install_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_UNINSTALL_WATCH, msg_center_dial_market_uninstall_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_SET_WATCH, msg_center_dial_market_set_watch},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ALL_WATCH_INFO, msg_center_dial_market_get_all_watch_info},
+    { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_CUR_WATCH_INFO, msg_center_dial_market_get_cur_watch_info},
+};
+
+errcode_t msg_center_dial_market_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    uint8_t tbl_size = sizeof(g_msg_center_dial_market_tbl) / sizeof(g_msg_center_dial_market_tbl[0]);
+    uint8_t i;
+    for (i = 0; i < tbl_size; i++) {
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_dial_market_tbl[i];
+        if ((item->type == type) && (item->handler != NULL)) {
+            item->handler(cmd_id, type, usr_data, usr_len);
+            return ERRCODE_SUCC;
+        }
+    }
+    return ERRCODE_NOT_SUPPORT;
+}
+
+void dial_market_init(void)
+{
+    msg_center_register_cmd(MSGCENTER_CMD_DIAL_MARKET, msg_center_dial_market_dispatch);
+}
+
+APP_FEATURE_INIT_PRI(dial_market_init, LAYER_INIT_LEVEL_4);
+#ifdef __cplusplus
+}
+#endif
+}  // namespace OHOS
\ No newline at end of file
index 86ae19f..64f708e 100644 (file)
@@ -18,9 +18,13 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
     ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
     ${ROOT_DIR}/application/wearable/service/xiaodu_voice
+    ${ROOT_DIR}/application/wearable/service/watch_setting_msg/include
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector/libs
     ${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
+    ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
+    ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+    ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
 )
 
 set(SOURCES
@@ -109,8 +113,7 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
     ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
     ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
-    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include/components
-    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components/
+    ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audio_player/interfaces/kits
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiomanager
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiocommon
@@ -123,6 +126,8 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/include/middleware/services/bts/common
     ${ROOT_DIR}/application/auto_ota
     ${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
+    ${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+    ${ROOT_DIR}/application/wearable/service/device_msg
     ${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
     ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
     ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
@@ -154,7 +159,9 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_common.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_utils.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_self_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/transmitting.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/charge_notification.cpp
@@ -174,10 +181,10 @@ else()
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_self_cmd.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/transmitting.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/charge_notification.cpp
index f6ea17c..c6b588a 100644 (file)
Binary files a/code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-cli/libmsg_center.a and b/code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-cli/libmsg_center.a differ
index c7c253e..19e2cb5 100644 (file)
Binary files a/code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-ser/libmsg_center.a and b/code/sdk/application/wearable/fd230/service/msg_center/brandy-auto-ota-ser/libmsg_center.a differ
index 0e24be7..b1e105a 100644 (file)
Binary files a/code/sdk/application/wearable/fd230/service/msg_center/brandy-native-js/libmsg_center.a and b/code/sdk/application/wearable/fd230/service/msg_center/brandy-native-js/libmsg_center.a differ
index c686df5..7f842a9 100644 (file)
Binary files a/code/sdk/application/wearable/fd230/service/msg_center/brandy-xts/libmsg_center.a and b/code/sdk/application/wearable/fd230/service/msg_center/brandy-xts/libmsg_center.a differ
index 02cf29c..ed6ece0 100644 (file)
@@ -62,6 +62,8 @@ typedef enum msg_center_cmd_id {
     MSGCENTER_CMD_WATCH_CONNECT      = 0x8,\r
     MSGCENTER_CMD_APP_STORE          = 0x9,\r
     MSGCENTER_CMD_DIAL_MARKET        = 0xa,\r
+    MSGCENTER_CMD_PHONE_MSG          = 0xb, // 增加消息通知;\r
+    MSGCENTER_CMD_DEVICE             = 0xc,\r
     MSGCENTER_CMD_MAX\r
 } msg_center_cmd_id_t;\r
 \r
index 532f1c1..345828d 100644 (file)
@@ -24,6 +24,7 @@
 #include "components/ui_view_group.h"
 #include "alarm_notification.h"
 #include "makephone_notification.h"
+#include "phone_msg_notification.h"
 
 constexpr uint16_t HALF_SCREEN = 2;
 constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
diff --git a/code/sdk/application/wearable/fd230/service/msg_center/include/notify/phone_msg_notification.h b/code/sdk/application/wearable/fd230/service/msg_center/include/notify/phone_msg_notification.h
new file mode 100644 (file)
index 0000000..735c01e
--- /dev/null
@@ -0,0 +1,75 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: phone message notification \r
+ * Author: \r
+ * Create: 2025-04-25\r
+ */\r
+\r
+#ifndef PHONE_MSG_NOTIFICATION_H\r
+#define PHONE_MSG_NOTIFICATION_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "graphic_timer.h"\r
+#include <unordered_map>\r
+\r
+struct PhoneMsg {\r
+    std::string appName;\r
+    std::string msgTitle;\r
+    std::string msgContent;\r
+};\r
+\r
+namespace OHOS {\r
+class PhoneMsgView {\r
+public:\r
+    static UIViewGroup *CreatePhoneMsgView();\r
+    static void FreePhoneMsgView(void);\r
+    static void UpDatePhoneMsg(std::string appName, std::string titile, std::string content);\r
+    static void StartPhoneMsgTimer(int32_t interval);\r
+    static void DisablePhoneMsgTimer();\r
+    static const uint32_t notifyTime = 5000;\r
+\r
+private:\r
+    static UIViewGroup *phoneMsgView_;\r
+    static UILabel *appNameLabel_;\r
+    static UILabel *titleLabel_;\r
+    static UILabel *contentLabel_;\r
+    static GraphicTimer *phoneMsgNotifyStop_;\r
+    static PhoneMsg phoneMsg_;\r
+    static UILabelButtonExt *cancelButton_;\r
+};\r
+\r
+class PhoneMsgViewEventListener : public OHOS::UIView::OnClickListener,\r
+                               public OHOS::UIView::OnLongPressListener,\r
+                               public OHOS::UIView::OnTouchListener,\r
+                               public OHOS::UIView::OnDragListener {\r
+public:\r
+    PhoneMsgViewEventListener();\r
+    virtual ~PhoneMsgViewEventListener();\r
+    static PhoneMsgViewEventListener *GetInstance(void);\r
+    bool OnDrag(UIView& view, const DragEvent& event) override;\r
+    bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override;\r
+    bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;\r
+    bool OnPress(OHOS::UIView& view, const OHOS::PressEvent& event) override\r
+    {\r
+        return true;\r
+    }\r
+    bool OnLongPress(OHOS::UIView& view, const OHOS::LongPressEvent& event) override\r
+    {\r
+        return true;\r
+    }\r
+    bool OnRelease(OHOS::UIView& view, const OHOS::ReleaseEvent& event) override\r
+    {\r
+        return true;\r
+    }\r
+\r
+    bool OnDragStart(OHOS::UIView& view, const OHOS::DragEvent& event) override\r
+    {\r
+        return true;\r
+    }\r
+};\r
+}; // namespace OHOS\r
+\r
+#endif /* PHONE_MSG_NOTIFICATION_H */\r
diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/common/msg_center_self_cmd.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/common/msg_center_self_cmd.cpp
new file mode 100644 (file)
index 0000000..ee822be
--- /dev/null
@@ -0,0 +1,43 @@
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "msg_center_common.h"
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_self_cmd_tbl[] = {
+#ifdef JS_ENABLE
+    { MSGCENTER_CMD_PING,       MSGCENTER_TYPE_ID_PING_REC,           msg_center_ping_rec},
+    { MSGCENTER_CMD_PING,       MSGCENTER_TYPE_ID_PING_RSP,           NULL},
+#endif
+};
+
+errcode_t msg_center_self_cmd_type(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+    uint8_t tbl_size = sizeof(g_msg_center_self_cmd_tbl) / sizeof(g_msg_center_self_cmd_tbl[0]);
+    uint8_t i;
+    for (i = 0; i < tbl_size; i++) {
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_self_cmd_tbl[i];
+        if ((item->type == type) && (item->handler != NULL)) {
+            item->handler(cmd_id, type, usr_data, usr_len);
+            return ERRCODE_SUCC;
+        }
+    }
+    return ERRCODE_NOT_SUPPORT;
+}
+
+void xiaodu_self_cmd_init(void)
+{
+    msg_center_register_cmd(MSGCENTER_CMD_PING, msg_center_self_cmd_type);
+}
+
+#ifdef JS_ENABLE
+APP_FEATURE_INIT_PRI(xiaodu_self_cmd_init, LAYER_INIT_LEVEL_4);
+#endif
+#ifdef __cplusplus
+}
+#endif
+}  // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/phone_msg_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/phone_msg_notification.cpp
new file mode 100644 (file)
index 0000000..eb6a408
--- /dev/null
@@ -0,0 +1,206 @@
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: phone message notification\r
+ * Create: 2025-04-25\r
+ */\r
+\r
+#include "notification_manager.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include <string>\r
+#include "main/MessageModel.h"\r
+\r
+namespace OHOS {\r
+// 三方应用名\r
+static const uint32_t APP_NAME_POS_X = 180;\r
+static const uint32_t APP_NAME_POS_Y = 82;\r
+static const uint32_t APP_NAME_WIDTH = 200;\r
+static const uint32_t APP_NAME_HEIGHT = 60;\r
+// 三方消息主题\r
+static const uint32_t MSG_TITLE_POS_X = 81;\r
+static const uint32_t MSG_TITLE_POS_Y = 122;\r
+static const uint32_t MSG_TITLE_WIDTH = 409;\r
+static const uint32_t MSG_TITLE_HEIGHT = 83;\r
+// 三方消息内容\r
+static const uint32_t MSG_CONTENT_POS_X = 78;\r
+static const uint32_t MSG_CONTENT_POS_Y = 176;\r
+static const uint32_t MSG_CONTENT_WIDTH = 457;\r
+static const uint32_t MSG_CONTENT_HEIGHT = 269;\r
+// 取消通知\r
+static const uint32_t CANCEL_BUTTON_POS_X = 150;\r
+static const uint32_t CANCEL_BUTTON_POS_Y = 323;\r
+static const uint32_t CANCEL_BUTTON_WIDTH = 165;\r
+static const uint32_t CANCEL_BUTTON_HEIGHT = 44;\r
+\r
+// 设置字体大小\r
+static const uint32_t APP_NAME_FONT_SIZE = 20;\r
+static const uint32_t MSG_TITLE_FONT_SIZE = 20;\r
+static const uint32_t MSG_CONTENT_FONT_SIZE = 40;\r
+\r
+UIViewGroup *PhoneMsgView::phoneMsgView_ = nullptr;\r
+UILabel *PhoneMsgView::appNameLabel_ = nullptr;\r
+UILabel *PhoneMsgView::titleLabel_ = nullptr;\r
+UILabel *PhoneMsgView::contentLabel_ = nullptr;\r
+GraphicTimer *PhoneMsgView::phoneMsgNotifyStop_ = nullptr;\r
+PhoneMsg PhoneMsgView::phoneMsg_;\r
+UILabelButtonExt *PhoneMsgView::cancelButton_ = nullptr;\r
+\r
+void PhoneMsgStopNotifyCallback(void *data)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgStopNotifyCallback");\r
+    (void)data;\r
+    NotificationManager::GetInstance()->StopNotify();\r
+}\r
+\r
+void PhoneMsgView::StartPhoneMsgTimer(int32_t interval)\r
+{\r
+    uint32_t tick = GetOSTick(interval);\r
+    phoneMsgNotifyStop_ = new GraphicTimer(tick, PhoneMsgStopNotifyCallback, nullptr, true);\r
+    phoneMsgNotifyStop_->Start();\r
+}\r
+\r
+void PhoneMsgView::DisablePhoneMsgTimer()\r
+{\r
+    if (phoneMsgNotifyStop_ != nullptr) {\r
+        phoneMsgNotifyStop_->Stop();\r
+        delete phoneMsgNotifyStop_;\r
+        phoneMsgNotifyStop_ = nullptr;\r
+    }\r
+}\r
+\r
+UIViewGroup *PhoneMsgView::CreatePhoneMsgView()\r
+{\r
+    if (phoneMsgView_ == nullptr) {\r
+        phoneMsgView_ = new UIViewGroup();\r
+        phoneMsgView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+        phoneMsgView_->SetViewId("phoneMsgView");\r
+    }\r
+\r
+    if (appNameLabel_ == nullptr) {\r
+        appNameLabel_ = new UILabel();\r
+    }\r
+    appNameLabel_->SetPosition(APP_NAME_POS_X, APP_NAME_POS_Y, APP_NAME_WIDTH, APP_NAME_HEIGHT);\r
+    appNameLabel_->SetText(phoneMsg_.appName.c_str());\r
+    appNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
+    appNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    // Add to rootView\r
+    phoneMsgView_->Add(appNameLabel_);\r
+    appNameLabel_->SetVisible(true);\r
+\r
+    if (titleLabel_ == nullptr) {\r
+        titleLabel_ = new UILabel();\r
+    }\r
+    titleLabel_->SetPosition(MSG_TITLE_POS_X, MSG_TITLE_POS_Y, MSG_TITLE_WIDTH, MSG_TITLE_HEIGHT);\r
+    titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
+    titleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_TITLE_FONT_SIZE);\r
+    titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    // Add to rootView\r
+    phoneMsgView_->Add(titleLabel_);\r
+    titleLabel_->SetVisible(true);\r
+\r
+    if (contentLabel_ == nullptr) {\r
+        contentLabel_ = new UILabel();\r
+    }\r
+    contentLabel_->SetPosition(MSG_CONTENT_POS_X, MSG_CONTENT_POS_Y, MSG_CONTENT_WIDTH, MSG_CONTENT_HEIGHT);\r
+    contentLabel_->SetText(phoneMsg_.msgContent.c_str());\r
+    contentLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_CONTENT_FONT_SIZE);\r
+    contentLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+    // Add to rootView\r
+    phoneMsgView_->Add(contentLabel_);\r
+    contentLabel_->SetVisible(true);\r
+\r
+    if (cancelButton_ == nullptr) {\r
+        cancelButton_ = new UILabelButtonExt();\r
+    }\r
+    cancelButton_->SetPosition(CANCEL_BUTTON_POS_X, CANCEL_BUTTON_POS_Y, CANCEL_BUTTON_WIDTH, CANCEL_BUTTON_HEIGHT);\r
+    cancelButton_->SetViewId("cancelButton");\r
+    cancelButton_->SetText("取消通知");\r
+    cancelButton_->SetTouchable(true);\r
+    cancelButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
+    // Add to rootView\r
+    phoneMsgView_->Add(cancelButton_);\r
+\r
+    phoneMsgView_->SetDraggable(true);\r
+    phoneMsgView_->SetTouchable(true);\r
+    UIView::OnDragListener *dragListener =\r
+        static_cast<UIView::OnDragListener *>(PhoneMsgViewEventListener::GetInstance());\r
+    UIView::OnClickListener *clickListener =\r
+        static_cast<UIView::OnClickListener *>(PhoneMsgViewEventListener::GetInstance());\r
+    phoneMsgView_->SetOnDragListener(dragListener);\r
+    phoneMsgView_->SetOnClickListener(clickListener);\r
+    cancelButton_->SetOnClickListener(clickListener);\r
+    StartPhoneMsgTimer(PhoneMsgView::notifyTime);\r
+    NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneMsgView);\r
+    return phoneMsgView_;\r
+}\r
+\r
+void PhoneMsgView::FreePhoneMsgView(void)\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreePhoneMsgView");\r
+    if (phoneMsgView_ != nullptr) {\r
+        DisablePhoneMsgTimer();\r
+        phoneMsgView_->RemoveAll();\r
+        delete appNameLabel_;\r
+        appNameLabel_ = nullptr;\r
+        delete titleLabel_;\r
+        titleLabel_ = nullptr;\r
+        delete contentLabel_;\r
+        contentLabel_ = nullptr;\r
+        delete cancelButton_;\r
+        cancelButton_ = nullptr;\r
+        RootView::GetInstance()->Remove(phoneMsgView_);\r
+        delete phoneMsgView_;\r
+        phoneMsgView_ = nullptr;\r
+    }\r
+}\r
+\r
+void PhoneMsgView::UpDatePhoneMsg(std::string appName, std::string titile, std::string content)\r
+{\r
+    phoneMsg_.appName = appName;\r
+    phoneMsg_.msgTitle = titile;\r
+    phoneMsg_.msgContent = content;\r
+    MessageModel::GetInstance().GetMessageInfo(appName, titile, content);\r
+}\r
+\r
+PhoneMsgViewEventListener::PhoneMsgViewEventListener()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener :%p", this);\r
+}\r
+\r
+PhoneMsgViewEventListener::~PhoneMsgViewEventListener()\r
+{\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PhoneMsgViewEventListener");\r
+}\r
+\r
+PhoneMsgViewEventListener *PhoneMsgViewEventListener::GetInstance(void)\r
+{\r
+    static PhoneMsgViewEventListener phoneMsgViewEventListener;\r
+    return &phoneMsgViewEventListener;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+    return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDragEnd(UIView &view, const DragEvent &event)\r
+{\r
+    std::string viewId = view.GetViewId();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener OnDragEnd %s", viewId.c_str());\r
+    if (viewId == "phoneMsgView") {\r
+        NotificationManager::GetInstance()->StopNotify();\r
+    }\r
+    return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+    UNUSED(event);\r
+    std::string viewId = view.GetViewId();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener ClickListener %s", viewId.c_str());\r
+    if (viewId == "phoneMsgView") {\r
+        NotificationManager::GetInstance()->StopNotify();\r
+    }\r
+    return true;\r
+}\r
+}  // namespace OHOS
\ No newline at end of file
index ff36968..f869cf3 100644 (file)
@@ -23,7 +23,7 @@
 #include "nandflash_to_os.h"\r
 #endif\r
 #ifdef SUPPORT_OHOSFWK\r
-#include "ui_screennotify.h"\r
+#include "screennotify/ui_screennotify.h"\r
 #endif\r
 #include "sys/time.h"\r
 #include "touch_screen_def.h"\r
index 334b4ad..1df196e 100644 (file)
@@ -47,7 +47,18 @@ static input_action_t filter_gui_execute_touch_event(screen_context_t *current,
             ac = TURN_OFF_SCREEN;\r
         }\r
     } else {\r
-        ac = TURN_ON_SCREEN;\r
+        if (sc->enable_aod) {\r
+            if (sc->current_state == SCREEN_AMBIENT) {\r
+                // The driver needs to implement the logic for reporting these events.\r
+                if (event == MC_TP_SHORT_CLICK || event == MC_TP_DOUBLE_CLICK) {\r
+                    ac = TURN_ON_SCREEN;\r
+                }\r
+            } else {\r
+                ac = TURN_ON_SCREEN;\r
+            }\r
+        } else {\r
+            ac = TURN_ON_SCREEN;\r
+        }\r
     }\r
     POWER_DISPLAY_PRINT_DEBUG(0, "filter_gui_execute_touch_event,ac:%u.", ac);\r
     return ac;\r
diff --git a/code/sdk/application/wearable/fd230/service/remote_msg/CMakeLists.txt b/code/sdk/application/wearable/fd230/service/remote_msg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f8e5abb
--- /dev/null
@@ -0,0 +1,37 @@
+set(COMPONENT_NAME "remote_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+set(PRIVATE_HEADER\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
+    ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+)\r
+\r
+set(SOURCES\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/remote_msg.cpp\r
+)\r
+\r
+set(COMPONENT_PUBLIC_CCFLAGS\r
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+    -std=c++11\r
+    -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+    true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+    APP_PLATFORM_WATCHGT\r
+    CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
diff --git a/code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.cpp b/code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.cpp
new file mode 100644 (file)
index 0000000..a339654
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: ota upgrade handle.\r
+ * This file should be changed only infrequently and with great care.\r
+ */\r
+#include <stdio.h>\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "wearable_log.h"\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_common.h"\r
+#include "ohos_init.h"\r
+#include "remote_msg.h"\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+static const msg_center_cmd_map_t g_msg_center_phone_msg_tbl[] = {\r
+    {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_THIRD_APP, msg_center_phone_msg_rec},\r
+    {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_SMS, msg_center_phone_msg_rec},\r
+    {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_PHONE, msg_center_phone_msg_rec},\r
+};\r
+\r
+errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+    uint16_t payload_len = usr_len - tl_len;\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+    errcode_t ret = ERRCODE_SUCC;\r
+    uint8_t msg_result = 0;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_rec, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+    Request request;\r
+    request.msgId = type;\r
+    request.len = payload_len;\r
+    request.data = tlv_payload;\r
+    MsgCenterNotifyProc(TOPIC_DEMO_ALL_MSG, &request);\r
+    ret = msg_center_send_data(cmd_id, type, &msg_result, sizeof(msg_result));\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "phone msg_result fail, ret = %d\r\n", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_phone_msg_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_type_dispatch, cmd_id = %d, type = %d\r\n",\r
+                  cmd_id, type);\r
+    uint8_t tbl_size = sizeof(g_msg_center_phone_msg_tbl) / sizeof(g_msg_center_phone_msg_tbl[0]);\r
+    uint8_t i;\r
+    for (i = 0; i < tbl_size; i++) {\r
+        msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_phone_msg_tbl[i];\r
+        if ((item->type == type) && (item->handler != NULL)) {\r
+            item->handler(cmd_id, type, usr_data, usr_len);\r
+            return ERRCODE_SUCC;\r
+        }\r
+    }\r
+    return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void phone_msg_init(void)\r
+{\r
+    msg_center_register_cmd(MSGCENTER_CMD_PHONE_MSG, msg_center_phone_msg_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(phone_msg_init, LAYER_INIT_LEVEL_4);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.h b/code/sdk/application/wearable/fd230/service/remote_msg/remote_msg.h
new file mode 100644 (file)
index 0000000..2787377
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: third application message\r
+ * Author: CompanyName\r
+ * Create: 2021-11-11\r
+ */\r
+\r
+#ifndef REMOTE_MSG_H\r
+#define REMOTE_MSG_H\r
+\r
+#include "msg_center_protocol.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+typedef enum msg_center_phone_msg_type_id {\r
+    MSGCENTER_TYPE_ID_MSG_THIRD_APP = 0x1, // 三方应用消息\r
+    MSGCENTER_TYPE_ID_MSG_SMS,             // 短信\r
+    MSGCENTER_TYPE_ID_MSG_PHONE,           // 电话\r
+    MSGCENTER_TYPE_ID_MSG_MAX,\r
+} msg_center_msg_notify_type_id_t;\r
+\r
+errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+#endif /* REMOTE_MSG_H */
\ No newline at end of file
index 6ca6ae7..9e88a43 100644 (file)
@@ -20,6 +20,9 @@
 #include "watchdog.h"\r
 #include "js_ability.h"\r
 #include "recording_module.h"\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+#include "bluetooth/BluetoothChangeBle.h"\r
+#endif\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -62,6 +65,43 @@ static void pcm_stream_del_queue(void)
     return;\r
 }\r
 \r
+static errcode_t send_pcm_stream_data(pcm_stream_queue_msg msg)\r
+{\r
+    uint8_t retry_cnt = 100;\r
+    uint8_t msg_send_delay = 10;\r
+    errcode_t res;\r
+\r
+    while (retry_cnt--) {\r
+        if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
+            res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
+                msg.data, msg.len);\r
+        } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
+            res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
+                msg.len);\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+            ChangeBleConnectToDefault();\r
+#endif\r
+        }\r
+\r
+        if (res != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send stream fail, retry_cnt: %d, type = %d\n", retry_cnt,\r
+                          msg.msg_id);\r
+            osDelay(msg_send_delay);\r
+        } else {\r
+            break;\r
+        }\r
+    }\r
+    free(msg.data);\r
+    msg.data = nullptr;\r
+    if (res != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "after retry, send stream still fail, retry_cnt: %d, type = %d\n",\r
+                      retry_cnt, msg.msg_id);\r
+        pcm_stream_del_queue();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 static errcode_t pcm_stream_task_body(void *data)\r
 {\r
     UNUSED(data);\r
@@ -75,39 +115,22 @@ static errcode_t pcm_stream_task_body(void *data)
     }\r
 \r
     g_pcm_stream_end_record_sended_flag = false;\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+    ChangeBleConnectToMax();\r
+#endif\r
 \r
     for (;;) {\r
         osStatus_t ret = osMessageQueueGet(g_pcm_stream_msg_queue_id, &msg, nullptr, osWaitForever);\r
         if (ret != osOK) {\r
-            msg.msg_id = MSGCENTER_TYPE_ID_XIAODU_END_RECORD;\r
-            msg.data = nullptr;\r
+            continue;\r
         }\r
-        if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
-            res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
-                msg.data, msg.len);\r
-            free(msg.data);\r
-            msg.data = nullptr;\r
-            if (res != ERRCODE_SUCC) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream failed");\r
-                pcm_stream_del_queue();\r
-                return ERRCODE_FAIL;\r
-            }\r
-        } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
-            res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
-                msg.len);\r
-            free(msg.data);\r
-            msg.data = nullptr;\r
-            if (res != ERRCODE_SUCC) {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm end failed");\r
-                pcm_stream_del_queue();\r
-                return ERRCODE_FAIL;\r
-            }\r
-            g_pcm_stream_end_record_sended_flag = true;\r
-            return ERRCODE_SUCC;\r
+\r
+        /* pcm帧、end帧合并处理 */\r
+        res = send_pcm_stream_data(msg);\r
+        if (res == ERRCODE_FAIL || (res == ERRCODE_SUCC && msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD)) {\r
+            return res;\r
         }\r
     }\r
-\r
-    return ERRCODE_SUCC;\r
 }\r
 \r
 /*\r
@@ -163,7 +186,6 @@ errcode_t pcm_stream_create_task(void)
 \r
 errcode_t msg_center_xiaodu_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
 {\r
-    unused(usr_data);\r
     uint8_t ack = 1;\r
     errcode_t ret = ERRCODE_SUCC;\r
 \r
@@ -174,16 +196,21 @@ errcode_t msg_center_xiaodu_start(uint8_t cmd_id, uint8_t type, void *usr_data,
     }\r
     display_api->set_screen_set_keepon_timeout(30000); // 30000ms\r
 #endif\r
-#ifdef JS_ENABLE\r
-    StartJsApp("com.vendor.voiceassistant");\r
-#endif\r
 \r
     /* ack */\r
     ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
     if (ret != ERRCODE_SUCC) {\r
         return ERRCODE_FAIL;\r
     }\r
+    uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+#ifdef JS_ENABLE\r
+    if(tlv_payload[0] == 1) {\r
+        StartJsApp("com.vendor.Aidialogue");\r
+    } else {\r
+        StartJsApp("com.vendor.Aidial");\r
+    }\r
 \r
+#endif\r
     return ERRCODE_SUCC;\r
 }\r
 \r
@@ -407,6 +434,7 @@ errcode_t msg_center_xiaodu_send_end_record(uint8_t cmd_id, uint8_t type, void *
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream end, usr_data = %d, usr_len = %d\r\n",\r
                   *(uint8_t *)usr_data, usr_len); /* usr_data参考协议msg_center_pcm_end_flag_t */\r
     pcm_stream_del_queue();\r
+    g_pcm_stream_end_record_sended_flag = true;\r
     return ERRCODE_SUCC;\r
 }\r
 \r
index ebe9e40..1d3047a 100644 (file)
@@ -3,6 +3,9 @@
 #include "msg_center_protocol.h"
 #include "msg_center_cmd.h"
 #include "ohos_init.h"
+#include "msg_center_common.h"
+#include "wearable_log.h"
+
 namespace OHOS {
 
 #ifdef __cplusplus