/*------------------------------------------------------------------------------------------------*/ /* UNICENS V2.1.0-3491 */ /* Copyright (c) 2017 Microchip Technology Germany II GmbH & Co. KG. */ /* */ /* This program is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation, either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /* */ /* You may also obtain this software under a propriety license from Microchip. */ /* Please contact Microchip for further information. */ /*------------------------------------------------------------------------------------------------*/ /*! * \file * \brief Implementation of the Connection Storage Pool. * * \cond UCS_INTERNAL_DOC * \addtogroup G_UCS_XRM_INT * @{ */ /*------------------------------------------------------------------------------------------------*/ /* Includes */ /*------------------------------------------------------------------------------------------------*/ #include "ucs_xrmpool.h" #include "ucs_xrm_pv.h" /*------------------------------------------------------------------------------------------------*/ /* Implementation of class XrmPool */ /*------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------*/ /* Initialization Methods */ /*------------------------------------------------------------------------------------------------*/ /*! \brief Constructor of the XrmPool class. * \param self Instance pointer */ void Xrmp_Ctor(CXrmPool * self) { uint8_t i; MISC_MEM_SET(self, 0, sizeof(CXrmPool)); /* Initialize resource handle list */ for(i=0U; iresource_handle_list[i].resource_handle = XRM_INVALID_RESOURCE_HANDLE; self->resource_handle_list[i].job_ptr = NULL; self->resource_handle_list[i].resource_object_ptr = NULL; } } /*------------------------------------------------------------------------------------------------*/ /* Service */ /*------------------------------------------------------------------------------------------------*/ /*! \brief Stores the given resource handle in the resource handle list. * \param self_ptr XrmPool Instance pointer * \param resource_handle Resource handle to save * \param job_ptr Reference to job * \param resource_object_ptr Reference to resource object * \return \c true if free slot in handle list was found, otherwise \c false */ bool Xrmp_StoreResourceHandle(CXrmPool * self_ptr, uint16_t resource_handle, Xrm_Job_t * job_ptr, UCS_XRM_CONST Ucs_Xrm_ResObject_t * resource_object_ptr) { bool ret_val = false; uint8_t i; for(i=0U; iresource_handle_list[i].job_ptr == NULL) { self_ptr->resource_handle_list[i].job_ptr = job_ptr; self_ptr->resource_handle_list[i].resource_object_ptr = resource_object_ptr; self_ptr->resource_handle_list[i].resource_handle = resource_handle; ret_val = true; break; } } return ret_val; } /*! \brief Retrieves the resource handle identified by the given job reference and the given * resource object reference. * \param self Instance pointer * \param job_ptr Reference to the job. Use NULL as wildcard. * \param resource_object_ptr Reference to the resource object * \param func_ptr Optional function pointer in order to check whether the found job belongs to the provided XRM instance. * \param usr_ptr User pointer used to store the XRM instance to be looked for * \return Resource handle if handle was found, otherwise XRM_INVALID_RESOURCE_HANDLE. */ uint16_t Xrmp_GetResourceHandle(CXrmPool * self, Xrm_Job_t * job_ptr, UCS_XRM_CONST Ucs_Xrm_ResObject_t * resource_object_ptr, Xrmp_CheckJobListFunc_t func_ptr, void * usr_ptr) { uint16_t ret_val = XRM_INVALID_RESOURCE_HANDLE; uint8_t i; bool job_found = true; for(i=0U; iresource_handle_list[i].job_ptr == job_ptr) || (job_ptr == NULL)) && (self->resource_handle_list[i].resource_object_ptr == resource_object_ptr)) { if ((func_ptr != NULL) && (usr_ptr != NULL)) { job_found = func_ptr(usr_ptr, self->resource_handle_list[i].job_ptr); } if (job_found) { ret_val = self->resource_handle_list[i].resource_handle; break; } } } return ret_val; } /*! \brief Returns the table index of the given resource object. * \param self Instance pointer * \param job_ptr Reference to job * \param obj_pptr Reference to array of references to INIC resource objects * \return Table index of the given resource object. If entry is not found 0xFF is returned. */ uint8_t Xrmp_GetResourceHandleIdx(CXrmPool *self, Xrm_Job_t *job_ptr, UCS_XRM_CONST Ucs_Xrm_ResObject_t **obj_pptr) { uint8_t i = 0U; uint8_t ret_val = 0xFFU; MISC_UNUSED(self); while(job_ptr->resource_object_list_ptr[i] != NULL) { if(job_ptr->resource_object_list_ptr[i] == *obj_pptr) { ret_val = i; break; } i++; } return ret_val; } /*! \brief Returns the reference of the job that is identified by the given resource object list. * \param self Instance pointer * \param resource_object_list[] Reference to array of references to INIC resource objects * \return Reference to the desired job if the job was found, otherwise NULL. */ Xrm_Job_t * Xrmp_GetJob(CXrmPool * self, UCS_XRM_CONST Ucs_Xrm_ResObject_t * resource_object_list[]) { uint8_t i; Xrm_Job_t *ret_ptr = NULL; for(i=0U; i<(uint8_t)XRM_NUM_JOBS; i++) { if(self->job_list[i].resource_object_list_ptr == resource_object_list) { ret_ptr = &self->job_list[i]; break; } else if((self->job_list[i].resource_object_list_ptr == NULL) && (ret_ptr == NULL)) { ret_ptr = &self->job_list[i]; } } return ret_ptr; } /*! \brief Calls the given function for each node in the resource list. If the func_ptr * returns true the loop is stopped. * \param self Instance pointer * \param func_ptr Reference of the callback function which is called for each node * \param user_data_ptr1 Reference of optional user data 1 pass to func_ptr * \param user_data_ptr2 Reference of optional user data 2 pass to func_ptr * \param user_data_ptr3 Reference of optional user data 3 pass to func_ptr */ void Xrmp_Foreach(CXrmPool *self, Xrmp_ForeachFunc_t func_ptr, void *user_data_ptr1, void *user_data_ptr2, void *user_data_ptr3) { uint8_t j; for(j=0U; jresource_handle_list[j].job_ptr != NULL) { if (func_ptr(&self->resource_handle_list[j], user_data_ptr1, user_data_ptr2, user_data_ptr3) != false) { break; } } } } /*! * @} * \endcond */ /*------------------------------------------------------------------------------------------------*/ /* End of file */ /*------------------------------------------------------------------------------------------------*/