www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - D to C# conversion of GPS Data




string[] parse_gps_data(string data, SysTime start_time, SysTime 
end_time) {
	// Validate input
	string[] gps;
	if (!data.length) {
		error("Empty GPS file");
		return gps;
	}

	auto start_timestamp = start_time.toUnixTime();
	auto end_timestamp = end_time.toUnixTime();

	// Parse every line
	foreach (line; splitLines(data)) {
		// Detect type of line
		auto match = matchFirst(line, GPS_LINE);
		if (!match) {
			// Unknown format
			error("Unknown GPS line: " ~ line);
			continue;
		}

		// Parse time
		auto record_time = SysTime.fromISOExtString(match[1].replace(" 
", "T"));
		auto record_timestamp = record_time.toUnixTime();
		if (record_timestamp < start_timestamp || record_timestamp > 
end_timestamp) {
			// Skip invalid time interval
			error(format(
				"Invalid GPS interval: %d > %d || %d < %d\nLine: %s",
				record_timestamp, start_timestamp, record_timestamp, 
end_timestamp,
				line
			));
			continue;
		}

		// Parse coordinates
		float longitude;
		float latitude;

		if (to!char(match[2]) == 'N') {
			latitude = to!float(match[3]);

			if (to!char(match[4]) == 'W') {
				longitude = to!float(match[5]) * -1;
			}
			else {
				longitude = to!float(match[5]);
			}
		}

		else if (to!char(match[2]) == 'W') {
			longitude = to!float(match[3]) * -1;
			latitude = to!float(match[5]);
		}

		else if (to!char(match[2]) == 'E') {
			longitude = to!float(match[3]);
			latitude = to!float(match[5]);
		}

		// Prepare gps timestamp
		auto record_interval = (record_time - 
start_time).split!("hours", "minutes", "seconds")();
		gps ~= format(
			"('%02d:%02d:%02d', '(%f, %f)'::point)::time_point",
			record_interval.hours, record_interval.minutes, 
record_interval.seconds,
			longitude, latitude
		);
	}

	return gps;
}








So far I have this :



  /// <summary>
         ///
         /// </summary>
         /// <param name="deviceData"></param>
         /// <param name="device"></param>
         /// <returns></returns>
         public string[] ParseGPSData (string deviceData, DateTime 
startTime, DateTime endTime)
         {
             string[] gps = null;

             if (deviceData == string.Empty)
                 return gps;

             var startTimeStamp = startTime.ToUniversalTime ();
             var endTimeStamp = endTime.ToUniversalTime ();


             foreach (var line in Regex.Split(deviceData, "\r\n 
|\r |\n"))
             {
                 var match = _rx.Match(line);
                 if (!match.Success)
                     continue;


                 var recordTime = match.Groups[1].Value.Replace (' 
', 'T');



             }

             return gps;
         }
     }




The constructor for GPS class has this defined :


  public class GPSEngine
     {
         private Regex _rx;

         /// <summary>
         ///
         /// </summary>
         public GPSEngine ()
         {
             _rx = new Regex 
( "^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+(N|W|E)(\d+\.\d+)\s+(N|W|E)(\d+\.\d+)",
                 RegexOptions.Compiled | RegexOptions.IgnoreCase);
         }
May 08 2017