/* negative return error code if an error occurs. */ int BTPSAPI TPS_Query_Tx_Power_Level(unsigned int BluetoothStackID, unsigned int InstanceID, SByte_t *Tx_Power_Level) { int ret_val; TPSServerInstance_t *ServiceInstance; /* Make sure the parameters passed to us are semi-valid. */ if((BluetoothStackID) && (InstanceID) && (Tx_Power_Level)) { /* Acquire the specified TPS Instance. */ if((ServiceInstance = AcquireServiceInstance(BluetoothStackID, &InstanceID)) != NULL) { /* Query the current Tx Power Level. */ *Tx_Power_Level = READ_UNALIGNED_BYTE_LITTLE_ENDIAN(&(InstanceData[InstanceID-1].Tx_Power_Level)); /* Return success to the caller. */ ret_val = 0; /* UnLock the previously locked Bluetooth Stack. */ BSC_UnLockBluetoothStack(ServiceInstance->BluetoothStackID); } else ret_val = TPS_ERROR_INVALID_INSTANCE_ID; } else ret_val = TPS_ERROR_INVALID_PARAMETER; /* Finally return the result to the caller. */ return(ret_val); }
/* non-zero, Instance ID on success or a negative error code. */ static int LLSRegisterService(unsigned int BluetoothStackID, LLS_Event_Callback_t EventCallback, unsigned long CallbackParameter, unsigned int *ServiceID, GATT_Attribute_Handle_Group_t *ServiceHandleRange) { int ret_val; unsigned int InstanceID; LLSServerInstance_t *ServiceInstance; /* Make sure the parameters passed to us are semi-valid. */ if((BluetoothStackID) && (ServiceID)) { /* Verify that no instance is registered to this Bluetooth Stack. */ if(!InstanceRegisteredByStackID(BluetoothStackID)) { /* Acquire a free LLS Instance. */ InstanceID = 0; if((ServiceInstance = AcquireServiceInstance(BluetoothStackID, &InstanceID)) != NULL) { /* Call GATT to register the LLS service. */ ret_val = GATT_Register_Service(BluetoothStackID, LLS_SERVICE_FLAGS, LINK_LOSS_SERVICE_ATTRIBUTE_COUNT, (GATT_Service_Attribute_Entry_t *)Link_Loss_Service, ServiceHandleRange, GATT_ServerEventCallback, InstanceID); if(ret_val > 0) { /* Save the Instance information. */ ServiceInstance->BluetoothStackID = BluetoothStackID; ServiceInstance->ServiceID = (unsigned int)ret_val; ServiceInstance->EventCallback = EventCallback; ServiceInstance->CallbackParameter = CallbackParameter; *ServiceID = (unsigned int)ret_val; /* Intilize the Instance Data for this instance. */ BTPS_MemInitialize(&InstanceData[InstanceID-1], 0,LLS_INSTANCE_DATA_SIZE); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&(InstanceData[InstanceID-1].Alert_Level_Length), LLS_ALERT_LEVEL_LENGTH); /* Return the LLS Instance ID. */ ret_val = (int)InstanceID; } /* UnLock the previously locked Bluetooth Stack. */ BSC_UnLockBluetoothStack(BluetoothStackID); } else ret_val = LLS_ERROR_INSUFFICIENT_RESOURCES; } else ret_val = LLS_ERROR_SERVICE_ALREADY_REGISTERED; } else ret_val = LLS_ERROR_INVALID_PARAMETER; /* Finally return the result to the caller. */ return(ret_val); }
/* non-zero, Instance ID on success or a negative error code. */ static int IASRegisterService(unsigned int BluetoothStackID, IAS_Event_Callback_t EventCallback, unsigned long CallbackParameter, unsigned int *ServiceID, GATT_Attribute_Handle_Group_t *ServiceHandleRange) { int ret_val; unsigned int InstanceID; IASServerInstance_t *ServiceInstance; /* Make sure the parameters passed to us are semi-valid. */ if((BluetoothStackID) && (EventCallback) && (ServiceID)) { /* Verify that no instance is registered to this Bluetooth Stack. */ if(!InstanceRegisteredByStackID(BluetoothStackID)) { /* Acquire a free IAS Instance. */ InstanceID = 0; if((ServiceInstance = AcquireServiceInstance(BluetoothStackID, &InstanceID)) != NULL) { /* Call GATT to register the IAS service. */ ret_val = GATT_Register_Service(BluetoothStackID, IAS_SERVICE_FLAGS, IMMEDIATE_ALERT_SERVICE_ATTRIBUTE_COUNT, (GATT_Service_Attribute_Entry_t *)Immediate_Alert_Service, ServiceHandleRange, GATT_ServerEventCallback, InstanceID); if(ret_val > 0) { /* Save the Instance information. */ ServiceInstance->BluetoothStackID = BluetoothStackID; ServiceInstance->ServiceID = (unsigned int)ret_val; ServiceInstance->EventCallback = EventCallback; ServiceInstance->CallbackParameter = CallbackParameter; *ServiceID = (unsigned int)ret_val; /* Return the IAS Instance ID. */ ret_val = (int)InstanceID; } /* UnLock the previously locked Bluetooth Stack. */ BSC_UnLockBluetoothStack(BluetoothStackID); } else ret_val = IAS_ERROR_INSUFFICIENT_RESOURCES; } else ret_val = IAS_ERROR_SERVICE_ALREADY_REGISTERED; } else ret_val = IAS_ERROR_INVALID_PARAMETER; /* Finally return the result to the caller. */ return(ret_val); }
/* successful or a negative return error code if an error occurs. */ int BTPSAPI TPS_Cleanup_Service(unsigned int BluetoothStackID, unsigned int InstanceID) { int ret_val; TPSServerInstance_t *ServiceInstance; /* Make sure the parameters passed to us are semi-valid. */ if((BluetoothStackID) && (InstanceID)) { /* Acquire the specified TPS Instance. */ if((ServiceInstance = AcquireServiceInstance(BluetoothStackID, &InstanceID)) != NULL) { /* Verify that the service is actually registered. */ if(ServiceInstance->ServiceID) { /* Call GATT to un-register the service. */ GATT_Un_Register_Service(BluetoothStackID, ServiceInstance->ServiceID); /* Mark the instance entry as being free. */ BTPS_MemInitialize(ServiceInstance, 0, TPS_SERVER_INSTANCE_DATA_SIZE); /* Return success to the caller. */ ret_val = 0; } else ret_val = TPS_ERROR_INVALID_PARAMETER; /* UnLock the previously locked Bluetooth Stack. */ BSC_UnLockBluetoothStack(BluetoothStackID); } else ret_val = TPS_ERROR_INVALID_INSTANCE_ID; } else ret_val = TPS_ERROR_INVALID_PARAMETER; /* Finally return the result to the caller. */ return(ret_val); }
/* instances. */ static void BTPSAPI GATT_ServerEventCallback(unsigned int BluetoothStackID, GATT_Server_Event_Data_t *GATT_ServerEventData, unsigned long CallbackParameter) { Word_t AttributeOffset; Word_t InstanceTag; Word_t ValueLength; Byte_t *Value; unsigned int TransactionID; unsigned int InstanceID; TPSServerInstance_t *ServiceInstance; /* Verify that all parameters to this callback are Semi-Valid. */ if((BluetoothStackID) && (GATT_ServerEventData) && (CallbackParameter)) { /* The Instance ID is always registered as the callback parameter.*/ InstanceID = (unsigned int)CallbackParameter; /* Acquire the Service Instance for the specified service. */ if((ServiceInstance = AcquireServiceInstance(BluetoothStackID, &InstanceID)) != NULL) { switch(GATT_ServerEventData->Event_Data_Type) { case etGATT_Server_Read_Request: /* Verify that the Event Data is valid. */ if(GATT_ServerEventData->Event_Data.GATT_Read_Request_Data) { AttributeOffset = GATT_ServerEventData->Event_Data.GATT_Read_Request_Data->AttributeOffset; TransactionID = GATT_ServerEventData->Event_Data.GATT_Read_Request_Data->TransactionID; /* Verify that they are not trying to write with an */ /* offset or using prepared writes. */ if(!(GATT_ServerEventData->Event_Data.GATT_Read_Request_Data->AttributeValueOffset)) { /* Verify that the read request is on the Tx Power */ /* Level characteristic. */ if((Tx_Power_Service[AttributeOffset].Attribute_Entry_Type == aetCharacteristicValue16) && (AttributeOffset == TPS_TX_POWER_LEVEL_ATTRIBUTE_OFFSET)) { /* Get the instance tag for the characteristic. */ InstanceTag = (Word_t)(((GATT_Characteristic_Value_16_Entry_t *)Tx_Power_Service[AttributeOffset].Attribute_Value)->Characteristic_Value_Length); ValueLength = READ_UNALIGNED_WORD_LITTLE_ENDIAN(&(((Byte_t *)(&InstanceData[InstanceID-1]))[InstanceTag])); Value = (Byte_t *)(&(((Byte_t *)(&InstanceData[InstanceID-1]))[InstanceTag + WORD_SIZE])); /* Respond with the data. */ GATT_Read_Response(BluetoothStackID, TransactionID, (unsigned int)ValueLength, Value); } } else GATT_Error_Response(BluetoothStackID, TransactionID, AttributeOffset, ATT_PROTOCOL_ERROR_CODE_ATTRIBUTE_NOT_LONG); } break; default: /* Do nothing, as this is just here to get rid of */ /* warnings that some compilers flag when not all cases */ /* are handled in a switch off of a enumerated value. */ break; } /* UnLock the previously locked Bluetooth Stack. */ BSC_UnLockBluetoothStack(ServiceInstance->BluetoothStackID); } } }
/* next free instance. */ static TPSServerInstance_t *AcquireServiceInstance(unsigned int BluetoothStackID, unsigned int *InstanceID) { unsigned int LocalInstanceID; unsigned int Index; TPSServerInstance_t *ret_val = NULL; /* Lock the Bluetooth Stack to gain exclusive access to this */ /* Bluetooth Protocol Stack. */ if(!BSC_LockBluetoothStack(BluetoothStackID)) { /* Acquire the BSC List Lock while we are searching the instance */ /* list. */ if(BSC_AcquireListLock()) { /* Store a copy of the passed in InstanceID locally. */ LocalInstanceID = *InstanceID; /* Verify that the Instance ID is valid. */ if((LocalInstanceID) && (LocalInstanceID <= TPS_MAXIMUM_SUPPORTED_INSTANCES)) { /* Decrement the LocalInstanceID (to access the InstanceList*/ /* which is 0 based). */ --LocalInstanceID; /* Verify that this Instance is registered and valid. */ if((InstanceList[LocalInstanceID].BluetoothStackID == BluetoothStackID) && (InstanceList[LocalInstanceID].ServiceID)) { /* Return a pointer to this instance. */ ret_val = &InstanceList[LocalInstanceID]; } } else { /* Verify that we have been requested to find the next free */ /* instance. */ if(!LocalInstanceID) { /* Try to find a free instance. */ for(Index=0;Index<TPS_MAXIMUM_SUPPORTED_INSTANCES;Index++) { /* Check to see if this instance is being used. */ if(!(InstanceList[Index].ServiceID)) { /* Return the InstanceID AND a pointer to the */ /* instance. */ *InstanceID = Index+1; ret_val = &InstanceList[Index]; break; } } } } /* Release the previously acquired list lock. */ BSC_ReleaseListLock(); } /* If we failed to acquire the instance then we should un-lock the*/ /* previously acquired Bluetooth Stack. */ if(!ret_val) BSC_UnLockBluetoothStack(BluetoothStackID); } /* Finally return the result to the caller. */ return(ret_val); }