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