Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 205 → Rev 206

/DUBwise/trunk/shared/src/MKGPSPosition.java
0,0 → 1,419
/*********************************************
*
* class representing the DebugData Structure
*
* Author: Marcus -LiGi- Bueschleb
*
* see README for further Infos
*
* Some code taken from here:
* http://www.koders.com/java/fidFC75A641A87B51BB757E9CD3136C7886C491487F.aspx
*
* and
* http://www.movable-type.co.uk/scripts/latlong.html
*
* thanx a lot for sharing!
*
********************************************/
 
package org.ligi.ufo;
 
 
import java.lang.Math;
public class MKGPSPosition
{
public final byte GPS_FORMAT_DECIMAL=0;
public final byte GPS_FORMAT_MINSEC=1;
public final byte GPS_FORMAT_COUNT=2;
 
byte act_gps_format=GPS_FORMAT_DECIMAL;
 
public final static int MAX_WAYPOINTS=100;
 
public int[] LongWP;
public int[] LatWP;
public String[] NameWP;
 
int UBatt;
 
public int last_wp=0;
 
public int Longitude;
public int Latitude;
public int Altitude;
 
public int TargetLongitude;
public int TargetLatitude;
public int TargetAltitude;
 
public int HomeLongitude;
public int HomeLatitude;
public int HomeAltitude;
 
public int Distance2Target;
public int Angle2Target;
 
public int Distance2Home;
public int Angle2Home;
 
public byte SatsInUse=-1;
public byte WayPointNumber=-1;
public byte WayPointIndex=-1;
public int AngleNick = -1;
public int AngleRoll = -1;
public int SenderOkay = -1;
public int MKFlags= -1;
public int NCFlags= -1;
public int ErrorCode= -1;
 
 
 
public int Altimeter=-1; // hight according to air pressure
public int Variometer=-1; // climb(+) and sink(-) rate
public int FlyingTime=-1;
 
public int GroundSpeed=-1;
public int Heading=-1;
public int CompasHeading=-1;
 
 
 
//#if cldc11=="on"
public static final double PI = Math.PI;
public static final double PI_div2 = PI / 2.0;
public static final double PI_div4 = PI / 4.0;
public static final double RADIANS = PI / 180.0;
public static final double DEGREES = 180.0 / PI;
 
private static final double p4 = 0.161536412982230228262e2;
private static final double p3 = 0.26842548195503973794141e3;
private static final double p2 = 0.11530293515404850115428136e4;
private static final double p1 = 0.178040631643319697105464587e4;
private static final double p0 = 0.89678597403663861959987488e3;
private static final double q4 = 0.5895697050844462222791e2;
private static final double q3 = 0.536265374031215315104235e3;
private static final double q2 = 0.16667838148816337184521798e4;
private static final double q1 = 0.207933497444540981287275926e4;
private static final double q0 = 0.89678597403663861962481162e3;
 
 
 
private static double _ATAN(double X)
{
if (X < 0.414213562373095048802)
return _ATANX(X);
else if (X > 2.414213562373095048802)
return PI_div2 - _ATANX(1.0 / X);
else
return PI_div4 + _ATANX((X - 1.0) / (X + 1.0));
}
 
 
private static double _ATANX(double X)
{
double XX = X * X;
return X * ((((p4 * XX + p3) * XX + p2) * XX + p1) * XX + p0)/ (((((XX + q4) * XX + q3) * XX + q2) * XX + q1) * XX + q0);
}
 
 
 
public double aTan2(double Y, double X)
{
 
if (X == 0.0) {
if (Y > 0.0)
return PI_div2;
else if (Y < 0.0)
return -PI_div2;
else
return 0.0;
}
 
// X<0
else if (X < 0.0) {
if (Y >= 0.0)
return (PI - _ATAN(Y / -X)); // Y>=0,X<0 |Y/X|
else
return -(PI - _ATAN(Y / X)); // Y<0,X<0 |Y/X|
}
 
// X>0
else if (X > 0.0)
{
if (Y > 0.0)
return _ATAN(Y / X);
else
return -_ATAN(-Y / X);
}
 
return 0.0;
 
}
 
public int distance2wp(int id)
{
double lat1=(Latitude/10000000.0)*RADIANS;
double long1=(Longitude/10000000.0)*RADIANS;
 
double lat2=(LatWP[id]/10000000.0)*RADIANS;
double long2=(LongWP[id]/10000000.0)*RADIANS;
 
 
double dLat= (lat2-lat1);
double dLon= (long2-long1);
 
double a = Math.sin(dLat/2.0) * Math.sin(dLat/2.0) +
Math.cos(lat1) * Math.cos(lat2) *
Math.sin(dLon/2.0) * Math.sin(dLon/2.0);
 
return (int)(( 2.0 * aTan2(Math.sqrt(a), Math.sqrt(1.0-a)) )*6371008.8);
}
 
 
 
 
public int angle2wp(int id)
{
// TODO reuse from distance
double lat1=(Latitude/10000000.0)*RADIANS;
double long1=(Longitude/10000000.0)*RADIANS;
 
double lat2=(LatWP[id]/10000000.0)*RADIANS;
double long2=(LongWP[id]/10000000.0)*RADIANS;
 
 
double dLat= (lat2-lat1);
double dLon= (long2-long1);
 
 
double y = Math.sin(dLon) * Math.cos(lat2);
double x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
return ((int)(aTan2(y, x)*DEGREES)+360)%360;
 
}
 
 
//#endif
 
//#if cldc11!="on"
//# public int distance2wp(int id)
//# {
//# return -1;
//# }
 
//# public int angle2wp(int id)
//# {
//# return -1;
//# }
//#endif
 
public void push_wp()
{
LongWP[last_wp]=Longitude;
LatWP[last_wp]=Latitude;
 
last_wp++;
}
 
public void next_gps_format()
{
act_gps_format=(byte)((act_gps_format+1)%GPS_FORMAT_COUNT);
}
 
public String act_gps_format_str(int val)
{
switch(act_gps_format)
{
case GPS_FORMAT_DECIMAL:
return "" + val/10000000 + "." +val%10000000 ;
case GPS_FORMAT_MINSEC:
return "" + val/10000000 + "^" + ((val%10000000)*60)/10000000 + "'" + ((((val%10000000)*60)%10000000)*60)/10000000 + "." + ((((val%10000000)*60)%10000000)*60)%10000000;
default:
return "invalid format";
}
}
 
public String WP_Latitude_str(int id)
{
return act_gps_format_str(LatWP[id]); //+ "''N" ;
}
 
public String WP_Longitude_str(int id)
{
return act_gps_format_str(LongWP[id]); //+ "''E" ;
 
}
 
public String Latitude_str()
{
return act_gps_format_str(Latitude) ;
}
 
public String Longitude_str()
{
return act_gps_format_str(Longitude) ;
 
}
 
 
public String TargetLatitude_str()
{
return act_gps_format_str(TargetLatitude) ;
}
 
public String TargetLongitude_str()
{
return act_gps_format_str(TargetLongitude) ;
}
 
public String HomeLatitude_str()
{
return act_gps_format_str(HomeLatitude) ;
}
 
public String HomeLongitude_str()
{
return act_gps_format_str(HomeLongitude) ;
}
 
 
 
 
// Constructor
public MKGPSPosition()
{
 
LongWP=new int[MAX_WAYPOINTS];
LatWP=new int[MAX_WAYPOINTS];
 
NameWP=new String[MAX_WAYPOINTS];
// predefined waypoints
 
/*
LongWP[0]=123230170;
LatWP[0]= 513600170 ;
NameWP[0]="Sicherer PC1";
 
LongWP[1]=123269000;
LatWP[1]= 513662670;
NameWP[1]="Sicherer PC2";
 
LongWP[2]=123475570;
LatWP[2]= 513569750 ;
NameWP[2]="Treffpunkt Seba";
*/
 
last_wp=0;
}
 
private int parse_arr_4(int offset,int[] in_arr)
{
return ((in_arr[offset+3]<<24) |
(in_arr[offset+2]<<16) |
(in_arr[offset+1]<<8) |
(in_arr[offset+0]));
}
 
 
private int parse_arr_2(int offset,int[] in_arr)
{
return ((in_arr[offset+1]<<8) |
(in_arr[offset+0]));
}
 
 
 
public void set_by_mk_data(int[] in_arr,MKVersion version)
{
Longitude=parse_arr_4(0,in_arr);
Latitude=parse_arr_4(4,in_arr);
Altitude=parse_arr_4(8,in_arr);
//status=in_arr[12];
 
TargetLongitude=parse_arr_4(13,in_arr);
TargetLatitude=parse_arr_4(17,in_arr);
TargetAltitude=parse_arr_4(21,in_arr);
//Targetstatus=in_arr[25];
 
Distance2Target=parse_arr_2(26,in_arr);
Angle2Target=parse_arr_2(28,in_arr);
 
HomeLongitude=parse_arr_4(30,in_arr);
HomeLatitude=parse_arr_4(34,in_arr);
HomeAltitude=parse_arr_4(38,in_arr);
//Targetstatus=in_arr[42];
 
Distance2Home=parse_arr_2(43,in_arr);
Angle2Home=parse_arr_2(45,in_arr);
 
WayPointIndex=(byte)in_arr[47];
WayPointNumber=(byte)in_arr[48];
 
SatsInUse=(byte)in_arr[49];
Altimeter=parse_arr_2(50,in_arr); // hight according to air pressure
Variometer=parse_arr_2(52,in_arr);; // climb(+) and sink(-) rate
FlyingTime=parse_arr_2(54,in_arr);;
UBatt= in_arr[56];
 
GroundSpeed= parse_arr_2(57,in_arr);
Heading= parse_arr_2(59,in_arr);
CompasHeading= parse_arr_2(61,in_arr);
AngleNick = in_arr[63];
AngleRoll = in_arr[64];
SenderOkay = in_arr[65];
 
MKFlags=in_arr[66];
NCFlags=in_arr[67];
 
ErrorCode=in_arr[67];
 
 
// ground_speed 54 / 55
/*
if (version.compare(0,11)==version.VERSION_PREVIOUS)
{
 
TargetLongitude=parse_arr(8,in_arr);
TargetLatitude=parse_arr(12,in_arr);
Distance2Target=parse_arr(16,in_arr);
Angle2Target=parse_arr(20,in_arr);
Used_Sat=(byte)in_arr[24];
}
else
{
 
Longitude=parse_arr(0,in_arr);
Latitude=parse_arr(4,in_arr);
 
TargetLongitude=parse_arr(13,in_arr);
TargetLatitude=parse_arr(17,in_arr);
 
Distance2Target=-23 ; //parse_arr(16,in_arr);
Angle2Target=parse_arr(20,in_arr);
 
WayPointNumber=-1;
WayPointIndex=-1;
Used_Sat=(byte)in_arr[24];
 
 
 
}
*/
}
 
 
 
}