优化角色信息配置函数,添加解析日程信息函数
authorcheng <chengyf@zhihuishixun.com>
Thu, 18 Sep 2025 03:15:46 +0000 (11:15 +0800)
committercheng <chengyf@zhihuishixun.com>
Thu, 18 Sep 2025 03:15:46 +0000 (11:15 +0800)
code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h
code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c [new file with mode: 0644]

index 2af430d..6ff5144 100644 (file)
@@ -18,6 +18,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_device_info.c
     ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_ota.c
     ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_websocket.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_schedule.c
 )
 
 # 公共头文件路径(供其他模块引用)
index 9b9287f..ebfb9c0 100644 (file)
@@ -162,52 +162,16 @@ const char* uapi_ln_get_user_id(void)
     return g_ln_device_user_id;
 }
 
-/* 获取设备角色id */
-const char *uapi_ln_get_character_id(void)
+/* 获取设备角色配置 */
+LnCharacterConfig uapi_ln_get_character_config(void)
 {
-    return g_ln_character_id;
+    return g_ln_character_config;
 }
 
-/* 获取设备角色名称 */
-const char *uapi_ln_get_character_name(void)
+/* 获取日程提醒信息 */
+ScheduleReminder uapi_ln_get_schedule_reminder(void)
 {
-    return g_ln_character_name;
-}
-
-/* 获取设备角色眼睛形状 */
-const char *uapi_ln_get_character_eyes_shape(void)
-{
-    return g_ln_avatar_eyes_shape;
-}
-
-/* 获取设备角色头发颜色 */
-const char *uapi_ln_get_character_hair_color(void)
-{
-    return g_ln_avatar_hair_color;
-}
-
-/* 获取设备角色眼睛颜色 */
-const char *uapi_ln_get_character_eyes_color(void)
-{
-    return g_ln_avatar_eyes_color;
-}
-
-/* 获取设备角色头发样式 */
-const char *uapi_ln_get_character_hair_style(void)
-{
-    return g_ln_avatar_hair_style;
-}
-
-/* 获取设备角色屏幕图片 */
-const char *uapi_ln_get_character_screen_image(void)
-{
-    return g_ln_avatar_screen_image;
-}
-
-/* 获取设备角色屏幕图片是否为表情,默认false */
-int uapi_ln_get_character_screen_image_as_emoji(void)
-{
-    return g_ln_avatar_screen_image_as_emoji;
+    return g_schedule_reminder;
 }
 
 /* 自适应申请HttpClient缓冲(保证header>=2048),失败则逐步扩容重试 */
index ace8186..f695e36 100644 (file)
@@ -133,6 +133,30 @@ typedef enum
     LN_DEVICE_BIND_STATUS_ERROR = 3         /* 其他错误(网络/解析等)*/
 } LnDeviceBindStatus;
 
+/* =================== 设备角色信息结构体定义 =================== */
+typedef struct {
+    char character_id[64];
+    char character_name[64];
+    char avatar_hair_color[64];
+    char avatar_eyes_color[64];
+    char avatar_hair_style[64];
+    char avatar_eyes_shape[64];
+    char avatar_screen_image[256];
+    int  avatar_screen_image_as_emoji;
+} LnCharacterConfig;
+
+// 定义存储日程提醒信息的全局变量
+typedef struct
+{
+    int scheduleId;
+    char deviceId[64];
+    char scheduleName[128];
+    char reminderContent[512];
+    char reminderAudioUrl[512];
+    int enableVoice;
+    int enableVibration;
+} ScheduleReminder;
+
 /* 初始化 LN HTTP 服务 */
 errcode_t uapi_ln_http_server_init(void); 
 /* 通用发送接口:向 LN HTTP 发送队列投递消息 */
@@ -166,22 +190,10 @@ void uapi_ln_audio_download_is_cancel(int status);
 uint32_t uapi_ln_is_device_bound(void);
 /* 获取设备绑定用户ID */
 const char* uapi_ln_get_user_id(void);
