// // NavDataParser.m // FMC Planner 2 // // Created by Kilian Hofmann on 13.04.16. // Copyright © 2016 Kilian Hofmann. All rights reserved. // #import "NavDataParser.h" @implementation NavDataParser NSString *const Airways = @"NAVDATA/awys.txt"; NSString *const Intersections = @"NAVDATA/ints.txt"; NSString *const Navaids = @"NAVDATA/navs.txt"; - (instancetype)initWithHandler:(void (^)(void))handler { self = [super init]; self.parserReady = false; self.notActive = false; // Load Navaids NSArray *temp = [[NSString stringWithContentsOfFile:[SharedDeclerations savePathForFile:Navaids] encoding:NSASCIIStringEncoding error:nil] componentsSeparatedByString:@"\r\n"]; self.navaids = [[NSMutableDictionary alloc] init]; for (NSString *str in temp) { if (str.length > 0 && ![[str substringToIndex:1] isEqualToString:@";"]) { if ((self.navaids)[[str substringToIndex:5]] != nil) { // Item exists, make array and set that. NSMutableArray *temp2 = [[NSMutableArray alloc] init]; [temp2 addObject:[str substringFromIndex:10]]; if ([(self.navaids)[[str substringToIndex:5]] isKindOfClass:[NSArray class]]) { [temp2 addObjectsFromArray:(self.navaids)[ [str substringToIndex:5]]]; } else { [temp2 addObject:(self.navaids)[[str substringToIndex:5]]]; } [self.navaids setValue:temp2 forKey:[str substringToIndex:5]]; } else { [self.navaids setValue:[str substringFromIndex:10] forKey:[str substringToIndex:5]]; } } } // Load Intersections temp = [[NSString stringWithContentsOfFile:[SharedDeclerations savePathForFile:Intersections] encoding:NSASCIIStringEncoding error:nil] componentsSeparatedByString:@"\r\n"]; self.intersections = [[NSMutableDictionary alloc] init]; for (NSString *str in temp) { if (str.length > 0 && ![[str substringToIndex:1] isEqualToString:@";"]) { if ((self.intersections)[[str substringToIndex:5]] != nil) { // Item exists, make array and set that. NSMutableArray *temp2 = [[NSMutableArray alloc] init]; [temp2 addObject:[str substringFromIndex:10]]; if ([(self.intersections)[[str substringToIndex:5]] isKindOfClass:[NSArray class]]) { [temp2 addObjectsFromArray:(self.intersections)[ [str substringToIndex:5]]]; } else { [temp2 addObject:(self.intersections)[ [str substringToIndex:5]]]; } [self.intersections setValue:temp2 forKey:[str substringToIndex:5]]; } else { [self.intersections setValue:[str substringFromIndex:10] forKey:[str substringToIndex:5]]; } } } // Load Airways temp = [[NSString stringWithContentsOfFile:[SharedDeclerations savePathForFile:Airways] encoding:NSASCIIStringEncoding error:nil] componentsSeparatedByString:@"\r\n"]; self.airways = [[NSMutableDictionary alloc] init]; for (NSString *str in temp) { if (str.length > 0 && ![[str substringToIndex:1] isEqualToString:@";"]) { if ((self.airways)[[str substringToIndex:5]] != nil) { // Item exists, make array and set that. NSMutableArray *temp2 = [[NSMutableArray alloc] init]; [temp2 addObject:[str substringFromIndex:8]]; if ([(self.airways)[[str substringToIndex:5]] isKindOfClass:[NSArray class]]) { [temp2 addObjectsFromArray:(self.airways)[ [str substringToIndex:5]]]; } else { [temp2 addObject:(self.airways)[[str substringToIndex:5]]]; } [self.airways setValue:temp2 forKey:[str substringToIndex:5]]; } else { [self.airways setValue:[str substringFromIndex:8] forKey:[str substringToIndex:5]]; } } } if (self.navaids.count == 0 || self.intersections.count == 0 || self.airways.count == 0) { self.notActive = true; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ handler(); }]; } self.parserReady = true; return self; } #pragma mark - Search for elements in normal route entry /** * Find the given airway in both files, returns Array if found * @param airway */ - (NSArray *)findAirway:(NSString *)airway { if ([airway isEqualToString:@"DIRECT"]) { return @[ @"OK" ]; } NSMutableArray *array = [[NSMutableArray alloc] init]; for (int i = (int)airway.length; i < 5; i++) { airway = [airway stringByAppendingString:@" "]; } id airways = _airways[airway]; if (airways != nil) { if ([airways isKindOfClass:[NSArray class]]) { [array addObjectsFromArray:airways]; } else { [array addObject:airways]; } } return array; } /** * Find the given waypoint in both files, returns Array so user can select * @param waypoint */ - (NSArray *)findWaypoint:(NSString *)waypoint { NSMutableArray *array = [[NSMutableArray alloc] init]; for (int i = (int)waypoint.length; i < 5; i++) { waypoint = [waypoint stringByAppendingString:@" "]; } id navaids = _navaids[waypoint]; id intersections = _intersections[waypoint]; if (navaids != nil) { if ([navaids isKindOfClass:[NSArray class]]) { [array addObjectsFromArray:navaids]; } else { [array addObject:navaids]; } } if (intersections != nil) { if ([intersections isKindOfClass:[NSArray class]]) { [array addObjectsFromArray:intersections]; } else { [array addObject:intersections]; } } return array; } - (NSArray *)findWaypoint:(NSString *)waypoint onAirway:(NSString *)airway { NSArray *airwayWaypoints = [self findAirway:airway]; for (int i = (int)waypoint.length; i < 5; i++) { waypoint = [waypoint stringByAppendingString:@" "]; } for (NSString *wpt in airwayWaypoints) { if ([wpt isEqualToString:@"OK"]) { if ([self findWaypoint:waypoint].count > 0) { return @[ @"DIRECT" ]; } return nil; } if ([[wpt substringWithRange:NSMakeRange(5, 5)] isEqualToString:waypoint]) { return airwayWaypoints; } } return nil; } - (NSArray *)findCrosspointBetween:(NSString *)airwayOne and:(NSString *)airwayTwo withStart:(NSString *)waypoint { NSArray *airwayOneArray = [self findAirway:airwayOne]; NSArray *airwayTwoArray = [self findAirway:airwayTwo]; if (airwayOneArray.count < airwayTwoArray.count) { for (int i = 0; i < airwayTwoArray.count; i++) { NSString *waypointTwo = [airwayTwoArray[i] substringWithRange:NSMakeRange(5, 43)]; for (int j = 0; j < airwayOneArray.count; j++) { NSString *waypointOne = [airwayOneArray[j] substringWithRange:NSMakeRange(5, 43)]; if ([waypointOne isEqualToString:waypointTwo]) { return @[ [[waypointTwo substringToIndex:5] stringByReplacingOccurrencesOfString:@" " withString:@""] ]; } } } } else { for (int i = 0; i < airwayOneArray.count; i++) { NSString *waypointOne = [airwayOneArray[i] substringWithRange:NSMakeRange(5, 43)]; for (int j = 0; j < airwayTwoArray.count; j++) { NSString *waypointTwo = [airwayTwoArray[j] substringWithRange:NSMakeRange(5, 43)]; if ([waypointOne isEqualToString:waypointTwo]) { return @[ [[waypointTwo substringToIndex:5] stringByReplacingOccurrencesOfString:@" " withString:@""] ]; } } } } return nil; } @end