1/*
2 * Copyright (c) 2020-2022 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
16#include <stdint.h>
17#include <securec.h>
18#include <ohos_init.h>
19#include <cmsis_os.h>
20#include "service.h"
21#include "samgr_lite.h"
22#include "time_adapter.h"
23
24#define TOTAL_SPEC_TASK_NUM 19
25
26static const char *g_specTaskService[] = {
27    "ltsk_s1", "ltsk_s2", "ltsk_s3",
28    "otsk_s1", "otsk_s2", "otsk_s3", "otsk_s4",
29    "otsk_s5", "otsk_s6", "otsk_s7", "otsk_s8",
30    "otsk_s9", "otsk_s10", "otsk_s11", "otsk_s12",
31    "otsk_s13", "otsk_s14", "otsk_s15", "otsk_s16",
32};
33static const char *g_specServiceName1[] = {
34    "l6tsk_s1", "l6tsk_s2"
35};
36static const char *g_specServiceName2[] = {
37    "l7tsk_s1", "l7tsk_s2", "l7tsk_s3"
38};
39static const char *g_specServiceName3[] = {
40    "l8tsk_s1", "l8tsk_s2", "l8tsk_s3", "l8tsk_s4"
41};
42static const char *GetName(Service *service);
43static const char *GetSpec1Name(Service *service);
44static const char *GetSpec2Name(Service *service);
45static const char *GetSpec3Name(Service *service);
46static BOOL Initialize(Service *service, Identity identity);
47static BOOL MessageHandle(Service *service, Request *msg);
48static TaskConfig GetLowTagTaskConfig(Service *service);
49static TaskConfig GetHighTagTaskConfig(Service *service);
50static TaskConfig GetSpec1TagTaskConfig(Service *service);
51static TaskConfig GetSpec2TagTaskConfig(Service *service);
52static TaskConfig GetSpec3TagTaskConfig(Service *service);
53static Service g_example[] = {
54    {GetName, Initialize, MessageHandle, GetLowTagTaskConfig},
55    {GetName, Initialize, MessageHandle, GetLowTagTaskConfig},
56    {GetName, Initialize, MessageHandle, GetLowTagTaskConfig},
57    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
58    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
59    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
60    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
61    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
62    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
63    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
64    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
65    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
66    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
67    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
68    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
69    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
70    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
71    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig},
72    {GetName, Initialize, MessageHandle, GetHighTagTaskConfig}
73};
74static Service g_exampleSpec1[] = {
75    {GetSpec1Name, Initialize, MessageHandle, GetSpec1TagTaskConfig},
76    {GetSpec1Name, Initialize, MessageHandle, GetSpec1TagTaskConfig}
77};
78static Service g_exampleSpec2[] = {
79    {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig},
80    {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig},
81    {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig}
82};
83static Service g_exampleSpec3[] = {
84    {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
85    {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
86    {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
87    {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig}
88};
89static uint32_t g_initIndex = 0;
90
91static const char *GetName(Service *service)
92{
93    int i;
94    for (i = 0; i < TOTAL_SPEC_TASK_NUM; ++i) {
95        if (service == &g_example[i]) {
96            return g_specTaskService[i];
97        }
98    }
99    return NULL;
100}
101
102static const char *GetSpec1Name(Service *service)
103{
104    int i;
105    // g_exampleSpec1 has 2 services
106    for (i = 0; i < 2; ++i) {
107        if (service == &g_exampleSpec1[i]) {
108            return g_specServiceName1[i];
109        }
110    }
111    return NULL;
112}
113
114static const char *GetSpec2Name(Service *service)
115{
116    int i;
117    // g_exampleSpec2 has 3 services
118    for (i = 0; i < 3; ++i) {
119        if (service == &g_exampleSpec2[i]) {
120            return g_specServiceName2[i];
121        }
122    }
123    return NULL;
124}
125
126static const char *GetSpec3Name(Service *service)
127{
128    int i;
129    // g_exampleSpec3 has 4 services
130    for (i = 0; i < 4; ++i) {
131        if (service == &g_exampleSpec3[i]) {
132            return g_specServiceName3[i];
133        }
134    }
135    return NULL;
136}
137
138static BOOL Initialize(Service *service, Identity identity)
139{
140    (void)identity;
141    printf("[Specified Task Test][TaskID:%u][Step:%u][Reg Finish S:%s]Time: %llu!\n",
142           (int)osThreadGetId(), g_initIndex++, service->GetName(service), SAMGR_GetProcessTime());
143    return TRUE;
144}
145
146static BOOL MessageHandle(Service *service, Request *msg)
147{
148    printf("[Specified Task Test][TaskID:%u][Step:%u][S:%s] msgId<%d> \n",
149           (int)osThreadGetId(), g_initIndex++, service->GetName(service), msg->msgId);
150    return FALSE;
151}
152
153static TaskConfig GetLowTagTaskConfig(Service *service)
154{
155    (void)service;
156    int16 customLevelLow = LEVEL_CUSTOM_BEGIN + 1;
157    TaskConfig config = {customLevelLow, PRI_NORMAL,
158                         0x400, 16, SPECIFIED_TASK};
159    return config;
160}
161
162static TaskConfig GetHighTagTaskConfig(Service *service)
163{
164    (void)service;
165    int16 customLevelHigh = LEVEL_CUSTOM_BEGIN + 2; // Custom level 2
166    TaskConfig config = {customLevelHigh, PRI_NORMAL,
167                         0x400, 16, SPECIFIED_TASK};
168    return config;
169}
170
171static TaskConfig GetSpec1TagTaskConfig(Service *service)
172{
173    (void)service;
174    int16 customLevelSpec1 = LEVEL_CUSTOM_BEGIN + 3; // Custom level 3
175    TaskConfig config = {customLevelSpec1, PRI_NORMAL,
176                         0x400, 16, SPECIFIED_TASK};
177    return config;
178}
179
180static TaskConfig GetSpec2TagTaskConfig(Service *service)
181{
182    (void)service;
183    int16 customLevelSpec2 = LEVEL_CUSTOM_BEGIN + 4; // Custom level 4
184    TaskConfig config = {customLevelSpec2, PRI_NORMAL,
185                         0x400, 16, SPECIFIED_TASK};
186    return config;
187}
188
189static TaskConfig GetSpec3TagTaskConfig(Service *service)
190{
191    (void)service;
192    int16 customLevelSpec3 = LEVEL_CUSTOM_BEGIN + 5; // Custom level 5
193    TaskConfig config = {customLevelSpec3, PRI_NORMAL,
194                         0x400, 16, SPECIFIED_TASK};
195    return config;
196}
197
198static void SInit(Service *demo)
199{
200    SAMGR_GetInstance()->RegisterService(demo);
201
202    printf("[Specified Task Test][TaskID:%u][Step:%u][SYSEX Reg S:%s]Time: %llu!\n",
203           (int)osThreadGetId(), g_initIndex++, demo->GetName(demo), SAMGR_GetProcessTime());
204}
205
206static void SSInit(void)
207{
208    int i;
209    for (i = 0; i < TOTAL_SPEC_TASK_NUM; ++i) {
210        SInit(&g_example[i]);
211    }
212
213    // g_exampleSpec1 has 2 services
214    for (i = 0; i < 2; ++i) {
215        SInit(&g_exampleSpec1[i]);
216    }
217    // g_exampleSpec2 has 3 services
218    for (i = 0; i < 3; ++i) {
219        SInit(&g_exampleSpec2[i]);
220    }
221    // g_exampleSpec3 has 4 services
222    for (i = 0; i < 4; ++i) {
223        SInit(&g_exampleSpec3[i]);
224    }
225}
226
227SYSEX_SERVICE_INIT(SSInit);
228