-/* 获取设备角色id */
-const char *uapi_ln_get_character_id(void);
-/* 获取设备角色名称 */
-const char *uapi_ln_get_character_name(void);
-/* 获取设备角色眼睛形状 */
-const char *uapi_ln_get_character_eyes_shape(void);
-/* 获取设备角色头发颜色 */
-const char *uapi_ln_get_character_hair_color(void);
-/* 获取设备角色眼睛颜色 */
-const char *uapi_ln_get_character_eyes_color(void);
-/* 获取设备角色头发样式 */
-const char *uapi_ln_get_character_hair_style(void);
-/* 获取设备角色屏幕图片 */
-const char *uapi_ln_get_character_screen_image(void);
-/* 获取设备角色屏幕图片是否为表情 */
-int uapi_ln_get_character_screen_image_as_emoji(void);
+/* 获取设备角色配置 */
+LnCharacterConfig uapi_ln_get_character_config(void);
+/* 获取日程提醒信息 */
+ScheduleReminder uapi_ln_get_schedule_reminder(void);
 
 
 /* ============================== 共享全局状态(跨文件) ============================== */
@@ -192,15 +204,10 @@ extern char g_ln_last_package_url[512];
 extern char g_ln_last_target_version[64];
 extern char g_ln_last_package_md5[65];
 extern int g_ln_last_package_size;
-/* 设备角色信息(由 ln_parse_character_config 填充)*/
-extern char g_ln_character_id[64];              //角色id
-extern char g_ln_character_name[64];            //角色名称
-extern char g_ln_avatar_eyes_shape[64];         //眼睛形状
-extern char g_ln_avatar_hair_color[64];         //头发颜色
-extern char g_ln_avatar_eyes_color[64];         //眼睛颜色
-extern char g_ln_avatar_hair_style[64];         //发型
-extern char g_ln_avatar_screen_image[256];      //屏幕图片
-extern int  g_ln_avatar_screen_image_as_emoji;  //屏幕图片是否为表情
+/* 全局角色配置结构体实例 */
+extern LnCharacterConfig g_ln_character_config;
+/* 全局日程提醒结构体实例 */
+extern ScheduleReminder g_schedule_reminder;
 
 /* ============================== 公共工具函数(供拆分后的模块复用) ============================== */
 
index 05d5a55..ce60788 100644 (file)
@@ -3,16 +3,7 @@
 #include <string.h>
 #include <cJSON.h>
 
-/* =================== 设备角色信息存储 =================== */
-char g_ln_character_id[64] = {0};
-char g_ln_character_name[64] = {0};
-char g_ln_avatar_hair_color[64] = {0};
-char g_ln_avatar_eyes_color[64] = {0};
-char g_ln_avatar_hair_style[64] = {0};
-char g_ln_avatar_eyes_shape[64] = {0};
-char g_ln_avatar_screen_image[256] = {0};
-int  g_ln_avatar_screen_image_as_emoji = 0;
-
+ScheduleReminder g_schedule_reminder = {0};
 /* 安全写入帮助函数 */
 static inline void ln_safe_strcpy(char *dst, size_t dst_size, const char *src)
 {
@@ -25,7 +16,7 @@ static inline void ln_safe_strcpy(char *dst, size_t dst_size, const char *src)
     dst[dst_size - 1] = '\0';
 }
 
