将iPhone加速度计设置为±8g模式

时间:2012-05-28 18:52:13

标签: ios iphone accelerometer

是否可以将iPhone加速度计设置为接收±8g范围内的数据? (据我所知,ST LIS331DLH安装在iPhone上的加速计支持这种模式)

我们不仅关注标准API,还关注

  • 无证件功能
  • 可能的iOS黑客攻击
  • 硬件修补

无论如何将加速度计范围扩展到标准±2g以上

2 个答案:

答案 0 :(得分:6)

我的“回答”直接回答了Evgeny的问题。但是我找到了一堆可能有用的无证功能。

我在iOS SDK中搜索了与加速度计相关的功能。似乎所有内容都归结为两个框架之一(其他框架依赖于其中一个框架):SpringBoardServices(Private)和CoreMotion。

SpingBoardServices API相对简单: 另见:SBSAccelerometer description

objective-C API:

@interface SBSAccelerometer : XXUnknownSuperclass {
    id<SBSAccelerometerDelegate> _delegate;
    CFRunLoopSourceRef _accelerometerEventsSource;
    CFRunLoopRef _accelerometerEventsRunLoop;
    double _interval;
    NSLock* _lock;
    BOOL _orientationEventsEnabled;
    int _orientationEventsToken;
    NSThread* _orientationEventsThread;
    float _xThreshold;
    float _yThreshold;
    float _zThreshold;
}
@property(assign, nonatomic) id<SBSAccelerometerDelegate> delegate;
@property(assign, nonatomic) BOOL orientationEventsEnabled;
@property(assign, nonatomic) float zThreshold;
@property(assign, nonatomic) float yThreshold;
@property(assign, nonatomic) float xThreshold;
@property(assign, nonatomic) double updateInterval;
@property(assign, nonatomic) BOOL accelerometerEventsEnabled;
-(id)init;
-(void)dealloc;
-(void)_checkIn;
-(void)_checkOut;
-(void)_serverWasRestarted;
-(int)currentDeviceOrientation;
-(id)_orientationEventsThread;
-(void)_orientationDidChange;
@end 

C-API(方法的签名未知):

int SBAccelerometer_server(struct unknown *in, struct unknown *out); //returns 1 on success, 0 otherwise
int SBAccelerometer_server_routine(struct unknown *in); // retuns 0 on error;
(?) SBSetAccelerometerClientEventsEnabled(...);
(?) SBSetAccelerometerDeviceOrientationChangedEventsEnabled(...);
(?) SBSetAccelerometerRawEventsInterval(...);
(?) SBXXDeliverAccelerometerEvent(...);
(NSString* or char*) _SBXXSBAccelerometer_subsystem;

CoreMotion 框架低级API是C ++ API。我不会发布所有API(它比SpingBoardServices更大),但是有很多有希望的部分:

CLSensorFusionAccelerometerOnly::reset(float)
CLSensorNetworkProtocol::isAccelerometerPacket(__CFData const*)
CLSensorNetworkProtocol::serializeAccelerometerPacket(CLAccelerometer::Sample const&)
CLSensorNetworkProtocol::deserializeAccelerometerPacket(__CFData const*)
CLSensorInterface::setAccelerometerCallbackAndInfo(void (*)(void*, CLMotionTypeVector3 const&, double const&), void*)

答案 1 :(得分:2)

不幸的是,没有本地方法可以做到这一点。另一方面,如果你愿意越狱,你可以得到一个Cydia调整(我不记得名字),这会降低加速度计的灵敏度。如果你的灵敏度为25%,它应该能够感知±8g。仅供参考,如果您正在阅读应用程序的输出,它仍将在±2g的范围内,但通过调整,您必须记住读数将缩小1/4。 (意思是app中的2g =实际空间中的8g)。