JZsdk_Config.c
10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#include "JZsdkLib.h"
#include <string.h> // 确保包含头文件
#include "./JZsdk_Hal.h"
#include "BaseConfig.h"
#define JZSDK_HAL_CONFIG_FILE "/root/sdcard/config.ini"
/**
* 读取INI配置文件中的指定键值对
* @param config_file 配置文件路径
* @param section 配置段名称
* @param key 键名称
* @return 成功返回动态分配的字符串(需调用者 free),失败返回 NULL
*/
char* JZsdk_HalConfig_Read(const char* config_file, const char* section, const char* key) {
FILE* fp = fopen(config_file, "r");
if (!fp) return NULL;
char line[1024];
char section_buf[256];
int in_target_section = 0;
char* result = NULL;
while (fgets(line, sizeof(line), fp)) {
// 去除行尾换行符
size_t len = strlen(line);
while (len > 0 && (line[len - 1] == '\n' || line[len - 1] == '\r')) {
line[--len] = '\0';
}
if (line[0] == '[') {
if (sscanf(line, "[%[^]]]", section_buf) == 1) {
// 去除空格
char* start = section_buf;
char* end = section_buf + strlen(section_buf) - 1;
while (start <= end && (*start == ' ' || *start == '\t')) start++;
while (end >= start && (*end == ' ' || *end == '\t')) end--;
if (start <= end) {
*(end + 1) = '\0';
in_target_section = (strcmp(start, section) == 0);
}
}
continue;
}
if (in_target_section) {
char current_key[256], current_value[256];
if (sscanf(line, "%[^=]=%[^\n]", current_key, current_value) == 2) {
// 去除key两端空格
char* k_start = current_key;
char* k_end = current_key + strlen(current_key) - 1;
while (k_start <= k_end && (*k_start == ' ' || *k_start == '\t')) k_start++;
while (k_end >= k_start && (*k_end == ' ' || *k_end == '\t')) k_end--;
if (k_start <= k_end) {
*(k_end + 1) = '\0';
if (strcmp(k_start, key) == 0) {
// 去除value两端空格和行尾注释
char* v_start = current_value;
char* v_end = current_value + strlen(current_value) - 1;
while (v_start <= v_end && (*v_start == ' ' || *v_start == '\t')) v_start++;
while (v_end >= v_start) {
if (*v_end == ' ' || *v_end == '\t' || *v_end == '#') {
v_end--;
}
else {
break;
}
}
if (v_start <= v_end) {
size_t val_len = v_end - v_start + 1;
result = (char*)malloc(val_len + 1);
if (result) {
strncpy(result, v_start, val_len);
result[val_len] = '\0';
}
}
break;
}
}
}
}
}
fclose(fp);
return result;
}
/**
* 修改INI配置文件中的指定键值对
* @param config_file 配置文件路径
* @param section 配置段名称(如 "APP_RUN_TYPE")
* @param key 键名称(如 "appmode")
* @param new_value 新的值(字符串形式)
* @return 0成功,-1失败
*/
T_JZsdkReturnCode JZsdk_HalConfig_Write(const char* config_file, const char* section,
const char* key, const char* new_value)
{
FILE* fp, * fp_temp;
char temp_file[512];
char line[1024];
char section_buf[256];
int in_target_section = 0;
int key_found = 0;
int ret = 0;
// 参数检查
if (!config_file || !section || !key || !new_value) {
printf("错误:参数不能为空\n");
return -1;
}
// 检查原文件是否存在
fp = fopen(config_file, "r");
if (!fp) {
JZSDK_LOG_ERROR("错误:无法打开配置文件 %s\n", config_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 创建临时文件
snprintf(temp_file, sizeof(temp_file), "%s.tmp", config_file);
fp_temp = fopen(temp_file, "w");
if (!fp_temp) {
JZSDK_LOG_ERROR("错误:无法创建临时文件\n");
fclose(fp);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 逐行读取原文件并处理
while (fgets(line, sizeof(line), fp)) {
// 去除行尾的换行符(保留用于写入)
size_t len = strlen(line);
if (len > 0 && (line[len - 1] == '\n' || line[len - 1] == '\r')) {
line[len - 1] = '\0';
len--;
}
if (len > 0 && line[len - 1] == '\r') {
line[len - 1] = '\0';
}
// 检查是否是section行
if (line[0] == '[') {
// 解析section名称
if (sscanf(line, "[%[^]]]", section_buf) == 1) {
// 去除section名称两端的空格
char* start = section_buf;
char* end = section_buf + strlen(section_buf) - 1;
while (start <= end && (*start == ' ' || *start == '\t')) start++;
while (end >= start && (*end == ' ' || *end == '\t')) end--;
if (start <= end) {
*(end + 1) = '\0';
// 判断是否是目标section
if (strcmp(start, section) == 0) {
in_target_section = 1;
printf("进入目标段: [%s]\n", section);
}
else {
in_target_section = 0;
}
}
}
// 写入原section行
fprintf(fp_temp, "%s\n", line);
continue;
}
// 如果在目标section内,查找key
if (in_target_section && !key_found) {
char current_key[256];
char current_value[256];
// 尝试解析key=value格式
if (sscanf(line, "%[^=]=%[^\n]", current_key, current_value) == 2) {
// 去除key两端的空格
char* key_start = current_key;
char* key_end = current_key + strlen(current_key) - 1;
while (key_start <= key_end && (*key_start == ' ' || *key_start == '\t')) key_start++;
while (key_end >= key_start && (*key_end == ' ' || *key_end == '\t')) key_end--;
if (key_start <= key_end) {
*(key_end + 1) = '\0';
// 检查是否是目标key
if (strcmp(key_start, key) == 0) {
printf("找到目标键: %s,原值: %s,修改为新值: %s\n",
key, current_value, new_value);
// 保留原行的缩进和格式
// 找到等号的位置
char* eq_pos = strchr(line, '=');
if (eq_pos) {
// 计算等号前的部分(包括空格)
int prefix_len = eq_pos - line + 1;
// 写入key部分(保持原格式)
fprintf(fp_temp, "%.*s%s\n", prefix_len, line, new_value);
}
else {
// 如果找不到等号(不应该发生),简单写入
fprintf(fp_temp, "%s=%s\n", key, new_value);
}
key_found = 1;
continue;
}
}
}
}
// 如果不是目标key,写入原行
fprintf(fp_temp, "%s\n", line);
}
// 如果在目标section内没有找到目标key,则在section末尾添加
if (in_target_section && !key_found) {
printf("未找到键 %s,在段末添加: %s=%s\n", key, key, new_value);
fprintf(fp_temp, "%s=%s\n", key, new_value);
}
// 关闭文件
fclose(fp);
fclose(fp_temp);
// 用临时文件替换原文件
if (remove(config_file) != 0) {
printf("警告:无法删除原文件 %s\n", config_file);
ret = -1;
}
if (rename(temp_file, config_file) != 0) {
printf("错误:无法重命名临时文件为 %s\n", config_file);
ret = -1;
}
if (ret == 0) {
printf("成功修改配置文件: %s\n", config_file);
}
return ret;
}
T_JZsdkReturnCode JZsdk_Hal_config_use_uart1(int num)
{
// const char* config_file = JZSDK_HAL_CONFIG_FILE;
// const char* target_value = NULL;
// char* current_value = NULL;
// int need_write = 0;
//
// // 确定目标值
// if (num == 0) {
// target_value = "0";
// }
// else if (num == 1) {
// target_value = "1";
// }
// else if (num == 3) {
//#if DEVICE_VERSION == JZ_H150A
// T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
// if (handle != NULL) {
// T_JZsdk_HalInfo HalInfo;
// handle->GetHalInfo(&HalInfo);
// for (int i = 0; i < HalInfo.UartNum; i++) {
// if (strcmp(HalInfo.UartInfo[i].DevicePath, "/dev/ttyS2") == 0) {
// target_value = "0";
// break;
// }
// else if (strcmp(HalInfo.UartInfo[i].DevicePath, "/dev/ttyGS0") == 0) {
// target_value = "1";
// break;
// }
// }
// }
//#endif
// if (!target_value) {
// JZSDK_LOG_ERROR("无法确定目标设备类型");
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
// }
// else {
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 其他num不处理
// }
//
// // 读取当前配置值
// current_value = JZsdk_HalConfig_Read(config_file, "UART1", "device");
// if (current_value) {
// if (strcmp(current_value, target_value) != 0) {
// need_write = 1;
// }
// free(current_value);
// }
// else {
// // 读取失败(如文件不存在或键不存在),需要写入
// need_write = 1;
// }
//
// if (need_write) {
// if (JZsdk_HalConfig_Write(config_file, "UART1", "device", target_value) == 0) {
// JZSDK_LOG_INFO("成功修改device为 %s\n", target_value);
// }
// else {
// JZSDK_LOG_ERROR("修改device失败");
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
// }
// else {
// JZSDK_LOG_INFO("device已经是 %s,无需修改\n", target_value);
// }
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_HalConfigInit()
{
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}