-/* 解析设备角色配置 JSON 并保存到全局变量 */
+/* 解析设备角色配置 JSON 并保存到全局结构体 */
 void ln_parse_character_config(const char *json_buf, int json_len)
 {
     if (!json_buf || json_len <= 0)
@@ -69,8 +60,13 @@ void ln_parse_character_config(const char *json_buf, int json_len)
     /* 基础字段 */
     cJSON *cid = cJSON_GetObjectItem(data, "characterId");
     cJSON *cname = cJSON_GetObjectItem(data, "characterName");
-    ln_safe_strcpy(g_ln_character_id, sizeof(g_ln_character_id), (cid && cJSON_IsString(cid)) ? cid->valuestring : "");
-    ln_safe_strcpy(g_ln_character_name, sizeof(g_ln_character_name), (cname && cJSON_IsString(cname)) ? cname->valuestring : "");
+    ln_safe_strcpy(g_ln_character_config.character_id, 
+                  sizeof(g_ln_character_config.character_id), 
+                  (cid && cJSON_IsString(cid)) ? cid->valuestring : "");
+                  
+    ln_safe_strcpy(g_ln_character_config.character_name, 
+                  sizeof(g_ln_character_config.character_name), 
+                  (cname && cJSON_IsString(cname)) ? cname->valuestring : "");
 
     /* 头像配置 */
     cJSON *avatar = cJSON_GetObjectItem(data, "characterAvatar");
@@ -83,29 +79,51 @@ void ln_parse_character_config(const char *json_buf, int json_len)
         cJSON *screenImage = cJSON_GetObjectItem(avatar, "screenImage");
         cJSON *screenImageAsEmoji = cJSON_GetObjectItem(avatar, "screenImageAsEmoji");
 
-        ln_safe_strcpy(g_ln_avatar_hair_color, sizeof(g_ln_avatar_hair_color), (hairColor && cJSON_IsString(hairColor)) ? hairColor->valuestring : "");
-        ln_safe_strcpy(g_ln_avatar_eyes_color, sizeof(g_ln_avatar_eyes_color), (eyesColor && cJSON_IsString(eyesColor)) ? eyesColor->valuestring : "");
-        ln_safe_strcpy(g_ln_avatar_hair_style, sizeof(g_ln_avatar_hair_style), (hairStyle && cJSON_IsString(hairStyle)) ? hairStyle->valuestring : "");
-        ln_safe_strcpy(g_ln_avatar_eyes_shape, sizeof(g_ln_avatar_eyes_shape), (eyesShape && cJSON_IsString(eyesShape)) ? eyesShape->valuestring : "");
-        ln_safe_strcpy(g_ln_avatar_screen_image, sizeof(g_ln_avatar_screen_image), (screenImage && cJSON_IsString(screenImage)) ? screenImage->valuestring : "");
-        g_ln_avatar_screen_image_as_emoji = (screenImageAsEmoji && cJSON_IsBool(screenImageAsEmoji)) ? (cJSON_IsTrue(screenImageAsEmoji) ? 1 : 0) : 0;
+        ln_safe_strcpy(g_ln_character_config.avatar_hair_color, 
+                      sizeof(g_ln_character_config.avatar_hair_color), 
+                      (hairColor && cJSON_IsString(hairColor)) ? hairColor->valuestring : "");
+                      
+        ln_safe_strcpy(g_ln_character_config.avatar_eyes_color, 
+                      sizeof(g_ln_character_config.avatar_eyes_color), 
+                      (eyesColor && cJSON_IsString(eyesColor)) ? eyesColor->valuestring : "");
+                      
+        ln_safe_strcpy(g_ln_character_config.avatar_hair_style, 
+                      sizeof(g_ln_character_config.avatar_hair_style), 
+                      (hairStyle && cJSON_IsString(hairStyle)) ? hairStyle->valuestring : "");
+                      
+        ln_safe_strcpy(g_ln_character_config.avatar_eyes_shape, 
+                      sizeof(g_ln_character_config.avatar_eyes_shape), 
+                      (eyesShape && cJSON_IsString(eyesShape)) ? eyesShape->valuestring : "");
+                      
+        ln_safe_strcpy(g_ln_character_config.avatar_screen_image, 
+                      sizeof(g_ln_character_config.avatar_screen_image), 
+                      (screenImage && cJSON_IsString(screenImage)) ? screenImage->valuestring : "");
+                      
+        g_ln_character_config.avatar_screen_image_as_emoji = 
+            (screenImageAsEmoji && cJSON_IsBool(screenImageAsEmoji)) ? 
+            (cJSON_IsTrue(screenImageAsEmoji) ? 1 : 0) : 0;
     }
     else
     {
-        /* 缺省时清空 */
-        g_ln_avatar_hair_color[0] = '\0';
-        g_ln_avatar_eyes_color[0] = '\0';
-        g_ln_avatar_hair_style[0] = '\0';
-        g_ln_avatar_eyes_shape[0] = '\0';
-        g_ln_avatar_screen_image[0] = '\0';
-        g_ln_avatar_screen_image_as_emoji = 0;
+        /* 缺省时清空结构体字段 */
+        g_ln_character_config.avatar_hair_color[0] = '\0';
+        g_ln_character_config.avatar_eyes_color[0] = '\0';
+        g_ln_character_config.avatar_hair_style[0] = '\0';
+        g_ln_character_config.avatar_eyes_shape[0] = '\0';
+        g_ln_character_config.avatar_screen_image[0] = '\0';
+        g_ln_character_config.avatar_screen_image_as_emoji = 0;
     }
 
