public PositioningInformation(string result, PositionDisplayFormatMode mode) { FormatMode = mode; switch (mode) { case PositionDisplayFormatMode.LongLatLong: { //+QGPSLOC: <UTC>,<latitude>,<longitude>,<hdop>,<altitude>,<fix>,<cog>,<spkm>,<spkn>,<date>,<nsat> var regex = Regex.Match(result, @"\+QGPSLOC: (\d+.\d+),(\d+.\d+),(.),(\d+.\d+),(.),(\d+.\d+),(\d+.\d+),(\d),(\d+.\d+),(\d+.\d+),(\d+.\d+),(\d+),(\d+)"); if (regex.Groups.Count < 13) { throw new Exception("Invalid result from QGPSLOC: " + result); } //[1] is time (in UTC) Latitude = double.Parse(regex.Groups[2].Value); Longitude = double.Parse(regex.Groups[4].Value); HorizontalPrecision = double.Parse(regex.Groups[6].Value); Altitude = double.Parse(regex.Groups[7].Value); Fix = int.Parse(regex.Groups[8].Value); Cog = double.Parse(regex.Groups[9].Value); SpeedKM = double.Parse(regex.Groups[10].Value); SpeedKnots = double.Parse(regex.Groups[11].Value); //[12] is date (in UTC) NumSattelites = int.Parse(regex.Groups[13].Value); Date = DateTime.ParseExact(regex.Groups[1].Value + " " + regex.Groups[12].Value, "HHmmss.f ddMMyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } break; case PositionDisplayFormatMode.PositiveNegativeLatLong: { var regex = Regex.Match(result, @"\+QGPSLOC: (\d+.\d+),(-?\d+.\d+),(-?\d+.\d+),(\d+.\d+),(\d+.\d+),(\d),(\d+.\d+),(\d+.\d+),(\d+.\d+),(\d+),(\d+)"); if (regex.Groups.Count < 11) { throw new Exception("Invalid result from QGPSLOC: " + result); } //[1] is time (in UTC) Latitude = double.Parse(regex.Groups[2].Value); Longitude = double.Parse(regex.Groups[3].Value); HorizontalPrecision = double.Parse(regex.Groups[4].Value); Altitude = double.Parse(regex.Groups[5].Value); Fix = int.Parse(regex.Groups[6].Value); Cog = double.Parse(regex.Groups[7].Value); SpeedKM = double.Parse(regex.Groups[8].Value); SpeedKnots = double.Parse(regex.Groups[9].Value); NumSattelites = int.Parse(regex.Groups[11].Value); Date = DateTime.ParseExact(regex.Groups[1].Value + " " + regex.Groups[10].Value, "HHmmss.f ddMMyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); } break; default: throw new NotImplementedException(); } }
///// <summary> ///// TODO: document ///// </summary> ///// <param name="deleteType"></param> //public void DeleteGNSSAssistanceData(int deleteType) //{ // SendATCommand("AT+QGPSDEL=" + deleteType); //} public async Task <PositioningInformation> GetGNSSPositionAsync(PositionDisplayFormatMode mode = PositionDisplayFormatMode.PositiveNegativeLatLong) { var result = await SendATCommandAsync(new ATCommandWithReply("AT+QGPSLOC=" + (int)mode, "+QGPSLOC: ")); result.Result.ThrowIfError(); var response = new PositioningInformation(result.Response, mode); return(response); }