From 127f65539111f56c725d902907d7f7efa0dccbf6 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Tue, 7 Jun 2022 16:19:13 +0800 Subject: [PATCH 01/12] add erase data and disable logging --- .../shimmerserviceexample/MainActivity.java | 23 ++++++++++++++++++- .../src/main/res/menu/menu.xml | 4 ++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index 30717d91..06736404 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -189,6 +189,27 @@ public boolean onOptionsItemSelected(MenuItem item) { mDevice3.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).readLoggedData(); } return true; + case R.id.disable_logging: + if(selectedDeviceAddress != null) { + try { + VerisenseDeviceAndroid mDevice1 = (VerisenseDeviceAndroid)mService.getShimmer(selectedDeviceAddress); + mDevice1.setRecordingEnabled(false); + byte[] opConfig = mDevice1.configBytesGenerate(true, COMMUNICATION_TYPE.BLUETOOTH); + mDevice1.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeOperationalConfig(opConfig); + } catch (ShimmerException e) { + e.printStackTrace(); + } + } + case R.id.erase_data: + if(selectedDeviceAddress != null) { + try { + VerisenseDeviceAndroid mDevice1 = (VerisenseDeviceAndroid)mService.getShimmer(selectedDeviceAddress); + mDevice1.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeEraseLoggedData(); + } catch (ShimmerException e) { + e.printStackTrace(); + } + } + return true; case R.id.disconnect_all_devices: mService.disconnectAllDevices(); connectedShimmersListFragment.buildShimmersConnectedListView(null, getApplicationContext()); @@ -208,7 +229,6 @@ protected void onStart() { super.onStart(); } - private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // This is called when the connection with the service has been @@ -342,6 +362,7 @@ public int getItemPosition(Object object) { return PagerAdapter.POSITION_NONE; } } + private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what == ShimmerBluetooth.MSG_IDENTIFIER_STATE_CHANGE) { diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml index a4fa9995..a9ba04aa 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/res/menu/menu.xml @@ -24,6 +24,10 @@ android:id="@+id/stop_streaming"> + + \ No newline at end of file From 6657c9081575e0a7d579520235c62b8ad7fb550d Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Tue, 7 Jun 2022 16:38:36 +0800 Subject: [PATCH 02/12] minor fix --- .../shimmerserviceexample/MainActivity.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index 06736404..6a071a53 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -135,15 +135,21 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem item = menu.findItem(R.id.data_sync); + MenuItem item1 = menu.findItem(R.id.data_sync); + MenuItem item2 = menu.findItem(R.id.disable_logging); + MenuItem item3 = menu.findItem(R.id.erase_data); if(selectedDeviceAddress != null){ ShimmerDevice device = mService.getShimmer(selectedDeviceAddress); if(device instanceof VerisenseDeviceAndroid) { - item.setVisible(true); + item1.setVisible(true); + item2.setVisible(true); + item3.setVisible(true); return true; } } - item.setVisible(false); + item1.setVisible(false); + item2.setVisible(false); + item3.setVisible(false); return true; } From 2e16937095bcc4c7cc7c7968603a6a5cecc3b696 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen <87511087+weiwentan23@users.noreply.github.com> Date: Tue, 7 Jun 2022 16:41:45 +0800 Subject: [PATCH 03/12] Update README.md --- .../shimmerServiceExample/README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/README.md b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/README.md index 69fb46bc..f1f7532c 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/README.md +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/README.md @@ -1,5 +1,13 @@ # ShimmerServiceExample -This example is only applicable for the use with Shimmer3 devices onwards +This example is only applicable for the use with Verisense devices and Shimmer3 devices onwards -To get started click on the menu and connect to a device. To configure select the device in the Connected Device Fragment, and swipe right. To plot data, start streaming via the menu, and sipe to the Signals to Plot fragment +To get started click on the menu and connect to a device. To configure select the device in the Connected Device Fragment, and swipe right. To plot data, start streaming via the menu, and swipe to the Signals to Plot fragment + +This ShimmerSeriviceExample allows user to +- Connect to Shimmer3/Verisense device +- Configure the device +- Stream and plot the data +- Erase data in Verisense device +- Disable logging in Verisense device +- Data sync Verisense device From 28bd1b49c531981d625f5655b20a9c74b8308bec Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Tue, 19 Jul 2022 13:50:40 +0800 Subject: [PATCH 04/12] minor --- .../shimmerserviceexample/MainActivity.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index 6a071a53..79344c20 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -24,7 +24,6 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; - import com.androidplot.xy.XYPlot; import com.clj.fastble.BleManager; import com.shimmerresearch.android.Shimmer; @@ -43,6 +42,7 @@ import com.shimmerresearch.driver.ShimmerDevice; import com.shimmerresearch.exceptions.ShimmerException; import com.shimmerresearch.driver.Configuration.COMMUNICATION_TYPE; +import com.shimmerresearch.verisense.VerisenseDevice; import com.shimmerresearch.verisense.communication.SyncProgressDetails; import com.shimmerresearch.android.VerisenseDeviceAndroid; @@ -198,19 +198,22 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.disable_logging: if(selectedDeviceAddress != null) { try { - VerisenseDeviceAndroid mDevice1 = (VerisenseDeviceAndroid)mService.getShimmer(selectedDeviceAddress); - mDevice1.setRecordingEnabled(false); - byte[] opConfig = mDevice1.configBytesGenerate(true, COMMUNICATION_TYPE.BLUETOOTH); - mDevice1.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeOperationalConfig(opConfig); + VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); + VerisenseDevice mDeviceClone = mDevice.deepClone(); + mDeviceClone.setRecordingEnabled(false); + byte[] opConfig = mDeviceClone.configBytesGenerate(true, COMMUNICATION_TYPE.BLUETOOTH); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeOperationalConfig(opConfig); + Toast.makeText(this, "Logging disabled", Toast.LENGTH_SHORT).show(); } catch (ShimmerException e) { e.printStackTrace(); } } + return true; case R.id.erase_data: if(selectedDeviceAddress != null) { try { - VerisenseDeviceAndroid mDevice1 = (VerisenseDeviceAndroid)mService.getShimmer(selectedDeviceAddress); - mDevice1.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeEraseLoggedData(); + VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeEraseLoggedData(); } catch (ShimmerException e) { e.printStackTrace(); } From ed3fe183274746d596fd7262fbb30a8d1c05fab9 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Tue, 19 Jul 2022 14:21:30 +0800 Subject: [PATCH 05/12] minor --- .../AndroidBleRadioByteCommunication.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) 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 3fd2f001..b1948790 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/androidradiodriver/AndroidBleRadioByteCommunication.java @@ -27,6 +27,9 @@ import bolts.TaskCompletionSource; +/** + * Each instance of this class represents a ble radio that is used to communicate with a verisense device + */ public class AndroidBleRadioByteCommunication extends AbstractByteCommunication { BleDevice mBleDevice; String TxID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"; @@ -40,11 +43,19 @@ public class AndroidBleRadioByteCommunication extends AbstractByteCommunication //"DA:A6:19:F0:4A:D7" //"E7:45:2C:6D:6F:14" + /** + * Initialize a ble radio + * @param mac mac address of the verisense device e.g. d0:2b:46:3d:a2:bb + */ public AndroidBleRadioByteCommunication(String mac) { mMac = mac; } TaskCompletionSource mTaskConnect = new TaskCompletionSource<>(); TaskCompletionSource mTaskMTU = new TaskCompletionSource<>(); + + /** + * Connect to the verisense device + */ @Override public void connect() { mTaskConnect = new TaskCompletionSource<>(); @@ -111,6 +122,10 @@ public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, Bl } } + /** + * Get services and start notify for characteristics changed + * @param bleDevice BLE device + */ public void startServiceS(BleDevice bleDevice){ List services = BleManager.getInstance().getBluetoothGattServices(bleDevice); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { @@ -136,6 +151,11 @@ else if (characteristic.getUuid().compareTo(rxid)==0){ } } + /** + * Start notify for characteristics changed + * @param bleDevice BLE device + * @param characteristic + */ public void newConnectedBLEDevice(final BleDevice bleDevice, final BluetoothGattCharacteristic characteristic) { @@ -168,11 +188,18 @@ public void onCharacteristicChanged(byte[] data) { } } + /** + * Disconnect from the verisense device + */ @Override public void disconnect() { BleManager.getInstance().disconnect(mBleDevice); } + /** + * Write bytes to the verisense device + * @param bytes byte array to be written + */ @Override public void writeBytes(byte[] bytes) { BleManager.getInstance().write(mBleDevice, sid.toString(), txid.toString(), bytes, false, new BleWriteCallback() { @@ -192,11 +219,20 @@ public void onWriteFailure(BleException exception) { public void stop() { } + + /** + * Convert mac address to uuid + * @param MacID e.g. d0:2b:46:3d:a2:bb + * @return uuid e.g. 00000000-0000-0000-0000-d02b463da2bb + */ public String convertMacIDtoUUID(String MacID) { String uuid = "00000000-0000-0000-0000-"; return uuid + MacID.replace(":", ""); } + /** + * @return uuid e.g. 00000000-0000-0000-0000-d02b463da2bb + */ public String getUuid() { return convertMacIDtoUUID(this.mMac); } From c617237db48c6444b12e079e8b81f18ae5948669 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Fri, 22 Jul 2022 12:12:03 +0800 Subject: [PATCH 06/12] update for tcs and some fixes --- .../ConnectedShimmersListFragment.java | 101 +++++----- .../shimmerserviceexample/MainActivity.java | 179 ++++++++++++------ 2 files changed, 166 insertions(+), 114 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java index 86430c6d..d0cf064c 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java @@ -26,24 +26,22 @@ */ public class ConnectedShimmersListFragment extends ListFragment { - OnShimmerDeviceSelectedListener mCallBack; - String selectedDeviceAddress, selectedDeviceName; final static String LOG_TAG = "SHIMMER"; + OnShimmerDeviceSelectedListener mCallBack; + String selectedDeviceAddress; ListView savedListView = null; ArrayAdapter savedListAdapter = null; - int selectedItemPos = -1; List shimmerDeviceList; Context context; int selectedDevicePos = -1; - public ConnectedShimmersListFragment() { // Required empty public constructor } //Container Activity must implement this interface public interface OnShimmerDeviceSelectedListener { - public void onShimmerDeviceSelected(String macAddress, String deviceName); + public void onShimmerDeviceSelected(String macAddress, String deviceName, Boolean selected); } @Override @@ -66,72 +64,71 @@ public static ConnectedShimmersListFragment newInstance() { public void buildShimmersConnectedListView(final List deviceList, final Context context) { if(isVisible()){ - shimmerDeviceList = deviceList; - this.context = context; - if(deviceList == null) { - //String[] displayList = {"Service not yet initialised"}; - String[] displayList = {"No devices connected"}; - ArrayAdapter listAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, displayList); - setListAdapter(listAdapter); - } - else { - final String[] nameList = new String[deviceList.size()]; - final String[] macList = new String[deviceList.size()]; - final String[] displayList = new String[deviceList.size()]; - - for (int i = 0; i < nameList.length; i++) { - nameList[i] = deviceList.get(i).getShimmerUserAssignedName(); - macList[i] = deviceList.get(i).getMacId(); - displayList[i] = nameList[i] + "\n" + macList[i]; + shimmerDeviceList = deviceList; + this.context = context; + if(deviceList == null) { + //String[] displayList = {"Service not yet initialised"}; + String[] displayList = {"No devices connected"}; + ArrayAdapter listAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, displayList); + setListAdapter(listAdapter); } + else { + final String[] nameList = new String[deviceList.size()]; + final String[] macList = new String[deviceList.size()]; + final String[] displayList = new String[deviceList.size()]; + + for (int i = 0; i < nameList.length; i++) { + nameList[i] = deviceList.get(i).getShimmerUserAssignedName(); + macList[i] = deviceList.get(i).getMacId(); + displayList[i] = nameList[i] + "\n" + macList[i]; + } - ArrayAdapter listAdapter = new ArrayAdapter(context, R.layout.simple_list_item_multiple_choice_force_black_text, displayList); - - //Set the list of devices to be displayed in the Fragment - setListAdapter(listAdapter); + ArrayAdapter listAdapter = new ArrayAdapter(context, R.layout.simple_list_item_multiple_choice_force_black_text, displayList); - final ListView listView = getListView(); - listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - selectedItemPos = position; + //Set the list of devices to be displayed in the Fragment + setListAdapter(listAdapter); - selectedDeviceAddress = macList[position]; - selectedDeviceName = nameList[position]; - selectedDevicePos = position; + final ListView listView = getListView(); + listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(selectedDeviceAddress != null && selectedDeviceAddress == macList[position]){ + selectedDeviceAddress = null; + selectedDevicePos = -1; + } + else{ + selectedDeviceAddress = macList[position]; + selectedDevicePos = position; + } - try { - mCallBack.onShimmerDeviceSelected(macList[position], nameList[position]); - } catch (ClassCastException cce) { + try { + mCallBack.onShimmerDeviceSelected(macList[position], nameList[position], selectedDevicePos == -1 ? false : true); + } catch (ClassCastException cce) { + } } - } - }); + }); - //Save the listView so that it can be restored in onCreateView when returning to the Fragment. - savedListView = listView; - savedListAdapter = listAdapter; + //Save the listView so that it can be restored in onCreateView when returning to the Fragment. + savedListView = listView; + savedListAdapter = listAdapter; - //Ensure that the selected item's checkbox is checked - if (selectedDeviceAddress != null) { + //Ensure that the selected item's checkbox is checked for (int i = 0; i < listView.getAdapter().getCount(); i++) { - View view = getViewByPosition(i, listView); CheckedTextView checkedTextView = (CheckedTextView) view.findViewById(android.R.id.text1); if (checkedTextView != null) { String text = checkedTextView.getText().toString(); - if (text.contains(selectedDeviceAddress)) { - listView.setItemChecked(i, true); - } else { + if (selectedDeviceAddress == null || !text.contains(selectedDeviceAddress)) { listView.setItemChecked(i, false); } + else { + listView.setItemChecked(i, true); + } } - } } - - } } } diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index d2f78a1f..a2897ead 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -2,6 +2,7 @@ import android.Manifest; import android.app.Activity; +import android.app.ProgressDialog; import android.content.pm.PackageManager; import android.os.Message; import android.support.v4.app.FragmentManager; @@ -52,8 +53,16 @@ import static com.shimmerresearch.android.guiUtilities.ShimmerBluetoothDialog.EXTRA_DEVICE_ADDRESS; import static com.shimmerresearch.android.guiUtilities.ShimmerBluetoothDialog.EXTRA_DEVICE_NAME; +import bolts.Continuation; +import bolts.Task; + public class MainActivity extends AppCompatActivity implements ConnectedShimmersListFragment.OnShimmerDeviceSelectedListener, SensorsEnabledFragment.OnSensorsSelectedListener { + final static String LOG_TAG = "Shimmer"; + final static String SERVICE_TAG = "ShimmerService"; + final static int REQUEST_CONNECT_SHIMMER = 2; + final static int PERMISSIONS_REQUEST_WRITE_STORAGE = 5; + ShimmerDialogConfigurations dialog; BluetoothAdapter btAdapter; ShimmerService mService; @@ -64,9 +73,9 @@ public class MainActivity extends AppCompatActivity implements ConnectedShimmers SignalsToPlotFragment signalsToPlotFragment; DataSyncFragment dataSyncFragment; public String selectedDeviceAddress, selectedDeviceName; - boolean mServiceFirstTime; - XYPlot dynamicPlot; + boolean isServiceStarted = false; + /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a @@ -82,14 +91,6 @@ public class MainActivity extends AppCompatActivity implements ConnectedShimmers */ private ViewPager mViewPager; - boolean isServiceStarted = false; - - final static String LOG_TAG = "Shimmer"; - final static String SERVICE_TAG = "ShimmerService"; - final static int REQUEST_CONNECT_SHIMMER = 2; - final static int PERMISSIONS_REQUEST_WRITE_STORAGE = 5; - - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -102,7 +103,6 @@ protected void onCreate(Bundle savedInstanceState) { mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter1); mViewPager.setOffscreenPageLimit(5); //Ensure none of the fragments has their view destroyed when off-screen - btAdapter = BluetoothAdapter.getDefaultAdapter(); dialog = new ShimmerDialogConfigurations(); @@ -140,10 +140,15 @@ public boolean onPrepareOptionsMenu(Menu menu) { MenuItem item3 = menu.findItem(R.id.erase_data); if(selectedDeviceAddress != null){ ShimmerDevice device = mService.getShimmer(selectedDeviceAddress); - if(device instanceof VerisenseDeviceAndroid) { + if(device instanceof VerisenseDevice) { item1.setVisible(true); item2.setVisible(true); item3.setVisible(true); + if (((VerisenseDevice)device).isRecordingEnabled()){ + item2.setTitle("Disable Logging"); + return true; + } + item2.setTitle("Enable Logging"); return true; } } @@ -163,10 +168,14 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.start_streaming: if(selectedDeviceAddress != null) { - ShimmerDevice mDevice1 = mService.getShimmer(selectedDeviceAddress); + ShimmerDevice mDevice = mService.getShimmer(selectedDeviceAddress); try { - mDevice1.startStreaming(); + mDevice.startStreaming(); + mViewPager.setCurrentItem(mDevice instanceof VerisenseDevice ? 5 : 4); } catch (ShimmerException e) { + if(e.getMessage() == "A task is still ongoing"){ + Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + } e.printStackTrace(); } signalsToPlotFragment.buildSignalsToPlotList(this, mService, selectedDeviceAddress, dynamicPlot); @@ -174,52 +183,83 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.stop_streaming: if(selectedDeviceAddress != null) { - ShimmerDevice mDevice2 = mService.getShimmer(selectedDeviceAddress); + ShimmerDevice mDevice = mService.getShimmer(selectedDeviceAddress); try { - mDevice2.stopStreaming(); + mDevice.stopStreaming(); } catch (ShimmerException e) { e.printStackTrace(); } - sensorsEnabledFragment.buildSensorsList(mDevice2, this, mService.getBluetoothManager()); - deviceConfigFragment.buildDeviceConfigList(mDevice2, this, mService.getBluetoothManager()); + sensorsEnabledFragment.buildSensorsList(mDevice, this, mService.getBluetoothManager()); + deviceConfigFragment.buildDeviceConfigList(mDevice, this, mService.getBluetoothManager()); } return true; case R.id.data_sync: if(selectedDeviceAddress != null) { - VerisenseDeviceAndroid mDevice3 = (VerisenseDeviceAndroid)mService.getShimmer(selectedDeviceAddress); + VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); String participantName = DataSyncFragment.editTextParticipantName.getText().toString(); + if(participantName.isEmpty()){ + participantName = "Default Participant"; + DataSyncFragment.editTextParticipantName.setText(participantName); + } String trialName = DataSyncFragment.editTextTrialName.getText().toString(); - mDevice3.setTrialName(trialName); - mDevice3.setParticipantID(participantName); - mDevice3.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).setRootPathForBinFile(android.os.Environment.getExternalStorageDirectory().getAbsolutePath()); + if(trialName.isEmpty()){ + trialName = "Default trial"; + DataSyncFragment.editTextTrialName.setText(trialName); + } + mViewPager.setCurrentItem(3); + mDevice.setTrialName(trialName); + mDevice.setParticipantID(participantName); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).setRootPathForBinFile(android.os.Environment.getExternalStorageDirectory().getAbsolutePath()); try{ - mDevice3.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).readLoggedData(); - } catch (Exception ex){ - ex.printStackTrace(); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).readLoggedData(); + } catch (Exception e){ + if(e.getMessage() == "A task is still ongoing"){ + Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + } + e.printStackTrace(); } - } return true; case R.id.disable_logging: if(selectedDeviceAddress != null) { + VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); + VerisenseDevice mDeviceClone = mDevice.deepClone(); + boolean logging = !mDevice.isRecordingEnabled(); + mDeviceClone.setRecordingEnabled(logging); + byte[] opConfig = mDeviceClone.configBytesGenerate(true, COMMUNICATION_TYPE.BLUETOOTH); try { - VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); - VerisenseDevice mDeviceClone = mDevice.deepClone(); - mDeviceClone.setRecordingEnabled(false); - byte[] opConfig = mDeviceClone.configBytesGenerate(true, COMMUNICATION_TYPE.BLUETOOTH); - mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeOperationalConfig(opConfig); - Toast.makeText(this, "Logging disabled", Toast.LENGTH_SHORT).show(); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeAndReadOperationalConfig(opConfig); + Toast.makeText(this, logging?"Logging Enabled":"Logging Disabled", Toast.LENGTH_SHORT).show(); } catch (ShimmerException e) { + if(e.getMessage() == "A task is still ongoing"){ + Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + } e.printStackTrace(); } } return true; case R.id.erase_data: if(selectedDeviceAddress != null) { + VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); + final ProgressDialog progress = new ProgressDialog(this); + progress.setTitle("Erasing data"); + progress.setMessage("Please wait for the operation to complete..."); + progress.setCancelable(false); // disable dismiss by tapping outside of the dialog + progress.show(); try { - VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); - mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).writeEraseLoggedData(); + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).eraseDataTask().continueWith(new Continuation() { + @Override + public Void then(Task completed) throws Exception { + progress.dismiss(); + Toast.makeText(getApplicationContext(), "erased data completed", Toast.LENGTH_LONG).show(); + return null; + } + }); } catch (ShimmerException e) { + progress.dismiss(); + if(e.getMessage() == "A task is still ongoing"){ + Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + } e.printStackTrace(); } } @@ -227,7 +267,7 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.disconnect_all_devices: mService.disconnectAllDevices(); connectedShimmersListFragment.buildShimmersConnectedListView(null, getApplicationContext()); - if(mSectionsPagerAdapter1.getCount() == 6) + if(mSectionsPagerAdapter1.getCount() == mSectionsPagerAdapter1.VERISENSE_PAGE_COUNT) { mSectionsPagerAdapter1.remove(3); mSectionsPagerAdapter1.notifyDataSetChanged(); @@ -304,6 +344,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { public class SectionsPagerAdapter1 extends FragmentStatePagerAdapter { + final static int VERISENSE_PAGE_COUNT = 6; + final static int SHIMMER3_PAGE_COUNT = 5; ArrayList fragmentArrayList = new ArrayList(); ArrayList fragmentTitle = new ArrayList(); @@ -435,7 +477,11 @@ else if(msg.what == Shimmer.MSG_IDENTIFIER_SYNC_PROGRESS){ DataSyncFragment.TextViewPayloadIndex.setText("Current Payload Index : " + Integer.toString(mDetails.mPayloadIndex)); DataSyncFragment.TextViewSpeed.setText("Speed(KBps) : " + Double.toString(mDetails.mTransferRateBytes/1024)); DataSyncFragment.TextViewDirectory.setText("Bin file path : " + mDetails.mBinFilePath); - + } + else if(msg.what == Shimmer.MSG_IDENTIFIER_NOTIFICATION_MESSAGE){ + if(((CallbackObject)msg.obj).mIndicator == Shimmer.NOTIFICATION_SHIMMER_FULLY_INITIALIZED){ + Toast.makeText(getApplicationContext(), "Device fully initialized: ", Toast.LENGTH_SHORT).show(); + } } if(msg.arg1 == Shimmer.MSG_STATE_STOP_STREAMING) { @@ -449,42 +495,51 @@ else if(msg.what == Shimmer.MSG_IDENTIFIER_SYNC_PROGRESS){ * @param macAddress */ @Override - public void onShimmerDeviceSelected(String macAddress, String deviceName) { - Toast.makeText(this, "Selected Device: " + deviceName + "\n" + macAddress, Toast.LENGTH_SHORT).show(); - selectedDeviceAddress = macAddress; - selectedDeviceName = deviceName; + public void onShimmerDeviceSelected(String macAddress, String deviceName, Boolean selected) { + if(selected){ + Toast.makeText(this, "Selected Device: " + deviceName + "\n" + macAddress, Toast.LENGTH_SHORT).show(); + selectedDeviceAddress = macAddress; + selectedDeviceName = deviceName; - //Pass the selected device to the fragments - ShimmerDevice device = mService.getShimmer(selectedDeviceAddress); + //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); + //add and remove DataSyncFragment based on the type of device + if(device instanceof VerisenseDeviceAndroid) { + if(mSectionsPagerAdapter1.getCount() == mSectionsPagerAdapter1.SHIMMER3_PAGE_COUNT) + { + dataSyncFragment = DataSyncFragment.newInstance(); + mSectionsPagerAdapter1.add(dataSyncFragment, "Data Sync", 3); + } } + else{ + if(mSectionsPagerAdapter1.getCount() == mSectionsPagerAdapter1.VERISENSE_PAGE_COUNT) + { + mSectionsPagerAdapter1.remove(3); + } + } + mSectionsPagerAdapter1.notifyDataSetChanged(); + + sensorsEnabledFragment.setShimmerService(mService); + sensorsEnabledFragment.buildSensorsList(device, this, mService.getBluetoothManager()); + + deviceConfigFragment.buildDeviceConfigList(device, this, mService.getBluetoothManager()); + + plotFragment.setShimmerService(mService); + plotFragment.clearPlot(); + plotFragment.setSelectedDeviceAddress(selectedDeviceAddress); + dynamicPlot = plotFragment.getDynamicPlot(); + + mService.stopStreamingAllDevices(); + signalsToPlotFragment.setDeviceNotStreamingView(); } else{ if(mSectionsPagerAdapter1.getCount() == 6) { mSectionsPagerAdapter1.remove(3); } + mSectionsPagerAdapter1.notifyDataSetChanged(); } - mSectionsPagerAdapter1.notifyDataSetChanged(); - - sensorsEnabledFragment.setShimmerService(mService); - sensorsEnabledFragment.buildSensorsList(device, this, mService.getBluetoothManager()); - - deviceConfigFragment.buildDeviceConfigList(device, this, mService.getBluetoothManager()); - - plotFragment.setShimmerService(mService); - plotFragment.clearPlot(); - plotFragment.setSelectedDeviceAddress(selectedDeviceAddress); - dynamicPlot = plotFragment.getDynamicPlot(); - - mService.stopStreamingAllDevices(); - signalsToPlotFragment.setDeviceNotStreamingView(); } @Override From f2468e334cbd73010251b8558ee5f86a4315012b Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Fri, 22 Jul 2022 12:27:29 +0800 Subject: [PATCH 07/12] minor refactor --- .../ExampleInstrumentedTest.java | 2 +- .../shimmerBLEBasicExample/src/main/AndroidManifest.xml | 4 ++-- .../MainActivity.java | 4 ++-- .../src/main/res/layout/activity_main.xml | 2 +- .../ExampleUnitTest.java | 2 +- .../ExampleUnitTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/{shimmerbasicexample => shimmerblebasicexample}/ExampleInstrumentedTest.java (93%) rename ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/{shimmerbasicexample => shimmerblebasicexample}/MainActivity.java (98%) rename ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/{shimmerbasicexample => shimmerblebasicexample}/ExampleUnitTest.java (87%) rename ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/{shimmerbasicexample => shimmerblebasicexample}/ExampleUnitTest.java (87%) diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerbasicexample/ExampleInstrumentedTest.java b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerblebasicexample/ExampleInstrumentedTest.java similarity index 93% rename from ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerbasicexample/ExampleInstrumentedTest.java rename to ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerblebasicexample/ExampleInstrumentedTest.java index 763fb10f..8708ad39 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerbasicexample/ExampleInstrumentedTest.java +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/androidTest/java/shimmerresearch/com/shimmerblebasicexample/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ -package shimmerresearch.com.shimmerbasicexample; +package shimmerresearch.com.shimmerblebasicexample; import android.content.Context; import android.support.test.InstrumentationRegistry; diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/AndroidManifest.xml b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/AndroidManifest.xml index 77473584..ed9066fe 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/AndroidManifest.xml +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="shimmerresearch.com.shimmerblebasicexample"> - + diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerbasicexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerblebasicexample/MainActivity.java similarity index 98% rename from ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerbasicexample/MainActivity.java rename to ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerblebasicexample/MainActivity.java index 3c168f6a..5bc9ed29 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerbasicexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/java/shimmerresearch/com/shimmerblebasicexample/MainActivity.java @@ -1,4 +1,4 @@ -package shimmerresearch.com.shimmerbasicexample; +package shimmerresearch.com.shimmerblebasicexample; import android.app.Activity; import android.content.Intent; @@ -37,7 +37,7 @@ public class MainActivity extends Activity { - private final static String LOG_TAG = "ShimmerBasicExample"; + private final static String LOG_TAG = "ShimmerBLEBasicExample"; AndroidBleRadioByteCommunication radio1 = new AndroidBleRadioByteCommunication("E7:45:2C:6D:6F:14"); VerisenseProtocolByteCommunication protocol1 = new VerisenseProtocolByteCommunication(radio1); VerisenseDeviceAndroid device1; diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/res/layout/activity_main.xml b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/res/layout/activity_main.xml index 246d7204..bae14d2d 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/res/layout/activity_main.xml +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="shimmerresearch.com.shimmerbasicexample.MainActivity" + tools:context=".MainActivity" android:orientation="vertical" android:gravity="center"> diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerbasicexample/ExampleUnitTest.java b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerblebasicexample/ExampleUnitTest.java similarity index 87% rename from ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerbasicexample/ExampleUnitTest.java rename to ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerblebasicexample/ExampleUnitTest.java index 7bc433f1..1fd33362 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerbasicexample/ExampleUnitTest.java +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/com/shimmerresearch/shimmerblebasicexample/ExampleUnitTest.java @@ -1,4 +1,4 @@ -package com.shimmerresearch.shimmerbasicexample; +package com.shimmerresearch.shimmerblebasicexample; import org.junit.Test; diff --git a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerbasicexample/ExampleUnitTest.java b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerblebasicexample/ExampleUnitTest.java similarity index 87% rename from ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerbasicexample/ExampleUnitTest.java rename to ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerblebasicexample/ExampleUnitTest.java index 29474185..4c933adb 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerbasicexample/ExampleUnitTest.java +++ b/ShimmerAndroidInstrumentDriver/shimmerBLEBasicExample/src/test/java/shimmerresearch/com/shimmerblebasicexample/ExampleUnitTest.java @@ -1,4 +1,4 @@ -package shimmerresearch.com.shimmerbasicexample; +package shimmerresearch.com.shimmerblebasicexample; import org.junit.Test; From 7a8d360b0aa02a5a28da70739c97f3afff65ea55 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Fri, 22 Jul 2022 15:32:45 +0800 Subject: [PATCH 08/12] minor updates --- .../shimmerserviceexample/MainActivity.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index a2897ead..51935edd 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -49,6 +49,7 @@ import java.util.List; import java.util.ArrayList; +import java.util.concurrent.TimeUnit; import static com.shimmerresearch.android.guiUtilities.ShimmerBluetoothDialog.EXTRA_DEVICE_ADDRESS; import static com.shimmerresearch.android.guiUtilities.ShimmerBluetoothDialog.EXTRA_DEVICE_NAME; @@ -161,6 +162,7 @@ public boolean onPrepareOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection + final Toast otherTaskOngoingToast = Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG); switch (item.getItemId()) { case R.id.connect_device: Intent pairedDevicesIntent = new Intent(getApplicationContext(), ShimmerBluetoothDialog.class); @@ -174,7 +176,7 @@ public boolean onOptionsItemSelected(MenuItem item) { mViewPager.setCurrentItem(mDevice instanceof VerisenseDevice ? 5 : 4); } catch (ShimmerException e) { if(e.getMessage() == "A task is still ongoing"){ - Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + otherTaskOngoingToast.show(); } e.printStackTrace(); } @@ -187,6 +189,9 @@ public boolean onOptionsItemSelected(MenuItem item) { try { mDevice.stopStreaming(); } catch (ShimmerException e) { + if(e.getMessage() == "A task is still ongoing"){ + otherTaskOngoingToast.show(); + } e.printStackTrace(); } sensorsEnabledFragment.buildSensorsList(mDevice, this, mService.getBluetoothManager()); @@ -214,7 +219,7 @@ public boolean onOptionsItemSelected(MenuItem item) { mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).readLoggedData(); } catch (Exception e){ if(e.getMessage() == "A task is still ongoing"){ - Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + otherTaskOngoingToast.show(); } e.printStackTrace(); } @@ -232,7 +237,7 @@ public boolean onOptionsItemSelected(MenuItem item) { Toast.makeText(this, logging?"Logging Enabled":"Logging Disabled", Toast.LENGTH_SHORT).show(); } catch (ShimmerException e) { if(e.getMessage() == "A task is still ongoing"){ - Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); + otherTaskOngoingToast.show(); } e.printStackTrace(); } @@ -240,28 +245,26 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.erase_data: if(selectedDeviceAddress != null) { - VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); + final VerisenseDevice mDevice = (VerisenseDevice)mService.getShimmer(selectedDeviceAddress); final ProgressDialog progress = new ProgressDialog(this); progress.setTitle("Erasing data"); progress.setMessage("Please wait for the operation to complete..."); progress.setCancelable(false); // disable dismiss by tapping outside of the dialog progress.show(); - try { - mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).eraseDataTask().continueWith(new Continuation() { - @Override - public Void then(Task completed) throws Exception { + new Thread(){ + public void run(){ + try { + mDevice.getMapOfVerisenseProtocolByteCommunication().get(COMMUNICATION_TYPE.BLUETOOTH).eraseDataTask().waitForCompletion(60, TimeUnit.SECONDS); + progress.dismiss(); + } catch (ShimmerException | InterruptedException e) { progress.dismiss(); - Toast.makeText(getApplicationContext(), "erased data completed", Toast.LENGTH_LONG).show(); - return null; + if(e.getMessage() == "A task is still ongoing"){ + otherTaskOngoingToast.show(); + } + e.printStackTrace(); } - }); - } catch (ShimmerException e) { - progress.dismiss(); - if(e.getMessage() == "A task is still ongoing"){ - Toast.makeText(this, "Please wait until current task is finished", Toast.LENGTH_LONG).show(); } - e.printStackTrace(); - } + }.start(); } return true; case R.id.disconnect_all_devices: @@ -272,6 +275,7 @@ public Void then(Task completed) throws Exception { mSectionsPagerAdapter1.remove(3); mSectionsPagerAdapter1.notifyDataSetChanged(); } + mViewPager.setCurrentItem(0); return true; default: return super.onOptionsItemSelected(item); From 10284dce15d0ea9462e2fde702d3d6ed719cc38f Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Fri, 22 Jul 2022 15:59:28 +0800 Subject: [PATCH 09/12] disable trial and participant textbox when data sync --- .../shimmerresearch/shimmerserviceexample/MainActivity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index 51935edd..e6e267fb 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -448,6 +448,8 @@ public void handleMessage(Message msg) { if(dataSyncFragment != null){ DataSyncFragment.TextViewPayloadIndex.setText(""); DataSyncFragment.TextViewSpeed.setText(""); + DataSyncFragment.editTextTrialName.setEnabled(true); + DataSyncFragment.editTextParticipantName.setEnabled(true); } break; case CONNECTING: @@ -469,6 +471,8 @@ public void handleMessage(Message msg) { break; case STREAMING_LOGGED_DATA: Toast.makeText(getApplicationContext(), "Data Sync: " + shimmerName + " " + macAddress, Toast.LENGTH_SHORT).show(); + DataSyncFragment.editTextTrialName.setEnabled(false); + DataSyncFragment.editTextParticipantName.setEnabled(false); break; case DISCONNECTED: Toast.makeText(getApplicationContext(), "Device disconnected: " + shimmerName + " " + macAddress, Toast.LENGTH_SHORT).show(); From 5ec3313d007fc2bd0115df2ce86b733012c3e73a Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Thu, 28 Jul 2022 09:51:50 +0800 Subject: [PATCH 10/12] minor update --- .../supportfragments/ConnectedShimmersListFragment.java | 5 +++++ .../shimmerresearch/shimmerserviceexample/MainActivity.java | 3 +++ 2 files changed, 8 insertions(+) diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java index d0cf064c..100ab4e2 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/ConnectedShimmersListFragment.java @@ -154,6 +154,11 @@ public View getViewByPosition(int pos, ListView listView) { } } + public void removeSelectedDevice(){ + selectedDeviceAddress = null; + selectedDevicePos = -1; + } + public int getNumShimmersConnected() { if(shimmerDeviceList != null) { return shimmerDeviceList.size(); diff --git a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java index e6e267fb..e5d7cc73 100644 --- a/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java +++ b/ShimmerAndroidInstrumentDriver/shimmerServiceExample/src/main/java/com/shimmerresearch/shimmerserviceexample/MainActivity.java @@ -276,6 +276,9 @@ public void run(){ mSectionsPagerAdapter1.notifyDataSetChanged(); } mViewPager.setCurrentItem(0); + selectedDeviceAddress = null; + selectedDeviceName = null; + connectedShimmersListFragment.removeSelectedDevice(); return true; default: return super.onOptionsItemSelected(item); From d6df685157b444d25503bec5bb4d7776c52d7260 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Thu, 28 Jul 2022 10:41:09 +0800 Subject: [PATCH 11/12] add set default setting --- .../DeviceConfigFragment.java | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java index ecaed196..3aa18ca7 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java @@ -24,6 +24,7 @@ import com.shimmerresearch.driverUtilities.SensorDetails; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,10 +49,14 @@ public void buildDeviceConfigList(final ShimmerDevice shimmerDevice, final Conte final Map configOptionsMap = shimmerDevice.getConfigOptionsMap(); shimmerDeviceClone = shimmerDevice.deepClone(); Map sensorMap = shimmerDevice.getSensorMap(); - List listOfKeys = new ArrayList(); + final List listOfKeys = new ArrayList(); for (SensorDetails sd:sensorMap.values()) { if (sd.mSensorDetailsRef.mListOfConfigOptionKeysAssociated!=null && sd.isEnabled()) { - listOfKeys.addAll(sd.mSensorDetailsRef.mListOfConfigOptionKeysAssociated); + for(String configOptionKey:sd.mSensorDetailsRef.mListOfConfigOptionKeysAssociated){ + if(!listOfKeys.contains(configOptionKey)){ + listOfKeys.add(configOptionKey); + } + } } } @@ -135,9 +140,10 @@ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition if(expandListView.getFooterViewsCount() == 0) { LinearLayout buttonLayout = new LinearLayout(context); buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); - buttonLayout.setOrientation(LinearLayout.HORIZONTAL); + buttonLayout.setOrientation(LinearLayout.VERTICAL); Button writeConfigButton = new Button(context); Button resetListButton = new Button(context); + Button setDefaultConfigButton = new Button(context); writeConfigButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -161,10 +167,38 @@ public void onClick(View v) { Toast.makeText(context, "Settings have been reset", Toast.LENGTH_SHORT).show(); } }); + setDefaultConfigButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final Map defaultConfigMap = new HashMap(); + defaultConfigMap.put("Accel_Range", 3); + defaultConfigMap.put("Gyro_Range", 3); + defaultConfigMap.put("Accel_Rate", 2); + defaultConfigMap.put("Mode", 1); + defaultConfigMap.put("Accel_Gyro_Rate", 6); + defaultConfigMap.put("LP Mode", 1); + defaultConfigMap.put("Range", 3); + + shimmerDeviceClone = shimmerDevice.deepClone(); + for(String key : listOfKeys) { + if(defaultConfigMap.containsKey(key)){ + final ConfigOptionDetailsSensor cods = configOptionsMap.get(key); + if(cods != null){ + shimmerDeviceClone.setConfigValueUsingConfigLabel(key, cods.mConfigValues[defaultConfigMap.get(key)]); + } + } + } + expandListAdapter.updateCloneDevice(shimmerDeviceClone); + expandListAdapter.notifyDataSetChanged(); + Toast.makeText(context, "Settings have been set to default", Toast.LENGTH_SHORT).show(); + } + }); writeConfigButton.setText("Write config to Shimmer"); resetListButton.setText("Reset settings"); + setDefaultConfigButton.setText("Set default config"); buttonLayout.addView(resetListButton); buttonLayout.addView(writeConfigButton); + buttonLayout.addView(setDefaultConfigButton); expandListView.addFooterView(buttonLayout); } From 52ab18dad1a79c2ecc47b72a295332a164aa0a95 Mon Sep 17 00:00:00 2001 From: Tan Wei Wen Date: Fri, 29 Jul 2022 15:59:39 +0800 Subject: [PATCH 12/12] add data sync button and minor --- .../supportfragments/DataSyncFragment.java | 6 ++- .../DeviceConfigFragment.java | 1 + .../layouts/fragments/layout/data_sync.xml | 12 ++++++ .../shimmerserviceexample/MainActivity.java | 43 ++++++++++--------- 4 files changed, 40 insertions(+), 22 deletions(-) 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 index 46be6d46..7aa058e1 100644 --- 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 @@ -7,6 +7,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import android.widget.EditText; import com.shimmerresearch.androidinstrumentdriver.R; @@ -20,6 +21,7 @@ public class DataSyncFragment extends Fragment { public static TextView TextViewPayloadIndex; public static TextView TextViewSpeed; public static TextView TextViewDirectory; + public static Button ButtonDataSync; public DataSyncFragment() { // Required empty public constructor @@ -42,13 +44,13 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { - + ButtonDataSync = (Button) getView().findViewById(R.id.dataSyncButton); 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); TextViewDirectory = (TextView) getView().findViewById(R.id.directory); - + ButtonDataSync.setVisibility(View.GONE); super.onActivityCreated(savedInstanceState); } } \ No newline at end of file diff --git a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java index 3aa18ca7..b526260e 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/java/com/shimmerresearch/android/guiUtilities/supportfragments/DeviceConfigFragment.java @@ -178,6 +178,7 @@ public void onClick(View v) { defaultConfigMap.put("Accel_Gyro_Rate", 6); defaultConfigMap.put("LP Mode", 1); defaultConfigMap.put("Range", 3); + defaultConfigMap.put("PPG Rate", 3); shimmerDeviceClone = shimmerDevice.deepClone(); for(String key : listOfKeys) { 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 index 468f006a..9010b64e 100644 --- a/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/res/layouts/fragments/layout/data_sync.xml +++ b/ShimmerAndroidInstrumentDriver/ShimmerAndroidInstrumentDriver/src/main/res/layouts/fragments/layout/data_sync.xml @@ -3,6 +3,18 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> + +