public static void GetSessionInfo()
        {
            Send(M_ASK_ALL);

            var buf = new byte[1000];
            var res = tcp_client.GetStream().Read(buf, 0, buf.Length);

            try             // todo fix
            {
                File.WriteAllBytes(@"logs\start_header.dat", buf);
            }
            catch
            {
            }

            SessionInfo = new SessionInfoStruct();

            var stream = new MemoryStream(buf);
            var reader = new BinaryReader(stream);

            uint size_dummy = reader.ReadUInt32();
            uint type       = reader.ReadUInt32();

            if (type != M_ANSWER_INFO)
            {
                throw new Exception("strange answer: " + type);
            }
            SessionInfo.ClientName   = reader.ReadString1251();
            SessionInfo.ChannelsNum  = reader.ReadInt32();
            SessionInfo.ChannelsInfo = new ChannelInfoStruct[SessionInfo.ChannelsNum];
            for (int i = 0; i < SessionInfo.ChannelsNum; i++)
            {
                SessionInfo.ChannelsInfo[i].Name        = reader.ReadString1251();
                SessionInfo.ChannelsInfo[i].BitWeight   = reader.ReadDouble();
                SessionInfo.ChannelsInfo[i].Frequency   = reader.ReadDouble();
                SessionInfo.ChannelsInfo[i].UnitName    = reader.ReadString1251();
                SessionInfo.ChannelsInfo[i].HighFilter  = reader.ReadDouble();
                SessionInfo.ChannelsInfo[i].LowFilter   = reader.ReadDouble();
                SessionInfo.ChannelsInfo[i].FilterLevel = reader.ReadInt32();
                SessionInfo.ChannelsInfo[i].Rejector    = reader.ReadDouble();
                SessionInfo.ChannelsInfo[i].Sensivity   = reader.ReadDouble();
            }
            SessionInfo.SchemeName = reader.ReadString1251();

            //Console.WriteLine(stream.Position);

            //           Console.WriteLine(name.Length);
        }
        public static List <short[]> LoadTxt(string path)
        {
            StreamReader file = new StreamReader(path, Encoding.GetEncoding("windows-1251"));

            // заполняем сессию

            /*
             * Иванов Петр Сергеевич	<Ф.И.О.>
             * м	<Пол.>
             * 42	<Возраст, лет>
             *      <Примечания>
             * 4.8.2019	<Дата проведения исследования: день, месяц, год>
             * 2	<Общее количество каналов>
             * 250.	<Частота дискретизации, Гц>
             *
             * 3	<Количество групп физиологических сигналов>
             *
             * Т	<Тип сигналов 1-й группы>
             * 1	<Количество сигналов 1-й группы>
             * 0,0013	<Вес бита сигналов 1-й группы>
             * °С	<Единицы измерения сигналов 1-й группы>
             *
             * Двигательная активность	<Тип сигналов 2-й группы>
             * 1	<Количество сигналов 2-й группы>
             * 0,0003	<Вес бита сигналов 2-й группы>
             * у.е.	<Единицы измерения сигналов 2-й группы>
             *
             * ЭЭГ	<Тип сигналов 3-й группы>
             * 0	<Количество сигналов 3-й группы>
             * 0,1250	<Вес бита сигналов 3-й группы>
             * мкВ	<Единицы измерения сигналов 3-й группы>
             *
             *      <Полярность значений сигналов ЭЭГ – в соответствии с конвенцией о полярности. Негативность отражена минусом.>
             * 91e0d8ec-db86-4711-9994-9e1bd4ee2db9	<Идентификатор исследования>
             * 1	<Количество фрагментов записи>
             * 20:28:05.320	<Время начала 1-го фрагмента>
             * 2700	<Продолжительность 1-го фрагмента в отсчетах, отсчетов>
             * Температура	ДПТ
             */

            // todo: не очень, точки будут считаться как спецсигналы
            string ReadParam(StreamReader f, string param_name)
            {
                var line     = f.ReadLine();
                var splitted = line.Split('\t');

                //if (!Regex.Match(splitted[1],"^<" + param_pattern + ">$").Success)
                if (splitted[1] != "<" + param_name + ">")
                {
                    throw new Exception("param " + param_name + " not match: " + splitted[1]);
                }
                return(splitted[0]);
            };

            double ReadDouble(StreamReader f, string param_name)
            {
                var res = ReadParam(f, param_name);

                return(double.Parse(res.Replace('.', ',')));                // туду - некрасивый хак локали
            }

            SessionInfo = new SessionInfoStruct();

            SessionInfo.ClientName = ReadParam(file, "Ф.И.О.");
            ReadParam(file, "Пол.");
            ReadParam(file, "Возраст, лет");
            ReadParam(file, "Примечания");
            ReadParam(file, "Дата проведения исследования: день, месяц, год");
            SessionInfo.ChannelsNum = int.Parse(ReadParam(file, "Общее количество каналов"));
            var freq       = ReadDouble(file, "Частота дискретизации, Гц");
            var groups_num = int.Parse(ReadParam(file, "Количество групп физиологических сигналов"));

#if !OLDNET
            var channels_raw = new List <(double, string)>();
            for (int i = 0; i < groups_num; i++)
            {
                //Т	<Тип сигналов 1-й группы>
                //4	<Количество сигналов 1-й группы>
                //0,0013	<Вес бита сигналов 1-й группы>
                //°С	<Единицы измерения сигналов 1-й группы>

                var ig     = (i + 1) + "-й группы";
                var type   = ReadParam(file, "Тип сигналов " + ig);
                var num    = int.Parse(ReadParam(file, "Количество сигналов " + ig));
                var weight = ReadDouble(file, "Вес бита сигналов " + ig);
                var unit   = ReadParam(file, "Единицы измерения сигналов " + ig);
                for (int j = 0; j < num; j++)
                {
                    channels_raw.Add((weight, unit));
                }
            }
            ;
            ReadParam(file, "Полярность значений сигналов ЭЭГ – в соответствии с конвенцией о полярности. Негативность отражена минусом.");
            ReadParam(file, "Идентификатор исследования");
            ReadParam(file, "Количество фрагментов записи");
            ReadParam(file, "Время начала 1-го фрагмента");
            ReadParam(file, "Продолжительность 1-го фрагмента в отсчетах, отсчетов");

            var channels_names = file.ReadLine().Split('\t');

            SessionInfo.ChannelsInfo = new ChannelInfoStruct[SessionInfo.ChannelsNum];
            for (int i = 0; i < SessionInfo.ChannelsNum; i++)
            {
                SessionInfo.ChannelsInfo[i].Name        = channels_names[i];
                SessionInfo.ChannelsInfo[i].BitWeight   = channels_raw[i].Item1;
                SessionInfo.ChannelsInfo[i].Frequency   = freq;
                SessionInfo.ChannelsInfo[i].UnitName    = channels_raw[i].Item2;
                SessionInfo.ChannelsInfo[i].HighFilter  = 100;
                SessionInfo.ChannelsInfo[i].LowFilter   = 0;
                SessionInfo.ChannelsInfo[i].FilterLevel = 2;
                SessionInfo.ChannelsInfo[i].Rejector    = 50;
                SessionInfo.ChannelsInfo[i].Sensivity   = 1;
            }
            SessionInfo.SchemeName = "Emulated";

            var    loaded_list = new List <short[]>();
            string ln;
            while ((ln = file.ReadLine()) != null)
            {
                if (ln == "<Все служебные маркеры>")
                {
                    break;
                }
                var s_arr = ln.Split('\t');
                var arr   = new short[SessionInfo.ChannelsNum];
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = short.Parse(s_arr[i]);
                }
                loaded_list.Add(arr);
            }
            file.Close();
            file.Dispose();

            return(loaded_list);
#else
            throw new NotImplementedException();
#endif
        }