77import java .util .LinkedList ;
88import java .util .List ;
99import java .util .Queue ;
10+ import java .util .concurrent .ConcurrentHashMap ;
1011import java .util .concurrent .ConcurrentLinkedQueue ;
1112
1213import 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 ] + "\t Channel Name : " + data [1 ]
166- + "\t Format : " + data [2 ] + "\t Unit : " + 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