urish/muse-js

Simultaneous EEG / PPG and zipping samples

Opened this issue · 2 comments

I run into some strange behaviour trying to plot EEG and PPG simultaneously. I'm using a Muse-S.

Below I added the basic code to reproduce the behaviour. Connect to the muse and then subscribe to both the zipped Observables.

try {         
         this.muse.enablePpg = true;
         await this.muse.connect();
         await this.muse.start();     
         await this.muse.deviceInfo();  
         zipSamples(this.muse.eegReadings).subscribe(console.log); 
         zipSamplesPpg(this.muse.ppgReadings).subscribe(console.log);     
        } catch (err) {
         window.alert(err.toString());
         this.connectionError.next('Connection failed: ' + err.toString());  
       } finally {
         this.connecting.next(false);
       }    
  • This logs the zipped eegSamples to the console, but it does not print out the zipped ppg values. It only prints out 6 of the zipped ppgSamples on disconnection.
  • When not subscribing to eeg, but only to ppg, it does print the zipped ppgSamples to console like expected.
  • The zipped EegSamples always get printed to the console, regardless of the subscription to the ppg observable.
  • When not zipping any of the sample Observables with the zipSamples / zipSamplesPpg pipe, it does print the readings (unzipped) for both.

I hope the issue is clear, it's quite hard to describe. I suspect a bug in the zipSamplesPpg, but I can't seem to figure out how to fix it.

I found out the timestamp isn't changing for PPG readings when I subscribe to both the eegReadings and the ppgReadings. The zipSamplesPPG never gets passed the first mergeMap call.

mergeMap((reading) => {        
       // NEVER GETS PASSED THIS CALL, reading.timestamp doesnt update properly
         if (reading.timestamp !== lastTimestamp) {
             lastTimestamp = reading.timestamp;   
             if (buffer.length) {                 
                 const result = from([[...buffer]]);
                 buffer.splice(0, buffer.length, reading);
                 return result;
             }
         }         
         buffer.push(reading);         
         return from([]);
     }),     

@TijeOortwijnThales did you ever find a solution to this?