252 lines
8.7 KiB
Objective-C
252 lines
8.7 KiB
Objective-C
//
|
|
// 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)init
|
|
{
|
|
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 == nil || self.intersections == nil ||
|
|
self.airways == nil) {
|
|
self.notActive = true;
|
|
}
|
|
|
|
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"]) {
|
|
return @[ @"DIRECT" ];
|
|
}
|
|
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
|