219 lines
8.4 KiB
C#
219 lines
8.4 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace Hytera_SOC
|
|||
|
{
|
|||
|
class GPSconvertor
|
|||
|
{
|
|||
|
public string GPSmsg_str = "";
|
|||
|
public GPSconvertor(int radioID, byte[] pbPayload, int size, int start, int poll, string gw_id)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
int idx = start;
|
|||
|
|
|||
|
//gps status Data valid bit(A/V)
|
|||
|
char gps_status = (char)pbPayload[idx];
|
|||
|
Console.WriteLine("gps_status: {0}", gps_status);
|
|||
|
idx++;
|
|||
|
//gps time Greenwich time,Hour/minute/second occupy 2bytes each
|
|||
|
int gps_h = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
int gps_m = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
int gps_s = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
//Console.WriteLine("time {0}:{1}:{2}", gps_h, gps_m, gps_s);
|
|||
|
//gps date Day/month/year occupy 2 bytes each,
|
|||
|
int gps_d = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
int gps_mon = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
int gps_y = (pbPayload[idx] - 0x30) * 10 + (pbPayload[idx + 1] - 0x30);
|
|||
|
idx += 2;
|
|||
|
//Console.WriteLine("date {0}/{1}/{2}", gps_d, gps_mon, gps_y);
|
|||
|
//gps northsouth N:North S:South
|
|||
|
string gps_northsouth = ((char)pbPayload[idx]).ToString();
|
|||
|
idx++;
|
|||
|
//std::cout<<"gps_northsouth:"<<gps_northsouth<<endl;
|
|||
|
//gps latitude Latitude Format: DDFF.FFFF
|
|||
|
string lat = "";
|
|||
|
for (int i = 0; i < 9; i++)
|
|||
|
{
|
|||
|
lat += ((char)pbPayload[idx + i]).ToString();
|
|||
|
}
|
|||
|
idx += 9;
|
|||
|
//_cprintf("gps latitude: \n",lat);
|
|||
|
//gps_eastwest E:East,W:West
|
|||
|
string gps_eastwest = ((char)pbPayload[idx]).ToString();
|
|||
|
idx++;
|
|||
|
//std::cout<<"gps_eastwest:"<<gps_eastwest<<endl;
|
|||
|
//gps_longitude Latitude Format: DDDFF.FFFF
|
|||
|
string lng = "";
|
|||
|
for (int i = 0; i < 10; i++)
|
|||
|
{
|
|||
|
lng += ((char)pbPayload[idx + i]).ToString();
|
|||
|
}
|
|||
|
idx += 10;
|
|||
|
//gps speed
|
|||
|
string speed = "";
|
|||
|
for (int i = 0; i < 3; i++)
|
|||
|
{
|
|||
|
speed += ((char)pbPayload[idx + i]).ToString();
|
|||
|
//Console.WriteLine("spd:" + ((char)pbPayload[idx + i]).ToString());
|
|||
|
}
|
|||
|
idx += 3;
|
|||
|
Console.WriteLine("speed:" + speed);
|
|||
|
|
|||
|
// add by bigu for system with are not English
|
|||
|
string decimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
|
|||
|
if (decimalSeparator == ",") speed = speed.Replace('.', ',');
|
|||
|
try
|
|||
|
{
|
|||
|
speed = Convert.ToString((Int32)Math.Round(Convert.ToDouble(speed) * (Double)1.85));
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine("Error on conver Speed:\n\r" + ex.ToString());
|
|||
|
}
|
|||
|
|
|||
|
DateTime dt = DateTime.Now;
|
|||
|
if (Hytera_GW.cfg.useRadioTime)
|
|||
|
if (gps_status == 'A') dt = new DateTime(gps_y + 2000, gps_mon, gps_d, gps_h, gps_m, gps_s);
|
|||
|
string strTime = DateTo70Format(dt).ToString();
|
|||
|
|
|||
|
string lat_str = ProcessGPSLat(lat, gps_northsouth).ToString();
|
|||
|
string lng_str = ProcessGPSLong(lng, gps_eastwest).ToString();
|
|||
|
//send to message bus
|
|||
|
string msgOPcode = "131";
|
|||
|
if (poll == 1) msgOPcode = "231";
|
|||
|
|
|||
|
GPSmsg_str = "#" + gw_id + "." + DateTo70Format(dt) + "#" + msgOPcode + "#"
|
|||
|
+ radioID + "#" + strTime + "#" +
|
|||
|
speed + "#" + lat_str + "#" + lng_str + "#";
|
|||
|
|
|||
|
int len2 = GPSmsg_str.Length + 1;
|
|||
|
len2 = len2 + ((len2).ToString()).Length;
|
|||
|
GPSmsg_str = "#" + len2.ToString() + GPSmsg_str;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine("GPSconvertor ERROR:\n\r" + ex.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
float ProcessGPSLat(String latitude, String lat_dir)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
long LAT, LAT2;
|
|||
|
char LAT3;
|
|||
|
long llat, grade, zec;
|
|||
|
char[] param = new char[50];
|
|||
|
String[] latList;
|
|||
|
float flat;
|
|||
|
|
|||
|
param = lat_dir.ToCharArray();
|
|||
|
if (param[0] != 'N' && param[0] != 'S')
|
|||
|
return 0;
|
|||
|
|
|||
|
//Console.WriteLine("Latitude " + latitude + " dir " + lat_dir);
|
|||
|
|
|||
|
latList = latitude.Split('.');
|
|||
|
LAT = Convert.ToInt32(latList[0]);
|
|||
|
if (latList[1].Length > 4)
|
|||
|
latList[1] = latList[1].Remove(4);
|
|||
|
LAT2 = Convert.ToInt32(latList[1]);
|
|||
|
LAT3 = param[0];
|
|||
|
|
|||
|
// process the lat and lng for display
|
|||
|
grade = (LAT / 100L);
|
|||
|
zec = (LAT % 100L) * 1000L + LAT2 / 10; // get MMMMM*1000, from MM.mmmmm by MM*1000+mmm (0-59999)
|
|||
|
zec = (zec * 100L) / 60L; // translate MMMMM*1000 to DD * 100 * 1000 (0-99998)
|
|||
|
grade = grade * 100000 + zec; // translate all to DDddddd
|
|||
|
llat = grade;
|
|||
|
|
|||
|
flat = (float)llat / 100000;
|
|||
|
|
|||
|
if (param[0] == 'S')
|
|||
|
flat = -flat;
|
|||
|
|
|||
|
if (flat < -90 || flat > 90)
|
|||
|
{
|
|||
|
Console.WriteLine("[warning \"overflow lat\": flat={0} llat={1}]",
|
|||
|
flat, llat);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return flat;
|
|||
|
}
|
|||
|
catch (Exception ee)
|
|||
|
{
|
|||
|
Console.WriteLine("Error in ProcessGPSLat" + ee.ToString());
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
float ProcessGPSLong(String longitude, String lng_dir)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
long LNG, LNG2;
|
|||
|
char LNG3;
|
|||
|
long llng, grade, zec;
|
|||
|
char[] param = new char[50];
|
|||
|
String[] lngList;
|
|||
|
float flong;
|
|||
|
|
|||
|
param = lng_dir.ToCharArray();
|
|||
|
if (param[0] != 'E' && param[0] != 'W')
|
|||
|
return 0;
|
|||
|
|
|||
|
lngList = longitude.Split('.');
|
|||
|
LNG = Convert.ToInt32(lngList[0]);
|
|||
|
if (lngList[1].Length > 4)
|
|||
|
lngList[1] = lngList[1].Remove(4);
|
|||
|
LNG2 = Convert.ToInt32(lngList[1]);
|
|||
|
LNG3 = param[0];
|
|||
|
|
|||
|
grade = LNG / 100; // get DD (0-90)
|
|||
|
zec = (LNG % 100L) * 1000L + LNG2 / 10; // get MMMMM*1000, from MM.mmmmm by MM*1000+mmm (0-59999)
|
|||
|
zec = (zec * 100L) / 60L; // translate MMMMM*1000 to DD * 100 * 1000 (0-99998)
|
|||
|
grade = grade * 100000 + zec; // translate all to DDddddd
|
|||
|
llng = grade;
|
|||
|
|
|||
|
flong = (float)llng / 100000;
|
|||
|
|
|||
|
if (param[0] == 'W')
|
|||
|
flong = -flong;
|
|||
|
|
|||
|
if (flong < -180 || flong > 180)
|
|||
|
{
|
|||
|
Console.WriteLine("[warning \"overflow lng\": flng={0} llng={1}]",
|
|||
|
flong, llng);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return flong;
|
|||
|
}
|
|||
|
catch (Exception ee)
|
|||
|
{
|
|||
|
Console.WriteLine("Error in ProcessGPSLong" + ee.ToString());
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
uint DateTo70Format(DateTime param)
|
|||
|
{
|
|||
|
long nOfSeconds;
|
|||
|
//Console.WriteLine("DateTo70Format param=" + param);
|
|||
|
System.DateTime dt70 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|||
|
TimeSpan span = param - dt70;
|
|||
|
nOfSeconds = (long)span.TotalSeconds;
|
|||
|
return ((uint)nOfSeconds);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|