Example #1
0
 /// <summary>
 /// проверка двух связей и возможно связывание
 /// </summary>
 /// <param name="l"></param>
 /// <param name="r"></param>
 /// <param name="CompareDateTime"></param>
 /// <returns></returns>
 private bool Calculate_One(QSO l, QSO r, CalculateMode mode)
 {
     // совпадение всех полей кроме RST
     if (l.Raw.RecvCall == r.Raw.SendCall &&
         l.Raw.SendCall == r.Raw.RecvCall &&
         l.Feq == r.Feq &&
         //(l.Raw.Mode == r.Raw.Mode) &&
         ((l.Raw.Mode == r.Raw.Mode && l.Raw.Mode == "CW") || (l.Raw.Mode != "CW" && r.Raw.Mode != "CW")) &&
         Util.AsNumeric(l.Raw.SendExch1) == Util.AsNumeric(r.Raw.RecvExch1) &&
         Util.AsNumeric(l.Raw.SendExch2) == Util.AsNumeric(r.Raw.RecvExch2) &&
         Util.AsNumeric(l.Raw.SendExch3) == Util.AsNumeric(r.Raw.RecvExch3) &&
         Util.AsNumeric(l.Raw.RecvExch1) == Util.AsNumeric(r.Raw.SendExch1) &&
         Util.AsNumeric(l.Raw.RecvExch2) == Util.AsNumeric(r.Raw.SendExch2) &&
         Util.AsNumeric(l.Raw.RecvExch3) == Util.AsNumeric(r.Raw.SendExch3) &&
         (mode == CalculateMode.withoutdate || (mode == CalculateMode.withdate && l.DateTime == r.DateTime)) &&
         (Config.rst_check == 0 || (Config.rst_check == 1 &&
                                    Util.AsNumeric(l.Raw.SendRST) == Util.AsNumeric(r.Raw.RecvRST) &&
                                    Util.AsNumeric(l.Raw.RecvRST) == Util.AsNumeric(r.Raw.SendRST))) &&
         Coordinate.ValidateLocator(l.Raw.SendExch2) == true &&
         Coordinate.ValidateLocator(l.Raw.RecvExch2) == true)
     // TODO: где то нужно сделать правильно проверку локаторов выше две строки
     {
         //l.Errors.Clear();
         //r.Errors.Clear();
         if (mode == CalculateMode.withdate)
         {
             l.Errors.Add("=[" + r.Raw.SendCall + " QSO:" + r.Raw.Number + " " + r.DateTime.ToString("HHmm") + "]");
             r.Errors.Add("=[" + l.Raw.SendCall + " QSO:" + l.Raw.Number + " " + l.DateTime.ToString("HHmm") + "]");
         }
         else
         {
             l.Errors.Add("±[" + r.Raw.SendCall + " QSO:" + r.Raw.Number + " " + r.DateTime.ToString("HHmm") + "]");
             r.Errors.Add("±[" + l.Raw.SendCall + " QSO:" + l.Raw.Number + " " + l.DateTime.ToString("HHmm") + "]");
         }
         if (Util.AsNumeric(l.Raw.SendRST) != Util.AsNumeric(r.Raw.RecvRST))
         {
             l.Errors.Add("Partner warning (" + l.Raw.SendRST + "/" + r.Raw.RecvRST + ")");
             r.Errors.Add("Receive warning (" + l.Raw.SendRST + "/" + r.Raw.RecvRST + ")");
         }
         if (Util.AsNumeric(l.Raw.RecvRST) != Util.AsNumeric(r.Raw.SendRST))
         {
             l.Errors.Add("Receive warning (" + r.Raw.SendRST + "/" + l.Raw.RecvRST + ")");
             r.Errors.Add("Partner warning (" + r.Raw.SendRST + "/" + l.Raw.RecvRST + ")");
         }
         l.LinkedQSO   = r;
         l.Counters.OK = true;
         r.LinkedQSO   = l;
         r.Counters.OK = true;
         return(true);
     }
     return(false);
 }
Example #2
0
        /// <summary>
        /// интелектуальное сравнение связи. сначала с оффсетом а потом с магией
        /// </summary>
        /// <param name="l"></param>
        /// <param name="qso_list"></param>
        private void Calculate_AI(QSO l, QSOList qso_list)
        {
            QSOList new_qso_list = new QSOList();

            foreach (QSO item in qso_list)
            {
                if (item.Counters.ErrorOnCheck == false && item.Counters.Filtered == false && item.Counters.OK == false)
                {
                    if (l.DateTime.AddMinutes(-Config.offset_min) <= item.DateTime && item.DateTime <= l.DateTime.AddMinutes(Config.offset_min))
                    {
                        new_qso_list.Add(item);
                    }
                }
            }
            bool found = false;

            foreach (QSO item in new_qso_list)
            {
                found = Calculate_One(l, item, CalculateMode.withoutdate);
                if (found)
                {
                    new_qso_list.Clear();
                    return;
                }
            }
            /// TODO: доделать ебаное интелектуальное сравнение
            /// вроде мысли появились, сравнивать блоками.
            /// типа сравнить дату время и позывные, потом моду, потом контрольные номера и локаторы
            if (!found)
            {
                foreach (QSO r in new_qso_list)
                {
                    /// странное сравнивание №1
                    /// сравниваем по дата время уже в возможных границах
                    /// диапазон, позывные, RST
                    ///              @           @       @     @                 @
                    /// <para>QSO: 28009 CW 2008-09-23 0711 UA1XYZ 599 001 123 UA2XYZ 599 001 AF 1</para>
                    if (l.Raw.RecvCall == r.Raw.SendCall &&
                        l.Raw.SendCall == r.Raw.RecvCall &&
                        l.Feq == r.Feq)
                    {
                        l.Errors.Add(BuildErrorStr(l, r));
                        l.Counters.SetError(ErrorType.similarqso);
                        l.LinkedQSO = r;
                        if (!r.Counters.ErrorOnCheck)
                        {
                            r.LinkedQSO = l;
                        }
                        break;
                    }

                    #region странное сравнивание №2
                    ///// сравниваем по дата время уже в возможных границах
                    ///// диапазон, локатор в одну сторону и позывной в одну сторону
                    /////              @    @      @       @
                    ///// <para>QSO: 28009 CW 2008-09-23 0711 UA1XYZ 599 001 LOCATOR UA2XYZ 599 001 LOCATOR 1</para>
                    //if (((l.Raw.Mode == "CW" && r.Raw.Mode == "CW") || (l.Raw.Mode != "CW" && r.Raw.Mode != "CW")) &&
                    //    Util.AsNumeric(l.Raw.SendExch2) == Util.AsNumeric(r.Raw.RecvExch2) &&
                    //    l.Raw.RecvCall != r.Raw.SendCall &&
                    //    l.Feq == r.Feq)
                    //{
                    //    string ltext = "@[" + r.Raw.SendCall + " QSO:" + r.Raw.Number;

                    //    if (l.Raw.SendCall == r.Raw.RecvCall)
                    //    {
                    //        // переданный позывной и полученный
                    //        ltext = string.Concat(ltext, " [recv call: " + l.Raw.RecvCall + "/" + r.Raw.SendCall + "]");
                    //    }

                    //    if (Util.AsNumeric(l.Raw.SendRST) != Util.AsNumeric(r.Raw.RecvRST) ||
                    //        Util.AsNumeric(l.Raw.RecvRST) != Util.AsNumeric(r.Raw.SendRST))
                    //    {
                    //        // RST не совпало
                    //        if (Util.AsNumeric(l.Raw.SendRST) != Util.AsNumeric(r.Raw.RecvRST))
                    //            ltext = string.Concat(ltext, " [send rst: " + l.Raw.SendRST + "/" + r.Raw.RecvRST + "]");
                    //        if (Util.AsNumeric(l.Raw.RecvRST) != Util.AsNumeric(r.Raw.SendRST))
                    //            ltext = string.Concat(ltext, " [recv rst: " + l.Raw.RecvRST + "/" + r.Raw.SendRST + "]");
                    //    }

                    //    if (Util.AsNumeric(l.Raw.SendExch1) != Util.AsNumeric(r.Raw.RecvExch1) ||
                    //        Util.AsNumeric(l.Raw.RecvExch1) != Util.AsNumeric(r.Raw.SendExch1))
                    //    {
                    //        // не совпал 1 контрольный
                    //        if (Util.AsNumeric(l.Raw.SendExch1) != Util.AsNumeric(r.Raw.RecvExch1))
                    //            ltext = string.Concat(ltext, " [send exch1: " + l.Raw.SendExch1 + "/" + r.Raw.RecvExch1 + "]");
                    //        if (Util.AsNumeric(l.Raw.RecvExch1) != Util.AsNumeric(r.Raw.SendExch1))
                    //            ltext = string.Concat(ltext, " [recv exch1: " + l.Raw.RecvExch1 + "/" + r.Raw.SendExch1 + "]");
                    //    }

                    //    if (Util.AsNumeric(l.Raw.RecvExch2) != Util.AsNumeric(r.Raw.SendExch2))
                    //    {
                    //        // не совпал 2 контрольный
                    //        if (Util.AsNumeric(l.Raw.RecvExch2) != Util.AsNumeric(r.Raw.SendExch2))
                    //            ltext = string.Concat(ltext, " [recv exch2: " + l.Raw.RecvExch2 + "/" + r.Raw.SendExch2 + "]");
                    //    }

                    //    if (Util.AsNumeric(l.Raw.SendExch3) != Util.AsNumeric(r.Raw.RecvExch3) ||
                    //        Util.AsNumeric(l.Raw.RecvExch3) != Util.AsNumeric(r.Raw.SendExch3))
                    //    {
                    //        // не совпал 3 контрольный
                    //        if (Util.AsNumeric(l.Raw.SendExch3) != Util.AsNumeric(r.Raw.RecvExch3))
                    //            ltext = string.Concat(ltext, " [send exch3: " + l.Raw.SendExch3 + "/" + r.Raw.RecvExch3 + "]");
                    //        if (Util.AsNumeric(l.Raw.RecvExch3) != Util.AsNumeric(r.Raw.SendExch3))
                    //            ltext = string.Concat(ltext, " [recv exch3: " + l.Raw.RecvExch3 + "/" + r.Raw.SendExch3 + "]");
                    //    }
                    //    l.Errors.Add(ltext + "]");
                    //    l.Counters.ErrorOnCheck = true;
                    //    break;
                    //}
                    #endregion
                }
            }
        }
Example #3
0
        public string BuildErrorStr(QSO l, QSO r)
        {
            string ltext = "@[" + r.Raw.SendCall + " QSO:" + r.Raw.Number;

            //if (l.Raw.Mode != r.Raw.Mode) {
            //    // мода не совпала
            //    ltext = string.Concat(ltext, " [mode: " + l.Raw.Mode + "/" + r.Raw.Mode + "]");
            //}

            if ((l.Raw.Mode == "CW" && r.Raw.Mode != "CW") ||
                (l.Raw.Mode != "CW" && r.Raw.Mode == "CW"))
            {
                // мода не совпала
                ltext = string.Concat(ltext, " [mode: " + l.Raw.Mode + "/" + r.Raw.Mode + "]");
            }

            if (Util.AsNumeric(l.Raw.SendRST) != Util.AsNumeric(r.Raw.RecvRST) ||
                Util.AsNumeric(l.Raw.RecvRST) != Util.AsNumeric(r.Raw.SendRST))
            {
                // RST не совпало
                if (Util.AsNumeric(l.Raw.SendRST) != Util.AsNumeric(r.Raw.RecvRST))
                {
                    ltext = string.Concat(ltext, " [send rst: " + l.Raw.SendRST + "/" + r.Raw.RecvRST + "]");
                }
                if (Util.AsNumeric(l.Raw.RecvRST) != Util.AsNumeric(r.Raw.SendRST))
                {
                    ltext = string.Concat(ltext, " [recv rst: " + l.Raw.RecvRST + "/" + r.Raw.SendRST + "]");
                }
            }

            if (Util.AsNumeric(l.Raw.SendExch1) != Util.AsNumeric(r.Raw.RecvExch1) ||
                Util.AsNumeric(l.Raw.RecvExch1) != Util.AsNumeric(r.Raw.SendExch1))
            {
                // не совпал 1 контрольный
                if (Util.AsNumeric(l.Raw.SendExch1) != Util.AsNumeric(r.Raw.RecvExch1))
                {
                    ltext = string.Concat(ltext, " [send exch1: " + l.Raw.SendExch1 + "/" + r.Raw.RecvExch1 + "]");
                }
                if (Util.AsNumeric(l.Raw.RecvExch1) != Util.AsNumeric(r.Raw.SendExch1))
                {
                    ltext = string.Concat(ltext, " [recv exch1: " + l.Raw.RecvExch1 + "/" + r.Raw.SendExch1 + "]");
                }
            }

            if (Util.AsNumeric(l.Raw.SendExch2) != Util.AsNumeric(r.Raw.RecvExch2) ||
                Util.AsNumeric(l.Raw.RecvExch2) != Util.AsNumeric(r.Raw.SendExch2))
            {
                // не совпал 2 контрольный
                if (Util.AsNumeric(l.Raw.SendExch2) != Util.AsNumeric(r.Raw.RecvExch2))
                {
                    ltext = string.Concat(ltext, " [send exch2: " + l.Raw.SendExch2 + "/" + r.Raw.RecvExch2 + "]");
                }
                if (Util.AsNumeric(l.Raw.RecvExch2) != Util.AsNumeric(r.Raw.SendExch2))
                {
                    ltext = string.Concat(ltext, " [recv exch2: " + l.Raw.RecvExch2 + "/" + r.Raw.SendExch2 + "]");
                }
            }

            if (Util.AsNumeric(l.Raw.SendExch3) != Util.AsNumeric(r.Raw.RecvExch3) ||
                Util.AsNumeric(l.Raw.RecvExch3) != Util.AsNumeric(r.Raw.SendExch3))
            {
                // не совпал 3 контрольный
                if (Util.AsNumeric(l.Raw.SendExch3) != Util.AsNumeric(r.Raw.RecvExch3))
                {
                    ltext = string.Concat(ltext, " [send exch3: " + l.Raw.SendExch3 + "/" + r.Raw.RecvExch3 + "]");
                }
                if (Util.AsNumeric(l.Raw.RecvExch3) != Util.AsNumeric(r.Raw.SendExch3))
                {
                    ltext = string.Concat(ltext, " [recv exch3: " + l.Raw.RecvExch3 + "/" + r.Raw.SendExch3 + "]");
                }
            }
            ltext = string.Concat(ltext, "]");
            return(ltext);
        }
Example #4
0
        /// <summary>
        /// поиск повторов
        /// </summary>
        private void Calculate_Double()
        {
            string previous_callsign = "";

            foreach (QSO item in items)
            {
                //if (Call == "RN0CW" && item.Raw.Number == 32)
                //{
                //    Console.WriteLine(item.Dump());
                //}
                if (!item.Counters.Filtered && (!item.Counters.ErrorOnCheck ||
                                                item.Counters.ErrorOnCheck &&
                                                (item.Counters.ErrorType == ErrorType.doublebymode ||
                                                 item.Counters.ErrorType == ErrorType.doublebytime ||
                                                 item.Counters.ErrorType == ErrorType.similarqso))
                    )
                {
                    /// TODO: решить тут все вопросы по проверкам
                    /// В каждом подтуре, на каждом диапазоне с одним и тем же корреспондентом
                    /// разрешается провести по две радиосвязи: одну радиосвязь – телеграфом CW,
                    /// одну – телефоном (FM или PH)
                    if (Config.double_check == 1)
                    {
                        /// получили все связи с этим позывным в текущем туре
                        /// ограничение: такой же ражим работы
                        QSOList list = items.GetPreviousInTour(item, true);
                        if (list.Count > 0)
                        {
                            QSO r = list[0];
                            // если предыдущая QSO подтверждена
                            if (r.Counters.OK || r.Counters.ErrorType == ErrorType.doublebymode || r.Counters.ErrorType == ErrorType.doublebytime)
                            {
                                item.Counters.OK = false;
                                item.Errors.Clear();
                                item.Errors.Add("Subtour double [mode] with QSO: " + r.Raw.Number);
                                item.Counters.SetError(ErrorType.doublebymode);
                                item.LinkedQSO = r;
                            }
                            // если предыдущая QSO не подтверждена и она не предыдущий дубль то текущая QSO не может быть дублем
                            else if (r.Counters.OK == false && r.Counters.ErrorType != ErrorType.doublebymode && r.Counters.ErrorType != ErrorType.doublebytime)
                            {
                                // обнуляем флаг что текущая QSO дубль
                                item.Counters.OK = false;
                                item.Errors.Clear();
                                item.Counters.SetError(ErrorType.clear);
                                item.LinkedQSO = null;
                            }
                            #region debug
                            //if (list.Count > 1)
                            //{
                            //    Console.WriteLine("=2===============================================================");
                            //    Console.WriteLine(item.Dump());
                            //    foreach (QSO l in list)
                            //    {
                            //        Console.WriteLine(l.Dump());
                            //    }
                            //    //Console.ReadKey();
                            //}
                            #endregion
                        }
                    }

                    ///// Повторную радиосвязь разными видами модуляции с одним и тем же корреспондентом
                    ///// разрешается проводить не ранее, чем через 3 минуты после предыдущей связи, или
                    ///// через одну радиосвязь, проведенную с другим корреспондентом.
                    if (Config.repeat_call > 0)
                    {
                        QSOList list = items.GetPreviousInTour(item, false);
                        if (list.Count > 0)
                        {
                            QSO r = list[0];
                            if (previous_callsign == item.Raw.RecvCall && r.Counters.Offset < Config.repeat_call && r.Counters.OK)
                            {
                                item.Counters.OK = false;
                                item.Errors.Clear();
                                item.Errors.Add("Subtour double [time] with QSO: " + r.Raw.Number);
                                item.Counters.SetError(ErrorType.doublebytime);
                                item.LinkedQSO = r;
                            }
                        }
                    }
                }
                previous_callsign = item.Raw.RecvCall;
            }
        }