Skip to content

Commit 8a4227c

Browse files
committed
Refactor Networking Widget and Fix TIme Series Output
1 parent f1219b0 commit 8a4227c

4 files changed

Lines changed: 373 additions & 250 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import socket
2+
import sys
3+
import time
4+
import argparse
5+
import signal
6+
import struct
7+
import os
8+
import json
9+
10+
numSamples = 0
11+
12+
# Print received message to console
13+
def print_message(*args):
14+
try:
15+
# print(args[0]) #added to see raw data
16+
obj = json.loads(args[0].decode())
17+
print(obj.get('data'))
18+
numSamplesInChannelOne = len(obj.get('data')[0])
19+
global numSamples
20+
print("NumSamplesInPacket_ChannelOne == " + str(numSamplesInChannelOne))
21+
numSamples += numSamplesInChannelOne
22+
if obj:
23+
return True
24+
else:
25+
return False
26+
except BaseException as e:
27+
print(e)
28+
return False
29+
# print("(%s) RECEIVED MESSAGE: " % time.time() +
30+
# ''.join(str(struct.unpack('>%df' % int(length), args[0]))))
31+
32+
# Clean exit from print mode
33+
def exit_print(signal, frame):
34+
print("Closing listener")
35+
sys.exit(0)
36+
37+
# Record received message in text file
38+
def record_to_file(*args):
39+
textfile.write(str(time.time()) + ",")
40+
#textfile.write(args[0])
41+
obj = json.loads(args[0].decode())
42+
#print(obj.get('data'))
43+
textfile.write(json.dumps(obj))
44+
textfile.write("\n")
45+
46+
# Save recording, clean exit from record mode
47+
def close_file(*args):
48+
print("\nFILE SAVED")
49+
textfile.close()
50+
sys.exit(0)
51+
52+
if __name__ == "__main__":
53+
# Collect command line arguments
54+
parser = argparse.ArgumentParser()
55+
parser.add_argument("--ip",
56+
default="127.0.0.1", help="The ip to listen on")
57+
parser.add_argument("--port",
58+
type=int, default=12345, help="The port to listen on")
59+
parser.add_argument("--address",default="/openbci", help="address to listen to")
60+
parser.add_argument("--option",default="print",help="Debugger option")
61+
parser.add_argument("--len",default=9,help="Debugger option")
62+
args = parser.parse_args()
63+
64+
# Set up necessary parameters from command line
65+
length = int(args.len)
66+
if args.option=="print":
67+
signal.signal(signal.SIGINT, exit_print)
68+
elif args.option=="record":
69+
i = 0
70+
while os.path.exists("udp_test%s.txt" % i):
71+
i += 1
72+
filename = "udp_test%i.txt" % i
73+
textfile = open(filename, "w")
74+
textfile.write("time,address,messages\n")
75+
textfile.write("-------------------------\n")
76+
print("Recording to %s" % filename)
77+
signal.signal(signal.SIGINT, close_file)
78+
79+
# Connect to socket
80+
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
81+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
82+
server_address = (args.ip, args.port)
83+
sock.bind(server_address)
84+
85+
# Display socket attributes
86+
print('--------------------')
87+
print("-- UDP LISTENER -- ")
88+
print('--------------------')
89+
print("IP:", args.ip)
90+
print("PORT:", args.port)
91+
print('--------------------')
92+
print("%s option selected" % args.option)
93+
94+
# Receive messages
95+
print("Listening...")
96+
start = time.time()
97+
98+
duration = 10
99+
while time.time() <= start + duration:
100+
data, addr = sock.recvfrom(20000) # buffer size is 20000 bytes
101+
if args.option=="print":
102+
print_message(data)
103+
# numSamples += 1
104+
elif args.option=="record":
105+
record_to_file(data)
106+
numSamples += 1
107+
108+
print( "Samples == {}".format(numSamples) )
109+
print( "Duration == {}".format(duration) )
110+
print( "Avg Sampling Rate == {}".format(numSamples / duration) )

OpenBCI_GUI/OpenBCI_GUI.pde

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import edu.ucsd.sccn.LSL; //for LSL
5555
import com.fazecast.jSerialComm.*; //Helps distinguish serial ports on Windows
5656
import org.apache.commons.lang3.time.StopWatch;
5757
import http.requests.*;
58+
import java.util.concurrent.atomic.AtomicBoolean;
5859

5960

