Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nslog timestamp

I want to nslog the device motion timestamp property .

The device motion is in the class CMMotionManager.devicemotion.timestamp

Any ideas.

like image 999
Abdul Samad Avatar asked Dec 03 '22 07:12

Abdul Samad


2 Answers

Here the solution I put in place because the date is according to Apple documentation :

The time stamp is the amount of time in seconds since the phone booted.

I first save the originDate at the first mesure (if my NSDate is nil).

[self.motionManager startGyroUpdatesToQueue:self.queue withHandler:^(CMGyroData *gyroData, NSError *error) {
    if (self.originDate == nil) {
        self.originDate = [NSDate dateWithTimeIntervalSinceNow:-gyroData.timestamp];
    }   
}];

Then I can display when I want the real date like this :

[NSDate dateWithTimeInterval:mygyroData.timestamp sinceDate:self.originDate]

Don't forget to reset the originDate to nil if you need to restart some mesure.

like image 58
Nicolas Lauquin Avatar answered Dec 16 '22 22:12

Nicolas Lauquin


Edit: Please see Nicolas Lauquin's answer. Per the comments, the following solution is not correct but is retained here for history (and because I can't delete it since it is currently marked accepted).


The timestamp property is an NSTimeInterval, so you should be able to do:

NSLog(@"Motion at time: %@",
[NSDate dateWithTimeIntervalSinceReferenceDate:devicemotion.timestamp]);

NSTimeInterval is just a typedef'd double type, so you could use %f instead of %@ and log it directly.

Also, the docs don't indicate whether this timestamp is set against Apple's reference date or the standard *nix date, so you may need to use [NSDate dateWithTimeIntervalSince1970:] if the aforementioned method returns dates far in the future.

As @davidbitton has suggested the CMDeviceMotion's timestamp is relative to the last device boot, the correct NSDate could be derived by

NSDate *startupTime = [NSDate dateWithTimeIntervalSinceNow:
                          -1 * [[NSProcessInfo processInfo] systemUptime]];

NSDate *deviceMotionDate = [NSDate dateWithTimeInterval:devicemotion.timestamp 
                                              sinceDate:startupTime];

This should yield a roughly accurate NSDate object, assuming @davidbitton is correct. (reference: NSProcessInfo -systemUptime)

However, given how complicated this is, I would now suggest for simplicity that, given the nature of the timestamp property, that you log it in a format string as something like

"... event logged at %0.2f seconds since startup...", devicemotion.timestamp
like image 33
Ben Mosher Avatar answered Dec 16 '22 21:12

Ben Mosher