| 
					
				 | 
			
			
				@@ -20,6 +20,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/database/adatabase.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/classes/asettings.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/opl.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/functions/atime.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using namespace ACalc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -136,7 +137,10 @@ double ACalc::greatCircleDistanceBetweenAirports(const QString &dept, const QStr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 QVector<QVector<double>> ACalc::intermediatePointsOnGreatCircle(double lat1, double lon1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                double lat2, double lon2, int tblk) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double d = greatCircleDistance(lat1, lon1, lat2, lon2); //Calculate distance (radians) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double d = greatCircleDistance(lat1, lon1, lat2, lon2); //Calculate distance (Haversine) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // where d is the great circle distance in radians, to get KM take * 6371 (radius of earth). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //DEB << "Distance (nm): " << (d*6371.0088) * 0.5399568; // km->nm = *0.54 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Converting Latitude and Longitude to Radians 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lat1 = degToRad(lat1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lon1 = degToRad(lon1); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,8 +161,8 @@ QVector<QVector<double>> ACalc::intermediatePointsOnGreatCircle(double lat1, dou 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         double lat = atan2(z, sqrt( pow(x, 2) + pow(y, 2) )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         double lon = atan2(y, x); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QVector<double> coordinate = {lat, lon}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        coordinates.append(coordinate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QVector<double> coordinate = {radToDeg(lat), radToDeg(lon)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        coordinates.prepend(coordinate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return coordinates; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -166,8 +170,7 @@ QVector<QVector<double>> ACalc::intermediatePointsOnGreatCircle(double lat1, dou 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 double ACalc::solarElevation(QDateTime utc_time_point, double lat, double lon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double Alt = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        11; // I am taking 11 kilometers as an average cruising height for a commercial passenger airplane. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double Alt = 11; // Assuming 11 kilometers as an average cruising height for a commercial passenger airplane. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // convert current DateTime Object to a J2000 value used in the Calculation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     double d = utc_time_point.date().toJulianDay() - 2451544 + utc_time_point.time().hour() / 24.0 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                utc_time_point.time().minute() / 1440.0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -213,7 +216,7 @@ double ACalc::solarElevation(QDateTime utc_time_point, double lat, double lon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     double HA = (sid_time * 15 - RA); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // convert to rectangular coordinate system 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = cos(HA * (M_PI / 180)) * cos(delta * (M_PI / 180)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    y = sin(HA * (M_PI / 180)) * cos(delta * (M_PI / 180)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //y = sin(HA * (M_PI / 180)) * cos(delta * (M_PI / 180)); //value of y not needed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     double z = sin(delta * (M_PI / 180)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // rotate this along an axis going east - west. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     double zhor = x * sin((90 - lat) * (M_PI / 180)) + z * cos((90 - lat) * (M_PI / 180)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -224,7 +227,7 @@ double ACalc::solarElevation(QDateTime utc_time_point, double lat, double lon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-int ACalc::calculateNightTime(const QString &dept, const QString &dest, QDateTime departureTime, int tblk, int nightAngle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int ACalc::calculateNightTime(const QString &dept, const QString &dest, QDateTime departureTime, int tblk, int night_angle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const QString statement = QLatin1String("SELECT lat, long FROM airports WHERE icao = '") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -233,23 +236,37 @@ int ACalc::calculateNightTime(const QString &dept, const QString &dest, QDateTim 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             + QLatin1String("'"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     auto lat_lon = aDB->customQuery(statement, 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (lat_lon.length() != 4) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double dept_lat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double dept_lon; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double dest_lat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double dest_lon; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int night_time = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (lat_lon.length() == 4) { // normal flight from A to B 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dept_lat = lat_lon[0].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dept_lon = lat_lon[1].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dest_lat = lat_lon[2].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dest_lon = lat_lon[3].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else if (lat_lon.length() == 2 ) { // Dept == Dest, i.e. local flight 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int i = 0; i < tblk; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dept_lat = lat_lon[0].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dept_lon = lat_lon[1].toDouble(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (solarElevation(departureTime.addSecs(60 * i), dept_lat, dept_lon) < night_angle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                night_time++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return night_time; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DEB << "Invalid input. Aborting."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double dept_lat = degToRad(lat_lon[0].toDouble()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double dept_lon = degToRad(lat_lon[1].toDouble()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double dest_lat = degToRad(lat_lon[2].toDouble()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double dest_lon = degToRad(lat_lon[3].toDouble()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     QVector<QVector<double>> route = intermediatePointsOnGreatCircle(dept_lat, dept_lon, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                      dest_lat, dest_lon, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                      tblk); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    int night_time = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (int i = 0; i < tblk ; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (solarElevation(departureTime.addSecs(60 * i), radToDeg(route[i][0]), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                           radToDeg(route[i][1])) < nightAngle) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (solarElevation(departureTime.addSecs(60 * i), route[i][0], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           route[i][1]) < night_angle) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             night_time ++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -306,19 +323,19 @@ void ACalc::updateAutoTimes(int acft_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 && acft_data.value(Opl::Db::TAILS_MULTIENGINE) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             DEB << "SPSE"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             flight_data.insert(Opl::Db::FLIGHTS_TSPSE, flight_data.value(Opl::Db::FLIGHTS_TBLK)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TMP, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TMP, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else if ((acft_data.value(Opl::Db::TAILS_MULTIPILOT) == 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     && acft.getData().value(Opl::Db::TAILS_MULTIENGINE) == 1)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             DEB << "SPME"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             flight_data.insert(Opl::Db::FLIGHTS_TSPME, flight_data.value(Opl::Db::FLIGHTS_TBLK)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TMP, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TMP, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else if ((acft_data.value(Opl::Db::TAILS_MULTIPILOT) == 1)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             DEB << "MPME"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             flight_data.insert(Opl::Db::FLIGHTS_TMP, flight_data.value(Opl::Db::FLIGHTS_TBLK)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QStringLiteral("")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         flight.setData(flight_data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         aDB->commit(flight); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -359,4 +376,3 @@ void ACalc::updateNightTimes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         aDB->commit(flt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 |