@@ -329,6 +329,17 @@ void LfpDisplayNode::acknowledgeTrigger(int id)
329329 latestTrigger.set (id, -1 );
330330}
331331
332+ bool LfpDisplayNode::getIntField (DynamicObject::Ptr payload, String name, int & value, int lowerBound, int upperBound) {
333+ if (!payload->hasProperty (name) || !payload->getProperty (name).isInt ())
334+ return false ;
335+ int tempVal = payload->getProperty (name);
336+ if ((upperBound != INT_MIN && tempVal > upperBound) || (lowerBound != INT_MAX && tempVal < lowerBound))
337+ return false ;
338+ value = tempVal;
339+ return true ;
340+ }
341+
342+
332343void LfpDisplayNode::handleBroadcastMessage (String msg) {
333344 var parsedMessage = JSON::parse (msg);
334345 if (!parsedMessage.isObject ())
@@ -343,29 +354,36 @@ void LfpDisplayNode::handleBroadcastMessage(String msg) {
343354 String command = jsonMessage -> getProperty (" command" );
344355 DynamicObject::Ptr payload = jsonMessage -> getProperty (" payload" ).getDynamicObject ();
345356 if (command == " filter" ) {
346- if (payload.get () == nullptr )
357+ if (payload.get () == nullptr ){
358+ LOGD (" Tried to filter in LFPViewer, but could not find a payload" );
347359 return ;
348- int streamID = payload -> getProperty (" streamID" );
349- int start = payload -> getProperty (" start" );
350- int rows = payload -> getProperty (" rows" );
351- int cols = payload -> getProperty (" cols" );
352- int colsPerRow = payload -> getProperty (" colsPerRow" );
353- if (streamID < 0 || start < 0 || rows < 0 || cols < 0 || colsPerRow < 0 ){
360+ }
361+ int split, start, rows, cols, colsPerRow, end;
362+ if (!getIntField (payload, " split" , split, 0 , 2 ) || !getIntField (payload, " start" , start, 0 )) {
363+ LOGD (" Tried to filter in LFPViewer, but a valid split and start weren't provided" );
354364 return ;
355365 }
356366 Array<int > channelNames;
357- for (int row = 0 ; row < rows; row++) {
358- for (int col = 0 ; col < cols; col++) {
359- channelNames.add (start + col + row*colsPerRow);
367+ // If an end is specificed add channels from start to end
368+ // Else calculate the rectangular selection based on rows and columns
369+ if (getIntField (payload, " end" , end, 0 )) {
370+ for (int index = 0 ; index < (end - start); index++) {
371+ channelNames.add (start + index);
360372 }
361373 }
362- displayBufferMap[streamID] -> setFilteredChannels (channelNames);
363- for (auto split : splitDisplays) {
364- split -> shouldRebuildChannelList = split->displayBuffer ->id == streamID;
374+ else {
375+ if (!getIntField (payload, " rows" , rows, 0 ) || !getIntField (payload, " cols" , cols, 0 ) || !getIntField (payload, " colsPerRow" , colsPerRow, 0 )) {
376+ LOGD (" Tried to filter by rectangular selection in LFPViewer, but valid row/column/columnsPerRow counts weren't provided" );
377+ return ;
378+ }
379+ for (int row = 0 ; row < rows; row++) {
380+ for (int col = 0 ; col < cols; col++) {
381+ channelNames.add (start + col + row*colsPerRow);
382+ }
383+ }
365384 }
366-
385+ splitDisplays[split] -> setFilteredChannels (channelNames);
386+ splitDisplays[split] -> shouldRebuildChannelList = true ;
367387 }
368-
369-
370388}
371389
0 commit comments