Files
ENIG/Cs_HMI/Project/Dialog/fXbeeSetting.cs
2025-12-23 13:07:01 +09:00

194 lines
5.6 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AR;
using COMM;
namespace Project.Dialog
{
public partial class fXbeeSetting : Form
{
public fXbeeSetting()
{
InitializeComponent();
VAR.BOOL[eVarBool.DISABLE_AUTOCONN_XBEE] = true;
PUB.XBE.Close();
this.serialPort1.DataReceived += SerialPort1_DataReceived;
}
private void fXbeeSetting_Load(object sender, EventArgs e)
{
this.tbPortName.Items.Clear();
foreach (var item in System.IO.Ports.SerialPort.GetPortNames())
{
this.tbPortName.Items.Add(item);
}
this.tbPortName.Text = PUB.setting.Port_XBE;
this.tbBaud.Text = PUB.setting.Baud_XBE.ToString();
}
void showlog(string Message)
{
if (rtXbee.Visible)
{
rtXbee.AddMsg(DateTime.Now, "NORMAL", Message);
}
}
void showlog(arCtl.LogTextBox rtRx, DateTime LogTime, string TypeStr, string Message)
{
if (rtRx.Visible)
{
rtRx.AddMsg(LogTime, TypeStr, Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (this.serialPort1.IsOpen)
{
serialPort1.Close();
showlog("closed");
}
else
{
serialPort1.PortName = tbPortName.Text;
serialPort1.BaudRate = int.Parse(tbBaud.Text);
serialPort1.Open();
showlog("open");
}
}
private void fXbeeSetting_FormClosed(object sender, FormClosedEventArgs e)
{
VAR.BOOL[eVarBool.DISABLE_AUTOCONN_XBEE] = false;
}
private volatile bool isCommandExecuting = false;
private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (isCommandExecuting) return;
try
{
string data = serialPort1.ReadExisting();
var hexdata = System.Text.Encoding.Default.GetBytes(data);
var hexstr = string.Join(" ", hexdata.Select(t => t.ToString("X2")));
if (!string.IsNullOrEmpty(data))
{
this.BeginInvoke(new Action(() =>
{
showlog($"RxAsync: {hexstr}");
}));
}
}
catch { }
}
private string Cmd(string cmd, int timeout = 1000)
{
isCommandExecuting = true;
try
{
if (!serialPort1.IsOpen) return "Error: Port Closed";
serialPort1.DiscardInBuffer();
serialPort1.Write(cmd);
System.Threading.Thread.Sleep(20);
serialPort1.ReadTimeout = timeout;
string res = serialPort1.ReadTo("\r");
System.Threading.Thread.Sleep(20);
showlog($"Tx:{cmd.Trim()}, Rx:{res}");
//명령수신호 10ms 대기후 다음 명령을 전송
System.Threading.Thread.Sleep(20);
return res;
}
catch (Exception ex)
{
showlog($"Err: {ex.Message}");
return "Error";
}
finally
{
isCommandExecuting = false;
}
}
private void btpand_Click(object sender, EventArgs e)
{
//각명령마다 회신을 확인하고 다음명령을 실행해야함
//명령수신호 10ms 대기후 다음 명령을 전송
//명령을 설정하면 응답은 OK\d 형태로 입력된다.
var cmds = new string[] {
"+++",
$"ATID{tbpanid.Text}\r" ,
$"ATCN\r"};
foreach (var cmd in cmds)
{
if(!Cmd(cmd).Contains("OK"))
{
showlog("FAIL");
break;
}
}
}
private void btch_Click(object sender, EventArgs e)
{
var cmds = new string[] {
"+++",
$"ATCH{tbch.Text}\r" ,
$"ATCN\r"};
foreach (var cmd in cmds)
{
if (!Cmd(cmd).Contains("OK"))
{
showlog("FAIL");
break;
}
}
}
private void btmy_Click(object sender, EventArgs e)
{
var cmds = new string[] {
"+++",
$"ATMY{tbmy.Text}\r" ,
$"ATCN\r"};
foreach (var cmd in cmds)
{
if (!Cmd(cmd).Contains("OK"))
{
showlog("FAIL");
break;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
//read all(id,ch,my)
if (Cmd("+++").Contains("OK"))
{
var id = Cmd("ATID\r");
var ch = Cmd("ATCH\r");
var my = Cmd("ATMY\r");
Cmd("ATCN\r");
this.BeginInvoke(new Action(() => {
this.tbpanid.Text = id;
this.tbch.Text = ch;
this.tbmy.Text = my;
}));
}
}
}
}