private void processLineFromComPort(string someLine) { string stringForLog = ""; //string someAmbString = "@" + transponderNumber_textBox2.Text + DateTime.Now.ToString("HHmmssff") + rnd.Next(50).ToString("00"); RaceThread rt = new RaceThread(admin); AMB20RX Res = rt.AMB20_Decode(someLine); if (Res.Hit == 0) { return; } string someLine1 = convertAsciiTextToHex(someLine); if (Res.Transponder.Length > 0 && Res.Transponder != "00") { // we have got signal from transponder #region processes signal from transponder string signalLevel = "слабый"; if (Res.Hit >= 20) { signalLevel = "хороший"; } stringForLog = "Time" + Res.Hour + ":" + Res.Minutes + ":" + Res.Seconds + ":" + Res.Millisecond + " Датчик " + Res.Transponder + ", уровень сигнала: " + signalLevel + " (" + Res.Hit.ToString("00") + "), (data: " + someLine1.Trim() + ")" + "\r\n" + "\r\n"; //stringForLog = DateTime.Now.ToLongTimeString() + " Датчик " + Res.Transponder + //", уровень сигнала: " + signalLevel + " (" + Res.Hit.ToString("00") + "), (data: " + someLine.Trim() + ")" + "\r\n" + "\r\n"; sensorsLog_richText.Invoke((MethodInvoker) delegate { sensorsLog_richText.Text = stringForLog + sensorsLog_richText.Text; }); #endregion } else { } }
/// <summary> /// распарсить строку в структуру данных /// </summary> /// <param name="s"></param> /// <returns></returns> public AMB20RX AMB20_Decode(string s) { AMB20RX Ret = new AMB20RX(); //if (bytesToRec != null && bytesToRec.Length == 32) //{ // string hexstringFromCom = BitConverter.ToString(bytesToRec); // string[] hexValuesSplit = hexstringFromCom.Split('-'); // string trans = String.Concat(hexValuesSplit[13], hexValuesSplit[14], hexValuesSplit[15], // hexValuesSplit[16]); // string hour = hexValuesSplit[6]; // string min = hexValuesSplit[7]; // string sec = hexValuesSplit[8]; // string msec = String.Concat(hexValuesSplit[17], hexValuesSplit[18], hexValuesSplit[19], // hexValuesSplit[20]); // string hit = String.Concat(hexValuesSplit[21], hexValuesSplit[22]); // Ret.Transponder = Convert.ToInt16(trans, 16).ToString(); // Ret.Hour = Convert.ToInt16(hour, 16); // Ret.Minutes = Convert.ToInt16(min, 16); // Ret.Seconds = Convert.ToInt16(sec, 16); // Ret.Millisecond = Convert.ToInt16(msec, 16); // Ret.Hit = Convert.ToInt16(hit, 16); //} //else //{ if (Settings["decoder"].ToString().Trim() == "AMBrc") { if (s.Length > 40) { // @\t40\t551\t313930\t5001.962\t12\t119\t02\txA03E\r s = s.Replace("\r", " ").Replace('@', ' ').Trim(); string[] elemStrings = s.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); TimeSpan time = TimeSpan.FromSeconds(Double.Parse(elemStrings[4].Split('.')[0].ToString())); Ret.Transponder = elemStrings[3]; Ret.Hour = time.Hours; Ret.Minutes = time.Minutes; Ret.Seconds = time.Seconds; Ret.Millisecond = Convert.ToInt16(elemStrings[4].Split('.')[1]); Ret.Hit = Convert.ToInt16(elemStrings[5], 16); } } else { // s = convertAsciiTextToHex(s); //вызов функция конвертации // parses the string using (StreamWriter sw = new StreamWriter("sqlTobase.txt", true)) { sw.Write("\r\n" + DateTime.Now + ":::" + s); } if (s.Length >= 31 * 2 + 30) { s = s.Replace("\r\n", " ").Trim(); string[] hexBits = s.Split(new[] { ' ' }); string[] hexValuesSplit = hexBits; //try //{ // for (int i = 0; i < hexBits.Length; i++) // { // hexValuesSplit[i] = // int.Parse(hexBits[i], System.Globalization.NumberStyles.HexNumber).ToString(); // //Console.WriteLine(i + ". " + hexBits[i] + " = " + decBits[i]); // } //} //catch (Exception ex) //{ // Console.WriteLine(@"String can not be parsed." + ex.Message); //} //Console.WriteLine(sett["decoder"]); // 0 - name protokol // 1 - bytes (32) // 2 - hours 1 // 3 - minutes 1 // 4 - seconds 1 // 5 - transponder // 6 - mseconds // 7 - hits // 8 - port speed // 9 - bits // 10 - StopBits int hourByte = Convert.ToInt32(decoderSetts[2].ToString().Trim()); int minuteByte = Convert.ToInt32(decoderSetts[3].ToString().Trim()); int secondByte = Convert.ToInt32(decoderSetts[4].ToString().Trim()); //int[] transBytes = new int[decoderSetts[5].ToString().Trim().Split(',').Length]; int index = 0; string trans = ""; foreach (string transByte in decoderSetts[5].ToString().Trim().Split(',')) { trans += hexValuesSplit[Convert.ToInt32(transByte) - 1]; } string msec = ""; foreach (string transByte in decoderSetts[6].ToString().Trim().Split(',')) { msec += hexValuesSplit[Convert.ToInt32(transByte) - 1]; } string hit = ""; foreach (string transByte in decoderSetts[7].ToString().Trim().Split(',')) { hit += hexValuesSplit[Convert.ToInt32(transByte) - 1]; } // String.Concat(hexValuesSplit[13],hexValuesSplit[14],hexValuesSplit[15],hexValuesSplit[16]); string hour = hexValuesSplit[hourByte - 1]; string min = hexValuesSplit[minuteByte - 1]; string sec = hexValuesSplit[secondByte - 1]; // string[] hexValuesSplit = s.Split(' '); //string trans = String.Concat(hexValuesSplit[13], hexValuesSplit[14], hexValuesSplit[15], // hexValuesSplit[16]); //string hour = hexValuesSplit[6]; //string min = hexValuesSplit[7]; //string sec = hexValuesSplit[8]; //string msec = String.Concat(hexValuesSplit[17], hexValuesSplit[18], hexValuesSplit[19], // hexValuesSplit[20]); //string hit = String.Concat(hexValuesSplit[21], hexValuesSplit[22]); Ret.Transponder = Convert.ToInt16(trans, 16).ToString(); Ret.Hour = Convert.ToInt16(hour, 16); Ret.Minutes = Convert.ToInt16(min, 16); Ret.Seconds = Convert.ToInt16(sec, 16); Ret.Millisecond = Convert.ToInt16(msec, 16); Ret.Hit = Convert.ToInt16(hit, 16); //Ret.Transponder = String.Concat(decBits[14 - 1], decBits[15 - 1], decBits[16 - 1], decBits[17 - 1]); //Ret.Hour = Convert.ToInt16(decBits[7 - 1]); //Ret.Minutes = Convert.ToInt16(decBits[8 - 1]); //Ret.Seconds = Convert.ToInt16(decBits[9 - 1]); //Ret.Millisecond = // Convert.ToInt16(String.Concat(decBits[18 - 1], decBits[19 - 1], decBits[20 - 1], decBits[21 - 1])); //Ret.Hit = Convert.ToInt16(String.Concat(decBits[22 - 1], decBits[23 - 1])); //Ret.receivedString = s; } else { Ret.Transponder = String.Empty; Ret.Hit = 0; Ret.Hour = 0; Ret.Minutes = 0; Ret.Seconds = 0; Ret.Millisecond = 0; Ret.receivedString = String.Empty; } } // Webanounserdata data = new Webanounserdata { method = "newlap", data = Ret }; // WebAnouncer anouncer = new WebAnouncer(); //anouncer.action(data); return(Ret); }
// Сохраняет декодированные данные // TODO public for tests public void AMB20_SaveData(string s) { // получаем порцию данных от прибора. // Это может быть пустая порция @00000036 // или в момент прихода сигнала от датчика @050000059140 // @05-00-00-05-91-40 05 - датчик, 00 - часы, 00 - минуты, 05 - секунды, 91 - миллисекунды, 40 - хит - по непроверенной информации, это количество срабатываний прибора в момент прохода датчика над петлёй. то есть, если сигнал хороший (возможно и скорость меньше?), то число должно быть больше using (StreamWriter sw = new StreamWriter("logs.txt", true)) { sw.Write("\r\n" + DateTime.Now + ":::" + s); } // MainForm.log("AMB20_SaveData: " + s + " at system time: " + datetimeConverter.toDateTimeString(DateTime.Now) + "." + DateTime.Now.Millisecond.ToString()); if (Race == null) { return; } //if (bytesToRec != null) //{ // AMB20RX Res = AMB20_Decode(s); //} //else //{ // if (s.Length > 30) { AMB20RX Res = AMB20_Decode(s); // } //if (Res.Transponder.Length > 0 && Res.Transponder != "00") if (Res.Transponder != null && Res.Transponder.Length > 0) { // we have got signal from transponder Res.Transponder = Convert.ToInt32(Res.Transponder).ToString("000000"); #region processes signal from transponder stringForLogWindow += s + "\r\n"; lastReceive = s; int pilotInRaceIndex; // когда может прийти такая строка? if (stringForLogWindow.Length > 1024) { stringForLogWindow = ""; } // узнали индекс пилота в заезде. pilotInRaceIndex = FindMemberFromTransponder(Res.Transponder); // если это свободный режим, и пилоту едет на неназначенном карте, то назначим пилоту карт if (pilotInRaceIndex < 0 && Race.Light_mode == 1) { pilotInRaceIndex = AddKartToPilot(Res.Transponder); } //if (true) if (pilotInRaceIndex >= 0) { // создали тик из полученного времени long TickWhenSensorSignalReceived = new TimeSpan(0, Res.Hour, Res.Minutes, Res.Seconds, Res.Millisecond).Ticks; // MainForm.log("receivedTick: " + TickWhenSensorSignalReceived.ToString()); // приготовим строку для лога, который показывается на закладке Полученные данные stringForLogWindow += ">+ " + TickWhenSensorSignalReceived.ToString() + " " + new TimeSpan(Math.Abs(TickWhenSensorSignalReceived - Members[pilotInRaceIndex].LastTick)).TotalSeconds .ToString() + "\r\n"; stringForLogWindow += ">- " + Res.Hour.ToString("00") + ":" + Res.Minutes.ToString("00") + ":" + Res.Seconds.ToString("00") + "." + Res.Millisecond.ToString("000") + "/" + Res.Hit.ToString("000") + "\r\n\r\n"; // Условие шумового времени // если надо вычитать время прогревочного круга if (WarmLapShouldBeSubtracted) { // и если оно не было вычтено ?? для всех или для первого? муть какая-то if (!IsWarmSubtracted) { MaxTicksForRace = MaxTicksForRace - WarmTicks; IsWarmSubtracted = true; } } // Глобальная метка времени первого пересечения if (StartAfterDetection && StartTick == 0) { StartTick = DateTime.Now.Ticks; } #region sgavrilenko: непонятно, чего убрано // 1 - Узнаем разницу времени от последнего пересечения круга /* * if (Members[index].LastTick == 0) * { * T = 0; * } * else * { * T = NowT - Members[index].LastTick; * } * * // 2 - Определение дельты времени * if (Members[index].LapTime < (T - CorrectTime) && (T - CorrectTime) != 0) * { * Members[index].DeltaTime = "+"; * } * else * { * Members[index].DeltaTime = "-"; * } * Members[index].DeltaTime += Math.Round(new TimeSpan(Math.Abs(Members[index].LapTime - (T - CorrectTime))).TotalSeconds, 2).ToString(); * * // 3 - Если это первый круг то запоминаем время * // if (Members[index].Laps == 0) Members[index].FirstTick = receivTick; */ #endregion // 5 - Устанавливаем время круга long lapTime = Math.Abs(TickWhenSensorSignalReceived - Members[pilotInRaceIndex].LastTick); if (lapTime >= NoiseTime) // если время круга больше минимального, то... { if (Members[pilotInRaceIndex].LastTick > 0) { Members[pilotInRaceIndex].LapTime = lapTime < 0 ? 0 : lapTime; // 6 - Сохраняем общее время пилота Members[pilotInRaceIndex].TotalPilotTimeOfThisRace += lapTime; // 7 - Счетчик кругов Members[pilotInRaceIndex].Laps++; // 8 - Запись лучшего времени круга if (Members[pilotInRaceIndex].BestLapTime <= 0 || Members[pilotInRaceIndex].BestLapTime > Members[pilotInRaceIndex].LapTime) { Members[pilotInRaceIndex].BestLapTime = Members[pilotInRaceIndex].LapTime; } // 9 - Сохраняем данные в базу if (Members[pilotInRaceIndex].Laps > 0) { // MainForm.log("lapTime: " + lapTime.ToString()); decimal pilotLapTime = Convert.ToDecimal(new TimeSpan(lapTime).TotalSeconds); // MainForm.log("AddTimeStamp: " + pilotLapTime.ToString()); model.AddTimeStamp(Members[pilotInRaceIndex].MemberID, Members[pilotInRaceIndex].Laps, pilotLapTime); } } // 4 - Запоминаем время последнего тика Members[pilotInRaceIndex].LastTick = TickWhenSensorSignalReceived; } } #endregion } //} }