Files
ENIG/Cs_HMI/Project/StateMachine/AGVPosition.cs
2025-04-24 11:51:55 +09:00

145 lines
4.3 KiB
C#

using System;
using System.Collections.Generic;
namespace Project.StateMachine
{
public class AGVPosition
{
public enum PositionType
{
None,
Tops1,
Sstron1,
Sstron2,
Path
}
public class Position
{
public int RFID { get; set; }
public PositionType Type { get; set; }
public string Name { get; set; }
public string Direction { get; set; }
public List<int> ConnectedPositions { get; set; }
public Position(int rfid, PositionType type, string name, string direction)
{
RFID = rfid;
Type = type;
Name = name;
Direction = direction;
ConnectedPositions = new List<int>();
}
}
private Dictionary<int, Position> positionMap;
private static AGVPosition instance;
private AGVPosition()
{
positionMap = new Dictionary<int, Position>();
InitializePositions();
}
public static AGVPosition Instance
{
get
{
if (instance == null)
{
instance = new AGVPosition();
}
return instance;
}
}
private void InitializePositions()
{
// Tops 1 관련 위치
AddPosition(100, PositionType.Tops1, "Tops 1", "0");
AddPosition(101, PositionType.Path, "Tops1-Sstron1 Path 1", "0");
AddPosition(102, PositionType.Path, "Tops1-Sstron1 Path 2", "0");
// Sstron 1 관련 위치
AddPosition(200, PositionType.Sstron1, "Sstron 1", "0");
AddPosition(201, PositionType.Path, "Sstron1-Sstron2 Path 1", "0");
AddPosition(202, PositionType.Path, "Sstron1-Sstron2 Path 2", "0");
// Sstron 2 관련 위치
AddPosition(300, PositionType.Sstron2, "Sstron 2", "0");
// 경로 연결 설정
ConnectPositions(100, 101);
ConnectPositions(101, 102);
ConnectPositions(102, 200);
ConnectPositions(200, 201);
ConnectPositions(201, 202);
ConnectPositions(202, 300);
}
private void AddPosition(int rfid, PositionType type, string name, string direction)
{
positionMap[rfid] = new Position(rfid, type, name, direction);
}
private void ConnectPositions(int pos1, int pos2)
{
if (positionMap.ContainsKey(pos1) && positionMap.ContainsKey(pos2))
{
positionMap[pos1].ConnectedPositions.Add(pos2);
positionMap[pos2].ConnectedPositions.Add(pos1);
}
}
public Position GetPosition(int rfid)
{
if (positionMap.ContainsKey(rfid))
{
return positionMap[rfid];
}
return null;
}
public List<int> FindPath(int startRfid, int endRfid)
{
if (!positionMap.ContainsKey(startRfid) || !positionMap.ContainsKey(endRfid))
{
return null;
}
var visited = new HashSet<int>();
var path = new List<int>();
if (FindPathDFS(startRfid, endRfid, visited, path))
{
return path;
}
return null;
}
private bool FindPathDFS(int current, int end, HashSet<int> visited, List<int> path)
{
if (current == end)
{
path.Add(current);
return true;
}
visited.Add(current);
path.Add(current);
foreach (var next in positionMap[current].ConnectedPositions)
{
if (!visited.Contains(next))
{
if (FindPathDFS(next, end, visited, path))
{
return true;
}
}
}
path.RemoveAt(path.Count - 1);
return false;
}
}
}