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
26 static 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 };
33 static const char *g_specServiceName1[] = {
34 "l6tsk_s1", "l6tsk_s2"
35 };
36 static const char *g_specServiceName2[] = {
37 "l7tsk_s1", "l7tsk_s2", "l7tsk_s3"
38 };
39 static const char *g_specServiceName3[] = {
40 "l8tsk_s1", "l8tsk_s2", "l8tsk_s3", "l8tsk_s4"
41 };
42 static const char *GetName(Service *service);
43 static const char *GetSpec1Name(Service *service);
44 static const char *GetSpec2Name(Service *service);
45 static const char *GetSpec3Name(Service *service);
46 static BOOL Initialize(Service *service, Identity identity);
47 static BOOL MessageHandle(Service *service, Request *msg);
48 static TaskConfig GetLowTagTaskConfig(Service *service);
49 static TaskConfig GetHighTagTaskConfig(Service *service);
50 static TaskConfig GetSpec1TagTaskConfig(Service *service);
51 static TaskConfig GetSpec2TagTaskConfig(Service *service);
52 static TaskConfig GetSpec3TagTaskConfig(Service *service);
53 static 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 };
74 static Service g_exampleSpec1[] = {
75 {GetSpec1Name, Initialize, MessageHandle, GetSpec1TagTaskConfig},
76 {GetSpec1Name, Initialize, MessageHandle, GetSpec1TagTaskConfig}
77 };
78 static Service g_exampleSpec2[] = {
79 {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig},
80 {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig},
81 {GetSpec2Name, Initialize, MessageHandle, GetSpec2TagTaskConfig}
82 };
83 static Service g_exampleSpec3[] = {
84 {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
85 {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
86 {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig},
87 {GetSpec3Name, Initialize, MessageHandle, GetSpec3TagTaskConfig}
88 };
89 static uint32_t g_initIndex = 0;
90
GetName(Service * service)91 static 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
GetSpec1Name(Service * service)102 static 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
GetSpec2Name(Service * service)114 static 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
GetSpec3Name(Service * service)126 static 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
Initialize(Service * service,Identity identity)138 static 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
MessageHandle(Service * service,Request * msg)146 static 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
GetLowTagTaskConfig(Service * service)153 static 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
GetHighTagTaskConfig(Service * service)162 static 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
GetSpec1TagTaskConfig(Service * service)171 static 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
GetSpec2TagTaskConfig(Service * service)180 static 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
GetSpec3TagTaskConfig(Service * service)189 static 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
SInit(Service * demo)198 static 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
SSInit(void)206 static 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
227 SYSEX_SERVICE_INIT(SSInit);
228