private async void buttonSendMessage_Click(object sender, EventArgs e) { if (_secsGem == null || _secsGem.State != SECS.ConnectionState.Selected) { MessageBox.Show("SECS State Must be Selected!!"); return; } //if (string.IsNullOrWhiteSpace(txtSendPrimary.Text)) //{ // MessageBox.Show("Send Message SML is Null!!"); // return; //} try { //string test = "QueryLoadPortAccessMode:'S1F3' W <L[3] <U2[1] 18011> <U2[1] 18012> <U2[1] 18013> >"; //var reply = await _secsGem.SendAsync(test.ToSecsMessage()); string str = txtSendPrimary.Text; var reply = await _secsGem.SendAsync(txtSendPrimary.Text.ToSecsMessage()); //txtRecvSecondary.Text = reply.ToSml(); } catch (SecsException ex) { richTextBox2.AppendText(ex.Message + "\r\n"); } }
public static Task <SecsMessage> SendMessage(this SecsGem secsGem, short deviceId, byte s, byte f, bool replyExpected, int systemBytes, Item item = null, string key = "", int value = 0) { SecsMessage secsMessage = new SecsMessage(s, f, replyExpected, GetFunctionName(s, f, key, value), item); CIMBASE.WriteLog(AATS.Log.LogLevel.INFO, "\r\n" + secsMessage.ToSml()); if (systemBytes == -1) { return(secsGem.SendAsync(secsMessage)); } else { return(secsGem.SendAsync(secsMessage, systemBytes)); } }
public async Task SecsGem_SendAsync_And_Return_Secondary_Message() { var options = Options.Create(new SecsGemOptions { SocketReceiveBufferSize = 32, DeviceId = 0, }); using var secsGem1 = new SecsGem(options, pipeConnection1, Substitute.For <ISecsGemLogger>()); using var secsGem2 = new SecsGem(options, pipeConnection2, Substitute.For <ISecsGemLogger>()); var ping = new SecsMessage(s: 1, f: 13) { SecsItem = A("Ping"), }; var pong = new SecsMessage(s: 1, f: 14, replyExpected: false) { SecsItem = A("Pong"), }; using var cts = new CancellationTokenSource(); _ = pipeConnection1.StartAsync(cts.Token); _ = pipeConnection2.StartAsync(cts.Token); _ = Task.Run(async() => { var msg = await secsGem2.GetPrimaryMessageAsync(cts.Token).FirstAsync(cts.Token); msg.PrimaryMessage.Should().BeEquivalentTo(ping); await msg.TryReplyAsync(pong); }); var reply = await secsGem1.SendAsync(ping, cts.Token); reply.Should().NotBeNull().And.BeEquivalentTo(pong); }
private void btnEnable_Click(object sender, EventArgs e) { _secsGem?.Dispose(); _secsGem = new SecsGem( radioActiveMode.Checked, radioActiveMode.Checked?IPAddress.Parse(txtAddress.Text):IPAddress.Any, (int)numPort.Value, (int)numBufferSize.Value) { Logger = _logger, DeviceId = (ushort)numDeviceId.Value }; _secsGem.LinkTestEnable = true; _secsGem.LinkTestInterval = 60000; _secsGem.ConnectionChanged += delegate { this.Invoke((MethodInvoker) delegate { lbStatus.Text = _secsGem.State.ToString(); if (_secsGem.State == ConnectionState.Selected && _secsGem.IsActive) { _secsGem.SendAsync(new SecsMessage(1, 13, "Online Request", Item.L(Item.A(), Item.A()))); } }); }; Settings1.Default.ActiveMode = radioActiveMode.Checked; Settings1.Default.Save(); _secsGem.PrimaryMessageReceived += PrimaryMessageReceived; btnEnable.Enabled = false; _secsGem.Start(); btnDisable.Enabled = true; }
async void btnSend_Click(object sender, EventArgs e) { if (_secsGem == null) { MessageBox.Show("SECS/GEM not enable!"); return; } try { EapLogger.Notice("Send by operator"); await _secsGem.SendAsync(txtMsg.Text.ToSecsMessage()); } catch (Exception ex) { EapLogger.Error(ex); } }
private async void btnSendPrimary_Click(object sender, EventArgs e) { if (_secsGem == null || _secsGem.State != ConnectionState.Selected) { return; } if (string.IsNullOrWhiteSpace(txtSendPrimary.Text)) { return; } try { var reply = await _secsGem.SendAsync(txtSendPrimary.Text.ToSecsMessage()); txtRecvSecondary.Text = reply.ToSml(); } catch (SecsException ex) { txtRecvSecondary.Text = ex.Message; } }
public void SecsGem_SendAsync_With_Different_Device_Id() { var options1 = Options.Create(new SecsGemOptions { SocketReceiveBufferSize = 32, DeviceId = 0, }); var options2 = Options.Create(new SecsGemOptions { SocketReceiveBufferSize = 32, DeviceId = 1, }); using var secsGem1 = new SecsGem(options1, pipeConnection1, Substitute.For <ISecsGemLogger>()); using var secsGem2 = new SecsGem(options2, pipeConnection2, Substitute.For <ISecsGemLogger>()); var ping = new SecsMessage(s: 1, f: 13) { SecsItem = A("Ping"), }; using var cts = new CancellationTokenSource(); _ = pipeConnection1.StartAsync(cts.Token); _ = pipeConnection2.StartAsync(cts.Token); var receiver = Substitute.For <Action <SecsMessage> >(); _ = Task.Run(async() => { await foreach (var a in secsGem2.GetPrimaryMessageAsync(cts.Token)) { // can't receive any message, reply S9F1 internally receiver(a.PrimaryMessage); } }); Func <Task> sendAsync = async() => { var reply = await secsGem1.SendAsync(ping, cts.Token); }; sendAsync.Should().ThrowAsync <SecsException>().WithMessage(Resources.S9F1); receiver.DidNotReceive(); }
public void SecsGem_SendAsync_With_T3_Timeout() { var options1 = Options.Create(new SecsGemOptions { SocketReceiveBufferSize = 32, DeviceId = 0, T3 = 500, }); using var secsGem1 = new SecsGem(options1, pipeConnection1, Substitute.For <ISecsGemLogger>()); using var secsGem2 = new SecsGem(options1, pipeConnection2, Substitute.For <ISecsGemLogger>()); var ping = new SecsMessage(s: 1, f: 13) { SecsItem = A("Ping"), }; var pong = new SecsMessage(s: 1, f: 14, replyExpected: false) { SecsItem = A("Pong"), }; using var cts = new CancellationTokenSource(); _ = Task.Run(async() => { await foreach (var a in secsGem2.GetPrimaryMessageAsync(cts.Token)) { await Task.Delay(TimeSpan.FromMilliseconds(options1.Value.T3 + 100)); // process delay over T3 await a.TryReplyAsync(pong); } }); var receiver = Substitute.For <Action>(); Func <Task> sendAsync = async() => { var reply = await secsGem1.SendAsync(ping, cts.Token); receiver(); }; sendAsync.Should().ThrowAsync <SecsException>().WithMessage(Resources.T3Timeout); receiver.DidNotReceive(); }
void menuItemGemEnable_Click(object sender, EventArgs e) { EapLogger.Info("SECS/GEM Start"); gemStatusLabel.Text = "Start"; _secsGem?.Dispose(); _secsGem = new SecsGem( EAPConfig.Instance.Mode == ConnectionMode.Active, IPAddress.Parse(EAPConfig.Instance.IP), EAPConfig.Instance.TcpPort, EAPConfig.Instance.SocketRecvBufferSize) { DeviceId = EAPConfig.Instance.DeviceId, LinkTestInterval = EAPConfig.Instance.LinkTestInterval, T3 = EAPConfig.Instance.T3, T5 = EAPConfig.Instance.T5, T6 = EAPConfig.Instance.T6, T7 = EAPConfig.Instance.T7, T8 = EAPConfig.Instance.T8, Logger = new SecsLogger() }; _secsGem.ConnectionChanged += delegate { this.Invoke((MethodInvoker) delegate { EapLogger.Info("SECS/GEM " + _secsGem.State); gemStatusLabel.Text = _secsGem.State.ToString(); eqpAddressStatusLabel.Text = "Device IP: " + _secsGem.DeviceAddress; if (_secsGem.State == ConnectionState.Selected) { _secsGem.SendAsync(new SecsMessage(1, 13, "TestCommunicationsRequest", Item.L())); } }); }; _secsGem.PrimaryMessageReceived += PrimaryMsgHandler; _secsGem.Start(); menuItemGemDisable.Enabled = true; menuItemGemEnable.Enabled = false; }
private void SendAsyncManyMessagesAtOnce(ISecsConnection connection1, ISecsConnection connection2, CancellationToken cancellation) { var secsGem1 = new SecsGem(optionsActive, connection1, Substitute.For <ISecsGemLogger>()); var secsGem2 = new SecsGem(optionsPassive, connection2, Substitute.For <ISecsGemLogger>()); _ = Task.Run(async() => { var pong = new SecsMessage(s: 1, f: 14, replyExpected: false) { SecsItem = A("Pong"), }; await foreach (var a in secsGem2.GetPrimaryMessageAsync(cancellation)) { await a.TryReplyAsync(pong); } }); Func <Task> sendAsync = async() => { var ping = new SecsMessage(s: 1, f: 13) { SecsItem = A("Ping"), }; var sendCount = 10000; var totalTasks = new List <Task <SecsMessage> >(capacity: sendCount); for (var g = 0; g < sendCount; g++) { totalTasks.Add(secsGem1.SendAsync(ping, cancellation).AsTask()); } await Task.WhenAll(totalTasks.ToArray()); }; sendAsync.Should().NotThrowAsync(); }
private void EstablishCommButton_Click(object sender, EventArgs e) { _secsGem.SendAsync(new SecsMessage(1, 13, "TestCommunicationsRequest", Item.L())); }
private void btnSendPrimaryMsg_Click(object sender, EventArgs e) { secsGem.SendAsync(this.primaryMsgToSend.Text.ToSecsMessage()); }