2 * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "tskm_debug.h"
18 #include "tskm_main.h"
19 #include "tskm_state.h"
20 #include "tskm_util.h"
22 #include "tskm_srvr.h"
23 #include "tskm_port_pf.h"
24 #include "tskm_port_subsys.h"
27 * _TSKM_SvcCtl Sub-func Task-startup-process
28 * @param svcId service id
29 * @param p_main TSKM_MAIN_CTX_t*
30 * @param p_svc TSKM_SVC_CTX_t*
31 * @return TSKM_E_OK Succeeded
32 * @return other Failed
35 TSKM_ERR_t tskm_svcExecRequest(TSKM_SVCID_t svcId, TSKM_MAIN_CTX_t* p_main, TSKM_SVC_CTX_t* p_svc) {
36 TSKM_ERR_t tskmRet = TSKM_E_OK;
39 TSKM_GSTEP_REQ_INFO_t req = { 0 };
41 if (p_main->isOnStartDone == TSKM_FALSE) {
42 TSKM_PRINTF(TSKM_LOG_WARN, "Transient SVC cannot exec before get BootInfo");
44 } else if (p_main->isOnStopDone == TSKM_TRUE) {
45 TSKM_PRINTF(TSKM_LOG_WARN, "Transient SVC cannot exec after FrameworkunifiedOnStop");
49 tskmRet = tskm_svcExec(p_svc);
51 if (p_svc->state == TSKM_SVC_WAITCONNECT) {
52 // In the state of waiting to execute
54 req.localStep = TSKM_LSTEP_ALL;
55 tskmRet = tskm_svcWakeupRequest(p_svc, &req);
56 TSKM_ERR_CHK_DFT; // LCOV_EXCL_BR_LINE 6: Because TSKM_ERR_CHK_DFT does not specify a condition for goto to ERROR
58 ERROR: return tskmRet;
62 * _TSKM_SvcCtl Sub-func Task-startup-process
63 * @param p_main TSKM_MAIN_CTX_t*
64 * @param svcId TSKM_SVCID_t
65 * @return TSKM_E_OK Succeeded
66 * @return other Failed
69 TSKM_ERR_t tskm_svcReserveRequest(TSKM_MAIN_CTX_t* p_main, TSKM_SVCID_t svcId) {
70 uint8_t rsvSvcNum = p_main->nvInfo.body.rsvSvcNum;
71 TSKM_SVCID_t* p_rsvSvcs = p_main->nvInfo.body.rsvSvcs;
72 TSKM_ERR_t tskmRet = TSKM_E_OK;
74 if (rsvSvcNum >= TSKM_SVC_RESERVE_MAX) {
75 tskmRet = TSKM_E_STATE;
80 for (ii = 0; ii < rsvSvcNum; ii++) {
81 if (p_rsvSvcs[ii] == svcId) {
82 TSKM_ASSERT_PRINT(0, "Rsv Req already registered(%d)", svcId);
83 // Return OK as continuable
88 p_rsvSvcs[rsvSvcNum] = svcId;
89 p_main->nvInfo.body.rsvSvcNum++;
91 TSKM_PRINTF(TSKM_LOG_STATE, "Rsv Svc registered(%#x)", svcId);
93 ret = tskm_pf_nvFileWrite(&p_main->nvInfo); // LCOV_EXCL_BR_LINE 6: Return value of 0 only
105 * @param svcId service id
106 * @param ctl control command
107 * @return TSKM_E_OK Succeeded
108 * @return other Failed
110 TSKM_ERR_t _TSKM_SvcCtl(TSKM_SVCID_t svcId, const TSKM_SVC_CTL_t* ctl) {
111 TSKM_ERR_t tskmRet = TSKM_E_OK;
112 TSKM_MAIN_CTX_t* p_main = tskm_getMainCtx();
114 TSKM_SVC_CTX_t* p_svc;
121 p_svc = tskm_svcsGetSvcBySvcId(&p_main->svcs, svcId);
124 TSKM_PRINTF(TSKM_LOG_ERROR, "unknown svcId:%#x", svcId);
128 TSKM_PRINTF(TSKM_LOG_API, "%s(%#x,%d)", __FUNCTION__, svcId, ctl->cmd);
130 if (ctl->cmd == TSKM_SVC_CMD_EXEC) {
131 tskmRet = tskm_svcExecRequest(svcId, p_main, p_svc);
132 } else if (ctl->cmd == TSKM_SVC_CMD_ENABLE) {
133 tskmRet = tskm_svcEnableRequest(p_svc);
134 TSKM_ERR_CHK_DFT; // LCOV_EXCL_BR_LINE 8: Because TSKM_ERR_CHK_DFT does not specify a condition for goto to ERROR
136 } else if (ctl->cmd == TSKM_SVC_CMD_DISABLE) {
137 tskmRet = tskm_svcDisableRequest(p_svc);
140 } else if (ctl->cmd == TSKM_SVC_CMD_RESERVE) {
141 tskmRet = tskm_svcReserveRequest(p_main, svcId);
147 ERROR: return tskmRet;
152 * @param svcId service id
153 * @param svcInfo[O] service info
154 * @return TSKM_E_OK Succeeded
155 * @return other Failed
157 TSKM_ERR_t TSKM_SvcGetInfo(TSKM_SVCID_t svcId, TSKM_SVC_INFO_t* svcInfo) {
158 // Do not LOG acquisition APIs TSKM_PRINTF(TSKM_LOG_API,"%s()",__FUNCTION__)
160 TSKM_MAIN_CTX_t* p_main = tskm_getMainCtx();
161 TSKM_SVC_CTX_t* p_svc = tskm_svcsGetSvcBySvcId(&p_main->svcs, svcId);
163 if (p_svc == NULL || svcInfo == NULL) {
167 svcInfo->svcId = p_svc->attr->svcId;
168 svcInfo->isExecDisable =
169 (p_svc->state == TSKM_SVC_DISABLE) ? TSKM_TRUE : TSKM_FALSE;
174 RPC_Result _TSKM_ErrorReboot(const TSKM_ERROR_REBOOT_t* p_info) {
175 RPC_Result rpcRet = RPC_OK;
176 TSKM_ERROR_REBOOT_t rebootInfo;
178 if (!p_info || (p_info->type != TSKM_ERROR_REBOOT_NORMAL)) {
180 return RPC_ERR_Fatal;
183 memset(&rebootInfo, 0, sizeof(TSKM_ERROR_REBOOT_t));
184 rebootInfo.type = p_info->type;
185 snprintf(rebootInfo.log.messageStr, TSKM_LOGGING_MSG_STR_SIZE, "%s",
186 p_info->log.messageStr);
188 TSKM_PRINTF(TSKM_LOG_API, "%s(%d)", __FUNCTION__, p_info->type);
190 tskm_sub_reboot(&rebootInfo);
197 * @param p_rsv Reserved
198 * @return TSKM_E_OK Succeeded
199 * @return other Failed
201 TSKM_ERR_t TSKM_Reboot(const TSKM_RSV_t * p_rsv) {
202 TSKM_ERR_t tskmRet = TSKM_E_OK;
204 TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__)
210 tskm_sub_reboot_normal();
217 * @param p_info LOG storage info
218 * @return TSKM_E_OK Succeeded
219 * @return other Failed
221 TSKM_ERR_t TSKM_Logging(const TSKM_LOGGING_INFO_t* p_info) {
222 TSKM_LOGGING_INFO_t logInfo;
223 TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__)
229 switch (p_info->type) {
230 case TSKM_LOGGING_TYPE_MODULE_LOGS:
231 case TSKM_LOGGING_TYPE_GRP_RELAUNCH:
239 logInfo.type = p_info->type;
240 snprintf(logInfo.messageStr, TSKM_LOGGING_MSG_STR_SIZE, "%s",
243 tskm_sub_logging(&logInfo);
248 TSKM_ERR_t TSKM_SetWakeupOrder(const TSKM_WAKEUP_ORDER_t* p_order) {
249 TSKM_ERR_t tskmRet = TSKM_E_OK;
251 TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__)
253 if (p_order == NULL) {
257 if (strnlen(p_order->orderName, TSKM_ORDER_NAME_MAX) >= TSKM_ORDER_NAME_MAX) {
261 if (tskm_sub_setWakeupOrder(p_order->orderName) != 0) {
267 } // LCOV_EXCL_BR_LINE 10: Final line