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