-    printf("[DEVICE_CHARACTER] parsed: id=%s\n name=%s\n hairColor=%s\n eyesColor=%s\n hairStyle=%s\n eyesShape=%s\n screenImage=%s\n asEmoji=%d\n",
-           g_ln_character_id, g_ln_character_name,
-           g_ln_avatar_hair_color, g_ln_avatar_eyes_color,
-           g_ln_avatar_hair_style, g_ln_avatar_eyes_shape,
-           g_ln_avatar_screen_image, g_ln_avatar_screen_image_as_emoji);
+    /* 打印解析结果 */
+    printf("[DEVICE_CHARACTER] parsed:\n");
+    printf("  character_id: %s\n", g_ln_character_config.character_id);
+    printf("  character_name: %s\n", g_ln_character_config.character_name);
+    printf("  avatar_hair_color: %s\n", g_ln_character_config.avatar_hair_color);
+    printf("  avatar_eyes_color: %s\n", g_ln_character_config.avatar_eyes_color);
+    printf("  avatar_hair_style: %s\n", g_ln_character_config.avatar_hair_style);
+    printf("  avatar_eyes_shape: %s\n", g_ln_character_config.avatar_eyes_shape);
+    printf("  avatar_screen_image: %s\n", g_ln_character_config.avatar_screen_image);
+    printf("  avatar_screen_image_as_emoji: %d\n", g_ln_character_config.avatar_screen_image_as_emoji);
 
     cJSON_Delete(root);
     free(text);
@@ -163,8 +181,9 @@ uint32_t ln_device_get_character_http(const char *device_id,
         printf("device getCharacter: HTTP %d\n", code);
         if (clientData.responseBuf && clientData.responseBufLen > 0)
         {
-            int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen;
-            do_ln_http_server_recv_data(LN_HTTP_RECV_DEVICE_CHARACTER, clientData.responseBuf, (uint32_t)real_len);
+            // int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen;
+            // do_ln_http_server_recv_data(LN_HTTP_RECV_DEVICE_CHARACTER, clientData.responseBuf, (uint32_t)real_len);
+            printf("device getCharacter: responseBuf=%s\n", clientData.responseBuf);
         }
         goto end;
     }
@@ -368,3 +387,4 @@ uint32_t uapi_ln_device_get_user_id(LnDeviceBindStatus *out_status, char *out_us
     HttpClientClse(&client);
     return ERRCODE_SUCC;
 }
