aboutsummaryrefslogtreecommitdiffstats
path: root/src/4a-hal-manager/4a-hal-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/4a-hal-manager/4a-hal-manager.c')
-rw-r--r--src/4a-hal-manager/4a-hal-manager.c168
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