Подтвердить что ты не робот

Установите iPhone-акселерометр в режим ± 8g

Можно ли установить акселерометр iPhone для приема данных в диапазоне ± 8 г? (насколько я знаю ST LIS331DLH акселерометр, установленный на iPhone, поддерживает этот режим)

Мы рассматриваем не только стандартный API, но и

  • недокументированные функции
  • возможные хаки iOS
  • аппаратное мастерство

В любом случае, чтобы расширить диапазон акселерометра, превышающий стандарт ± 2g

4b9b3361

Ответ 1

В моем "ответе" нет содержится прямой ответ на вопрос Евгения. Однако я нашел кучу недокументированных функций, которые, вероятно, могут помочь.

Я искал whithin iOS SDK для функций, связанных с акселерометром. Кажется, что все сводится к одной из двух фреймворков (другие основы полагаются на одну из них): SpringBoardServices (Private) и CoreMotion.

API SpingBoardServices относительно прост: См. Также: Описание 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-интерфейс платформы - это С++ 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*)

Ответ 2

К сожалению, для этого нет собственного способа. С другой стороны, если вы хотите побег из тюрьмы, вы можете получить настройку Cydia (я не помню названия), которая уменьшает чувствительность акселерометра. Если у вас есть чувствительность к нему на уровне 25%, он должен иметь возможность ощущать ± 8 г. FYI, если вы читаете результаты своего приложения, он все равно будет варьироваться от ± 2g, но с настройкой, вы должны помнить, что показания будут уменьшены на 1/4. (Значение 2g в приложении = 8g в реальном пространстве).