Files
XRLib/Assets/Scripts/Simulator/Components/ComponentMqttHandler.cs
2026-02-26 14:04:33 +09:00

109 lines
4.2 KiB
C#

using Simulator.Config;
using Simulator.Data.Transport;
using System.Collections.Generic;
using UnityEngine;
using UVC.Data;
using UVC.Data.Core;
using UVC.Data.Mqtt;
namespace Simulator.Data
{
public class ComponentMqttHandler
{
private readonly ComponentPoolManager _poolManager;
public ComponentMqttHandler(ComponentPoolManager poolManager)
{
_poolManager = poolManager;
}
public void SubscribeTopic(Dictionary<string, ComponentBase> componentDatas)
{
foreach (var componentdata in componentDatas)
{
DataRepository.Instance.MqttReceiver.AddTopic($"simulation/{SimulationConfig.SimulationCode}/components/+/{componentdata.Key}/#");
var mqttConfig = new MqttSubscriptionConfig($"simulation/{SimulationConfig.SimulationCode}/components/+/{componentdata.Key}/#", false);
mqttConfig.SetDataMapper(_poolManager.DataMappers[componentdata.Value.componentType]);
mqttConfig.SetHandler((value) => OnUpdateData(value, componentdata.Value.componentType));
DataRepository.Instance.MqttReceiver.Add(mqttConfig);
}
DataRepository.Instance.MqttReceiver.AddTopic($"simulation/{SimulationConfig.SimulationCode}/status_changed");
var config = new MqttSubscriptionConfig($"simulation/{SimulationConfig.SimulationCode}/status_changed", false);
var progressDataMask = new DataMask();
DataMapper progressmapper = new DataMapper(progressDataMask);
config.SetDataMapper(progressmapper);
config.SetHandler(PlayerPropertyDataBase.Instance.GetMqttData);
DataRepository.Instance.MqttReceiver.Add(config);
}
public void OnUpdateData(IDataObject data, ComponentType type)
{
if (data is not DataObject obj) return;
string componentId = obj.GetString("component_id");
switch (type)
{
case ComponentType.Source:
case ComponentType.Sink:
case ComponentType.Queue:
if (string.Equals(obj.GetString("event_name"), "completed"))
_poolManager.FindActiveItem(type, componentId)?.GetModelData(obj);
break;
case ComponentType.Rack:
HandleRackEvent(obj, componentId);
break;
case ComponentType.ASRS:
case ComponentType.RobotArm:
case ComponentType.Processor:
case ComponentType.Worker:
_poolManager.FindActiveItem(type, componentId)?.GetModelData(obj);
break;
}
}
private void HandleRackEvent(DataObject obj, string componentId)
{
var rack = _poolManager.FindActiveItem(ComponentType.Rack, componentId) as RackComponent;
if (rack == null) return;
switch (obj.GetString("event_name"))
{
case "entity_stored": rack.GetModelData(obj); break;
case "inventory_initialized": rack.InitializeQueue(obj); break;
}
}
public void SetMQTT(SimulatorCodeDataClass sdata, LogicDetailData logicDetailData)
{
InitTransportAGVs(logicDetailData);
SubscribeConveyors(logicDetailData);
}
private void InitTransportAGVs(LogicDetailData logicDetailData)
{
var managers = logicDetailData.transport_system?.transport_managers;
if (managers is not { Count: > 0 }) return;
foreach (var manager in managers)
{
var fleets = manager.vehicle_fleets;
if (fleets is not { Count: > 0 }) continue;
foreach (var fleet in fleets)
AGVManager.Instance.InitAGV(fleet.vehicles);
}
}
private void SubscribeConveyors(LogicDetailData logicDetailData)
{
var conveyors = logicDetailData.production_system?.conveyors;
if (conveyors is not { Count: > 0 }) return;
foreach (var conveyor in conveyors)
ConveyorManager.Instance.SubscribeConveyor(conveyor);
}
}
}