±8gの範囲でデータを受信するようにiPhone加速度計を設定することは可能ですか? (私が知る限り、iPhoneにインストールされているST LIS331DLH加速度計はこのモードをサポートしています)
標準APIだけでなく、
- ドキュメント化されていない関数
- iOSハッキングの可能性
- ハードウェアいじり
とにかく、標準の±2gを超えて加速度計の範囲を拡張する
±8gの範囲でデータを受信するようにiPhone加速度計を設定することは可能ですか? (私が知る限り、iPhoneにインストールされているST LIS331DLH加速度計はこのモードをサポートしています)
標準APIだけでなく、
とにかく、標準の±2gを超えて加速度計の範囲を拡張する
私の「答え」には、Evgenyの質問に対する直接の答えは含まれていません。しかし、私はおそらく役立つ可能性のある文書化されていない関数の束を見つけました。
iOS SDKで、加速度計に関連する機能を検索しました。すべてが2つのフレームワークの1つに要約されているようです(他のフレームワークはこれらの1つに依存しています):SpringBoardServices(プライベート)とCoreMotion。
SpingBoardServices APIは比較的単純です。関連項目:SBSAccelerometerの説明
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*)
残念ながら、これを行うネイティブな方法はありません。一方、ジェイルブレイクを希望する場合は、加速度計の感度を下げる Cydia 微調整 (名前は思い出せません) があります。感度が25%の場合、±8g感知できるはずです。参考までに、アプリから出力を読み取っている場合は、±2g の範囲になりますが、微調整すると、読み取り値が 1/4 に縮小されることに注意してください。(アプリで 2g = 実際のスペースで 8g を意味します)。