diff options
Diffstat (limited to '4a-hal/4a-hal-utilities')
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.c | 27 | ||||
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.h | 25 | ||||
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-data.c | 211 | ||||
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-data.h | 74 | ||||
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.c | 49 | ||||
-rw-r--r-- | 4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.h | 38 |
6 files changed, 424 insertions, 0 deletions
diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.c b/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.c new file mode 100644 index 0000000..8ff6c06 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.c @@ -0,0 +1,27 @@ +/* + * 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 "4a-hal-utilities-data.h" +#include "4a-hal-utilities-alsa-link.h" + +// TODO JAI: implement alsa link functions
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.h b/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.h new file mode 100644 index 0000000..5c15109 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-alsa-link.h @@ -0,0 +1,25 @@ +/* + * 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 _HAL_UTILITIES_ALSA_LINK_INCLUDE_ +#define _HAL_UTILITIES_ALSA_LINK_INCLUDE_ + +#include <stdio.h> + +// TODO JAI: implement alsa link functions + +#endif /* _HAL_UTILITIES_DATA_INCLUDE_ */
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-data.c b/4a-hal/4a-hal-utilities/4a-hal-utilities-data.c new file mode 100644 index 0000000..dafed90 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-data.c @@ -0,0 +1,211 @@ +/* + * 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-data.h" + +/******************************************************************************* + * Specfic Hal data handling functions * + ******************************************************************************/ + +struct SpecificHalData *HalUtlAddHalApiToHalList(struct HalMgrData *HalMgrGlobalData) +{ + struct SpecificHalData *currentApi; + + if(! HalMgrGlobalData) + return NULL; + + currentApi = HalMgrGlobalData->first; + + if(! currentApi) { + currentApi = (struct SpecificHalData *) calloc(1, sizeof(struct SpecificHalData)); + if(! currentApi) + return NULL; + + HalMgrGlobalData->first = currentApi; + } + else { + while(currentApi->next) + currentApi = currentApi->next; + + currentApi->next = calloc(1, sizeof(struct SpecificHalData)); + if(! currentApi) + return NULL; + + currentApi = currentApi->next; + } + + currentApi->name = NULL; + currentApi->sndCard = NULL; + currentApi->author = NULL; + currentApi->version = NULL; + currentApi->date = NULL; + + currentApi->next = NULL; + + return currentApi; +} + +uint8_t HalUtlRemoveSelectedHalFromList(struct HalMgrData *HalMgrGlobalData, struct SpecificHalData *apiToRemove) +{ + struct SpecificHalData *currentApi, *matchingApi; + + if(! HalMgrGlobalData || ! apiToRemove) + return -1; + + currentApi = HalMgrGlobalData->first; + + if(currentApi == apiToRemove) { + HalMgrGlobalData->first = currentApi->next; + matchingApi = currentApi; + } + else { + while(currentApi && currentApi->next != apiToRemove) + currentApi = currentApi->next; + + if(currentApi) { + matchingApi = currentApi->next; + currentApi->next = currentApi->next->next; + } + else { + return -2; + } + } + + if(matchingApi->name) + free(matchingApi->name); + + if(matchingApi->sndCard) + free(matchingApi->sndCard); + + if(matchingApi->author) + free(matchingApi->author); + + if(matchingApi->version) + free(matchingApi->version); + + if(matchingApi->date) + free(matchingApi->date); + + free(matchingApi); + + return 0; +} + +uint64_t HalUtlRemoveAllHalFromList(struct HalMgrData *HalMgrGlobalData) +{ + uint8_t ret; + uint64_t CtlHalApiRemoved = 0; + + while(HalMgrGlobalData->first) { + ret = HalUtlRemoveSelectedHalFromList(HalMgrGlobalData, HalMgrGlobalData->first); + if(ret) + return (uint64_t) ret; + + CtlHalApiRemoved++; + } + + return CtlHalApiRemoved; +} + +uint64_t HalUtlGetNumberOfHalInList(struct HalMgrData *HalMgrGlobalData) +{ + uint64_t numberOfCtlHal = 0; + struct SpecificHalData *currentApi; + + if(! HalMgrGlobalData) + return -1; + + currentApi = HalMgrGlobalData->first; + + while(currentApi) { + currentApi = currentApi->next; + numberOfCtlHal++; + } + + return numberOfCtlHal; +} + +struct SpecificHalData *HalUtlSearchHalDataByApiName(struct HalMgrData *HalMgrGlobalData, char *name) +{ + struct SpecificHalData *currentApi; + + if(! HalMgrGlobalData || ! name) + return NULL; + + currentApi = HalMgrGlobalData->first; + + while(currentApi) { + if(! strcmp(name, currentApi->name)) + return currentApi; + + currentApi = currentApi->next; + } + + return NULL; +} + +/******************************************************************************* + * Hal Manager data handling functions * + ******************************************************************************/ + +uint8_t HalUtlInitializeHalMgrData(afb_dynapi *apiHandle, struct HalMgrData *HalMgrGlobalData, char *name, char *description) +{ + if(! apiHandle || ! HalMgrGlobalData || ! name || ! description) + return -1; + + // Allocate name and info strings + HalMgrGlobalData->name = (char *) calloc(strlen(name), sizeof(char)); + if(! HalMgrGlobalData->name) + return -2; + + HalMgrGlobalData->description = (char *) calloc(strlen(description), sizeof(char)); + if(! HalMgrGlobalData->name) + return -3; + + // Fill HalMgrGlobalData structure + strcpy(HalMgrGlobalData->name, name); + strcpy(HalMgrGlobalData->description, description); + + HalMgrGlobalData->apiHandle = apiHandle; + + return 0; +} + +void HalUtlRemoveHalMgrData(struct HalMgrData *HalMgrGlobalData) +{ + if(! HalMgrGlobalData) + return; + + if(HalMgrGlobalData->first) + HalUtlRemoveAllHalFromList(HalMgrGlobalData); + + if(HalMgrGlobalData->name) + free(HalMgrGlobalData->name); + + if(HalMgrGlobalData->description) + free(HalMgrGlobalData->description); + + free(HalMgrGlobalData); +}
\ 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 new file mode 100644 index 0000000..75653e4 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-data.h @@ -0,0 +1,74 @@ +/* + * 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 _HAL_UTILITIES_DATA_INCLUDE_ +#define _HAL_UTILITIES_DATA_INCLUDE_ + +#include <stdio.h> + +#define AFB_BINDING_VERSION dyn +#include <afb/afb-binding.h> + +#include <ctl-config.h> + +// Enum for sharing hal (controller or external) status +enum HalStatus { + HAL_STATUS_UNAVAILABLE=0, + HAL_STATUS_AVAILABLE=1, +}; + +// Structure to store specific hal (controller or external) data +struct SpecificHalData { + char *name; + enum HalStatus status; + char *sndCard; + uint8_t internal; + + char *author; + char *version; + char *date; + + // Can be beefed up if needed + + afb_dynapi *apiHandle; // Can be NULL if external api + CtlConfigT *ctrlConfig; // Can be NULL if external api + + struct SpecificHalData *next; +}; + +// Structure to store hal manager data +struct HalMgrData { + char *name; + char *description; + + afb_dynapi *apiHandle; + + struct SpecificHalData *first; +}; + +// Exported verbs for 'struct SpecificHalData' handling +struct SpecificHalData *HalUtlAddHalApiToHalList(struct HalMgrData *HalMgrGlobalData); +uint8_t HalUtlRemoveSelectedHalFromList(struct HalMgrData *HalMgrGlobalData, struct SpecificHalData *ApiToRemove); +uint64_t HalUtlRemoveAllHalFromList(struct HalMgrData *HalMgrGlobalData); +uint64_t HalUtlGetNumberOfHalInList(struct HalMgrData *HalMgrGlobalData); +struct SpecificHalData *HalUtlSearchHalDataByApiName(struct HalMgrData *HalMgrGlobalData, char *name); + +// Exported verbs for 'struct HalMgrData' handling +uint8_t HalUtlInitializeHalMgrData(afb_dynapi *apiHandle, struct HalMgrData *HalMgrGlobalData, char *name, char *description); +void HalUtlRemoveHalMgrData(struct HalMgrData *HalMgrGlobalData); + +#endif /* _HAL_UTILITIES_DATA_INCLUDE_ */
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.c b/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.c new file mode 100644 index 0000000..97c8df7 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.c @@ -0,0 +1,49 @@ +/* + * 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-verbs-loader.h" + +/******************************************************************************* + * Dynamic API common functions * + * TODO JAI : Use API-V3 instead of API-PRE-V3 * + ******************************************************************************/ + +int HalUtlLoadStaticVerbs(afb_dynapi *apiHandle, struct HalUtlApiVerb *verbs) +{ + int idx, errCount = 0; + + if(! apiHandle || ! verbs) + return -1; + + for (idx = 0; verbs[idx].verb; idx++) { + errCount+= afb_dynapi_add_verb(apiHandle, + verbs[idx].verb, + NULL, + verbs[idx].callback, + (void*) &verbs[idx], + verbs[idx].auth, + 0); + } + + return errCount; +};
\ No newline at end of file diff --git a/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.h b/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.h new file mode 100644 index 0000000..7accd80 --- /dev/null +++ b/4a-hal/4a-hal-utilities/4a-hal-utilities-verbs-loader.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 _HAL_UTILITIES_VERBS_LOADER_INCLUDE_ +#define _HAL_UTILITIES_VERBS_LOADER_INCLUDE_ + +#include <stdio.h> + +#define AFB_BINDING_VERSION dyn +#include <afb/afb-binding.h> + +// Structure to store data necessary to add a verb to a dynamic api +struct HalUtlApiVerb { + const char *verb; /* name of the verb, NULL only at end of the array */ + void (*callback)(afb_request *req); /* callback function implementing the verb */ + const struct afb_auth *auth; /* required authorisation, can be NULL */ + const char *info; /* some info about the verb, can be NULL */ + uint32_t session; +}; + +// Verb that allows to add verb to a dynamic api +int HalUtlLoadStaticVerbs(afb_dynapi *apiHandle, struct HalUtlApiVerb *verbs); + +#endif /* _HAL_UTILITIES_VERBS_LOADER_INCLUDE_ */
\ No newline at end of file |