1.0.11 • Published 10 months ago

react-native-libmuse v1.0.11

Weekly downloads
12
License
MIT
Repository
github
Last release
10 months ago

react-native-libmuse

Bridge between Muse EEG headsets and custom Android apps. (with passthrough API for react-native)

NOTE: The NPM package hasn't been updated in a long time, so rather than "npm install ..." below, just clone this repo for the latest version for now.

Install

1) Run "npm install react-native-libmuse --save".

Link module with Android app

  • in android/app/build.gradle:
android {
    defaultConfig {
+        ndk { abiFilters "armeabi-v7a" }
    }
}

dependencies {
    [...]
    compile "com.facebook.react:react-native:+"  // from node_modules
+   compile project(':react-native-libmuse')
}
  • in android/settings.gradle:
[...]
include ':app'
+ include ':react-native-libmuse'
+ project(':react-native-libmuse').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-libmuse/android')

Expose passthrough API for react-native (requires v0.29+)

  • in MainApplication.java:
+ import com.v.LibMuse;

  public class MainApplication extends Application implements ReactApplication {
    [...]
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
+         new LibMuse(),
          new MainReactPackage()
      );
    }
    [...]
  }

Usage (Android API) WIP

import VMuse from v.LibMuse;

fun Start() {
    val vMuse = VMuse()
    vMuse.Init()
    vMuse.StartSearch()
    vMuse.AddEventListener("OnChangeMuseList") { args ->
        var museList = args[0] as WritableArray
        Log.i(TAG, "MuseListSize: ${museList.size()}");
        if (museList.size() > 0) {
            vMuse.Connect()
        }
    }
    vMuse.AddEventListener("OnChangeMuseConnectStatus") { args ->
        var status = args[0] as String
        Log.i(TAG, "Status: $status");
    }
    vMuse.AddEventListener("OnReceiveMuseDataPacket_Android") { args ->
        var packet = args[0] as VMuseDataPacket
        Log.i(TAG, "Type: ${packet.type} ChannelValues: ${packet.eegValues.contentToString()}");
        // ex: "Type: eeg ChannelValues: [0.0,728.901098901099,998.0586080586081,1517.838827838828,-1000000000,-1000000000]"
        // note that -1000000000 signifies "not a number", i.e. no data (communication channel doesn't support NaN)
    }
}

Usage (react-native API)

var LibMuse = require("react-native-libmuse");
LibMuse.Init();
LibMuse.StartSearch();
LibMuse.AddListener_OnChangeMuseList(museList=> {
    console.log(`MuseListSize: ${museList.length}`);
	if (museList.length) {
        LibMuse.Connect();
    }
});
LibMuse.AddListener_OnChangeMuseConnectStatus(status=> {
    console.log(`Status: ${status}`);
});
LibMuse.AddListener_OnReceiveMuseDataPacket(packet=> {
    console.log(packet);
    // ex: {eegValues: [0.0,728.901098901099,998.0586080586081,1517.838827838828,-1000000000,-1000000000]}
	// note that -1000000000 signifies "not a number", i.e. no data (communication channel doesn't support NaN)
});

Troubleshooting

I hit an error: "Duplicate class com.facebook.jni.CppException found in modules ....jar"

You're most likely using another Facebook library like pytorch, which contains duplicates of the Facebook JNI classes defined in react-native. To fix this, add excludeReactNative = true to your app's gradle.properties file.

1.0.11

10 months ago

1.0.10

10 months ago

1.0.9

7 years ago

1.0.8

7 years ago

1.0.7

7 years ago

1.0.6

7 years ago

1.0.5

7 years ago

1.0.4

7 years ago

1.0.3

7 years ago

1.0.2

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago