/// <summary> /// Входящая команда /// </summary> /// <param name="_timeout">Время ожидания прихода команды, мс</param> public Command(ulong _timeout) { address = 0; count = 0; timeOut = _timeout; commandType = CommandType.TYPICAL; set_or_get = SET_OR_GET.OTHER; index = 0; data = new byte[0]; }
//public CommandType comType; /// <summary> /// Отправляемая команда /// </summary> /// <param name="_addr">Адрес данных</param> /// <param name="_cnt">Количество байт (размер)</param> /// <param name="_set_or_get">Команда для SET, GET или общая</param> /// <param name="_index">Индекс текущего сигнала среди общего списка сигналов (параметров) платы</param> public Command(ushort _addr, ushort _cnt, SET_OR_GET _set_or_get, int _index, CommandType _commandType) { //comType = _comType; address = _addr; count = _cnt; set_or_get = _set_or_get; index = _index; timeOut = 0; commandType = _commandType; //data = new byte[_comType == CommandType.READ ? 0 : _cnt]; data = new byte[_cnt]; }
private void CreateAndSendSignal(BoardSignal signal,int index,SET_OR_GET set_or_get) { if (bCommandBusy) { return; } ushort addr = 0; ushort cnt = 0; uint port = 0; uint groupVal = 0; byte[] buf = null; Udp udp = null; //lastSignal1 = signal; switch (set_or_get) { case SET_OR_GET.SET: { //if (signal.set.source == null) return; addr = (ushort)signal.set.source.address; cnt = signal.set.sizebyte; port = signal.set.source.port; buf = signal.set.source.group.valueTX; //собираем из буфера группы число for (int i = 0; i < buf.Length; i++) { groupVal += (uint)(buf[i] << (8 * i)); } //делаем ИЛИ с отправляемым сигналом groupVal |= signal.set.valueon; } break; case SET_OR_GET.GET: { addr = (ushort)signal.get.source.address; cnt = signal.get.sizebyte; port = signal.get.source.port; buf = signal.get.source.group.valueTX; //собираем из буфера группы число for (int i = 0; i < buf.Length; i++) { groupVal += (uint)(buf[i] << (8 * i)); } //делаем ИЛИ с отправляемым сигналом //groupVal |= signal.get.valueon; } break; case SET_OR_GET.DESET: { addr = (ushort)signal.set.source.address; cnt = signal.set.sizebyte; port = signal.set.source.port; buf = signal.set.source.group.valueTX; //собираем из буфера группы число for (int i = 0; i < buf.Length; i++) { groupVal += (uint)(buf[i] << (8 * i)); } //делаем И с отправляемым сигналом на выключение groupVal &= signal.set.valueoff; } break; } //выбираем порт для отправки if (port == uint.Parse(_frmMainWindow._frmSettings.txtIPPort1.Text)) { udp = udpPU; lastSignal1 = signal; } if (port == uint.Parse(_frmMainWindow._frmSettings.txtIPPort2.Text)) { udp = udpPK; lastSignal2 = signal; } if (port == uint.Parse(_frmMainWindow._frmSettings.txtIPPort3.Text)) { udp = udpPTVC; lastSignal3 = signal; } //собираем обратно получившееся значение в групповой буфер for (int i = 0; i < buf.Length; i++) { buf[i] = (byte)((groupVal >> (8 * i)) & 0xFF); } //создаем команду с определенным адресом и количеством байт данных Command com = new Command(addr,cnt,set_or_get,index,CommandType.TYPICAL); //заполняем буфер данных значением группы com.data = buf; //отображаем уходящий пакет на форме ShowBuf(com.GetCommandByteBuf(),BUF_TO_SHOW.TX); //команда уходит if (udp != null) { bCommandBusy = true; udp.SendCommand(com); } else { MessageBox.Show("Проверьте соединение!","7600",MessageBoxButtons.OK,MessageBoxIcon.Error); return; } while (bCommandBusy) { this.Cursor = Cursors.AppStarting; Application.DoEvents(); } this.Cursor = Cursors.Default; }