Пример #1
0
        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
            {
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        // Сохраняет декодированные данные // 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
            }

            //}
        }