Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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);
            }
        }