6061
//------------------------------------------------------------------------
@@ -417,6 +418,7 @@ void setup() {
417418
if (isMac()) {
418419
checkIsMacFullDetail();
419420
}
421+
println("JVM Version: " + System.getProperty("java.version"));
420422
println("Welcome to the Processing-based OpenBCI GUI!"); //Welcome line.
421423
println("For more information, please visit: https://docs.openbci.com/Software/OpenBCISoftware/GUIDocs/");
422424

@@ -518,6 +520,9 @@ synchronized void draw() {
518520
initSystem();
519521
reinitRequested = false;
520522
}
523+
if (systemMode == SYSTEMMODE_POSTINIT) {
524+
w_networking.networkingFrameLock.compareAndSet(false, true);
525+
}
521526
} else if (systemMode == SYSTEMMODE_INTROANIMATION) {
522527
if (settings.introAnimationInit == 0) {
523528
settings.introAnimationInit = millis();

OpenBCI_GUI/SessionSettings.pde

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,6 @@ class SessionSettings {
134134
String[] accVertScaleArray = {"Auto","1 g", "2 g", "4 g"};
135135
String[] accHorizScaleArray = {"Sync", "1 sec", "3 sec", "5 sec", "10 sec", "20 sec"};
136136

137-
//Used to set text in dropdown menus when loading Networking settings
138-
String[] nwProtocolArray = {"Serial", "LSL", "UDP", "OSC"};
139-
String[] nwDataTypesArray = {"None", "Focus", "EMG", "AvgBandPower", "BandPower", "TimeSeries", "Accel/Aux", "FFT", "Pulse"};
140-
String[] nwBaudRatesArray = {"57600", "115200", "250000", "500000"};
141-
142137
//Used to set text in dropdown menus when loading Analog Read settings
143138
String[] arVertScaleArray = {"Auto", "50", "100", "200", "400", "1000", "10000"};
144139
String[] arHorizScaleArray = {"Sync", "1 sec", "3 sec", "5 sec", "10 sec", "20 sec"};
@@ -403,7 +398,7 @@ class SessionSettings {
403398
switch(nwProtocolSave) {
404399
case 3:
405400
for (int i = 1; i <= 4; i++) {
406-
saveNetworkingSettings.setInt("OSC_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.datatypeNames[i-1]));
401+
saveNetworkingSettings.setInt("OSC_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.dataTypeNames.get(i-1)));
407402
saveNetworkingSettings.setString("OSC_ip"+i, (String) w_networking.getCP5Map().get("OSC_ip"+i));
408403
saveNetworkingSettings.setString("OSC_port"+i, (String) w_networking.getCP5Map().get("OSC_port"+i));
409404
saveNetworkingSettings.setString("OSC_address"+i, (String) w_networking.getCP5Map().get("OSC_address"+i));
@@ -412,15 +407,15 @@ class SessionSettings {
412407
break;
413408
case 2:
414409
for (int i = 1; i <= 3; i++) {
415-
saveNetworkingSettings.setInt("UDP_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.datatypeNames[i-1]));
410+
saveNetworkingSettings.setInt("UDP_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.dataTypeNames.get(i-1)));
416411
saveNetworkingSettings.setString("UDP_ip"+i, (String) w_networking.getCP5Map().get("UDP_ip"+i));
417412
saveNetworkingSettings.setString("UDP_port"+i, (String) w_networking.getCP5Map().get("UDP_port"+i));
418413
saveNetworkingSettings.setBoolean("UDP_filter"+i, (boolean) w_networking.getCP5Map().get("filter"+i));
419414
}
420415
break;
421416
case 1:
422417
for (int i = 1; i <= 3; i++) {
423-
saveNetworkingSettings.setInt("LSL_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.datatypeNames[i-1]));
418+
saveNetworkingSettings.setInt("LSL_DataType"+i, (Integer) w_networking.getCP5Map().get(w_networking.dataTypeNames.get(i-1)));
424419
saveNetworkingSettings.setString("LSL_name"+i, (String) w_networking.getCP5Map().get("LSL_name"+i));
425420
saveNetworkingSettings.setString("LSL_type"+i, (String) w_networking.getCP5Map().get("LSL_type"+i));
426421
saveNetworkingSettings.setBoolean("LSL_filter"+i, (boolean) w_networking.getCP5Map().get("filter"+i));
@@ -868,21 +863,21 @@ class SessionSettings {
868863
//Update protocol with loaded value
869864
Protocol(nwProtocolLoad);
870865
//Update dropdowns and textfields in the Networking widget with loaded values
871-
w_networking.cp5_widget.getController("Protocol").getCaptionLabel().setText(nwProtocolArray[nwProtocolLoad]); //Reference the dropdown from the appropriate widget
866+
w_networking.cp5_widget.getController("Protocol").getCaptionLabel().setText(w_networking.protocols.get(nwProtocolLoad)); //Reference the dropdown from the appropriate widget
872867
w_networking.cp5_networking.get(Toggle.class, "filter1").setState(false);
873868
w_networking.cp5_networking.get(Toggle.class, "filter2").setState(false);
874869
w_networking.cp5_networking.get(Toggle.class, "filter3").setState(false);
875870
w_networking.cp5_networking.get(Toggle.class, "filter4").setState(false);
876871
switch (nwProtocolLoad) {
877872
case 3: //Apply OSC if loaded
878873
println("Apply OSC Networking Mode");
879-
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(nwDataTypesArray[nwDataType1]); //Set text on frontend
874+
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType1)); //Set text on frontend
880875
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType1").setValue(nwDataType1); //Set value in backend
881-
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(nwDataTypesArray[nwDataType2]); //etc...
876+
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType2)); //etc...
882877
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType2").setValue(nwDataType2);
883-
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(nwDataTypesArray[nwDataType3]);
878+
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType3));
884879
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType3").setValue(nwDataType3);
885-
w_networking.cp5_networking_dropdowns.getController("dataType4").getCaptionLabel().setText(nwDataTypesArray[nwDataType4]);
880+
w_networking.cp5_networking_dropdowns.getController("dataType4").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType4));
886881
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType4").setValue(nwDataType4);
887882
w_networking.cp5_networking.get(Textfield.class, "OSC_ip1").setText(nwOscIp1Load); //Simply set the text for text boxes
888883
w_networking.cp5_networking.get(Textfield.class, "OSC_ip2").setText(nwOscIp2Load); //The strings are referenced on command
@@ -903,11 +898,11 @@ class SessionSettings {
903898
break;
904899
case 2: //Apply UDP if loaded
905900
println("Apply UDP Networking Mode");
906-
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(nwDataTypesArray[nwDataType1]); //Set text on frontend
901+
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType1)); //Set text on frontend
907902
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType1").setValue(nwDataType1); //Set value in backend
908-
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(nwDataTypesArray[nwDataType2]); //etc...
903+
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType2)); //etc...
909904
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType2").setValue(nwDataType2);
910-
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(nwDataTypesArray[nwDataType3]);
905+
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType3));
911906
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType3").setValue(nwDataType3);
912907
w_networking.cp5_networking.get(Textfield.class, "UDP_ip1").setText(nwUdpIp1Load);
913908
w_networking.cp5_networking.get(Textfield.class, "UDP_ip2").setText(nwUdpIp2Load);
@@ -921,11 +916,11 @@ class SessionSettings {
921916
break;
922917
case 1: //Apply LSL if loaded
923918
println("Apply LSL Networking Mode");
924-
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(nwDataTypesArray[nwDataType1]); //Set text on frontend
919+
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType1)); //Set text on frontend
925920
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType1").setValue(nwDataType1); //Set value in backend
926-
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(nwDataTypesArray[nwDataType2]); //etc...
921+
w_networking.cp5_networking_dropdowns.getController("dataType2").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType2)); //etc...
927922
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType2").setValue(nwDataType2);
928-
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(nwDataTypesArray[nwDataType3]);
923+
w_networking.cp5_networking_dropdowns.getController("dataType3").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType3));
929924
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType3").setValue(nwDataType3);
930925
w_networking.cp5_networking.get(Textfield.class, "LSL_name1").setText(nwLSLName1Load);
931926
w_networking.cp5_networking.get(Textfield.class, "LSL_name2").setText(nwLSLName2Load);
@@ -939,9 +934,9 @@ class SessionSettings {
939934
break;
940935
case 0: //Apply Serial if loaded
941936
println("Apply Serial Networking Mode");
942-
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(nwDataTypesArray[nwDataType1]); //Set text on frontend
937+
w_networking.cp5_networking_dropdowns.getController("dataType1").getCaptionLabel().setText(w_networking.dataTypes.get(nwDataType1)); //Set text on frontend
943938
w_networking.cp5_networking_dropdowns.get(ScrollableList.class, "dataType1").setValue(nwDataType1); //Set value in backend
944-
w_networking.cp5_networking_baudRate.getController("baud_rate").getCaptionLabel().setText(nwBaudRatesArray[nwSerialBaudRateLoad]); //Set text
939+
w_networking.cp5_networking_baudRate.getController("baud_rate").getCaptionLabel().setText(w_networking.baudRates.get(nwSerialBaudRateLoad)); //Set text
945940
w_networking.cp5_networking_baudRate.get(ScrollableList.class, "baud_rate").setValue(nwSerialBaudRateLoad); //Set value in backend
946941
w_networking.cp5_networking.get(Toggle.class, "filter1").setState(nwSerialFilter1Load);
947942

0 commit comments

Comments
 (0)