|
|
|
@ -1,15 +1,104 @@
|
|
|
|
using System;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
using System.Text;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace SmartAquaViewer.DataAnalisys
|
|
|
|
namespace SmartAquaViewer.DataAnalisys
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
internal class AquarDataControl
|
|
|
|
internal class AquarDataControl
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
private AQUA_DATA_CONTROL_STATE state = AQUA_DATA_CONTROL_STATE.IDLE;
|
|
|
|
|
|
|
|
private readonly IWaterQuality iwaterQuality;
|
|
|
|
|
|
|
|
private CancellationTokenSource? cts;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AppDbContext db = new AppDbContext();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AquarDataControl(IWaterQuality iwaterQuality)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.iwaterQuality = iwaterQuality;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AQUA_DATA_CONTROL_STATE GetState() => state;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// 파일 파싱 시작
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
public void ParseFile(string filePath)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// --- 동기 처리 구간 ---
|
|
|
|
|
|
|
|
if (state != AQUA_DATA_CONTROL_STATE.IDLE &&
|
|
|
|
|
|
|
|
state != AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
iwaterQuality.OnError("illegal state error : " + state);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
state = AQUA_DATA_CONTROL_STATE.PROCESSING;
|
|
|
|
|
|
|
|
cts = new CancellationTokenSource();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --- 비동기 처리 구간 ---
|
|
|
|
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var fileInfo = new FileInfo(filePath);
|
|
|
|
|
|
|
|
long totalBytes = fileInfo.Length;
|
|
|
|
|
|
|
|
long processedBytes = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
|
|
|
|
|
|
|
|
using (var reader = new StreamReader(fs))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
string? line;
|
|
|
|
|
|
|
|
while ((line = await reader.ReadLineAsync()) != null)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cts.Token.ThrowIfCancellationRequested();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
processedBytes += Encoding.UTF8.GetByteCount(line + Environment.NewLine);
|
|
|
|
|
|
|
|
double percent = (double)processedBytes / totalBytes * 100.0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: 라인 파싱 로직
|
|
|
|
|
|
|
|
WaterQualityVO vo = new();
|
|
|
|
|
|
|
|
vo.PH = 10.5;
|
|
|
|
|
|
|
|
vo.Timestamp = DateTime.Now;
|
|
|
|
|
|
|
|
iwaterQuality.OnParsed(vo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
db.Add(vo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iwaterQuality.OnProgress(percent);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
state = AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED;
|
|
|
|
|
|
|
|
iwaterQuality.OnCompleted();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (OperationCanceledException)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
state = AQUA_DATA_CONTROL_STATE.CANCELLED;
|
|
|
|
|
|
|
|
iwaterQuality.OnCancelled();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
state = AQUA_DATA_CONTROL_STATE.ERROR;
|
|
|
|
|
|
|
|
iwaterQuality.OnError("파일 처리 중 오류 발생: " + ex.Message);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// 처리 중단 요청
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
public void Cancel()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cts.Cancel();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|