diff --git a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs
index 52cfb36..1c17ada 100644
--- a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs
+++ b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs
@@ -1,15 +1,96 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmartAquaViewer.DataAnalisys
{
+
+
+
internal class AquarDataControl
{
+ private AQUA_DATA_CONTROL_STATE state = AQUA_DATA_CONTROL_STATE.IDLE;
+ private readonly IWaterQuality iwaterQuality;
+ private CancellationTokenSource? cts;
+
+ public AquarDataControl(IWaterQuality iwaterQuality)
+ {
+ this.iwaterQuality = iwaterQuality;
+ }
+
+ public AQUA_DATA_CONTROL_STATE GetState() => state;
+
+ ///
+ /// 파일 파싱 시작
+ ///
+ 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;
+
+ iwaterQuality.OnProgress(percent);
+
+ // TODO: 라인 파싱 로직
+ }
+ }
+ 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);
+ }
+ });
+ }
+ ///
+ /// 처리 중단 요청
+ ///
+ public void Cancel()
+ {
+ if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null)
+ {
+ cts.Cancel();
+ }
+ }
}
diff --git a/SmartAquaViewer/DataAnalisys/IWaterQuality.cs b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs
new file mode 100644
index 0000000..a76621e
--- /dev/null
+++ b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SmartAquaViewer.DataAnalisys
+{
+
+ internal enum AQUA_DATA_CONTROL_STATE
+ {
+ IDLE,
+ PROCESSING,
+ PROCESS_COMPLETED,
+ CANCELLED,
+ ERROR
+ }
+
+
+ internal interface IWaterQuality
+ {
+ void OnProgress(double percent);
+ void OnError(string message);
+ void OnCompleted();
+ void OnCancelled();
+ }
+}