private bool ParseVariables(string[] variables, string[] data, ref MeasMsg measMsg) { try { int dataLen = data.GetLength(0); int varLen = variables.GetLength(0); int loopMaxIndex = Math.Min(dataLen, varLen); //if (dataLen > varLen) // return false; for (var i = 0; i < loopMaxIndex; i++) { if (variables[i].Length > 0) { var meas = new Meas(variables[i], dateTime, data[i], MeasStatus.c*K); measMsg.AddMeas(meas); if (variables[i] == "WSAVG1M") { meas = new Meas("WS", dateTime, data[i], MeasStatus.c*K); measMsg.AddMeas(meas); } else if (variables[i] == "WDAVG1M") { meas = new Meas("WD", dateTime, data[i], MeasStatus.c*K); measMsg.AddMeas(meas); } } } return(true); } catch (Exception ex) { ExceptionHandler.HandleException("WXT.ParseVariables", ex); return(false); } }
private MeasMsg AddCellDepths(NMEAProprietarySentence nmeaSentence, MeasMsg measMsg) { bool cannotCompute = false; const int blankingIndex = 4; const int cellSizeIndex = 5; double blanking = 0; double cellSize = 0; if (!measMsg.GetNumericDoubleObsValueByName(nameDictionary["I"][blankingIndex], out blanking)) { cannotCompute = true; } else if (!measMsg.GetNumericDoubleObsValueByName(nameDictionary["I"][cellSizeIndex], out cellSize)) { cannotCompute = true; } for (int i = 0; i < CellDepthVariables.Count; i++) { string dataValue = "///"; if (!cannotCompute) { double depth = blanking + (i + 1) * cellSize; dataValue = depth.ToString(); } measMsg.AddMeas(CellDepthVariables[i], dataValue.ToString()); } return(measMsg); }
private MeasMsg ParseCellVelocityData(NMEAProprietarySentence nmeaSentence, MeasMsg measMsg) { const int cellIdIndex = 2; const int speedIndex = 6; const int dirIndex = 7; int cell; string cellId = nmeaSentence.parameters[cellIdIndex].ToString(); if (!int.TryParse(cellId, out cell)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.EventLog, StringManager.GetString("Unable to parse Nortec AWAC NMEA message cell id. Received cellId was:") + cellId); return(measMsg); } int index = cell - 1; // Ignore any message from cells which do not have variables defined if (-1 < index && index < CellSpeedVariables.Count) { var dataValue = nmeaSentence.parameters[speedIndex].ToString(); measMsg.AddMeas(CellSpeedVariables[index], dataValue); } if (-1 < index && index < CellDirectionVariables.Count) { var dataValue = nmeaSentence.parameters[dirIndex].ToString(); measMsg.AddMeas(CellDirectionVariables[index], dataValue); } if (measMsg.Count == 0) { return(null); } return(measMsg); }
private void ParseDataItem(string start, string dataValue, MeasMsg measMsg) { if (!engineeringUnits.ContainsKey(start)) { return; } if (!wxtNameToOcName.ContainsKey(start)) { return; } int index = dataValue.IndexOf(engineeringUnits[start]); if (index == -1) { return; } var finalDataValue = dataValue.Substring(0, index); var meas = new Meas(wxtNameToOcName[start], dateTime, finalDataValue, MeasStatus.c*K); measMsg.AddMeas(meas); }
private MeasMsg ParseMsg(NMEAProprietarySentence nmeaSentence) { MeasMsg result = new MeasMsg(); result.Time = DateTimeEx.Now; var s = nmeaSentence.SentenceIDString.ToUpperInvariant(); if (!nameDictionary.ContainsKey(s)) { return(null); } if (s == "C") { return(ParseCellVelocityData(nmeaSentence, result)); } int len = nmeaSentence.parameters.Length; for (int i = 0; i < len; i++) { string dataValue = string.Empty; if (null != nmeaSentence.parameters[i]) { dataValue = nmeaSentence.parameters[i].ToString(); } result.AddMeas(nameDictionary[s][i], dataValue); } if (s == "I") { return(AddCellDepths(nmeaSentence, result)); } return(result); }
internal bool Parse(string data, out MeasMsg measMsg) { // Debug.WriteLine(DateTimeEx.NowToStringWithMs + "\tYourview Parser starts" + data.Substring(0, Math.Min(data.Length, 30))); measMsg = new MeasMsg(); try { if (variableNames.Count == 0) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.EventLog, "YourView parser has not been initialised. Variable names have not been set."); return(false); } CheckControlParameters(); if (string.IsNullOrEmpty(data)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: null or empty input data."); return(false); } string messageName = GetMessageName(data); if (string.IsNullOrEmpty(messageName)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: unable to solve message name."); return(false); } if (!fieldSeparators.ContainsKey(messageName)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: field separator has not been defined for message " + messageName); return(false); } string fieldSeparator = ConvertFieldSeparator(fieldSeparators[messageName]); string[] separator = { fieldSeparator }; if (!messageStarts.ContainsKey(messageName)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: field start character(s) have not been defined for message " + messageName); return(false); } string convertedStart = ConvertMsgStart(messageStarts[messageName]).Trim(); string msgStart = convertedStart; if (messageStarts.Count > 1) { msgStart = messageName + convertedStart; } string tmp = sSTX + " "; while (data.Contains(tmp)) { data = data.Replace(tmp, sSTX); } string tmp2 = " " + sSTX; while (data.Contains(tmp2)) { data = data.Replace(tmp2, sSTX); } int startOfDataValues = data.IndexOf(msgStart); if (startOfDataValues == -1) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: cannot find start of message:" + messageName + ". Looking for:" + msgStart + ".Data to be parsed is:" + data); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: cannot find start of message:" + messageName + ". msgStart len" + msgStart.Length + ".Data len:" + data.Length); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "Index of STX:" + data.IndexOf(STX).ToIcString() + " "); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "Index of first 0:" + data.IndexOf("0").ToIcString() + " "); foreach (var c in msgStart) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "Index of first " + c + ":" + data.IndexOf(c).ToIcString() + " "); } SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: cannot find start of message:" + messageName + ". Looking for:" + msgStart.ReplaceSohStxEtx() + ".Data to be parsed is:" + data.ReplaceSohStxEtx()); return(false); } int msgStartLen = msgStart.Length; string dataValueString = data.Substring(startOfDataValues + msgStartLen); if (fieldSeparators[messageName] == YV_SPACE) { while (dataValueString.Contains(" ")) { dataValueString = dataValueString.Replace(" ", " "); } } Debug.Assert(data.Contains(msgStart), "data.Contains(msgStart)"); /* * Debug.WriteLine("message in data:" + data.Contains(msgStart)); * Debug.WriteLine("data:" + data.ReplaceLfCr() + "\t\t" + "datavalue:" + dataValueString); * Debug.WriteLine("messageStarts[messageName]:" + messageStarts[messageName] +"\t" +"startOfDataValues:" + startOfDataValues); */ if (!doNotUseSeparatorAtBeginningOfMessage[messageName]) { if (dataValueString.StartsWith(fieldSeparator)) { dataValueString = dataValueString.Substring(fieldSeparator.Length); } } if (subParsers.ContainsKey(messageName)) { if (subParsers[messageName] == "CTK25KAM61") { int ceiloStart = data.IndexOf("CT"); if (ceiloStart == -1) { return(false); } return(this.ceiloParser.Parse(data.Substring(ceiloStart), out measMsg)); } } string[] lines = dataValueString.Split(separator, StringSplitOptions.None); /* * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:dataValueString :" + dataValueString.ReplaceSohStxEtx()); * for(int i = 0; i< lines.GetLength(0);i++) * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:line " + i + ":" + lines[i].ReplaceSohStxEtx()); */ if (UseStationName) { measMsg.Station = StationName; } measMsg.Time = DateTimeEx.Now; // char[] charsToTrim = { '\n', 'r', SOH, STX, ETX }; // string messageName = lines[0].Trim(charsToTrim); if (!variableNames.ContainsKey(messageName)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser: unknown message received. Message name =" + messageName); return(false); } var varList = variableNames[messageName]; int lineLen = lines.GetLength(0); int lineIndex = 0; var max = varList.Count; for (var varCount = 0; varCount < max; varCount++) { lineIndex = varCount; if (lineIndex < lineLen) { string varname = varList[varCount]; if (string.IsNullOrEmpty(varname)) { continue; } string lineValue = lines[lineIndex]; if (SpecialFields.Contains(varname) || varname.StartsWith("<DATE ") || varname.StartsWith("<TIME ")) { measMsg = HandleSpecialField(varname, lineValue, measMsg); } else { if (string.IsNullOrWhiteSpace(lineValue)) { continue; } measMsg.AddMeas(new Meas(varname, measMsg.Time, lineValue, MeasStatus.c*K, measMsg.Station)); } } } /* * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:message successfully parsed.Station name" + measMsg.Station); * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:message date:" + measMsg.Time); * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:message contents:" + measMsg.ToString()); * SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "YourView parser:UseStation:" + UseStationName); */ // Debug.WriteLine(DateTimeEx.NowToStringWithMs + "\tYourview Parser ends" + data.Substring(0, Math.Min(data.Length, 30))); return(true); } catch (Exception ex) { ExceptionRecorder.RecordException("Error in parsing yourview message." + " data:" + data, ex); return(false); } }
new internal bool Parse(string data, out MeasMsg measMsg) { var progress = 0; measMsg = new MeasMsg(); try { if (string.IsNullOrEmpty(data)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "CeiloMsg61Parser: null or empty input data."); return(false); } progress++; char[] charsToTrim = { '\n', '\r', '\x01' }; data = data.TrimStart(charsToTrim); char[] separator = { '\n' }; var lines = data.Split(separator); if (!CheckLines(lines)) { return(false); } var lineCount = lines.GetLength(0); if (lineCount < 2) { string error = GetErrorData(data); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "CeiloMsg61Parser: incomplete message. Lines:" + lines.GetLength(0) + data + " " + error); return(false); } progress++; lines[0] = lines[0].Replace("\x01", string.Empty); var stationName = lines[0].Trim().Substring(0, 3).Replace("\r", "").Replace("\n", ""); if (!Validation.IsValidDirectoryName(stationName)) { var error = GetErrorData(data); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "CeiloMsg61Parser: invalid station name. Lines:" + lines.GetLength(0) + data + " " + error); return(false); } measMsg.Station = stationName; measMsg.Time = DateTimeEx.Now; ResetVariables(); progress++; string tmp = lines[1].Trim(charsToTrim); if (!ParseSecondLine(tmp)) { return(false); } progress++; measMsg.AddMeas(new Meas("CL_HDSTATUS", measMsg.Time, cloudHeightDetectionStatus, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("CL_WARNING", measMsg.Time, alarmsAndWarningsInformation, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("CB1", measMsg.Time, lowestCloudBase, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("CB2", measMsg.Time, secondLowestCloudBase, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("CB3", measMsg.Time, highestCloudBase, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("VV", measMsg.Time, verticalVisibility, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas("CL_STATUSCODE", measMsg.Time, alarmsAndWarnings, MeasStatus.c*K, measMsg.Station)); progress++; if (lineCount > 2) { progress++; ParseThirdLine(lines[2].Trim(charsToTrim)); progress++; measMsg.AddMeas(new Meas("CL_SCSTATUS", measMsg.Time, skyConditionDetectionStatus, MeasStatus.c*K, measMsg.Station)); if (cloudHeightsBySkycondition.Count > 0) { measMsg.AddMeas(new Meas("CL1", measMsg.Time, cloudHeightsBySkycondition[0], MeasStatus.c*K, measMsg.Station)); } if (cloudHeightsBySkycondition.Count > 1) { measMsg.AddMeas(new Meas("CL2", measMsg.Time, cloudHeightsBySkycondition[1], MeasStatus.c*K, measMsg.Station)); } if (cloudHeightsBySkycondition.Count > 2) { measMsg.AddMeas(new Meas("CL3", measMsg.Time, cloudHeightsBySkycondition[2], MeasStatus.c*K, measMsg.Station)); } if (cloudHeightsBySkycondition.Count > 3) { measMsg.AddMeas(new Meas("CL4", measMsg.Time, cloudHeightsBySkycondition[3], MeasStatus.c*K, measMsg.Station)); } if (cloudHeightsBySkycondition.Count > 4) { measMsg.AddMeas(new Meas("CL5", measMsg.Time, cloudHeightsBySkycondition[4], MeasStatus.c*K, measMsg.Station)); } if (cloudAmountBySkycondition.Count > 0) { measMsg.AddMeas(new Meas("SC1", measMsg.Time, cloudAmountBySkycondition[0], MeasStatus.c*K, measMsg.Station)); } if (cloudAmountBySkycondition.Count > 1) { measMsg.AddMeas(new Meas("SC2", measMsg.Time, cloudAmountBySkycondition[1], MeasStatus.c*K, measMsg.Station)); } if (cloudAmountBySkycondition.Count > 2) { measMsg.AddMeas(new Meas("SC3", measMsg.Time, cloudAmountBySkycondition[2], MeasStatus.c*K, measMsg.Station)); } if (cloudAmountBySkycondition.Count > 3) { measMsg.AddMeas(new Meas("SC4", measMsg.Time, cloudAmountBySkycondition[3], MeasStatus.c*K, measMsg.Station)); } if (cloudAmountBySkycondition.Count > 4) { measMsg.AddMeas(new Meas("SC5", measMsg.Time, cloudAmountBySkycondition[4], MeasStatus.c*K, measMsg.Station)); } } return(true); } catch (Exception ex) { ExceptionRecorder.RecordException("Error in parsing ceilo message. Progress:" + progress + " data:" + data, ex); return(false); } }
new internal bool Parse(string data, out MeasMsg measMsg) { var progress = 0; measMsg = new MeasMsg(); try { if (string.IsNullOrEmpty(data)) { SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "PwdMsg7Parser: null or empty input data."); return(false); } progress++; int indexOfSOH = data.IndexOf('\x01'); if (indexOfSOH > -1) { data = data.Substring(indexOfSOH); } char[] charsToTrim = { '\n', '\r' }; data = data.TrimStart(charsToTrim); char[] separator = { '\n' }; var lines = data.Split(separator); if (!CheckLines(lines)) { return(false); } if (lines.GetLength(0) < 3) { var error = GetErrorData(data); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "PwdMsg7Parser: incomplete message. Lines:" + lines.GetLength(0) + data + " " + error); return(false); } progress++; string pw1 = lines[0].Substring(0, 5).Trim(invalidChars).Replace("\r", "").Replace("\n", "").Replace('\x01', ' ').Replace('\x02', ' ').Replace(" ", string.Empty); if (!Validation.IsValidFileName(pw1) || !Validation.IsValidDirectoryName(pw1)) { var error = GetErrorData(data); SimpleFileWriter.WriteLineToEventFile(DirectoryName.Diag, "PwdMsg7Parser: invalid station name. Lines:" + lines.GetLength(0) + data + " " + error); return(false); } measMsg.Station = pw1; measMsg.Time = DateTimeEx.Now; ResetVariables(); progress++; const char STX = '\x02'; var stxIndex = lines[0].IndexOf(STX); if (stxIndex < 0) { return(false); } var tmp = lines[0].Substring(stxIndex + 1).Trim(charsToTrim); if (!ParseDataItems(tmp)) { return(false); } progress++; measMsg.AddMeas(new Meas(GetVariableName("PWD_VISALARM"), measMsg.Time, visibilityAlarm, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PWD_WARNING"), measMsg.Time, alarmsAndWarningsInformation, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("VISAVG1M"), measMsg.Time, visibility1MinAvg, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("VISAVG10M"), measMsg.Time, visibility10MinAvg, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("NWSCODE"), measMsg.Time, instantPresentWeatherNwsCode, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PW"), measMsg.Time, instantPresentWeather, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PW15M"), measMsg.Time, presentWeather15m, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PW1H"), measMsg.Time, presentWeather1h, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PRFAVG1M"), measMsg.Time, precipitationIntensity, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PRSUM24H"), measMsg.Time, cumulativeWaterSum, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("SNOWSUM24H"), measMsg.Time, cumulativeSnowSum, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("PWD_TA"), measMsg.Time, temperature, MeasStatus.c*K, measMsg.Station)); measMsg.AddMeas(new Meas(GetVariableName("LMAVG1M"), measMsg.Time, backgroundLuminance, MeasStatus.c*K, measMsg.Station)); progress++; if (lines.GetLength(0) > 1) { progress++; string line = (lines[1].Trim(charsToTrim)); progress++; measMsg.AddMeas(new Meas(GetVariableName("METARPWCODE"), measMsg.Time, line, MeasStatus.c*K, measMsg.Station)); } if (lines.GetLength(0) > 2) { progress++; string line = (lines[2].Trim(charsToTrim)); progress++; measMsg.AddMeas(new Meas(GetVariableName("METARRWCODE"), measMsg.Time, line, MeasStatus.c*K, measMsg.Station)); } return(true); } catch (Exception ex) { ExceptionRecorder.RecordException("Error in parsing pwd message. Progress:" + progress + " data:" + data, ex); return(false); } }