summaryrefslogtreecommitdiffstats
path: root/task_manager/server/src/tskm_api.cpp
blob: a9943ba16845317a4a6e24cd137e21232c65a027 (plain)
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
/*
 * @copyright Copyright (c) 2016-2019 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