diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/build.gradle b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/build.gradle index 0d995ab7..9d0be86b 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/build.gradle +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/build.gradle @@ -74,13 +74,13 @@ dependencies { compile files('libs/ShimmerBiophysicalProcessingLibrary_Rev_0_11.jar') compile files('libs/AndroidBluetoothLibrary.jar') compile files('libs/androidplot-core-0.5.0-release.jar') - implementation (group: 'com.shimmersensing', name: 'ShimmerBluetoothManagerDev', version:'JA-56 v0.4'){ + implementation (group: 'com.shimmersensing', name: 'ShimmerBluetoothManagerDev', version:'JA-56 v0.7'){ // excluding org.json which is provided by Android exclude group: 'io.netty' exclude group: 'com.google.protobuf' exclude group: 'org.apache.commons.math' } - implementation (group: 'com.shimmersensing', name: 'ShimmerDriverDev', version:'JA-56 v0.4'){ + implementation (group: 'com.shimmersensing', name: 'ShimmerDriverDev', version:'JA-56 v0.7'){ // excluding org.json which is provided by Android exclude group: 'io.netty' exclude group: 'com.google.protobuf' diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/VerisenseDeviceAndroid.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/VerisenseDeviceAndroid.java index 023c31bd..14a11ee3 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/VerisenseDeviceAndroid.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/VerisenseDeviceAndroid.java @@ -4,8 +4,11 @@ import android.os.Handler; import com.shimmerresearch.bluetooth.ShimmerBluetooth; +import com.shimmerresearch.driver.CallbackObject; import com.shimmerresearch.driver.ObjectCluster; +import com.shimmerresearch.driver.ShimmerMsg; import com.shimmerresearch.verisense.VerisenseDevice; +import com.shimmerresearch.verisense.communication.SyncProgressDetails; import java.util.ArrayList; import java.util.List; @@ -47,4 +50,13 @@ private void sendMsgToHandlerListTarget(int what, Object object) { } } } + + @Override + public void sendCallBackMsg(int i, Object ojc){ + super.sendCallBackMsg(i, ojc); + + if(((CallbackObject)ojc).mMyObject instanceof SyncProgressDetails){ + sendMsgToHandlerListTarget(ShimmerBluetooth.MSG_IDENTIFIER_SYNC_PROGRESS, -1, -1, ojc); + } + } } diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DataSyncFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DataSyncFragment.java new file mode 100644 index 00000000..2324e7b7 --- /dev/null +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DataSyncFragment.java @@ -0,0 +1,52 @@ +package com.shimmerresearch.android.guiUtilities.supportfragments; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.EditText; +import com.shimmerresearch.androidinstrumentdriver.R; + + +public class DataSyncFragment extends Fragment { + + static Context context; + public static EditText editTextParticipantName; + public static EditText editTextTrialName; + public static TextView TextViewPayloadIndex; + public static TextView TextViewSpeed; + + public DataSyncFragment() { + // Required empty public constructor + } + + public static DataSyncFragment newInstance() { + DataSyncFragment fragment = new DataSyncFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + context = getActivity(); + // Inflate the layout for this fragment + return inflater.inflate(R.layout.data_sync, container, false); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + + editTextParticipantName = (EditText) getView().findViewById(R.id.participantName); + editTextTrialName = (EditText) getView().findViewById(R.id.trialName); + TextViewPayloadIndex = (TextView) getView().findViewById(R.id.payloadIndex); + TextViewSpeed = (TextView) getView().findViewById(R.id.speed); + + super.onActivityCreated(savedInstanceState); + } +} \ No newline at end of file diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/PlotFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/PlotFragment.java index 60cdf71b..460cca9e 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/PlotFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/PlotFragment.java @@ -50,6 +50,7 @@ public class PlotFragment extends Fragment { static String deviceState = ""; static TextView textViewDeviceName; static TextView textViewDeviceState; + static String selectedDeviceAddress; private static String LOG_TAG = "PlotFragment"; Button signalsToPlotButton; @@ -201,8 +202,11 @@ public void handleMessage(Message msg) { Log.d(LOG_TAG,"Message Fully Initialized Received from Shimmer driver"); shimmerService.enableGraphingHandler(true); deviceState = "Connected"; - textViewDeviceName.setText(mBluetoothAddress); - textViewDeviceState.setText(deviceState); + if(selectedDeviceAddress.equals(mBluetoothAddress)){ + textViewDeviceName.setText(mBluetoothAddress); + textViewDeviceState.setText(deviceState); + } + break; case SDLOGGING: Log.d(LOG_TAG,"Message Fully Initialized Received from Shimmer driver"); @@ -214,8 +218,10 @@ public void handleMessage(Message msg) { case CONNECTING: Log.d(LOG_TAG,"Driver is attempting to establish connection with Shimmer device"); deviceState = "Connecting"; - textViewDeviceName.setText(mBluetoothAddress); - textViewDeviceState.setText(deviceState); + if(selectedDeviceAddress.equals(mBluetoothAddress)){ + textViewDeviceName.setText(mBluetoothAddress); + textViewDeviceState.setText(deviceState); + } break; case STREAMING: deviceState="Streaming"; @@ -279,6 +285,11 @@ else if(shimmerService.isEXGUsingTestSignal16Configuration(mBluetoothAddress)) textViewDeviceState.setText(deviceState); //TODO: set the enable logging regarding the user selection break; + case STREAMING_LOGGED_DATA: + deviceState="Data Sync"; + textViewDeviceName.setText(mBluetoothAddress); + textViewDeviceState.setText(deviceState); + break; case DISCONNECTED: Log.d(LOG_TAG,"Shimmer No State"); mBluetoothAddress=null; @@ -324,4 +335,11 @@ public void clearPlot() { mPlotDataMap.clear(); dynamicPlot.clear(); } + + public void setSelectedDeviceAddress(String address){ + selectedDeviceAddress = address; + textViewDeviceName.setText(address); + textViewDeviceState.setText("Connected"); + } + } diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/SignalsToPlotFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/SignalsToPlotFragment.java index 781706f9..3b9edfc2 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/SignalsToPlotFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/SignalsToPlotFragment.java @@ -7,6 +7,7 @@ import android.support.v4.app.Fragment; import android.support.v4.app.ListFragment; import android.util.Log; +import android.util.SparseBooleanArray; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -141,6 +142,23 @@ public void buildSignalsToPlotList(Context context, final ShimmerService service listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); updateCheckboxes(); + shimmerService.mPlotManager.removeAllSignals(); + + SparseBooleanArray pos = listView.getCheckedItemPositions(); + for (int i = 0; i < listView.getCount(); i++) { + if (pos.get(i)) { + try { + if(dynamicPlot == null) { + Log.e(LOG_TAG, "dynamicPlot is null!"); + } + shimmerService.mPlotManager.addSignal(mList.get(i), dynamicPlot); + } catch (Exception e) { + Log.e(LOG_TAG, "Error! Could not add signal: " + e); + e.printStackTrace(); + } + } + } + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java index 81cd1356..0b12185a 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java @@ -36,6 +36,7 @@ public class AndroidBleRadioByteCommunication extends AbstractByteCommunication UUID txid = UUID.fromString(TxID); UUID rxid = UUID.fromString(RxID); String mMac; + String uuid; //"DA:A6:19:F0:4A:D7" //"E7:45:2C:6D:6F:14" @@ -192,4 +193,13 @@ public void onWriteFailure(BleException exception) { public void stop() { } + public String convertMacIDtoUUID(String MacID) { + String uuid = "00000000-0000-0000-0000-"; + return uuid + MacID.replace(":", ""); + } + + public String getUuid() { + //"00000000-0000-0000-0000-E7EC37A0D234" + return convertMacIDtoUUID(this.mMac); + } } diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/res/layouts/fragments/layout/data_sync.xml b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/res/layouts/fragments/layout/data_sync.xml new file mode 100644 index 00000000..15901478 --- /dev/null +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/res/layouts/fragments/layout/data_sync.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/build.gradle b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/build.gradle index de1b65d2..865471b0 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/build.gradle +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/build.gradle @@ -41,13 +41,13 @@ android { dependencies { compile project(':ShimmerAndroidInstrumentDriver') - implementation (group: 'com.shimmersensing', name: 'ShimmerBluetoothManagerDev', version:'JA-56 v0.4'){ + implementation (group: 'com.shimmersensing', name: 'ShimmerBluetoothManagerDev', version:'JA-56 v0.7'){ // excluding org.json which is provided by Android exclude group: 'io.netty' exclude group: 'com.google.protobuf' exclude group: 'org.apache.commons.math' } - implementation (group: 'com.shimmersensing', name: 'ShimmerDriverDev', version:'JA-56 v0.4'){ + implementation (group: 'com.shimmersensing', name: 'ShimmerDriverDev', version:'JA-56 v0.7'){ // excluding org.json which is provided by Android exclude group: 'io.netty' exclude group: 'com.google.protobuf' diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/AndroidManifest.xml b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/AndroidManifest.xml index c0475a67..8357fb46 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/AndroidManifest.xml +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ - + + fragmentArrayList = new ArrayList(); + ArrayList fragmentTitle = new ArrayList(); public SectionsPagerAdapter1(FragmentManager fm) { super(fm); + connectedShimmersListFragment = ConnectedShimmersListFragment.newInstance(); + sensorsEnabledFragment = SensorsEnabledFragment.newInstance(null, null); + deviceConfigFragment = DeviceConfigFragment.newInstance(); + plotFragment = PlotFragment.newInstance(); + signalsToPlotFragment = SignalsToPlotFragment.newInstance(); + + add(connectedShimmersListFragment, "Connected Devices"); + add(sensorsEnabledFragment, "Enable Sensors"); + add(deviceConfigFragment, "Device Configuration"); + add(plotFragment, "Plot"); + add(signalsToPlotFragment, "Signals to Plot"); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. - if(position == 0) { + if(position < fragmentArrayList.size()){ + if(position == 0){ connectedShimmersListFragment.buildShimmersConnectedListView(null, getApplicationContext()); - return connectedShimmersListFragment; - } - else if(position == 1) { - return sensorsEnabledFragment; - } - else if (position == 2) { - return deviceConfigFragment; - } - else if (position == 3) { - return plotFragment; - } - else if (position == 4) { - return signalsToPlotFragment; - } - else { - return null; } + return fragmentArrayList.get(position); + } + else{ + return null; + } } @Override public int getCount() { - // Show 5 total pages. - return 5; + // Show 5 total pages (Show 6 when a verisense device is selected) + return fragmentArrayList.size(); } @Override public CharSequence getPageTitle(int position) { - switch (position) { - case 0: return "Connected Devices"; - case 1: return "Enable Sensors"; - case 2: return "Device Configuration"; - case 3: return "Plot"; - case 4: return "Signals to Plot"; - default: return ""; + if(position < fragmentTitle.size()){ + return fragmentTitle.get(position); } + return ""; + } + + public void add(Fragment fragment, String title, int index) + { + fragmentArrayList.add(index, fragment); + fragmentTitle.add(index, title); } + public void add(Fragment fragment, String title) + { + fragmentArrayList.add(fragment); + fragmentTitle.add(title); + } + + public void remove(int index) + { + if(fragmentArrayList.size() > 1 && fragmentTitle.size() > 1){ + fragmentArrayList.remove(index); + fragmentTitle.remove(index); + } + } + + @Override + public int getItemPosition(Object object) { + // refresh all fragments when data set changed + return PagerAdapter.POSITION_NONE; + } } private Handler mHandler = new Handler() { @@ -300,6 +362,14 @@ public void handleMessage(Message msg) { switch (state) { case CONNECTED: connectedShimmersListFragment.buildShimmersConnectedListView(mService.getListOfConnectedDevices(), getApplicationContext()); + if(selectedDeviceAddress != null){ + ShimmerDevice mDevice = mService.getShimmer(selectedDeviceAddress); + deviceConfigFragment.buildDeviceConfigList(mDevice, getApplicationContext(), mService.getBluetoothManager()); + } + if(dataSyncFragment != null){ + DataSyncFragment.TextViewPayloadIndex.setText(""); + DataSyncFragment.TextViewSpeed.setText(""); + } break; case CONNECTING: break; @@ -323,15 +393,16 @@ public void handleMessage(Message msg) { connectedShimmersListFragment.buildShimmersConnectedListView(mService.getListOfConnectedDevices(), getApplicationContext()); //to be safe lets rebuild this break; } - + } + else if(msg.what == Shimmer.MSG_IDENTIFIER_SYNC_PROGRESS){ + SyncProgressDetails mDetails = (SyncProgressDetails)((CallbackObject)msg.obj).mMyObject; + DataSyncFragment.TextViewPayloadIndex.setText("Current Payload Index : " + Integer.toString(mDetails.mPayloadIndex)); + DataSyncFragment.TextViewSpeed.setText("Speed(KBps) : " + Double.toString(mDetails.mTransferRateBytes/1024)); } if(msg.arg1 == Shimmer.MSG_STATE_STOP_STREAMING) { signalsToPlotFragment.setDeviceNotStreamingView(); } - - - } }; @@ -348,6 +419,22 @@ public void onShimmerDeviceSelected(String macAddress, String deviceName) { //Pass the selected device to the fragments ShimmerDevice device = mService.getShimmer(selectedDeviceAddress); + //add and remove DataSyncFragment based on the type of device + if(device instanceof VerisenseDeviceAndroid) { + if(mSectionsPagerAdapter1.getCount() == 5) + { + dataSyncFragment = DataSyncFragment.newInstance(); + mSectionsPagerAdapter1.add(dataSyncFragment, "Data Sync", 3); + } + } + else{ + if(mSectionsPagerAdapter1.getCount() == 6) + { + mSectionsPagerAdapter1.remove(3); + } + } + mSectionsPagerAdapter1.notifyDataSetChanged(); + sensorsEnabledFragment.setShimmerService(mService); sensorsEnabledFragment.buildSensorsList(device, this, mService.getBluetoothManager()); @@ -355,6 +442,7 @@ public void onShimmerDeviceSelected(String macAddress, String deviceName) { plotFragment.setShimmerService(mService); plotFragment.clearPlot(); + plotFragment.setSelectedDeviceAddress(selectedDeviceAddress); dynamicPlot = plotFragment.getDynamicPlot(); mService.stopStreamingAllDevices(); diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml index b6e858aa..a4fa9995 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml @@ -22,6 +22,8 @@ android:id="@+id/start_streaming"> + \ No newline at end of file