diff src/cs/services/atp/atp_sw_ent.c @ 0:92470e5d0b9e

src: partial import from FC Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 15 May 2020 01:28:16 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cs/services/atp/atp_sw_ent.c	Fri May 15 01:28:16 2020 +0000
@@ -0,0 +1,343 @@
+/*******************************************************************************
+ *
+ * File Name : atp_sw_ent.c
+ *
+ * Functions handling registered SW entities database of the ATP
+ *
+ * (C) Texas Instruments, all rights reserved
+ *
+ * Version number	: 0.1      Date : 28-Feb-2000
+ *
+ * History			: 0.1  - Created by E. Baissus
+ *					: 0.9 (3-May-2000) : reviewed 
+ *
+ * Author			: Eric Baissus : e-baissus@ti.com
+ *
+ *   (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved				
+ ******************************************************************************/
+#include "rv/rv_general.h"
+#include "rvf/rvf_api.h"
+#include "atp/atp_api.h"
+#include "atp/atp_i.h"
+#include "atp/atp_config.h"
+
+#include <string.h>
+
+
+/* Number of SW entity which has been registered into ATP excluding GSM */
+ T_ATP_SW_ENTITY_ID atp_nb_sw_entity;
+ 
+
+/* Table gathering the pointers on the different SW entity data structure */
+/* If NULL, field is free (initiated in atp_init)*/
+/* Note that a static field is used for GSM in order to be able to register the GSM */
+/* SW entity even if no memory bank has been allocated to ATP yet */
+
+static T_ATP_SW_ENTITY_STRUCT gsm_sw_entity;
+T_ATP_SW_ENTITY_STRUCT * atp_sw_entity_table_p[ATP_MAX_NB_SW_ENTITY+1] = { NULL } ; //First one is reserved for GSM and is NULL at beginning
+
+
+
+
+
+/******************************************************************************
+ * Function name: atp_reg
+ *
+ * Description : This function is used to register a new SW entity to the ATP entity
+
+ * Parameters :  - name = SW entity name
+ *				 - return_path => way to send event to the new registered entity,
+ *				 - mode => supported mode of the new registered entity
+ *				 - &sw_id_p => pointer on id to use later on to identify the SW entity
+ *
+ * Return     :   Standard error 
+ *					RV_OK or RV_MEMORY_ERR (no more entity can register, or prim MB not GREEN)
+ *
+ * History			: 0.1 (29-Feb-2000) 
+ *					: 0.9 (3-May-2000) : reviewed
+ ******************************************************************************/
+
+T_ATP_RET atp_reg(T_ATP_SW_ENTITY_NAME name, T_ATP_CALLBACK return_path, T_ATP_ENTITY_MODE mode ,
+				  T_ATP_SW_ENTITY_ID * sw_id_p)
+{ 
+	T_ATP_SW_ENTITY_STRUCT * sw_struct_p;
+	UINT8 i;
+
+    if (atp_get_sw(name,sw_id_p)== RV_OK)
+	{
+		/* SW entity is already registered */
+		atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_SAME_ACTION_ALREADY_DONE,NULL);
+		return RV_NOT_SUPPORTED;
+	}
+	
+	if (strcmp((char *) name,ATP_GSM_NAME) !=0) // Not GSM registration 
+	{
+		// Check if a new SW entity can register and if ATP has been started
+		if ( (atp_nb_sw_entity==ATP_MAX_NB_SW_ENTITY) || (atp_swe_state != ATP_STARTED))
+		{
+		atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_NO_MORE_RESSOURCE,NULL);
+			return RV_NOT_SUPPORTED;
+		}
+		
+		// Get buffer for a new instance
+		switch (rvf_get_buf(atp_mb_prim,sizeof(T_ATP_SW_ENTITY_STRUCT),(void **) &sw_struct_p))
+		{
+			case RVF_GREEN:
+				{
+					break;
+				}
+			case RVF_YELLOW:
+				{
+					rvf_free_buf ((T_RVF_BUFFER *) sw_struct_p);
+				}
+			default:
+				{
+					atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_MEMORY_ERROR,NULL);
+					return RV_MEMORY_ERR; // not enough memory : refuse any new registration
+				}
+		}
+	}
+	else
+	{
+		if (atp_sw_entity_table_p[0]!=NULL)
+		{
+		atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_SAME_ACTION_ALREADY_DONE,NULL);
+			return RV_NOT_SUPPORTED; // GSM is already registered 
+		}
+		sw_struct_p=(&gsm_sw_entity);
+	}
+
+	// Initialisation of the structure
+	
+	// Copy SW entity name
+	strcpy((char *) sw_struct_p->sw_entity_name ,(char *) name);
+   
+	
+	// Copy return path information
+	sw_struct_p->return_path.callback_func = return_path.callback_func;
+	sw_struct_p->return_path.addr_id	   = return_path.addr_id;
+
+
+	// Copy mode information
+	sw_struct_p->mode= mode;
+
+	// Initialize number of open port with the SW entity
+	sw_struct_p->nb_open_port=0;
+
+	
+	// START : THIS SECTION MUST BE PROTECTED BY  A SEMAPHORE !!!!!!
+	// Initialise SW entity table: next field points on new structure
+	if (strcmp( (char *) name,ATP_GSM_NAME) !=0) // Not GSM registration 
+	{
+		i=1;
+		while(atp_sw_entity_table_p[i]!=NULL)
+		{
+			i++;
+			if (i>ATP_MAX_NB_SW_ENTITY)
+			{
+				rvf_free_buf(sw_struct_p);	
+		atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_MEMORY_ERROR,NULL);
+				return RV_MEMORY_ERR;
+			}
+		}
+		atp_nb_sw_entity++;
+	}
+	else
+	{
+		i=0; // GSM always got id = 0 
+	}
+	
+	*sw_id_p=i;
+	atp_sw_entity_table_p[i]=sw_struct_p;
+
+
+	// END : THIS SECTION MUST BE PROTECTTED BY  A SEMAPHORE !!!!!!
+
+
+
+return RV_OK;
+}
+
+
+
+
+
+/******************************************************************************
+ * Function name: atp_dereg
+ *
+ * Description : This function is used to remove a SW entity to the list of
+ * SW entities registered in ATP.
+ *
+ * Parameters :  - sw_id => id of the SWE
+ *
+ * Return     :   Standard error 
+ *					RV_OK  , 
+ *					RV_NOT_READY if a port is still open involving the SW entity
+ *					RV_NOT_SUPPORTED if sw_id is already de-registered -> ignore call
+ *
+ * History			: 0.1 (29-Feb-2000) 
+ *					: 0.9 (3-May-2000) : reviewed
+ ******************************************************************************/
+
+T_ATP_RET atp_dereg(T_ATP_SW_ENTITY_ID  sw_id)
+{ 
+
+T_ATP_SW_ENTITY_STRUCT * sw_entity_p;
+
+	// Check for invalid parameters
+	if (sw_id > ATP_MAX_NB_SW_ENTITY)
+	{
+		return RV_INVALID_PARAMETER;
+	}
+
+	// START : THIS SECTION MUST BE PROTECTED BY  A SEMAPHORE !!!!!!
+	sw_entity_p=atp_sw_entity_table_p[sw_id];
+
+	if (sw_entity_p==NULL)
+	{
+		// This entity is no longer registered
+		return RV_NOT_SUPPORTED;
+	}
+
+	if (sw_entity_p->nb_open_port>0)
+	{
+		// A port is still open involving this SW entity : refuse de-registration
+		atp_error_switch(ATP_ERROR_FAILED_TO_HANDLE_REGISTRATION,ATP_ISSUED_IN_A_WRONG_STATE_ERROR,NULL);
+		return RV_NOT_READY;
+	}
+
+	// Remove SW entity
+	atp_sw_entity_table_p[sw_id]=NULL; // free the field
+	if (sw_id != 0)
+	{
+		rvf_free_buf(sw_entity_p); // free the buffer
+		atp_nb_sw_entity--;
+	}
+
+	// END : THIS SECTION MUST BE PROTECTTED BY  A SEMAPHORE !!!!!!
+
+return RV_OK;
+}
+
+
+
+
+
+
+
+/******************************************************************************
+ * Function name: atp_get_sw
+ *
+ * Description : This function is used to get SWE ID from the SWE name
+ *
+ * Parameters :     - name => name of the SWE to find
+ *					- sw_id_p => & of the id of the SWE
+ *
+ * Return     :   Standard error 
+ *					RV_OK  , 
+ *					RV_NOT_SUPPORTED if name was not in the SWE ATP list
+ *
+ * History			: 0.1 (29-Feb-2000) 
+ *					: 0.9 (3-May-2000) : reviewed
+ ******************************************************************************/
+T_ATP_RET atp_get_sw(T_ATP_SW_ENTITY_NAME name,T_ATP_SW_ENTITY_ID * sw_id_p)
+{ 
+	UINT8 i;
+	T_ATP_SW_ENTITY_STRUCT * sw_entity_p;
+
+	for(i=0;i<=ATP_MAX_NB_SW_ENTITY;i++)
+	{
+		sw_entity_p=atp_sw_entity_table_p[i];
+		if (sw_entity_p!=NULL)
+		{
+			if(strcmp((const char *) name,(const char *) sw_entity_p->sw_entity_name)==0) 
+			{   /* Found one SW entity with proper name */
+				*sw_id_p=i;
+				return RV_OK;
+			}
+		}
+	}
+	return RV_NOT_SUPPORTED; // No SW entity had this name
+}
+
+
+
+
+/******************************************************************************
+ * Function name: atp_reg_info
+ *
+ * Description : This function is used to get info on a SWE
+ *
+ * Parameters :  - name => name of the SWE to get info on
+ *				 - return : id of the SWE
+ *				 - return : SWE mode information 
+ *
+ * Return     :   Standard error 
+ *					RV_OK  , 
+ *					RV_NOT_SUPPORTED if name has not been found
+ *
+ * History			: 0.1 (29-Feb-2000) 
+ *					: 0.9 (3-May-2000) : reviewed
+ ******************************************************************************/
+T_ATP_RET atp_reg_info(T_ATP_SW_ENTITY_NAME name, T_ATP_SW_ENTITY_ID *  sw_id_p, 
+					   T_ATP_ENTITY_MODE * mode_p  )
+{ 
+
+T_ATP_SW_ENTITY_STRUCT * sw_entity_p;
+
+
+	// START : THIS SECTION MUST BE PROTECTED BY  A SEMAPHORE !!!!!!
+	/* Search related sw entity instance */
+	if(atp_get_sw(name,sw_id_p)!=RV_OK)
+	{
+		return RV_NOT_SUPPORTED;
+	}
+
+	sw_entity_p=atp_sw_entity_table_p[*sw_id_p];
+	(*mode_p)=sw_entity_p->mode;
+
+
+	// END : THIS SECTION MUST BE PROTECTTED BY  A SEMAPHORE !!!!!!
+
+return RV_OK;
+}
+
+
+
+/******************************************************************************
+* Function name: atp_dereg_all
+*
+* Description : De-register all the registered entity
+*
+* Parameters :  None
+*
+* Return     :   Always  RV_OK  
+*					 
+*
+* History			
+*					: 0.9 (10-Aug-2000) 
+******************************************************************************/
+T_ATP_RET atp_dereg_all(void)
+{ 
+	
+	UINT8 i;
+	
+	for(i=0;i<(ATP_MAX_NB_SW_ENTITY+1);i++)
+	{
+		if (atp_sw_entity_table_p[i] !=NULL)
+		{
+			/* A SWE is registered in this index */
+			if (atp_dereg(i) != RV_OK)
+			{
+				return RV_INTERNAL_ERR;
+			};
+		}
+	}
+	
+	return RV_OK;
+}
+
+
+
+
+