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); }
/// <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 } } }
/// <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; } }