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