1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <errno.h>
16 #include <unistd.h>
17 
18 #include "init_log.h"
19 #include "init_param.h"
20 #include "init_utils.h"
21 #include "param_manager.h"
22 #ifdef PARAM_LOAD_CFG_FROM_CODE
23 #include "param_cfg.h"
24 #endif
25 #ifdef __LITEOS_M__
26 #include "ohos_init.h"
27 #include "cmsis_os2.h"
28 #include "parameter.h"
29 #endif
30 
31 #ifdef PARAM_LOAD_CFG_FROM_CODE
StringTrim(char * buffer,int size,const char * name)32 static const char *StringTrim(char *buffer, int size, const char *name)
33 {
34     char *tmp = (char *)name;
35     while (*tmp != '\0' && *tmp != '"') {
36         tmp++;
37     }
38     if (*tmp == '\0') {
39         return name;
40     }
41     // skip "
42     tmp++;
43     int i = 0;
44     while (*tmp != '\0' && i < size) {
45         buffer[i++] = *tmp;
46         tmp++;
47     }
48     if (i >= size) {
49         return name;
50     }
51     while (i > 0) {
52         if (buffer[i] == '"') {
53             buffer[i] = '\0';
54             return buffer;
55         }
56         i--;
57     }
58     return name;
59 }
60 #endif
61 
InitParamService(void)62 int InitParamService(void)
63 {
64     PARAM_LOGI("InitParamService %s", DATA_PATH);
65     CheckAndCreateDir(PARAM_STORAGE_PATH "/");
66     CheckAndCreateDir(DATA_PATH);
67     // param space
68     int ret = InitParamWorkSpace(0, NULL);
69     PARAM_CHECK(ret == 0, return ret, "Init parameter workspace fail");
70     ret = InitPersistParamWorkSpace();
71     PARAM_CHECK(ret == 0, return ret, "Init persist parameter workspace fail");
72 
73     // from build
74     LoadParamFromBuild();
75 #ifdef PARAM_LOAD_CFG_FROM_CODE
76     char *buffer = calloc(1, PARAM_VALUE_LEN_MAX);
77     PARAM_CHECK(buffer != NULL, return ret, "Failed to malloc for buffer");
78     for (size_t i = 0; i < ARRAY_LENGTH(g_paramDefCfgNodes); i++) {
79         PARAM_LOGV("InitParamService name %s = %s", g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value);
80         uint32_t dataIndex = 0;
81         ret = WriteParam(g_paramDefCfgNodes[i].name,
82             StringTrim(buffer, PARAM_VALUE_LEN_MAX, g_paramDefCfgNodes[i].value), &dataIndex, 0);
83         PARAM_CHECK(ret == 0, continue, "Failed to set param %d name %s %s",
84             ret, g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value);
85     }
86     free(buffer);
87 #endif
88 
89     return 0;
90 }
91 
StartParamService(void)92 int StartParamService(void)
93 {
94     return 0;
95 }
96 
StopParamService(void)97 void StopParamService(void)
98 {
99     PARAM_LOGI("StopParamService.");
100     ClosePersistParamWorkSpace();
101     CloseParamWorkSpace();
102 }
103 
SystemWriteParam(const char * name,const char * value)104 int SystemWriteParam(const char *name, const char *value)
105 {
106     int ctrlService = 0;
107     int ret = CheckParameterSet(name, value, GetParamSecurityLabel(), &ctrlService);
108     PARAM_CHECK(ret == 0, return ret, "Forbid to set parameter %s", name);
109     PARAM_LOGV("SystemWriteParam name %s value: %s ctrlService %d", name, value, ctrlService);
110     if ((ctrlService & PARAM_CTRL_SERVICE) != PARAM_CTRL_SERVICE) { // ctrl param
111         uint32_t dataIndex = 0;
112         ret = WriteParam(name, value, &dataIndex, 0);
113         PARAM_CHECK(ret == 0, return ret, "Failed to set param %d name %s %s", ret, name, value);
114         ret = WritePersistParam(name, value);
115         PARAM_CHECK(ret == 0, return ret, "Failed to set persist param name %s", name);
116     } else {
117         PARAM_LOGE("SystemWriteParam can not support service ctrl parameter name %s", name);
118     }
119     return ret;
120 }
121 
122 #ifdef __LITEOS_M__
123 #define OS_DELAY 1000 // * 30 // 30s
124 #define STACK_SIZE 1024
125 
ParamServiceTask(int * arg)126 static void ParamServiceTask(int *arg)
127 {
128     (void)arg;
129     PARAM_LOGI("ParamServiceTask start");
130     while (1) {
131         CheckAndSavePersistParam();
132         osDelay(OS_DELAY);
133     }
134 }
135 
LiteParamService(void)136 void LiteParamService(void)
137 {
138     static int init = 0;
139     if (init) {
140         return;
141     }
142     init = 1;
143     EnableInitLog(INIT_INFO);
144     InitParamService();
145     // get persist param
146     LoadPersistParams();
147 }
148 CORE_INIT(LiteParamService);
149 #endif