#import "OrientationViewController.h" #import "MessierZoekFormulierViewController.h" #import "NGCZoekFormulierViewController.h" #import #include "Math.h" @implementation OrientationViewController @synthesize alt; @synthesize az; @synthesize objalt; @synthesize objaz; @synthesize latLabel; @synthesize longLabel; @synthesize timeLabel; @synthesize radecinfoLabel; @synthesize objectIDlabel; @synthesize objconstlabel; @synthesize objectlabel; @synthesize objsizeLabel; @synthesize objmagLabel; @synthesize horizvertlabel; @synthesize objnotes; @synthesize objtypeLabel; @synthesize ALTdirectionArrow; @synthesize AZdirectionArrow; @synthesize locatie; double ALT, AZ; NSString *strObjectinfo; - (id) init { self = [super init]; if (self != nil) { } return self; } #pragma mark - #pragma mark UIAccelerometerDelegate - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { double y,z; y = (double)acceleration.y; z =(double) acceleration.z; y=y*-1; if (y>1) y=1; if (y<-1) y=-1; // projected on sphere y = acos(y) ; y = (y / 3.14151927 ) * 180; // y=y-180; // als z negatief is dan is y dat ook. // if (z<0) y=y*-1; // NSLog (@"Z %.2f",z ); // round to 2 digits y= (round(y*100.0)/100.0); if (!isnan(y)) { alt.text=@""; } if (z<0) y=y*-1; if (![self isvertical]) { y=y+90; } else if (isnan(y)) { alt.text=@""; } alt.text = [NSString stringWithFormat:@"%.2f", y]; double delta = ((ALT-y)); if (abs(delta) <= 2 ) { ALTdirectionArrow.image = [UIImage imageNamed:@"bullseye.png"]; // target } else { if (delta > 5) ALTdirectionArrow.image = [UIImage imageNamed:@"up_arrow.png"]; else if (delta < 0) ALTdirectionArrow.image = [UIImage imageNamed:@"down_arrow.png"]; } } #pragma mark - /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; locationController = [[MyCLController alloc] init]; locationController.delegate = self; tabBar.delegate = self; motionManager = [[CMMotionManager alloc] init]; [locationController.locationManager startUpdatingLocation]; [locationController.locationManager startUpdatingHeading]; // Kost wat meer batterij, maar precisie boven alles. locationController.locationManager.desiredAccuracy = kCLLocationAccuracyBest; locationController.locationManager.headingFilter = kCLHeadingFilterNone; UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; accelerometer.delegate = self; // Terugzetten naar 0.5 voor productie! accelerometer.updateInterval = 0.1; // timer voor update / elke 10 seconden backgroundTimer = [NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(convertradectoaltaz) userInfo: nil repeats: YES]; } -(void)viewWillAppear:(BOOL)animated{ strObjectinfo=[MySingleton sharedMySingleton].objectName; if (strObjectinfo==NULL) { strObjectinfo=@"Please choose.."; objalt.text=@""; objaz.text=@""; } objectIDlabel.text=[MySingleton sharedMySingleton].objectkeuze; objectlabel.text=strObjectinfo; [self convertradectoaltaz]; // Laat zien op scherm double ra,dec; ra=[MySingleton sharedMySingleton].rechteklimming; dec=[MySingleton sharedMySingleton].declinatie; NSString *radecstr = [NSString stringWithFormat:@"RA %.2f DEC %.2f", ra, dec]; radecinfoLabel.text= radecstr; objsizeLabel.text=[MySingleton sharedMySingleton].objectSize; objmagLabel.text=[MySingleton sharedMySingleton].objectMagnitude; objnotes.text=[MySingleton sharedMySingleton].objectNotes; objtypeLabel.text=[MySingleton sharedMySingleton].objectType; objconstlabel.text=[MySingleton sharedMySingleton].objectConst; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void) convertradectoaltaz { NSString *strUren; NSString *strMinuten; NSString *strJaar; NSString *strMaand; NSString *strDag; double latit, longit, lst, rechteklimming, declinatie, uurhoek, dag, maand, uren, minuten, maanddagen, dagdagen ; double dagenj2000, dectijd, tijdut; double HARad, DECRad, ALTRad,LatRad, sinALT, cosAZ,AZ11,AZ12,sinAZ,AZ21,AZ22; // initialiseren dagdagen=0; maanddagen=0; // intitialiseren waardes latit=self.locatie.coordinate.latitude; longit=self.locatie.coordinate.longitude; // singleton data gebruiken. rechteklimming=[MySingleton sharedMySingleton].rechteklimming; declinatie=[MySingleton sharedMySingleton].declinatie; /* // DEBUG UITZETTEN! // Test voor M13 rechteklimming=16.695; declinatie=36.46; latit=52.5; longit=-1.91; */ // We werken in UTC NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; [formatter setTimeZone:timeZone]; // Dag grabben [formatter setDateFormat:@"dd"]; strDag= [formatter stringFromDate:self.locatie.timestamp]; // NSLog(@"Dag:% @" ,strDag); // Maand grabben [formatter setDateFormat:@"MM"]; strMaand= [formatter stringFromDate:self.locatie.timestamp]; // NSLog(@"Maand: %@" ,strMaand); // Uren grabben [formatter setDateFormat:@"HH"]; strUren= [formatter stringFromDate:self.locatie.timestamp]; // NSLog(@"Uur: %@" ,strUren); // Minuten grabben [formatter setDateFormat:@"mm"]; strMinuten= [formatter stringFromDate:self.locatie.timestamp]; // Jaar grabben [formatter setDateFormat:@"yyyy"]; strJaar= [formatter stringFromDate:self.locatie.timestamp]; /* // Debug UITZETTEN!! strDag=@"10"; strMaand=@"08"; strUren=@"23"; strMinuten=@"10"; strJaar=@"1998"; */ // Converteer string naar float dag = [strDag doubleValue]; maand = [strMaand doubleValue]; uren = [strUren doubleValue]; minuten = [strMinuten doubleValue]; // Aantal dagen sinds epoch 2000 berekenen // Maak van uren+minuten een decimaal dectijd =uren + (minuten/60); dectijd = dectijd/24; // NSLog(@"Dectijd %.2f", dectijd); // NSLog(@"Latit %.2f, Longit %.2f, RA %.2f,DEC %.2f", latit,longit,rechteklimming,declinatie); // in een array plaatsen! // maanddagen= 31; // Aantal dagen sinds begin van het jaar Augustus in een niet-schrikkeljaar int intMaand = (int) maand; switch(intMaand) { case 1 : maanddagen =0; break; case 2 : maanddagen =31; break; case 3 : maanddagen =59; break; case 4 : maanddagen =90; break; case 5 : maanddagen =120; break; case 6 : maanddagen =151; break; case 7 : maanddagen =181; break; case 8 : maanddagen =212; break; case 9 : maanddagen =243; break; case 10 : maanddagen =273; break; case 11 : maanddagen =304; break; case 12 : maanddagen =334; break; } if ([strJaar isEqual:@"2013"]) dagdagen=4747.5; if ([strJaar isEqual:@"2014"]) dagdagen=5112.5; if ([strJaar isEqual:@"2015"]) dagdagen=5477.5; if ([strJaar isEqual:@"2016"]) { // schrikkeljaar! dagdagen=5842.5; if ([strMaand isEqual:@"01"]) maanddagen=0; if ([strMaand isEqual:@"02"]) maanddagen=31; if([strMaand isEqual:@"03"]) maanddagen=60; if ([strMaand isEqual:@"04"]) maanddagen=91; if ([strMaand isEqual:@"05"]) maanddagen=121; if ([strMaand isEqual:@"06"]) maanddagen=152; if ([strMaand isEqual:@"07"]) maanddagen=182; if([strMaand isEqual:@"08"]) maanddagen=213; if([strMaand isEqual:@"09"]) maanddagen=244; if ([strMaand isEqual:@"10"]) maanddagen=274; if ([strMaand isEqual:@"11"]) maanddagen=305; if ([strMaand isEqual:@"12"]) maanddagen=335; } if ([strJaar isEqual:@"2017"]) dagdagen=6208.5; if ([strJaar isEqual:@"2018"]) dagdagen=6573.5; // optellen en aantal dagen bepalen sinds 01-01-2000 0:00 dagenj2000=dectijd+maanddagen+dag+dagdagen; // NSLog(@"Dagen J2000 %.2f = dectijd %.2f + maanddagen %.2f + dag %.2f + dagdagen %.2f", dagenj2000, dectijd, maanddagen,dag,dagdagen); // Local Siderial Time // UT tijd berekenen tijdut =uren + (minuten/60); lst = 100.46 + 0.985647 * dagenj2000 + longit + 15*tijdut ; // modulusberekening. Cocoa doet alleen INT op modulus lst = lst - (floor(lst/ 360) *360); // Rechteklimming converteren van decimalen naar graden rechteklimming = rechteklimming * 15; // Uurhoek berekenen. Als uurhoek <0 360 erbij optellen. uurhoek = lst - rechteklimming; if (uurhoek<0){ uurhoek=uurhoek+360; } // NSLog(@"Uurhoek %.2f rechteklimming %.2f" ,uurhoek,rechteklimming); // CONVERSIE RA/DEC --> ALTAZ // Converteer graden naar radians; HARad= (uurhoek*M_PI)/180; DECRad = (declinatie*M_PI)/180; LatRad = (latit*M_PI)/180; sinALT = sin(DECRad) * sin(LatRad) + cos(DECRad)* cos(LatRad)* cos(HARad); ALTRad = asin(sinALT) ; ALT = ALTRad * 180/M_PI; cosAZ = (sin(DECRad)* cos(LatRad)- cos(DECRad)*cos(HARad)* sin(LatRad))/ cos(ALTRad) ; AZ11 = (acos(cosAZ)) * 180/M_PI ; AZ12 = 360 - AZ11 ; sinAZ = (-cos(DECRad)*sin(HARad))/cos(ALTRad); AZ21 = (asin(sinAZ)) * 180/M_PI ; if (AZ21 >=0 ) {AZ22 = 180 - AZ21 ;} else { AZ22 = 360 - AZ21 ; } ; if ((abs(AZ11-AZ21) <= 0.0001)||(abs(AZ11-AZ22) <= 0.0001)){ AZ = AZ11 ; }else {AZ = AZ12 ;} // SCHERMOUTPUT strObjectinfo=[MySingleton sharedMySingleton].objectkeuze; objalt.text = [NSString stringWithFormat:@"%.2f", ALT]; objaz.text = [NSString stringWithFormat:@"%.2f", AZ]; if (strObjectinfo==NULL) { objalt.text = @"";//[NSString stringWithFormat:@"%.2f", ALT]; objaz.text =@"";// [NSString stringWithFormat:@"%.2f", AZ]; } // Laat lat en Lon zien op scherm latLabel.text = [NSString stringWithFormat:@"Lat: %.2f", self.locatie.coordinate.latitude]; longLabel.text = [NSString stringWithFormat:@"Lon: %.2f", self.locatie.coordinate.longitude]; // TijdLabel op scherm (terugconverteren naar GMT+1) --> Was een BUG! timeZone = [NSTimeZone systemTimeZone]; [formatter setTimeZone:timeZone]; [formatter setDateFormat:@"HH:mm"]; strUren= [formatter stringFromDate:self.locatie.timestamp]; timeLabel.text= strUren; if (ALT<0) { strObjectinfo=@"Object under horizon"; objalt.text=@"Under"; objaz.text=@"Horizon"; } } - (void)locationUpdate:(CLLocation *)location { self.locatie = location; } - (void)headingUpdate:(CLHeading *)heading { // If the accuracy is valid, process the event. if (heading.headingAccuracy > 0) { az.text = [NSString stringWithFormat:@"%.2f", heading.trueHeading]; double delta = heading.trueHeading - AZ; if (abs(delta) <= 10) { AZdirectionArrow.image = [UIImage imageNamed:@"bullseye.png"]; // target } else { if (delta > 180) AZdirectionArrow.image = [UIImage imageNamed:@"right_arrow.png"]; else if (delta > 0) AZdirectionArrow.image = [UIImage imageNamed:@"left_arrow.png"]; else if (delta > -180) AZdirectionArrow.image = [UIImage imageNamed:@"right_arrow.png"]; else AZdirectionArrow.image = [UIImage imageNamed:@"left_arrow.png"]; } AZdirectionArrow.hidden = NO; } else { AZdirectionArrow.hidden = YES; } } -(BOOL) isvertical { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; BOOL vertical = [defaults boolForKey:@"vertical"]; if (vertical) { return TRUE; } else return FALSE; } - (void)locationError:(NSError *)error { latLabel.text = [error description]; } - (IBAction)infoButtonClick:(id)sender{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"The Orientation window" message:@"Based on your selection, the Altitude and Azimuth are calculated for the object. Now you can point your telescope to the object. The numbers in the telescope position panel and the object panel should match. The arrows are here to help you. Hint: start with horizontal axis (like a compass) alignment, after that align vertically." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [alert show]; } @end