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 ConnectedPositions { get; set; } public Position(int rfid, PositionType type, string name, string direction) { RFID = rfid; Type = type; Name = name; Direction = direction; ConnectedPositions = new List(); } } private Dictionary positionMap; private static AGVPosition instance; private AGVPosition() { positionMap = new Dictionary(); 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 FindPath(int startRfid, int endRfid) { if (!positionMap.ContainsKey(startRfid) || !positionMap.ContainsKey(endRfid)) { return null; } var visited = new HashSet(); var path = new List(); if (FindPathDFS(startRfid, endRfid, visited, path)) { return path; } return null; } private bool FindPathDFS(int current, int end, HashSet visited, List 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; } } }