X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=service%2Fsystem%2Ftask_manager%2Fserver%2Fsrc%2Ftskm_api.cpp;fp=service%2Fsystem%2Ftask_manager%2Fserver%2Fsrc%2Ftskm_api.cpp;h=94c8226e94b21bce431f29e97710009b8d5b606b;hb=17cf21bcf8a2e29d2cbcf0a313474d2a4ee44f5d;hp=0000000000000000000000000000000000000000;hpb=9e86046cdb356913ae026f616e5bf17f6f238aa5;p=staging%2Fbasesystem.git diff --git a/service/system/task_manager/server/src/tskm_api.cpp b/service/system/task_manager/server/src/tskm_api.cpp new file mode 100755 index 0000000..94c8226 --- /dev/null +++ b/service/system/task_manager/server/src/tskm_api.cpp @@ -0,0 +1,268 @@ +/* + * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tskm_debug.h" +#include "tskm_main.h" +#include "tskm_state.h" +#include "tskm_util.h" + +#include "tskm_srvr.h" +#include "tskm_port_pf.h" +#include "tskm_port_subsys.h" + +/** + * _TSKM_SvcCtl Sub-func Task-startup-process + * @param svcId service id + * @param p_main TSKM_MAIN_CTX_t* + * @param p_svc TSKM_SVC_CTX_t* + * @return TSKM_E_OK Succeeded + * @return other Failed + */ + +TSKM_ERR_t tskm_svcExecRequest(TSKM_SVCID_t svcId, TSKM_MAIN_CTX_t* p_main, TSKM_SVC_CTX_t* p_svc) { + TSKM_ERR_t tskmRet = TSKM_E_OK; + + // Startup tasks + TSKM_GSTEP_REQ_INFO_t req = { 0 }; + + if (p_main->isOnStartDone == TSKM_FALSE) { + TSKM_PRINTF(TSKM_LOG_WARN, "Transient SVC cannot exec before get BootInfo"); + return TSKM_E_STATE; + } else if (p_main->isOnStopDone == TSKM_TRUE) { + TSKM_PRINTF(TSKM_LOG_WARN, "Transient SVC cannot exec after FrameworkunifiedOnStop"); + return TSKM_E_STATE; + } + + tskmRet = tskm_svcExec(p_svc); + TSKM_ERR_CHK_DFT; + if (p_svc->state == TSKM_SVC_WAITCONNECT) { + // In the state of waiting to execute + req.svcId = svcId; + req.localStep = TSKM_LSTEP_ALL; + tskmRet = tskm_svcWakeupRequest(p_svc, &req); + TSKM_ERR_CHK_DFT; // LCOV_EXCL_BR_LINE 6: Because TSKM_ERR_CHK_DFT does not specify a condition for goto to ERROR + } + ERROR: return tskmRet; +} + +/** + * _TSKM_SvcCtl Sub-func Task-startup-process + * @param p_main TSKM_MAIN_CTX_t* + * @param svcId TSKM_SVCID_t + * @return TSKM_E_OK Succeeded + * @return other Failed + */ + +TSKM_ERR_t tskm_svcReserveRequest(TSKM_MAIN_CTX_t* p_main, TSKM_SVCID_t svcId) { + uint8_t rsvSvcNum = p_main->nvInfo.body.rsvSvcNum; + TSKM_SVCID_t* p_rsvSvcs = p_main->nvInfo.body.rsvSvcs; + TSKM_ERR_t tskmRet = TSKM_E_OK; + + if (rsvSvcNum >= TSKM_SVC_RESERVE_MAX) { + tskmRet = TSKM_E_STATE; + } else { + int ii; + int ret; + + for (ii = 0; ii < rsvSvcNum; ii++) { + if (p_rsvSvcs[ii] == svcId) { + TSKM_ASSERT_PRINT(0, "Rsv Req already registered(%d)", svcId); + // Return OK as continuable + return tskmRet; + } + } + + p_rsvSvcs[rsvSvcNum] = svcId; + p_main->nvInfo.body.rsvSvcNum++; + + TSKM_PRINTF(TSKM_LOG_STATE, "Rsv Svc registered(%#x)", svcId); + + ret = tskm_pf_nvFileWrite(&p_main->nvInfo); // LCOV_EXCL_BR_LINE 6: Return value of 0 only + if (ret == -1) { + TSKM_ASSERT(0); + tskmRet = TSKM_E_NG; + return tskmRet; + } + } + return tskmRet; +} + +/** + * Service control + * @param svcId service id + * @param ctl control command + * @return TSKM_E_OK Succeeded + * @return other Failed + */ +TSKM_ERR_t _TSKM_SvcCtl(TSKM_SVCID_t svcId, const TSKM_SVC_CTL_t* ctl) { + TSKM_ERR_t tskmRet = TSKM_E_OK; + TSKM_MAIN_CTX_t* p_main = tskm_getMainCtx(); + + TSKM_SVC_CTX_t* p_svc; + + if (ctl == NULL) { + TSKM_ASSERT(0); + return TSKM_E_PAR; + } + + p_svc = tskm_svcsGetSvcBySvcId(&p_main->svcs, svcId); + if (p_svc == NULL) { + TSKM_ASSERT(0); + TSKM_PRINTF(TSKM_LOG_ERROR, "unknown svcId:%#x", svcId); + return TSKM_E_PAR; + } + + TSKM_PRINTF(TSKM_LOG_API, "%s(%#x,%d)", __FUNCTION__, svcId, ctl->cmd); + + if (ctl->cmd == TSKM_SVC_CMD_EXEC) { + tskmRet = tskm_svcExecRequest(svcId, p_main, p_svc); + } else if (ctl->cmd == TSKM_SVC_CMD_ENABLE) { + tskmRet = tskm_svcEnableRequest(p_svc); + TSKM_ERR_CHK_DFT; // LCOV_EXCL_BR_LINE 8: Because TSKM_ERR_CHK_DFT does not specify a condition for goto to ERROR + + } else if (ctl->cmd == TSKM_SVC_CMD_DISABLE) { + tskmRet = tskm_svcDisableRequest(p_svc); + TSKM_ERR_CHK_DFT; + + } else if (ctl->cmd == TSKM_SVC_CMD_RESERVE) { + tskmRet = tskm_svcReserveRequest(p_main, svcId); + + } else { + return TSKM_E_PAR; + } + + ERROR: return tskmRet; +} + +/** + * Get service info + * @param svcId service id + * @param svcInfo[O] service info + * @return TSKM_E_OK Succeeded + * @return other Failed + */ +TSKM_ERR_t TSKM_SvcGetInfo(TSKM_SVCID_t svcId, TSKM_SVC_INFO_t* svcInfo) { +// Do not LOG acquisition APIs TSKM_PRINTF(TSKM_LOG_API,"%s()",__FUNCTION__) + + TSKM_MAIN_CTX_t* p_main = tskm_getMainCtx(); + TSKM_SVC_CTX_t* p_svc = tskm_svcsGetSvcBySvcId(&p_main->svcs, svcId); + + if (p_svc == NULL || svcInfo == NULL) { + return TSKM_E_PAR; + } + + svcInfo->svcId = p_svc->attr->svcId; + svcInfo->isExecDisable = + (p_svc->state == TSKM_SVC_DISABLE) ? TSKM_TRUE : TSKM_FALSE; + + return TSKM_E_OK; +} + +RPC_Result _TSKM_ErrorReboot(const TSKM_ERROR_REBOOT_t* p_info) { + RPC_Result rpcRet = RPC_OK; + TSKM_ERROR_REBOOT_t rebootInfo; + + if (!p_info || (p_info->type != TSKM_ERROR_REBOOT_NORMAL)) { + TSKM_ASSERT(0); + return RPC_ERR_Fatal; + } + + memset(&rebootInfo, 0, sizeof(TSKM_ERROR_REBOOT_t)); + rebootInfo.type = p_info->type; + snprintf(rebootInfo.log.messageStr, TSKM_LOGGING_MSG_STR_SIZE, "%s", + p_info->log.messageStr); + + TSKM_PRINTF(TSKM_LOG_API, "%s(%d)", __FUNCTION__, p_info->type); + + tskm_sub_reboot(&rebootInfo); + + return rpcRet; +} + +/** + * Reboot service + * @param p_rsv Reserved + * @return TSKM_E_OK Succeeded + * @return other Failed + */ +TSKM_ERR_t TSKM_Reboot(const TSKM_RSV_t * p_rsv) { + TSKM_ERR_t tskmRet = TSKM_E_OK; + + TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__) + if (p_rsv != NULL) { + TSKM_ASSERT(0); + return TSKM_E_PAR; + } + + tskm_sub_reboot_normal(); + + return tskmRet; +} + +/** + * Save LOGs + * @param p_info LOG storage info + * @return TSKM_E_OK Succeeded + * @return other Failed + */ +TSKM_ERR_t TSKM_Logging(const TSKM_LOGGING_INFO_t* p_info) { + TSKM_LOGGING_INFO_t logInfo; + TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__) + + if (!p_info) { + TSKM_ASSERT(0); + return TSKM_E_PAR; + } else { + switch (p_info->type) { + case TSKM_LOGGING_TYPE_MODULE_LOGS: + case TSKM_LOGGING_TYPE_GRP_RELAUNCH: + break; + default: + TSKM_ASSERT(0); + return TSKM_E_PAR; + } + } + + logInfo.type = p_info->type; + snprintf(logInfo.messageStr, TSKM_LOGGING_MSG_STR_SIZE, "%s", + p_info->messageStr); + + tskm_sub_logging(&logInfo); + + return TSKM_E_OK; +} + +TSKM_ERR_t TSKM_SetWakeupOrder(const TSKM_WAKEUP_ORDER_t* p_order) { + TSKM_ERR_t tskmRet = TSKM_E_OK; + + TSKM_PRINTF(TSKM_LOG_API, "%s()", __FUNCTION__) + + if (p_order == NULL) { + return TSKM_E_PAR; + } + + if (strnlen(p_order->orderName, TSKM_ORDER_NAME_MAX) >= TSKM_ORDER_NAME_MAX) { + return TSKM_E_PAR; + } + + if (tskm_sub_setWakeupOrder(p_order->orderName) != 0) { + TSKM_ASSERT(0); + tskmRet = TSKM_E_NG; + } + + return tskmRet; +} // LCOV_EXCL_BR_LINE 10: Final line +