process, sink 작업
This commit is contained in:
@@ -1,7 +1,24 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class SimulationModelProcess : MonoBehaviour
|
||||
using System.Collections;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.Events;
|
||||
public class SimulationModelProcess : SimulationModel
|
||||
{
|
||||
public string eventUsingQueue = "processor_using_queue";
|
||||
public string eventUsingStore = "processor_using_store";
|
||||
public string eventStartBatch = "processor_batch_started";
|
||||
public string eventOutputQueue = "processor_output_queue";
|
||||
public List<GameObject> listProducts = new List<GameObject>();
|
||||
public Transform productPos;
|
||||
public UnityEvent onProcessStart;
|
||||
public UnityEvent onProcessEnd;
|
||||
int productCount = 0;
|
||||
float processTime = 0;
|
||||
float elapsedTime = 0;
|
||||
ConcurrentQueue<JObject> dataQueue;
|
||||
bool startBatch = false;
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
void Start()
|
||||
{
|
||||
@@ -11,6 +28,116 @@ public class SimulationModelProcess : MonoBehaviour
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
if (!startBatch) return;
|
||||
elapsedTime += Time.deltaTime;
|
||||
if (elapsedTime > processTime)
|
||||
{
|
||||
onProcessEnd?.Invoke();
|
||||
startBatch = false;
|
||||
}
|
||||
}
|
||||
protected override IEnumerator RunSimulationCoroutine()
|
||||
{
|
||||
yield return new WaitUntil(() => !string.IsNullOrEmpty(nodeID));
|
||||
while (dataQueue == null)
|
||||
{
|
||||
dataQueue = MQTTDataBase.Instance.GetDataQueue(nodeID);
|
||||
if (dataQueue == null)
|
||||
yield return null;
|
||||
else
|
||||
break;
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
if (dataQueue.IsEmpty)
|
||||
{
|
||||
yield return null;
|
||||
continue;
|
||||
}
|
||||
if (dataQueue.TryDequeue(out JObject currentData))
|
||||
{
|
||||
string eventKey = "_event";
|
||||
if (currentData.ContainsKey(eventKey))
|
||||
{
|
||||
string value = currentData[eventKey].ToString();
|
||||
if (value.Contains(eventUsingQueue))
|
||||
{
|
||||
string[] queueIDKey = { "data", "queue_name" };
|
||||
string[] loadCountKey = { "data", "required_items" };
|
||||
string queueID = GetJsonValue(currentData, queueIDKey)?.ToString();
|
||||
int loadCount = GetJsonIntValue(currentData, loadCountKey);
|
||||
SimulationModel model = DataManager.I.GetModel(queueID);
|
||||
SimulationModelStore storeModel = (SimulationModelStore)model;
|
||||
for (int i = 0; i < loadCount; i++)
|
||||
{
|
||||
GameObject product = null;
|
||||
yield return new WaitUntil(() => {
|
||||
product = storeModel.GetProduct();
|
||||
return product != null;
|
||||
});
|
||||
product.transform.parent = productPos;
|
||||
product.transform.localPosition = Vector3.zero;
|
||||
product.transform.localRotation = Quaternion.identity;
|
||||
listProducts.Add(product);
|
||||
}
|
||||
}
|
||||
else if (value.Contains(eventUsingStore))
|
||||
{
|
||||
string[] queueIDKey = { "data", "store_name" };
|
||||
string[] loadCountKey = { "data", "required_items" };
|
||||
string queueID = GetJsonValue(currentData, queueIDKey)?.ToString();
|
||||
int loadCount = GetJsonIntValue(currentData, loadCountKey);
|
||||
SimulationModel model = DataManager.I.GetModel(queueID);
|
||||
SimulationModelStore storeModel = (SimulationModelStore)model;
|
||||
for (int i = 0; i < loadCount; i++)
|
||||
{
|
||||
GameObject product = null;
|
||||
yield return new WaitUntil(() => {
|
||||
product = storeModel.GetProduct();
|
||||
return product != null;
|
||||
});
|
||||
product.transform.parent = productPos;
|
||||
product.transform.localPosition = Vector3.zero;
|
||||
product.transform.localRotation = Quaternion.identity;
|
||||
listProducts.Add(product);
|
||||
}
|
||||
}
|
||||
else if (value.Contains(eventStartBatch))
|
||||
{
|
||||
string[] productCountKey = { "data", "product_count" };
|
||||
string[] processTimeKey = { "data", "processing_time" };
|
||||
int productCount = GetJsonIntValue(currentData, productCountKey);
|
||||
processTime = GetJsonFloatValue(currentData, processTimeKey);
|
||||
elapsedTime = 0;
|
||||
startBatch = true;
|
||||
onProcessStart?.Invoke();
|
||||
}
|
||||
else if (value.Contains(eventOutputQueue))
|
||||
{
|
||||
string[] outputQueueKey = { "data", "queue_name" };
|
||||
string[] productCountKey = { "data", "products_to_add" };
|
||||
string queueID = GetJsonValue(currentData, outputQueueKey)?.ToString();
|
||||
int productCount = GetJsonIntValue(currentData, productCountKey);
|
||||
SimulationModel model = DataManager.I.GetModel(queueID);
|
||||
SimulationModelStore storeModel = (SimulationModelStore)model;
|
||||
for (int i = 0; i < productCount; i++)
|
||||
{
|
||||
if (listProducts.Count > 0)
|
||||
{
|
||||
GameObject product = listProducts[0];
|
||||
storeModel.StoreProduct(product);
|
||||
listProducts.Remove(product);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning("Trying to unload from empty transporter : " + nodeID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user