From bb13f7376e40119d08bb4c2b6a291f49a3432e59 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Sat, 26 May 2018 19:42:50 +0200 Subject: Parse controller config to get halmixer json object Parse controller configuration to get halmixer json object, this object is inside 'halmixer' section of controller configuration file. Use streams defined in this 'halmixer' section to get available streams of this hal, store them, and declare them as hal api verbs. Change-Id: I47adb2756f89f2a84c8d651ba38ecea5b84079c3 Signed-off-by: Jonathan Aillet --- .../4a-hal-controllers-api-loader.c | 2 + 4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c | 97 +++++++++++++++++++++- 4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h | 7 ++ 4a-hal/4a-hal-utilities/4a-hal-utilities-data.h | 2 + 4 files changed, 107 insertions(+), 1 deletion(-) diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c index bf7ccbe..0b6a919 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c @@ -45,6 +45,8 @@ static CtlSectionT ctrlSections[] = {.key="onload" , .loadCB= OnloadConfig}, {.key="controls", .loadCB= ControlConfig}, {.key="events" , .loadCB= EventConfig}, + // TODO JAI: create a new section parser to get 'halmap' and store them into hal structure + {.key="halmixer", .loadCB= HalCtlsHalMixerConfig}, {.key=NULL} }; diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c index bc8339c..c05059d 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c @@ -23,12 +23,107 @@ #include +#include "../4a-hal-utilities/4a-hal-utilities-data.h" +#include "../4a-hal-utilities/4a-hal-utilities-verbs-loader.h" + #include "4a-hal-controllers-cb.h" /******************************************************************************* - * HAL Manager verbs functions * + * HAL controllers sections parsing functions * ******************************************************************************/ +int HalCtlsHalMixerConfig(afb_dynapi *apiHandle, CtlSectionT *section, json_object *MixerJ) +{ + unsigned int streamCount, idx; + char *currentStreamName; + + CtlConfigT *ctrlConfig; + struct SpecificHalData *currentHalData; + + json_object *streamsArray, *currentStream; + + struct HalUtlApiVerb *CtlHalDynApiStreamVerbs; + + if(! apiHandle || ! section) + return -1; + + if(MixerJ) { + ctrlConfig = (CtlConfigT *) afb_dynapi_get_userdata(apiHandle); + if(! ctrlConfig) + return -2; + + currentHalData = (struct SpecificHalData *) ctrlConfig->external; + if(! currentHalData) + return -3; + + if(json_object_is_type(MixerJ, json_type_object)) + currentHalData->ctlHalSpecificData->halMixerJ = MixerJ; + else + return -4; + + if(wrap_json_unpack(MixerJ, "{s:s}", "mixerapi", ¤tHalData->ctlHalSpecificData->mixerApiName)) + return -5; + + if(! json_object_object_get_ex(MixerJ, "streams", &streamsArray)) + return -6; + + switch(json_object_get_type(streamsArray)) { + case json_type_object: + streamCount = 1; + break; + case json_type_array: + streamCount = json_object_array_length(streamsArray); + break; + default: + return -7; + } + + currentHalData->ctlHalSpecificData->ctlHalStreamsData.count = streamCount; + currentHalData->ctlHalSpecificData->ctlHalStreamsData.data = + (struct CtlHalStreamData *) calloc(streamCount, sizeof (struct CtlHalStreamData *)); + + CtlHalDynApiStreamVerbs = alloca((streamCount + 1) * sizeof(struct HalUtlApiVerb)); + memset(CtlHalDynApiStreamVerbs, '\0', (streamCount + 1) * sizeof(struct HalUtlApiVerb)); + CtlHalDynApiStreamVerbs[streamCount + 1].verb = NULL; + + for(idx = 0; idx < streamCount; idx++) { + if(streamCount > 1) + currentStream = json_object_array_get_idx(streamsArray, (int) idx); + else + currentStream = streamsArray; + + if(wrap_json_unpack(currentStream, "{s:s}", "uid", ¤tStreamName)) + return -9-idx; + + currentHalData->ctlHalSpecificData->ctlHalStreamsData.data[idx].name = strdup(currentStreamName); + currentHalData->ctlHalSpecificData->ctlHalStreamsData.data[idx].cardId = NULL; + + CtlHalDynApiStreamVerbs[idx].verb = currentStreamName; + CtlHalDynApiStreamVerbs[idx].callback = HalCtlsActionOnStream; + CtlHalDynApiStreamVerbs[idx].info = "Peform action on this stream"; + } + + if(HalUtlLoadVerbs(apiHandle, CtlHalDynApiStreamVerbs)) + return -8; + } + + return 0; +} + +// TODO JAI: create a new section parser to get 'halmap' and store them into hal structure + +/******************************************************************************* + * HAL controllers verbs functions * + ******************************************************************************/ + +// TODO JAI : to implement +void HalCtlsActionOnStream(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 HalCtlsListVerbs(afb_request *request) { diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h index 7bd6434..765001e 100644 --- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h +++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h @@ -23,6 +23,13 @@ #define AFB_BINDING_VERSION dyn #include +#include + +// HAL controllers sections parsing functions +int HalCtlsHalMixerConfig(afb_dynapi *apiHandle, CtlSectionT *section, json_object *MixerJ); + +// HAL controllers verbs functions +void HalCtlsActionOnStream(afb_request *request); void HalCtlsListVerbs(afb_request *request); #endif /* _HALMGR_CB_INCLUDE_ */ \ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-data.h b/4a-hal/4a-hal-utilities/4a-hal-utilities-data.h index 9514571..f9b9b36 100644 --- a/4a-hal/4a-hal-utilities/4a-hal-utilities-data.h +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-data.h @@ -20,6 +20,8 @@ #include +#include + #define AFB_BINDING_VERSION dyn #include -- cgit 1.2.3-korg