ble_error_t nRF51GattServer::addService(GattService &service) { /* ToDo: Make sure we don't overflow the array, etc. */ /* ToDo: Make sure this service UUID doesn't already exist (?) */ /* ToDo: Basic validation */ /* Add the service to the nRF51 */ ble_uuid_t nordicUUID; nordicUUID = custom_convert_to_nordic_uuid(service.getUUID()); uint16_t serviceHandle; // ASSERT( ERROR_NONE == //_modify // sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, // &nordicUUID, // &serviceHandle), // BLE_ERROR_PARAM_OUT_OF_RANGE ); nrf_err_check(sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &nordicUUID, &serviceHandle) ); service.setHandle(serviceHandle); /* Add characteristics to the service */ for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) { GattCharacteristic *p_char = service.getCharacteristic(i); nordicUUID = custom_convert_to_nordic_uuid(p_char->getUUID()); // ASSERT ( ERROR_NONE == //_modify // custom_add_in_characteristic(service.getHandle(), // &nordicUUID, // p_char->getProperties(), // NULL, // p_char->getInitialLength(), // p_char->getMaxLength(), // &nrfCharacteristicHandles[characteristicCount]), // BLE_ERROR_PARAM_OUT_OF_RANGE ); nrf_err_check(custom_add_in_characteristic(service.getHandle(), &nordicUUID, p_char->getProperties(), NULL, p_char->getInitialLength(), p_char->getMaxLength(), &nrfCharacteristicHandles[characteristicCount])); /* Update the characteristic handle */ uint16_t charHandle = characteristicCount; p_characteristics[characteristicCount++] = p_char; p_char->setHandle(charHandle); if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) { updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */); } } serviceCount++; return BLE_ERROR_NONE; }
ble_error_t nRF5xGattServer::addService(GattService &service) { /* ToDo: Make sure we don't overflow the array, etc. */ /* ToDo: Make sure this service UUID doesn't already exist (?) */ /* ToDo: Basic validation */ /* Add the service to the nRF51 */ ble_uuid_t nordicUUID; nordicUUID = custom_convert_to_nordic_uuid(service.getUUID()); uint16_t serviceHandle; ASSERT( ERROR_NONE == sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &nordicUUID, &serviceHandle), BLE_ERROR_PARAM_OUT_OF_RANGE ); service.setHandle(serviceHandle); /* Add characteristics to the service */ for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) { GattCharacteristic *p_char = service.getCharacteristic(i); /* Skip any incompletely defined, read-only characteristics. */ if ((p_char->getValueAttribute().getValuePtr() == NULL) && (p_char->getValueAttribute().getInitialLength() == 0) && (p_char->getProperties() == GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ)) { continue; } nordicUUID = custom_convert_to_nordic_uuid(p_char->getValueAttribute().getUUID()); /* The user-description descriptor is a special case which needs to be * handled at the time of adding the characteristic. The following block * is meant to discover its presence. */ const uint8_t *userDescriptionDescriptorValuePtr = NULL; uint16_t userDescriptionDescriptorValueLen = 0; for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) { GattAttribute *p_desc = p_char->getDescriptor(j); if (p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_USER_DESC) { userDescriptionDescriptorValuePtr = p_desc->getValuePtr(); userDescriptionDescriptorValueLen = p_desc->getLength(); } } ASSERT ( ERROR_NONE == custom_add_in_characteristic(BLE_GATT_HANDLE_INVALID, &nordicUUID, p_char->getProperties(), p_char->getRequiredSecurity(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), p_char->getValueAttribute().getMaxLength(), userDescriptionDescriptorValuePtr, userDescriptionDescriptorValueLen, p_char->isReadAuthorizationEnabled(), p_char->isWriteAuthorizationEnabled(), &nrfCharacteristicHandles[characteristicCount]), BLE_ERROR_PARAM_OUT_OF_RANGE ); /* Update the characteristic handle */ p_characteristics[characteristicCount] = p_char; p_char->getValueAttribute().setHandle(nrfCharacteristicHandles[characteristicCount].value_handle); characteristicCount++; /* Add optional descriptors if any */ /* ToDo: Make sure we don't overflow the array */ for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) { GattAttribute *p_desc = p_char->getDescriptor(j); /* skip the user-description-descriptor here; this has already been handled when adding the characteristic (above). */ if (p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_USER_DESC) { continue; } nordicUUID = custom_convert_to_nordic_uuid(p_desc->getUUID()); ASSERT(ERROR_NONE == custom_add_in_descriptor(BLE_GATT_HANDLE_INVALID, &nordicUUID, p_desc->getValuePtr(), p_desc->getInitialLength(), p_desc->getMaxLength(), &nrfDescriptorHandles[descriptorCount]), BLE_ERROR_PARAM_OUT_OF_RANGE); p_descriptors[descriptorCount++] = p_desc; p_desc->setHandle(nrfDescriptorHandles[descriptorCount]); } } serviceCount++; return BLE_ERROR_NONE; }
ble_error_t nRF5xGattServer::addService(GattService &service) { /* ToDo: Make sure this service UUID doesn't already exist (?) */ /* ToDo: Basic validation */ /* Add the service to the nRF51 */ ble_uuid_t nordicUUID; nordicUUID = custom_convert_to_nordic_uuid(service.getUUID()); uint16_t serviceHandle; ASSERT_TRUE( ERROR_NONE == sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &nordicUUID, &serviceHandle), BLE_ERROR_PARAM_OUT_OF_RANGE ); service.setHandle(serviceHandle); /* Add characteristics to the service */ for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) { if (characteristicCount >= BLE_TOTAL_CHARACTERISTICS) { return BLE_ERROR_NO_MEM; } GattCharacteristic *p_char = service.getCharacteristic(i); GattAttribute *p_description_descriptor = NULL; GattAttribute *p_presentation_format_descriptor = NULL; /* Skip any incompletely defined, read-only characteristics. */ if ((p_char->getValueAttribute().getValuePtr() == NULL) && (p_char->getValueAttribute().getLength() == 0) && (p_char->getProperties() == GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ)) { continue; } nordicUUID = custom_convert_to_nordic_uuid(p_char->getValueAttribute().getUUID()); /* The user-description and presentation-format descriptors are special cases * that need to be handled at the time of adding each characteristic. The * following block is meant to discover their presence. */ const uint8_t *userDescriptionDescriptorValuePtr = NULL; uint16_t userDescriptionDescriptorValueLen = 0; const uint8_t *presentationFormatDescriptorValuePtr = NULL; uint16_t presentationFormatDescriptorValueLen = 0; for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) { GattAttribute *p_desc = p_char->getDescriptor(j); if (p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_USER_DESC) { p_description_descriptor = p_desc; userDescriptionDescriptorValuePtr = p_desc->getValuePtr(); userDescriptionDescriptorValueLen = p_desc->getLength(); } if (p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT) { p_presentation_format_descriptor = p_desc; presentationFormatDescriptorValuePtr = p_desc->getValuePtr(); presentationFormatDescriptorValueLen = p_desc->getLength(); } } ASSERT_TRUE ( ERROR_NONE == custom_add_in_characteristic( BLE_GATT_HANDLE_INVALID, &nordicUUID, p_char->getProperties(), p_char->getReadSecurityRequirement(), p_char->getWriteSecurityRequirement(), p_char->getUpdateSecurityRequirement(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getLength(), p_char->getValueAttribute().getMaxLength(), p_char->getValueAttribute().hasVariableLength(), userDescriptionDescriptorValuePtr, userDescriptionDescriptorValueLen, presentationFormatDescriptorValuePtr, presentationFormatDescriptorValueLen, p_char->isReadAuthorizationEnabled(), p_char->isWriteAuthorizationEnabled(), &nrfCharacteristicHandles[characteristicCount] ), BLE_ERROR_PARAM_OUT_OF_RANGE ); /* Update the characteristic handle */ p_characteristics[characteristicCount] = p_char; p_char->getValueAttribute().setHandle(nrfCharacteristicHandles[characteristicCount].value_handle); if (p_description_descriptor) { p_description_descriptor->setHandle( nrfCharacteristicHandles[characteristicCount].user_desc_handle ); } if (p_presentation_format_descriptor) { // The handle is not available from the SoftDevice p_presentation_format_descriptor->setHandle(GattAttribute::INVALID_HANDLE); } characteristicCount++; /* Add optional descriptors if any */ for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) { if (descriptorCount >= BLE_TOTAL_DESCRIPTORS) { return BLE_ERROR_NO_MEM; } GattAttribute *p_desc = p_char->getDescriptor(j); /* skip the user-description or presentation-format descriptor here; * they have already been handled when adding the characteristic (above). */ if (p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_USER_DESC || p_desc->getUUID() == BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT) { continue; } nordicUUID = custom_convert_to_nordic_uuid(p_desc->getUUID()); ASSERT_TRUE(ERROR_NONE == custom_add_in_descriptor(BLE_GATT_HANDLE_INVALID, &nordicUUID, p_desc->getValuePtr(), p_desc->getLength(), p_desc->getMaxLength(), p_desc->hasVariableLength(), &nrfDescriptorHandles[descriptorCount], p_desc->getReadSecurityRequirement(), p_desc->getWriteSecurityRequirement()), BLE_ERROR_PARAM_OUT_OF_RANGE); p_descriptors[descriptorCount] = p_desc; p_desc->setHandle(nrfDescriptorHandles[descriptorCount]); descriptorCount++; } } serviceCount++; return BLE_ERROR_NONE; }
ble_error_t nRF51GattServer::addService(GattService &service) { /* ToDo: Make sure we don't overflow the array, etc. */ /* ToDo: Make sure this service UUID doesn't already exist (?) */ /* ToDo: Basic validation */ /* Add the service to the nRF51 */ ble_uuid_t nordicUUID; nordicUUID = custom_convert_to_nordic_uuid(service.getUUID()); uint16_t serviceHandle; ASSERT( ERROR_NONE == sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &nordicUUID, &serviceHandle), BLE_ERROR_PARAM_OUT_OF_RANGE ); service.setHandle(serviceHandle); /* Add characteristics to the service */ for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) { GattCharacteristic *p_char = service.getCharacteristic(i); /* Skip any incompletely defined, read-only characteristics. */ if ((p_char->getValueAttribute().getValuePtr() == NULL) && (p_char->getValueAttribute().getInitialLength() == 0) && (p_char->getProperties() == GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ)) { continue; } nordicUUID = custom_convert_to_nordic_uuid(p_char->getValueAttribute().getUUID()); ASSERT ( ERROR_NONE == custom_add_in_characteristic(BLE_GATT_HANDLE_INVALID, &nordicUUID, p_char->getProperties(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), p_char->getValueAttribute().getMaxLength(), &nrfCharacteristicHandles[characteristicCount]), BLE_ERROR_PARAM_OUT_OF_RANGE ); /* Update the characteristic handle */ uint16_t charHandle = characteristicCount; p_characteristics[characteristicCount++] = p_char; p_char->getValueAttribute().setHandle(charHandle); /* Add optional descriptors if any */ /* ToDo: Make sure we don't overflow the array */ for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) { GattAttribute *p_desc = p_char->getDescriptor(j); nordicUUID = custom_convert_to_nordic_uuid(p_desc->getUUID()); ASSERT ( ERROR_NONE == custom_add_in_descriptor(BLE_GATT_HANDLE_INVALID, &nordicUUID, p_desc->getValuePtr(), p_desc->getInitialLength(), p_desc->getMaxLength(), &nrfDescriptorHandles[descriptorCount]), BLE_ERROR_PARAM_OUT_OF_RANGE ); uint16_t descHandle = descriptorCount; p_descriptors[descriptorCount++] = p_desc; p_desc->setHandle(descHandle); } } serviceCount++; return BLE_ERROR_NONE; }