aboutsummaryrefslogtreecommitdiffstats
path: root/4a-hal/4a-hal-manager
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2018-05-03 16:47:56 +0200
committerJonathan Aillet <jonathan.aillet@iot.bzh>2018-10-08 15:51:00 +0200
commit99fcc5f06fe8c8c72bbc3fd80a866b2beac3052d (patch)
tree38e6acfcbc348cd51f0129785e04fa5843474cd1 /4a-hal/4a-hal-manager
parent28642c7d0bdf9ab9617ce78df378cba12c2ef8de (diff)
Pre-version of 4a-hal-manager
Pre-version of 4a-hal manager that uses app-fwk DynAPI and app-controller. Current version : - Declare a new API for each HAL (each .json config file is used to generate one app-controller API) at startup. - Define verbs that will be provided by this API. - Provide verb to list and get info of loaded API. Change-Id: I7bb6e8b7539b1acd5556fd9275a1b536e129332d Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to '4a-hal/4a-hal-manager')
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager-cb.c185
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager-cb.h38
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager-events.c29
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager-events.h28
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager.c148
-rw-r--r--4a-hal/4a-hal-manager/4a-hal-manager.h29
6 files changed, 457 insertions, 0 deletions
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager-cb.c b/4a-hal/4a-hal-manager/4a-hal-manager-cb.c
new file mode 100644
index 0000000..a2d946b
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager-cb.c
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2016 "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 <stdbool.h>
+
+#include <wrap-json.h>
+
+#include "../4a-hal-utilities/4a-hal-utilities-data.h"
+
+#include "4a-hal-manager-cb.h"
+#include "4a-hal-manager-events.h"
+
+/*******************************************************************************
+ * HAL Manager event handler function *
+ ******************************************************************************/
+
+// TODO JAI : to implement
+void HalMgrDispatchApiEvent(afb_dynapi *apiHandle, const char *evtLabel, struct json_object *eventJ)
+{
+ AFB_DYNAPI_WARNING(apiHandle, "JAI :%s not implemented yet", __func__);
+ // Use "4a-hal-manager-events.h" to handle events
+}
+
+/*******************************************************************************
+ * TODO JAI : Present for test, delete this function when validated *
+ ******************************************************************************/
+
+void HalMgrPing(afb_request *request)
+{
+ static int count = 0;
+
+ count++;
+
+ if(request->dynapi)
+ AFB_REQUEST_NOTICE(request, "JAI :%s (%s): ping count = %d", request->api, request->dynapi->apiname, count);
+ else
+ AFB_REQUEST_NOTICE(request, "JAI: %s: ping count = %d", request->api, count);
+
+ afb_request_success(request, json_object_new_int(count), NULL);
+
+ return;
+}
+
+/*******************************************************************************
+ * HAL Manager verbs functions *
+ ******************************************************************************/
+
+void HalMgrLoaded(afb_request *request)
+{
+ int requestJsonErr;
+ uint64_t cpt, numberOfLoadedApi;
+ char *requestOption;
+
+ afb_dynapi *apiHandle;
+ struct HalMgrData *HalMgrGlobalData;
+ struct SpecificHalData *currentHalData;
+
+ struct json_object *requestJson;
+ struct json_object *requestAnswer;
+ struct json_object *apiObject;
+
+ AFB_REQUEST_WARNING(request, "JAI :%s not completelly implemented yet", __func__);
+
+ apiHandle = (afb_dynapi *) afb_request_get_dynapi(request);
+ if(! apiHandle) {
+ afb_request_fail(request, "ERROR", "Can't get HalManager Api handle");
+ return;
+ }
+
+ HalMgrGlobalData = (struct HalMgrData *) afb_dynapi_get_userdata(apiHandle);
+ if(! HalMgrGlobalData) {
+ afb_request_fail(request, "ERROR", "Can't get HalManager data");
+ return;
+ }
+
+ requestJson = afb_request_json(request);
+ if(! requestJson) {
+ afb_request_fail(request, "ERROR", "Can't get request json");
+ return;
+ }
+
+ numberOfLoadedApi = HalUtlGetNumberOfHalInList(HalMgrGlobalData);
+ if(! numberOfLoadedApi) {
+ afb_request_success(request, NULL, "No Hal Api loaded");
+ return;
+ }
+
+ requestAnswer = json_object_new_array();
+ if(! requestAnswer) {
+ afb_request_fail(request, "ERROR", "Can't generate json answer");
+ return;
+ }
+
+ currentHalData = HalMgrGlobalData->first;
+
+ // Get request option
+ requestJsonErr = wrap_json_unpack(requestJson, "{s:s}", "option", &requestOption);
+
+ if(! requestJsonErr && ! strcmp(requestOption, "status")) { // Case if request option is 'status'
+ for(cpt = 0; cpt < numberOfLoadedApi; cpt++) {
+ wrap_json_pack(&apiObject,
+ "{s:i}",
+ currentHalData->name,
+ (unsigned int) currentHalData->status);
+ json_object_array_add(requestAnswer, apiObject);
+
+ currentHalData = currentHalData->next;
+ }
+ }
+ else if(! requestJsonErr && ! strcmp(requestOption, "metadata")) { // Case if request option is 'metadata'
+ for(cpt = 0; cpt < numberOfLoadedApi; cpt++) {
+ wrap_json_pack(&apiObject,
+ "{s:s s:i s:s s:i s:s s:s s:s}",
+ "api", currentHalData->name,
+ "status", (int) currentHalData->status,
+ "sndcard", currentHalData->sndCard,
+ "internal", (int) currentHalData->internal,
+ "author", currentHalData->author,
+ "version", currentHalData->version,
+ "date", currentHalData->date);
+ json_object_array_add(requestAnswer, apiObject);
+
+ currentHalData = currentHalData->next;
+ }
+ }
+ else { // Case if request option is empty or not valid
+ for(cpt = 0; cpt < numberOfLoadedApi; cpt++) {
+ json_object_array_add(requestAnswer, json_object_new_string(currentHalData->name));
+
+ currentHalData = currentHalData->next;
+ }
+ }
+
+ afb_request_success(request, requestAnswer, "Requested data");
+}
+
+// TODO JAI : to implement
+void HalMgrLoad(afb_request *request)
+{
+ AFB_REQUEST_WARNING(request, "JAI :%s not implemented yet", __func__);
+
+ afb_request_success(request, json_object_new_boolean(false), NULL);
+}
+
+// TODO JAI : to implement
+void HalMgrUnload(afb_request *request)
+{
+ AFB_REQUEST_WARNING(request, "JAI :%s not implemented yet", __func__);
+
+ afb_request_success(request, json_object_new_boolean(false), NULL);
+}
+
+// TODO JAI : to implement
+void HalMgrSubscribeEvent(afb_request *request)
+{
+ AFB_REQUEST_WARNING(request, "JAI :%s not implemented yet", __func__);
+
+ afb_request_success(request, json_object_new_boolean(false), NULL);
+}
+
+// TODO JAI : to implement
+void HalMgrUnsubscribeEvent(afb_request *request)
+{
+ AFB_REQUEST_WARNING(request, "JAI :%s not implemented yet", __func__);
+
+ afb_request_success(request, json_object_new_boolean(false), NULL);
+} \ No newline at end of file
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager-cb.h b/4a-hal/4a-hal-manager/4a-hal-manager-cb.h
new file mode 100644
index 0000000..f2f9ce0
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager-cb.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 "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.
+ */
+
+#ifndef _HALMGR_CB_INCLUDE_
+#define _HALMGR_CB_INCLUDE_
+
+#include <stdio.h>
+
+#define AFB_BINDING_VERSION dyn
+#include <afb/afb-binding.h>
+
+// Event handler
+void HalMgrDispatchApiEvent(afb_dynapi *apiHandle, const char *evtLabel, struct json_object *eventJ);
+
+// Exported verbs callbacks
+void HalMgrPing(afb_request *request);
+
+void HalMgrLoaded(afb_request *request);
+void HalMgrLoad(afb_request *request);
+void HalMgrUnload(afb_request *request);
+void HalMgrSubscribeEvent(afb_request *request);
+void HalMgrUnsubscribeEvent(afb_request *request);
+
+#endif /* _HALMGR_CB_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager-events.c b/4a-hal/4a-hal-manager/4a-hal-manager-events.c
new file mode 100644
index 0000000..0840bdd
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager-events.c
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 "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 <stdbool.h>
+
+#include <wrap-json.h>
+
+#include "../4a-hal-utilities/4a-hal-utilities-data.h"
+#include "4a-hal-manager-events.h"
+
+// TODO JAI: implement events handlers functions \ No newline at end of file
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager-events.h b/4a-hal/4a-hal-manager/4a-hal-manager-events.h
new file mode 100644
index 0000000..d7f4b59
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager-events.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 "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.
+ */
+
+#ifndef _HALMGR_EVENTS_INCLUDE_
+#define _HALMGR_EVENTS_INCLUDE_
+
+#include <stdio.h>
+
+#define AFB_BINDING_VERSION dyn
+#include <afb/afb-binding.h>
+
+// TODO JAI: declare events handlers functions
+
+#endif /* _HALMGR_EVENTS_INCLUDE_ */ \ No newline at end of file
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager.c b/4a-hal/4a-hal-manager/4a-hal-manager.c
new file mode 100644
index 0000000..257aa38
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2016 "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 <stdbool.h>
+#include <string.h>
+
+#include "../4a-hal-utilities/4a-hal-utilities-data.h"
+#include "../4a-hal-utilities/4a-hal-utilities-verbs-loader.h"
+#include "../4a-hal-controllers/4a-hal-controllers-api-loader.h"
+
+#include "4a-hal-manager.h"
+#include "4a-hal-manager-cb.h"
+
+// Default api to print log when apihandle not available
+afb_dynapi *AFB_default;
+
+/*******************************************************************************
+ * HAL Manager verbs table *
+ ******************************************************************************/
+
+// Hal manager exported verbs
+struct HalUtlApiVerb HalManagerApiStaticVerbs[] =
+{
+ /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
+ { .verb = "ping", .callback = HalMgrPing, .info = "Ping test for DynApi"},
+ { .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
+};
+
+/*******************************************************************************
+ * Dynamic API functions for hal manager *
+ * TODO JAI : Use API-V3 instead of API-PRE-V3 *
+ ******************************************************************************/
+
+static int HalMgrInitApi(afb_dynapi *apiHandle)
+{
+ struct HalMgrData *HalMgrGlobalData;
+
+ 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
+ HalMgrGlobalData = (struct HalMgrData *) afb_dynapi_get_userdata(apiHandle);
+ if(! HalMgrGlobalData)
+ return -2;
+
+ if(HalUtlInitializeHalMgrData(apiHandle, HalMgrGlobalData, HAL_MANAGER_API_NAME, HAL_MANAGER_API_INFO))
+ return -3;
+
+ return 0;
+}
+
+static int HalMgrLoadApi(void *cbdata, afb_dynapi *apiHandle)
+{
+ struct HalMgrData *HalMgrGlobalData;
+
+ if(! cbdata || ! apiHandle)
+ return -1;
+
+ HalMgrGlobalData = (struct HalMgrData *) cbdata;
+
+ // Save closure as api's data context
+ afb_dynapi_set_userdata(apiHandle, HalMgrGlobalData);
+
+ // Add static controls verbs
+ if(HalUtlLoadStaticVerbs(apiHandle, HalManagerApiStaticVerbs)) {
+ AFB_DYNAPI_ERROR(apiHandle, "%s : load section : fail to register static V2 verbs", __func__);
+ return 1;
+ }
+
+ // Declare an event manager for Hal Manager
+ afb_dynapi_on_event(apiHandle, HalMgrDispatchApiEvent);
+
+ // Init Api function (does not receive user closure ???)
+ afb_dynapi_on_init(apiHandle, HalMgrInitApi);
+
+ afb_dynapi_seal(apiHandle);
+
+ return 0;
+}
+
+int HalMgrCreateApi(afb_dynapi *apiHandle, struct HalMgrData *HalMgrGlobalData)
+{
+ if(! apiHandle || ! HalMgrGlobalData)
+ return -1;
+
+ // Create one API (Pre-V3 return code ToBeChanged)
+ return afb_dynapi_new_api(apiHandle, HAL_MANAGER_API_NAME, HAL_MANAGER_API_INFO, 1, HalMgrLoadApi, HalMgrGlobalData);
+}
+
+/*******************************************************************************
+ * Startup function *
+ * TODO JAI : Use API-V3 instead of API-PRE-V3 *
+ ******************************************************************************/
+
+int afbBindingVdyn(afb_dynapi *apiHandle)
+{
+ int status = 0, rc;
+ struct HalMgrData *HalMgrGlobalData;
+
+ if(! apiHandle)
+ return -1;
+
+ HalMgrGlobalData = (struct HalMgrData *) calloc(1, sizeof(struct HalMgrData));
+ if(! HalMgrGlobalData)
+ return -2;
+
+ // Hugely hack to make all V2 AFB_DEBUG to work in fileutils
+ AFB_default = apiHandle;
+
+ AFB_DYNAPI_NOTICE(apiHandle, "In %s", __func__);
+
+ // Load Hal-Manager using DynApi
+ rc = HalMgrCreateApi(apiHandle, HalMgrGlobalData);
+ if(rc < 0)
+ status--;
+
+ // Load Hal-Ctls using DynApi
+ rc = HalCtlsCreateAllApi(apiHandle, HalMgrGlobalData);
+ if(rc < 0)
+ status -= rc;
+
+ return status;
+} \ No newline at end of file
diff --git a/4a-hal/4a-hal-manager/4a-hal-manager.h b/4a-hal/4a-hal-manager/4a-hal-manager.h
new file mode 100644
index 0000000..fb41ad1
--- /dev/null
+++ b/4a-hal/4a-hal-manager/4a-hal-manager.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 "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.
+ */
+
+#ifndef _HALMGR_BINDING_INCLUDE_
+#define _HALMGR_BINDING_INCLUDE_
+
+#include <stdio.h>
+
+// TODO JAI: use it
+// #include <alsa/asoundlib.h>
+
+#define HAL_MANAGER_API_NAME "4a-hal-manager"
+#define HAL_MANAGER_API_INFO "Manager for 4A HAL APIs"
+
+#endif /* _HALMGR_BINDING_INCLUDE_ */ \ No newline at end of file