+    
\ No newline at end of file
diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c
new file mode 100644 (file)
index 0000000..919d1ed
--- /dev/null
@@ -0,0 +1,108 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "cJSON.h"
+#include "ln_api.h"
+
+LnCharacterConfig g_ln_character_config = {0};
+
+// 安全字符串复制函数
+static void ln_safe_strcpy(char *dest, size_t dest_size, const char *src)
+{
+    if (!dest || dest_size == 0 || !src)
+        return;
+    strncpy(dest, src, dest_size - 1);
+    dest[dest_size - 1] = '\0';
+}
+
+/* 解析日程提醒信息 */
+void ln_parse_schedule_reminder(const char *json_buf, int json_len)
+{
+    if (!json_buf || json_len <= 0)
+    {
+        printf("[SCHEDULE_REMINDER] invalid json input\n");
+        return;
+    }
+
+    // 复制并终止字符串
+    char *text = (char *)malloc((size_t)json_len + 1);
+    if (!text)
+        return;
+    memcpy(text, json_buf, (size_t)json_len);
+    text[json_len] = '\0';
+
+    // 解析JSON
+    cJSON *root = cJSON_Parse(text);
+    if (!root)
+    {
+        printf("[SCHEDULE_REMINDER] json parse failed\n");
+        free(text);
+        return;
+    }
+
+    // 检查错误码
+    cJSON *errorCode = cJSON_GetObjectItem(root, "errorCode");
+    if (errorCode && !cJSON_IsNull(errorCode))
+    {
+        printf("[SCHEDULE_REMINDER] server error: %s\n",
+               cJSON_IsString(errorCode) ? errorCode->valuestring : "unknown");
+        cJSON_Delete(root);
+        free(text);
+        return;
+    }
+
+    // 获取data对象
+    cJSON *data = cJSON_GetObjectItem(root, "data");
+    if (!data || !cJSON_IsObject(data))
+    {
+        printf("[SCHEDULE_REMINDER] no data object\n");
+        cJSON_Delete(root);
+        free(text);
+        return;
+    }
+
+    // 解析各个字段
+    cJSON *scheduleId = cJSON_GetObjectItem(data, "scheduleId");
+    cJSON *deviceId = cJSON_GetObjectItem(data, "deviceId");
+    cJSON *scheduleName = cJSON_GetObjectItem(data, "scheduleName");
+    cJSON *reminderContent = cJSON_GetObjectItem(data, "reminderContent");
+    cJSON *reminderAudioUrl = cJSON_GetObjectItem(data, "reminderAudioUrl");
+    cJSON *enableVoice = cJSON_GetObjectItem(data, "enableVoice");
+    cJSON *enableVibration = cJSON_GetObjectItem(data, "enableVibration");
+
+    // 填充全局结构体
+    g_schedule_reminder.scheduleId = (scheduleId && cJSON_IsNumber(scheduleId)) ? scheduleId->valueint : 0;
+
+    ln_safe_strcpy(g_schedule_reminder.deviceId,
+                   sizeof(g_schedule_reminder.deviceId),
+                   (deviceId && cJSON_IsString(deviceId)) ? deviceId->valuestring : "");
+
+    ln_safe_strcpy(g_schedule_reminder.scheduleName,
+                   sizeof(g_schedule_reminder.scheduleName),
+                   (scheduleName && cJSON_IsString(scheduleName)) ? scheduleName->valuestring : "");
+
+    ln_safe_strcpy(g_schedule_reminder.reminderContent,
+                   sizeof(g_schedule_reminder.reminderContent),
+                   (reminderContent && cJSON_IsString(reminderContent)) ? reminderContent->valuestring : "");
+
+    ln_safe_strcpy(g_schedule_reminder.reminderAudioUrl,
+                   sizeof(g_schedule_reminder.reminderAudioUrl),
+                   (reminderAudioUrl && cJSON_IsString(reminderAudioUrl)) ? reminderAudioUrl->valuestring : "");
+
+    g_schedule_reminder.enableVoice = (enableVoice && cJSON_IsNumber(enableVoice)) ? enableVoice->valueint : 0;
+    g_schedule_reminder.enableVibration = (enableVibration && cJSON_IsNumber(enableVibration)) ? enableVibration->valueint : 0;
+
+    // 打印解析结果
+    printf("[SCHEDULE_REMINDER] parsed successfully:\n");
+    printf("  scheduleId: %d\n", g_schedule_reminder.scheduleId);
+    printf("  deviceId: %s\n", g_schedule_reminder.deviceId);
+    printf("  scheduleName: %s\n", g_schedule_reminder.scheduleName);
+    printf("  reminderContent: %s\n", g_schedule_reminder.reminderContent);
+    printf("  reminderAudioUrl: %s\n", g_schedule_reminder.reminderAudioUrl);
+    printf("  enableVoice: %d\n", g_schedule_reminder.enableVoice);
+    printf("  enableVibration: %d\n", g_schedule_reminder.enableVibration);
+
+    // 清理资源
+    cJSON_Delete(root);
+    free(text);
+}
\ No newline at end of file