我正在使用 Apple 的iOS 事件处理指南。我正在使用附近描述的 pull 方法startAccelerometerUpdates
。pull 方法适合我的目的,因为我只需要从传感器读取一次。
在 iPhone 4、iPad Mini 和 iPad Retina 上的以下代码中,accelerometerData
我从对 的调用中得到零。isGyroAvailable isMagnetometerAvailable YES`。两个问题:gyroData
magnetometerData
isAccelerometerAvailable,
, and
each return
如何确定 和 的startAccelerometerUpdates
结果startGyroUpdates
?它们是void
函数,所以我可以假设它永远不会失败吗?(否则,它会抛出或返回 a BOOL
)。
如何从对和的调用accelerometerData
中获得最后一个错误?gyroData
magnetometerData
编辑:我不得不打电话[NSThread sleepForTimeInterval:0.150f]
从传感器中获取数据。更少,传感器不会产生有效数据。
睡眠增加了第三个问题:当硬件存在时,需要暂停多长时间才能确保数据到达?
提前致谢。
static CryptoPP::RandomPool pool;
static dispatch_once_t once = 0;
dispatch_once(&once, ^{
CryptoPP::SecByteBlock seed(32);
CryptoPP::OS_GenerateRandomBlock(true, seed.data(), seed.size());
pool.IncorporateEntropy(seed.data(), seed.size());
});
// First, send in all the uninitialized data. Then:
// sesnors[0,1,2] use accelerometer, if available
// sesnors[3,4,5] use gyroscope, if available
// sesnors[6,7,8] use magnetometer, if available
CryptoPP::SecBlock<double> sensors(3 * 3);
pool.IncorporateEntropy(sensors.BytePtr(), sensors.SizeInBytes());
CMMotionManager* mgr = [[CMMotionManager alloc] init];
if(mgr) {
[mgr startAccelerometerUpdates];
[mgr startGyroUpdates];
[mgr startMagnetometerUpdates];
[NSThread sleepForTimeInterval:0.150f];
if([mgr isAccelerometerAvailable]) {
CMAccelerometerData* accelData = [mgr accelerometerData];
if(accelData) {
sensors[0] = [accelData acceleration].x;
sensors[1] = [accelData acceleration].y;
sensors[2] = [accelData acceleration].z;
}
}
if([mgr isGyroAvailable]) {
CMGyroData* gyroData = [mgr gyroData];
if(gyroData) {
sensors[3] = [gyroData rotationRate].x;
sensors[4] = [gyroData rotationRate].y;
sensors[5] = [gyroData rotationRate].z;
}
}
if([mgr isMagnetometerAvailable]) {
CMMagnetometerData* magnetData = [mgr magnetometerData];
if(magnetData) {
sensors[6] = [magnetData magneticField].x;
sensors[7] = [magnetData magneticField].y;
sensors[8] = [magnetData magneticField].z;
}
}
pool.IncorporateEntropy(sensors.BytePtr(), sensors.SizeInBytes());
[mgr stopMagnetometerUpdates];
[mgr stopGyroUpdates];
[mgr stopAccelerometerUpdates];
[mgr release], mgr = nil;
}