using System.Linq;
using AR;
using AGVNavigationCore.Models;
using Project.StateMachine;
using System.Windows.Forms;
using System;
using System.Collections.Generic;
namespace Project.Dialog
{
public partial class fACSCommand : Form
{
public fACSCommand()
{
InitializeComponent();
}
private void btnGoto_Click(object sender, EventArgs e)
{
var btn = sender as Button;
if (btn == null) return;
var targetAlias = btn.Text.Trim();
var targetNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.AliasName.ToUpper() == targetAlias.ToUpper());
if (targetNode == null)
{
// Fallback for Buffer names which might have spaces
targetNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.AliasName.ToUpper().Replace(" ", "") == targetAlias.ToUpper().Replace(" ", ""));
}
if (targetNode == null)
{
UTIL.MsgE($"대상 노드를 찾을 수 없습니다: {targetAlias}");
return;
}
// Goto 명령 데이터: RFID 문자열
var data = System.Text.Encoding.Default.GetBytes(targetNode.RfidId.ToString());
ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE.Goto, data);
}
private void btnWork_Click(object sender, EventArgs e)
{
var btn = sender as Button;
if (btn == null) return;
ENIGProtocol.AGVCommandHE cmd;
switch (btn.Text)
{
case "PickOn Enter": cmd = ENIGProtocol.AGVCommandHE.PickOnEnter; break;
case "PickOff Enter": cmd = ENIGProtocol.AGVCommandHE.PickOffEnter; break;
case "Pickon Exit": cmd = ENIGProtocol.AGVCommandHE.PickOnExit; break;
case "PickOff Exit": cmd = ENIGProtocol.AGVCommandHE.PickOffExit; break;
default: return;
}
ExecuteRemoteCommand(cmd);
}
private void btnAction_Click(object sender, EventArgs e)
{
var btn = sender as Button;
if (btn == null) return;
switch (btn.Text)
{
case "Turn Left":
ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE.LTurn);
break;
case "Turn Right":
ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE.RTurn);
break;
case "Mark Stop":
ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE.MarkStop);
break;
case "Charge":
// ChargeControl: 1=On
ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE.ChargeControl, (byte)1);
break;
}
}
private void fACSCommand_Load(object sender, EventArgs e)
{
}
///
/// ACS로부터 수신된 패킷인 것처럼 시뮬레이션하여 메인 폼의 로직을 실행합니다.
///
private void ExecuteRemoteCommand(ENIGProtocol.AGVCommandHE cmd, params byte[] data)
{
// XBEE 패킷 시뮬레이션
var packet = new ENIG.Packet();
packet.ID = 0; // ACS ID
packet.Command = (byte)cmd;
// 데이터 설정 (TargetID: PUB.setting.XBE_ID)
var buffer = new List();
buffer.Add((byte)PUB.setting.XBE_ID);
if (data != null) buffer.AddRange(data);
packet.Data = buffer.ToArray();
var args = new ENIG.EEProtocol.DataEventArgs { ReceivedPacket = packet };
var mainForm = Application.OpenForms.OfType().FirstOrDefault();
if (mainForm != null)
{
// fMain.cs 내의 XBE_ProtocReceived를 호출하기 위해 리플렉션 사용
var method = typeof(fMain).GetMethod("XBE_ProtocReceived", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (method != null)
{
method.Invoke(mainForm, new object[] { null, args });
}
else
{
UTIL.MsgE("명령 처리 메서드(XBE_ProtocReceived)를 찾을 수 없습니다.");
}
}
else
{
UTIL.MsgE("메인 폼 인스턴스를 찾을 수 없습니다.");
}
}
}
}