diff --git a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/ImmediateAlertServiceFragment.java b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/ImmediateAlertServiceFragment.java new file mode 100644 index 0000000..8f8f87f --- /dev/null +++ b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/ImmediateAlertServiceFragment.java @@ -0,0 +1,145 @@ +/* + * Copyright 2015 Google Inc. All rights reserved. + * + * 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. + */ + +package io.github.webbluetoothcg.bletestperipheral; + +import android.app.Activity; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.os.Bundle; +import android.os.ParcelUuid; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import java.util.UUID; + + +public class ImmediateAlertServiceFragment extends ServiceFragment { + + private static final byte NO_ALERT = 0x00; + private static final byte MILD_ALERT = 0x01; + private static final byte HIGH_ALERT = 0x02; + + private static final String TAG = ImmediateAlertServiceFragment.class.getCanonicalName(); + + private static final UUID IMMEDIATE_ALERT_SERVICE_UUID = UUID + .fromString("00001802-0000-1000-8000-00805f9b34fb"); + + private static final UUID ALERT_LEVEL_UUID = UUID + .fromString("00002A06-0000-1000-8000-00805f9b34fb"); + + private ServiceFragmentDelegate mDelegate; + + // GATT + private BluetoothGattService mImmediateAlertService; + private BluetoothGattCharacteristic mBatteryLevelCharacteristic; + private TextView textView_receivedValue; + + public ImmediateAlertServiceFragment() { + mBatteryLevelCharacteristic = + new BluetoothGattCharacteristic(ALERT_LEVEL_UUID, + BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE, + BluetoothGattCharacteristic.PERMISSION_WRITE); + + mBatteryLevelCharacteristic.addDescriptor( + Peripheral.getClientCharacteristicConfigurationDescriptor()); + + mImmediateAlertService = new BluetoothGattService(IMMEDIATE_ALERT_SERVICE_UUID, + BluetoothGattService.SERVICE_TYPE_PRIMARY); + mImmediateAlertService.addCharacteristic(mBatteryLevelCharacteristic); + } + + // Lifecycle callbacks + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_immediate_alert, container, false); + + textView_receivedValue = (TextView) view.findViewById(R.id.textView_receivedValue); + + return view; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mDelegate = (ServiceFragmentDelegate) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement ServiceFragmentDelegate"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mDelegate = null; + } + + public BluetoothGattService getBluetoothGattService() { + return mImmediateAlertService; + } + + @Override + public ParcelUuid getServiceUUID() { + return new ParcelUuid(IMMEDIATE_ALERT_SERVICE_UUID); + } + + @Override + public int writeCharacteristic(BluetoothGattCharacteristic characteristic, int offset, byte[] value) { + //Log.v(TAG, "write Characteristic " + characteristic.getUuid() + " value " + value[0]); + /** + * https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.alert_level.xml + * + * The value of the characteristic shall be an unsigned 8 bit integer that has a fixed point + * exponent of 0. The Alert Level characteristic defines the level of alert, and is one of the + * following three values: + * + * Value 0, meaning “No Alert” + * Value 1, meaning “Mild Alert” + * Value 2, meaning “High Alert” + * + */ + final byte alertLevel = value[0]; + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + textView_receivedValue.setText(String.valueOf(alertLevel)); + } + }); + + switch (alertLevel){ + case NO_ALERT: + case MILD_ALERT: + case HIGH_ALERT: + return BluetoothGatt.GATT_SUCCESS; + //break; + + default: + return BluetoothGatt.GATT_WRITE_NOT_PERMITTED; + //break; + } + } +} diff --git a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripheral.java b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripheral.java index 6d677eb..448e897 100644 --- a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripheral.java +++ b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripheral.java @@ -210,6 +210,8 @@ protected void onCreate(Bundle savedInstanceState) { mCurrentServiceFragment = new BatteryServiceFragment(); } else if (peripheralIndex == 1) { mCurrentServiceFragment = new HeartRateServiceFragment(); + } else if (peripheralIndex == 2) { + mCurrentServiceFragment = new ImmediateAlertServiceFragment(); } else { Log.wtf(TAG, "Service doesn't exist"); } diff --git a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripherals.java b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripherals.java index fb28e92..7cc19b1 100644 --- a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripherals.java +++ b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/Peripherals.java @@ -27,7 +27,7 @@ public class Peripherals extends ListActivity { // TODO(g-ortuno): Implement heart rate monitor peripheral - private static final String[] PERIPHERALS_NAMES = new String[]{"Battery", "Heart Rate Monitor"}; + private static final String[] PERIPHERALS_NAMES = new String[]{"Battery", "Heart Rate Monitor", "Find Me Target"}; public final static String EXTRA_PERIPHERAL_INDEX = "PERIPHERAL_INDEX"; @Override diff --git a/app/src/main/res/layout/fragment_immediate_alert.xml b/app/src/main/res/layout/fragment_immediate_alert.xml new file mode 100644 index 0000000..e0d5756 --- /dev/null +++ b/app/src/main/res/layout/fragment_immediate_alert.xml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 63974f0..b38c587 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,6 +44,9 @@ Batter Level shouldn\'t exceed 100 Please enter a number between 0 and 100 + + Immediate Alert Service + Body Sensor Location Heart Rate Service