FMCPlanner2/FMC Planner 2/NavDataParser.m

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