-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstream_shimmer_to_lsl.m
198 lines (159 loc) · 7.6 KB
/
stream_shimmer_to_lsl.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
function stream_shimmer_to_lsl()
%PLOTANDWRITEEMGEXAMPLE - Plotting ecg signal and write to file
% INPUT: comPort - String value defining the COM port number for Shimmer
%
% INPUT: captureDuration - Numerical value defining the capture duration
% OUTPUT: shimmer - Object of the ShimmerHandleClass
%
% Example or Shimmer3
% addpath('C:/Users/Admin/Documents/MATLAB/Shimmer-MATLAB-ID-master/Resources/');
fs = 204.8; % sample rate in [Hz]
DELAY_PERIOD = 0.2;
streaming = 0;
PPGChannelNum = 13;
comPort = '12';
global shimmer; % = ShimmerHandleClass(comPort);
% SensorMacros = SetEnabledSensorsMacrosClass;
% shimmer.disconnect; % disconnect from shimmer
global outlet;
global SensorMacros;
global textarea;
connection_ready = 0;
function start_shimmer()
comPort = string(textarea.Value);
% disp(comPort);
shimmer = ShimmerHandleClass(comPort);
SensorMacros = SetEnabledSensorsMacrosClass;
try
shimmer.disconnect;
end
if (shimmer.connect)
shimmer.setsamplingrate(fs); % Select sampling rate
PPGChannel = ['INT A' num2str(PPGChannelNum)];
shimmer.setinternalboard('GSR'); % Select internal expansion board; select 'EMG' to enable SENSOR_EXG1
shimmer.disableallsensors; % Disable other sensors
shimmer.setenabledsensors(SensorMacros.GSR,1, PPGChannel,1 ); % Enable GSR, enable PPG Channel, disable other sensors
shimmer.setinternalexppower(1); % set internal expansion power
disp('shimmer connection ready');
end
disp('start shimmer done')
% shimmer.disconnect;
end
function setup_LSL_Stream()
%% LSL
%% instantiate the library
disp('Loading LSL library...');
lib = lsl_loadlib();
%% create new stream
disp('Creating a new stream info for Shimmer...');
info = lsl_streaminfo(lib,'Shimmer', 'Physio', 3, fs, 'cf_double64','GSR+');
chns = info.desc().append_child('channels');
ch = chns.append_child('channel');
ch.append_child_value('label','timestamp');
ch.append_child_value('unit','ms');
ch = chns.append_child('channel');
ch.append_child_value('label','PPG');
ch.append_child_value('unit','microvolts');
ch = chns.append_child('channel');
ch.append_child_value('label','EDA');
ch.append_child_value('unit','komhs');
info.desc().append_child_value('manufacturer','ShimmerSensing');
setup = info.desc().append_child('setup');
setup.append_child_value('location',dd.Value);
% make a new stream outlet
disp('Opening an outlet...');
outlet = lsl_outlet(info);
connection_ready = 1;
end % end setup LSL
%% UI
fig = uifigure("Name", 'Shimmer Streamer');
fig.Position = [100 100 400 200];
fig.WindowStyle = 'alwaysontop';
label = uilabel(fig);
label.Text = "Press record to send Shimmer data to LabStreamingLayer.";
label.Position = [20 150 350 60];
label.WordWrap = "on";
dd = uidropdown(fig,...
'Position',[20 140 230 22],...
'Items',{'fingers - medial phalange', 'fingers - distal phalange','fingers - proximal phalange','wrist', 'palm - thenar'},...
'Value','fingers - medial phalange');
% Create a push button
uibutton(fig,'push',...
'Text', 'Connect Shimmer',...
'Position',[20, 110, 120, 22],...
'ButtonPushedFcn', @(btn,event) start_shimmer());
% create a com port text
textarea = uitextarea(fig, 'Position', [150, 110, 100, 22], 'Value', {'COM Port'});
% Create a push button
btnSetup = uibutton(fig,'push',...
'Text', 'Setup LSL',...
'Position',[20, 80, 100, 22],...
'ButtonPushedFcn', @(btn,event) setup_LSL_Stream());
btnStream = uibutton(fig,'push',...
'Text', 'Stream',...
'Position',[20, 50, 100, 22],...
'ButtonPushedFcn', @(btn,event) startStreaming());
btnStop = uibutton(fig,'push',...
'Text', 'Stop',...
'Position',[130, 50, 100, 22],...
'ButtonPushedFcn', @(btn,event) stopStreaming());
t = uicontrol(fig,...
'Style','text',...
'String','Waiting...',...
'ForegroundColor', 'r',...
'Position',[20 15 250 20]);
% function closeRequest(hObject)
% % uialert(fig,report,'Error Message','Interpreter','html');
% selection = uiconfirm('Close document?','Confirm Close',...
% 'Icon','warning');
%
%
% switch selection
% case 'OK'
% try
% shimmer.stop; % stop data streaming
% shimmer.disconnect; % disconnect from shimmer
% end
% delete(hObject);
%
%
% case 'No'
% return
% end
% end
%
% set(fig,'CloseRequestFcn',@closeRequest)
function startStreaming()
if(connection_ready)
if(shimmer.start)
streaming = 1;
t.String = 'Streaming...';
t.ForegroundColor = 'b';
end % shimmer-start
% streamData_lsl = [];
while (streaming)
pause(DELAY_PERIOD); % Pause for this period of time on each iteration to allow data to arrive in the buffer
[newData,signalNameArray,signalFormatArray,signalUnitArray] = shimmer.getdata('c'); % Read the latest data from shimmer data buffer, signalFormatArray defines the format of the data and signalUnitArray the unit
if ~isempty(newData) % TRUE if new data has arrived
chIndex(1) = find(ismember(signalNameArray, 'Time Stamp')); % get signal indices
chIndex(2) = find(ismember(signalNameArray, 'Internal ADC A13'));
chIndex(3) = find(ismember(signalNameArray, 'GSR'));
% send data into the outlet, sample by sample
fprintf('Now transmitting data, size %i...\n',size(newData,1));
t.String = 'Now transmitting data. Buffer size: ' + string(size(newData,1));
streamData = [newData(:, chIndex(1)), newData(:, chIndex(2)), newData(:, chIndex(3))];
streamData = streamData'; % transpose into the format expected by LSL
% disp(streamData);
outlet.push_chunk(streamData);
end % data
end % while-loop
end
end
function stopStreaming()
streaming = 0;
if(shimmer.stop)
t.String = 'Stopped';
t.ForegroundColor = 'r';
end
end
end % end streamtoLsl