109 lines
4.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|