diff options
Diffstat (limited to 'src/4a-hal-manager/4a-hal-manager.c')
-rw-r--r-- | src/4a-hal-manager/4a-hal-manager.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/4a-hal-manager/4a-hal-manager.c b/src/4a-hal-manager/4a-hal-manager.c new file mode 100644 index 0000000..4d2fbf1 --- /dev/null +++ b/src/4a-hal-manager/4a-hal-manager.c @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2018 "IoT.bzh" + * Author Jonathan Aillet <jonathan.aillet@iot.bzh> + * + * 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. + */ + +#define _GNU_SOURCE + +#include <stdio.h> +#include <string.h> + +#include <afb/afb-binding.h> + +#include "4a-hal-utilities-data.h" +#include "4a-hal-utilities-verbs-loader.h" + +#include "../4a-internals-hal/4a-internals-hal-api-loader.h" + +#include "4a-hal-manager.h" +#include "4a-hal-manager-cb.h" + +// Default api to print log when apihandle not available +afb_api_t AFB_default; + +// Local (static) Hal manager data structure +static struct HalMgrData localHalMgrGlobalData; + +/******************************************************************************* + * HAL Manager verbs table * + ******************************************************************************/ + +// Hal manager exported verbs +afb_verb_t HalManagerApiStaticVerbs[] = +{ + /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */ + { .verb = "ping", .callback = HalMgrPing, .info = "Ping test"}, + { .verb = "loaded", .callback = HalMgrLoaded, .info = "Show loaded HAL"}, + { .verb = "load", .callback = HalMgrLoad, .info = "Load an external HAL to HAL Manager"}, + { .verb = "unload", .callback = HalMgrUnload, .info = "Unload an external HAL to HAL Manager"}, + { .verb = "subscribe", .callback = HalMgrSubscribeEvent, .info = "Subscribe to an event"}, + { .verb = "unsuscribe", .callback = HalMgrUnsubscribeEvent, .info = "Unsubscribe to an event"}, + { .verb = NULL } // Marker for end of the array +}; + +/******************************************************************************* + * HAL Manager get 'HalData' linked list * + from HAL list function * + ******************************************************************************/ + +struct HalData **HalMngGetHalDataList(void) +{ + return &localHalMgrGlobalData.halDataList; +} + +/******************************************************************************* + * Dynamic API functions for hal manager * + ******************************************************************************/ + +static int HalMgrInitApi(afb_api_t apiHandle) +{ + struct HalData *currentHalData; + struct HalMgrData *halMgrData; + + if(! apiHandle) + return -1; + + // Hugely hack to make all V2 AFB_DEBUG to work in fileutils + AFB_default = apiHandle; + + // Retrieve section config from api handle + halMgrData = (struct HalMgrData *) afb_api_get_userdata(apiHandle); + if(! halMgrData) + return -2; + + if(HalUtlInitializeHalMgrData(apiHandle, halMgrData, HAL_MANAGER_API_NAME, HAL_MANAGER_API_INFO)) + return -3; + + currentHalData = halMgrData->halDataList; + + while(currentHalData) { + if(! currentHalData->apiName) + return -4; + else if(afb_api_require_api(apiHandle, currentHalData->apiName, 1)) + return -5; + + currentHalData = currentHalData->next; + } + + return 0; +} + +static int HalMgrLoadApi(void *cbdata, afb_api_t apiHandle) +{ + struct HalMgrData *halMgrData; + + if(! cbdata || ! apiHandle) + return -1; + + halMgrData = (struct HalMgrData *) cbdata; + + // Save closure as api's data context + afb_api_set_userdata(apiHandle, halMgrData); + + // Add static controls verbs + if(HalUtlLoadVerbs(apiHandle, HalManagerApiStaticVerbs)) { + AFB_API_ERROR(apiHandle, "Load section : fail to register static verbs"); + return 1; + } + + // Declare an event manager for Hal Manager + afb_api_on_event(apiHandle, HalMgrDispatchApiEvent); + + // Init Api function (does not receive user closure ???) + afb_api_on_init(apiHandle, HalMgrInitApi); + + afb_api_seal(apiHandle); + + return 0; +} + +int HalMgrCreateApi(afb_api_t apiHandle, struct HalMgrData *halMgrData) +{ + if(! apiHandle || ! halMgrData) + return -1; + + // Create one API + return afb_api_new_api(apiHandle, HAL_MANAGER_API_NAME, HAL_MANAGER_API_INFO, 1, HalMgrLoadApi, halMgrData) ? 0 : -1; +} + +/******************************************************************************* + * Startup function * + ******************************************************************************/ + +int afbBindingEntry(afb_api_t apiHandle) +{ + int status = 0, rc; + + if(! apiHandle) + return -1; + + // Hugely hack to make all V2 AFB_DEBUG to work in fileutils + AFB_default = apiHandle; + + AFB_API_NOTICE(apiHandle, "Binding start"); + + // Load Hal-Manager using Api v3 + rc = HalMgrCreateApi(apiHandle, &localHalMgrGlobalData); + if(rc < 0) + status--; + + // Load internals Hal using Api v3 + rc = InternalHalCreateAllApi(apiHandle, &localHalMgrGlobalData); + if(rc < 0) + status -= rc; + + return status; +}
\ No newline at end of file |