Skip to content

Instantly share code, notes, and snippets.

@bhupiister
Created February 28, 2023 03:51
Show Gist options
  • Save bhupiister/b95aba7e5f7b385478ea761d0ed064cc to your computer and use it in GitHub Desktop.
Save bhupiister/b95aba7e5f7b385478ea761d0ed064cc to your computer and use it in GitHub Desktop.
React Native Accelerometer maximum frequency test
//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