Skip to content

Commit 04b43ff

Browse files
committed
update to allow more devices
1 parent 54d4033 commit 04b43ff

4 files changed

Lines changed: 77 additions & 38 deletions

File tree

ShimmerDriver/src/main/java/com/shimmerresearch/driver/ObjectCluster.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ final public class ObjectCluster implements Cloneable,Serializable{
8888

8989
private String mMyName;
9090
private String mBluetoothAddress;
91+
private String mComPort;
9192

9293
// ------- Old Array approach - Start -----------
9394
public byte[] mRawData;
@@ -220,6 +221,13 @@ public void setMacAddress(String macAddress){
220221
mBluetoothAddress = macAddress;
221222
}
222223

224+
public void setComPort(String comport) {
225+
mComPort = comport;
226+
}
227+
228+
public String getComPort() {
229+
return mComPort;
230+
}
223231
/**
224232
* Takes in a collection of Format Clusters and returns the Format Cluster specified by the string format
225233
* @param collectionFormatCluster

ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerDevice.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4465,6 +4465,13 @@ public String getComPort() {
44654465
return mComPort;
44664466
}
44674467

4468+
/**This method will only return the comport name
4469+
* @return
4470+
*/
4471+
public String getComPortName() {
4472+
return mComPort;
4473+
}
4474+
44684475
public boolean isReadyToConnect() {
44694476
if (mCommsProtocolRadio==null
44704477
||mCommsProtocolRadio.mRadioHal==null

ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,7 @@ public ObjectCluster buildMsg(byte[] newPacket, COMMUNICATION_TYPE fwType, boole
812812

813813
objectCluster.setShimmerName(mShimmerUserAssignedName);
814814
objectCluster.setMacAddress(mMyBluetoothAddress);
815+
objectCluster.setComPort(getComPortName());
815816
objectCluster.mRawData = newPacket;
816817

817818
if(fwType!=COMMUNICATION_TYPE.BLUETOOTH && fwType!=COMMUNICATION_TYPE.SD){

ShimmerDriverPC/src/main/java/com/shimmerresearch/tools/matlab/ShimmerJavaClass.java

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.LinkedList;
88
import java.util.List;
99
import java.util.Queue;
10+
import java.util.concurrent.ConcurrentHashMap;
1011
import java.util.concurrent.ConcurrentLinkedQueue;
1112

1213
import javax.swing.JButton;
@@ -31,19 +32,19 @@ public class ShimmerJavaClass {
3132
private String comPort;
3233
private SensorDataReceived sdr = new SensorDataReceived();
3334
private String[] channelNames;
34-
private Queue<Object[]> dataQueue = new LinkedList<>();
35+
private final ConcurrentLinkedQueue<String> connectedDevices = new ConcurrentLinkedQueue<>();
36+
private final ConcurrentHashMap<String, Queue<Object[]>> dataQueues = new ConcurrentHashMap<>();
3537
private List<float[]> collectedData = new ArrayList<>();
36-
private String[] signalNameArray;
37-
private String[] signalFormatArray;
38-
private String[] signalUnitArray;
38+
3939

40-
private boolean mDebug = false;
40+
private boolean mDebug = true;
4141

4242
// private int rowIndex = 0;
4343
Object[] currentData = null;
44-
public static BasicShimmerBluetoothManagerPc mBluetoothManager = new BasicShimmerBluetoothManagerPc(false);
44+
public static BasicShimmerBluetoothManagerPc mBluetoothManager;
4545

4646
public ShimmerJavaClass() {
47+
mBluetoothManager = new BasicShimmerBluetoothManagerPc(false);
4748
sdr.setWaitForData(mBluetoothManager.callBackObject);
4849
mBluetoothManager.addCallBack(sdr);
4950
if (mDebug) {
@@ -96,13 +97,16 @@ public void actionPerformed(ActionEvent e) {
9697
}
9798

9899
while(true) {
99-
if(!dataQueue.isEmpty()) {
100+
if (hasDataToRead(comPort)) {
100101
readData();
101102
}
103+
102104
}
103105
}
104106
});
105107

108+
109+
106110
stopButton.addActionListener(new ActionListener() {
107111
@Override
108112
public void actionPerformed(ActionEvent e) {
@@ -136,37 +140,56 @@ public String[] retrieveSensorChannels() {
136140

137141
return channelNamesList.toArray(new String[0]);
138142
}
139-
140-
public Object[] receiveData() {
141-
while (!dataQueue.isEmpty()) {
142-
Object[] currentData = dataQueue.poll();
143-
144-
float[] newData = (float[]) currentData[0];
145-
signalNameArray = (String[]) currentData[1];
146-
signalFormatArray = (String[]) currentData[2];
147-
signalUnitArray = (String[]) currentData[3];
148-
149-
collectedData.add(newData);
150-
}
151-
152-
// Convert list to 2D float array (m × n)
153-
float[][] dataMatrix = collectedData.toArray(new float[0][0]);
154-
155-
return new Object[]{dataMatrix, signalNameArray, signalFormatArray, signalUnitArray};
156-
}
157-
158-
private void sendData(Object[] data) {
159-
dataQueue.add(data);
160-
}
143+
public boolean hasDataToRead(String comPort) {
144+
Queue<Object[]> queue = dataQueues.get(comPort);
145+
return queue != null && !queue.isEmpty();
146+
}
147+
private void sendData(String comPort, Object[] data) {
148+
dataQueues.computeIfAbsent(comPort, k -> new LinkedList<>()).add(data);
149+
}
161150

162-
public void readData() { //Test receive data for all Object Cluster
163-
Object[] data = receiveData();
164-
if (mDebug) {
165-
System.out.println("New Data : " + data[0] + "\tChannel Name : " + data[1]
166-
+ "\tFormat : " + data[2] + "\tUnit : " + data[3]);
167-
}
151+
public void readData() {
152+
for (String comPort : dataQueues.keySet()) {
153+
Object[] data = receiveData(comPort);
154+
if (data != null && mDebug) {
155+
float[][] matrix = (float[][]) data[0];
156+
String[] signalNames = (String[]) data[1];
157+
String[] formats = (String[]) data[2];
158+
String[] units = (String[]) data[3];
159+
160+
System.out.println("==== Data from device: " + comPort + " ====");
161+
for (int i = 0; i < matrix.length; i++) {
162+
System.out.print("Row " + i + ": ");
163+
for (int j = 0; j < matrix[i].length; j++) {
164+
System.out.print(matrix[i][j] + " " + units[j] + " [" + signalNames[j] + "] | ");
165+
}
166+
System.out.println();
167+
}
168+
}
169+
}
170+
}
171+
172+
public Object[] receiveData(String comPort) {
173+
Queue<Object[]> queue = dataQueues.get(comPort);
174+
if (queue == null || queue.isEmpty()) return null;
175+
176+
List<float[]> deviceData = new ArrayList<>();
177+
String[] signalNameArray = null, signalFormatArray = null, signalUnitArray = null;
178+
179+
while (!queue.isEmpty()) {
180+
Object[] data = queue.poll();
181+
float[] values = (float[]) data[1];
182+
signalNameArray = (String[]) data[2];
183+
signalFormatArray = (String[]) data[3];
184+
signalUnitArray = (String[]) data[4];
185+
deviceData.add(values);
186+
}
187+
188+
float[][] dataMatrix = deviceData.toArray(new float[0][0]);
189+
return new Object[] { dataMatrix, signalNameArray, signalFormatArray, signalUnitArray };
168190
}
169191

192+
170193
public class SensorDataReceived extends BasicProcessWithCallBack {
171194

172195
@Override
@@ -218,9 +241,9 @@ protected void processMsgFromCallback(ShimmerMsg shimmerMSG) {
218241
}
219242
}
220243

221-
Object[] outputData = { newData, signalNameArray, signalFormatArray, signalUnitArray };
222-
223-
sendData(outputData);
244+
String comPort = objc.getComPort();
245+
Object[] outputData = { comPort, newData, signalNameArray, signalFormatArray, signalUnitArray };
246+
sendData(comPort, outputData);
224247
}
225248
}
226249
}

0 commit comments

Comments
 (0)