Created
February 28, 2023 03:51
-
-
Save bhupiister/b95aba7e5f7b385478ea761d0ed064cc to your computer and use it in GitHub Desktop.
React Native Accelerometer maximum frequency test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Maximum i could get on Iphone was 100 Hz, if someone has idea to improve on this, let me know in comments | |
//Android i could get around 160 hz | |
//Both test were done on https://snack.expo.dev/ by pasting the below code and testing on expo app. | |
//For android i have read the following | |
//If you need an update interval less than 200ms, you should: add android.permission.HIGH_SAMPLING_RATE_SENSORS to app.json permissions field | |
//or if you are using bare workflow, add <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> to AndroidManifest.xml. | |
import React, { useState, useEffect } from 'react'; | |
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; | |
import { Accelerometer } from 'expo-sensors'; | |
var count = 0; | |
var dispCount = 0; | |
var currTime = 0; | |
var lastTime = 0; | |
export default function App() { | |
const [{ x, y, z }, setData] = useState({ | |
x: 0, | |
y: 0, | |
z: 0, | |
}); | |
const [subscription, setSubscription] = useState(null); | |
const _slow = () => Accelerometer.setUpdateInterval(1000); | |
const _fast = () => Accelerometer.setUpdateInterval(2); | |
const _subscribe = () => { | |
count = 0; | |
lastTime = Date.now(); | |
setSubscription( | |
Accelerometer.addListener(accelerometerData => { | |
const { x, y, z } = accelerometerData; | |
setData(accelerometerData); | |
currTime = Date.now(); | |
count = count + 1; | |
if ((currTime - lastTime) > 1000) { | |
lastTime = currTime; | |
dispCount = count; | |
count = 0; | |
} | |
}) | |
); | |
}; | |
const _unsubscribe = () => { | |
subscription && subscription.remove(); | |
setSubscription(null); | |
}; | |
useEffect(() => { | |
_subscribe(); | |
return () => _unsubscribe(); | |
}, []); | |
return ( | |
<View style={styles.container}> | |
<Text style={styles.text}>Accelerometer: (in gs where 1g = 9.81 m/s^2)</Text> | |
<Text style={styles.text}>x: {x}</Text> | |
<Text style={styles.text}>y: {y}</Text> | |
<Text style={styles.text}>z: {z}</Text> | |
<Text style={styles.text}>hz: {dispCount}</Text> | |
<Text style={styles.text}>cTime: {currTime}</Text> | |
<Text style={styles.text}>lTime: {lastTime}</Text> | |
<View style={styles.buttonContainer}> | |
<TouchableOpacity onPress={subscription ? _unsubscribe : _subscribe} style={styles.button}> | |
<Text>{subscription ? 'On' : 'Off'}</Text> | |
</TouchableOpacity> | |
<TouchableOpacity onPress={_slow} style={[styles.button, styles.middleButton]}> | |
<Text>Slow</Text> | |
</TouchableOpacity> | |
<TouchableOpacity onPress={_fast} style={styles.button}> | |
<Text>Fast</Text> | |
</TouchableOpacity> | |
</View> | |
</View> | |
); | |
} | |
const styles = StyleSheet.create({ | |
container: { | |
flex: 1, | |
justifyContent: 'center', | |
paddingHorizontal: 20, | |
}, | |
text: { | |
textAlign: 'center', | |
}, | |
buttonContainer: { | |
flexDirection: 'row', | |
alignItems: 'stretch', | |
marginTop: 15, | |
}, | |
button: { | |
flex: 1, | |
justifyContent: 'center', | |
alignItems: 'center', | |
backgroundColor: '#eee', | |
padding: 10, | |
}, | |
middleButton: { | |
borderLeftWidth: 1, | |
borderRightWidth: 1, | |
borderColor: '#ccc', | |
}, | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment