Example #1
0
        public QSOList GetPreviousInTour(QSO l, bool OnlySameMode)
        {
            QSOList result = new QSOList();

            if (this.Count() > 0)
            {
                for (int i = this.Count() - 1; i >= 0; i--)
                {
                    if (!this[i].Counters.Filtered &&
                        l.Raw.RecvCall == this[i].Raw.RecvCall &&
                        l.Counters.SubTour == this[i].Counters.SubTour &&
                        l.Feq == this[i].Feq &&
                        this[i].Raw.Number < l.Raw.Number &&
                        this[i].DateTime <= l.DateTime)
                    {
                        if (!OnlySameMode ||
                            (OnlySameMode && (
                                 (l.Raw.Mode == "CW" && l.Raw.Mode == this[i].Raw.Mode) ||
                                 (l.Raw.Mode != "CW" && this[i].Raw.Mode != "CW")
                                 )))
                        {
                            this[i].Counters.Offset = (int)(l.DateTime - this[i].DateTime).TotalMinutes;
                            result.Add(this[i]);
                        }
                    }
                }
            }
            return(result);
        }
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
        /// <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;
            }
        }