https://github.com/venryx/react-native-libmuse
Bridge between libmuse and react-native. (used for my other project)
https://github.com/venryx/react-native-libmuse
Last synced: 11 months ago
JSON representation
Bridge between libmuse and react-native. (used for my other project)
- Host: GitHub
- URL: https://github.com/venryx/react-native-libmuse
- Owner: Venryx
- License: mit
- Created: 2016-11-22T20:14:27.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2023-07-04T09:59:41.000Z (about 3 years ago)
- Last Synced: 2025-08-16T09:43:34.893Z (11 months ago)
- Language: Java
- Size: 1.42 MB
- Stars: 7
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 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`:
```diff
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`:
```diff
[...]
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`:
```diff
+ import com.v.LibMuse;
public class MainApplication extends Application implements ReactApplication {
[...]
@Override
protected List getPackages() {
return Arrays.asList(
+ new LibMuse(),
new MainReactPackage()
);
}
[...]
}
```
# Usage (Android API) [WIP]
```kotlin
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)
```javascript
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.