2
// MarineCompassAppDelegate.m
5
// Created by döme on 26.07.2009.
6
// Copyright __MyCompanyName__ 2009. All rights reserved.
9
#import "MarineCompassAppDelegate.h"
11
#import "CompassViewController.h"
12
#import "ElAnimation.h"
14
#import <UIKit/UIKit.h>
15
#import <CoreLocation/CoreLocation.h>
17
#import <QuartzCore/QuartzCore.h>
18
#import <OpenGLES/EAGLDrawable.h>
19
#import <CoreGraphics/CoreGraphics.h>
21
@implementation MarineCompassAppDelegate
24
- (void)applicationDidFinishLaunching:(UIApplication *)application
29
- (void) startAnimation
31
ElCallbackAnimation* anim = [[[ElCallbackAnimation alloc] init] autorelease];
32
[anim setTarget: glView];
33
[anim setCallback: @selector(animationCallback:)];
34
[anim setDuration: HUGE_VALF];
35
[anim queueForKey: @"glViewAnimation" atBeginning: NO cancelPending: NO];
38
- (void) stopAnimation
40
[[[[ElAnimation alloc] init] autorelease] queueForKey: @"glViewAnimation" atBeginning: YES cancelPending: YES];
46
[window addSubview: [self view]];
48
lman = [[CLLocationManager alloc] init];
50
[lman setDelegate: self];
52
[lman startUpdatingHeading];
54
UIAccelerometer* accm = [UIAccelerometer sharedAccelerometer];
55
[accm setDelegate: self];
56
[accm setUpdateInterval: 0.01];
58
rawBaseTransform = midentity();
59
baseCompassTransform = midentity();
60
compassDiskTransform = midentity();
62
[self startAnimation];
64
mag = (v3){0.1,0.2,0.3};
71
"MRC p15, 0, %0, c0, 0, 0"
78
- (void)applicationWillResignActive:(UIApplication *)application {
83
- (void)applicationDidBecomeActive:(UIApplication *)application {
87
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
92
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading
94
v3 v = { [heading x], [heading y], [heading z] };
96
v = mtransformdir3(mtranspose(baseCompassTransform), v);
99
v3 dv = vsub(v, prevm);
100
dv = vclamp(dv, -0.2, 0.2);
106
double ffactor = 0.05;
112
cvflat = vnormalize(cvflat);
114
cvfp = vnormalize(vadd(vmul(cvfp, 1.0-ffactor), vmul(cvflat, ffactor)));
116
v3 Z = {0.0,0.0,1.0};
117
v3 cright = vnormalize(vcross(Z, cvfp));
119
compassDiskTransform = mcreatefrombases(vnegate(cvfp), vnegate(cright), Z);
123
[label setText: [NSString stringWithFormat: @"%.1f µT", vlength(mag)]];
126
- (void) accelerometer: (UIAccelerometer *) accelerometer didAccelerate: (UIAcceleration*) acceleration
128
v3 v = { [acceleration x], [acceleration y], [acceleration z] };
132
double ffactor = 0.02;
134
acc = vnormalize(vadd(vmul(acc, 1.0-ffactor), vmul(v, ffactor)));
137
// v3 up = vnormalize(vnegate(acc));
139
//v3 oldForward = {baseCompassTransform.a[4], baseCompassTransform.a[5], baseCompassTransform.a[6]};
140
v3 oldForward = mtransformdir3(baseCompassTransform, cvfp);
142
m16 newBaseCompassTransform = computeAlignedBasesFromDownVector2(acc, oldForward);
144
m16 newRawBaseTransform = computeAlignedBasesFromDownVector2(v, oldForward);
146
cvfp = mtransformdir3(baseCompassTransform, cvfp);
147
cvfp = mtransformdir3(mtranspose(newBaseCompassTransform), cvfp);
149
cvfp = vnormalize(cvfp);
151
baseCompassTransform = newBaseCompassTransform;
152
rawBaseTransform = newRawBaseTransform;
155
- (IBAction) toggleCamera: (id) sender
157
UIBarButtonItemStyle style = [sender style];
159
if (style != UIBarButtonItemStyleDone)
162
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
165
//[compassViewController.view removeFromSuperview];
168
[self.view setBackgroundColor: [UIColor clearColor]];
169
[glView setBackgroundColor: [UIColor clearColor]];
171
self.view.layer.opaque = NO;
172
glView.layer.opaque = NO;
174
[glView.layer setOpacity: 0.5f];
177
imagePicker = [[UIImagePickerController alloc] init];
179
[imagePicker setSourceType: UIImagePickerControllerSourceTypeCamera];
180
[imagePicker setDelegate: self];
181
[imagePicker setShowsCameraControls: NO];
183
[self.view setFrame: CGRectMake(0.0f,0.0f, 320.0f, 480.0f)];
185
[imagePicker setCameraOverlayView: self.view];
188
[self presentModalViewController: imagePicker animated: NO];
190
//[self.view setFrame: [[self.view superview] bounds]];
192
// [viewpointButton setEnabled: NO];
194
[sender setStyle: UIBarButtonItemStyleDone];
199
CALayer *eaglLayer = glView.layer;
201
[self.view setBackgroundColor: [UIColor blackColor]];
202
[glView setBackgroundColor: [UIColor clearColor]];
204
eaglLayer.opaque = YES;
206
[self.view setAlpha: 1.0f];
208
[self dismissModalViewControllerAnimated: NO];
210
[window addSubview: [self view]];
211
[self.view setFrame: [[self.view superview] bounds]];
213
// [viewpointButton setEnabled: YES];
215
[sender setStyle: UIBarButtonItemStyleBordered];
228
@synthesize baseCompassTransform, compassDiskTransform;