Browse Source

Merge branch 'master' of http://unque781.synology.me:3000/GSI/OHV

unque781 6 years ago
parent
commit
4270d5a9e0

+ 1 - 0
Dev/Connection/OHVProtocolServer/OHVConnector/Manager.cs

@@ -264,6 +264,7 @@ namespace OHVConnector
                 }
                 catch ( Exception e )
                 {
+                    TcpError( e );
                     logger.E( e );
                 }
             }

+ 325 - 325
Dev/OHV/Assambly/GSG.NET.XML

@@ -1705,621 +1705,621 @@
             <para>Trim은 옵션으로 체크</para>
             </summary>
         </member>
-        <member name="T:GSG.NET.ObjectBase.SingletonBase`1">
-            <summary>
-            A base class for the singleton design pattern.
-            </summary>
-            <typeparam name="T">Class type of the singleton</typeparam>
-        </member>
-        <member name="F:GSG.NET.ObjectBase.SingletonBase`1.sInstance">
+        <member name="M:GSG.NET.Logging.AppenderUtils.RemoveAppender(log4net.Repository.Hierarchy.Logger,System.String)">
             <summary>
-            Static instance. Needs to use lambda expression
-            to construct an instance (since constructor is private).
+            <para>1. Logger에서 Appender 제거함.</para>
+            <para>2. Close Appender</para>
             </summary>
+            <param name="logger"></param>
+            <param name="name"></param>
         </member>
-        <member name="P:GSG.NET.ObjectBase.SingletonBase`1.Instance">
+        <member name="T:GSG.NET.Logging.CsvAppender">
             <summary>
-            Gets the instance of this singleton.
+            Csv Header를 추가한 appender
+            <para>def values</para>
+            <para>File: CSV</para>
+            <para>Name: CsvAppender</para>
+            <para>DatePattern: -yyyyMMdd.'csv'</para>
+            <para>BackupDays: 30</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.ObjectBase.SingletonBase`1.CreateInstanceOfT">
+        <member name="P:GSG.NET.Logging.CsvAppender.Header">
             <summary>
-            Creates an instance of T via reflection since T's constructor is expected to be private.
+            Csv Header
             </summary>
-            <returns></returns>
         </member>
-        <member name="T:GSG.NET.OSView.EventLogSpy">
+        <member name="P:GSG.NET.Logging.CsvAppender.LogPattern">
             <summary>
-            <para>Event 로그를 읽는것이 느려서</para>
-            <para>EntryWritten을 활용하는 방법으로 구현한다.</para>
+            <para>Log content pattern</para>
+            <para>%m%n</para>
             </summary>
         </member>
-        <member name="E:GSG.NET.OSView.EventLogSpy.OnEntryWritten">
+        <member name="M:GSG.NET.Logging.CsvAppender.#ctor">
             <summary/>
         </member>
-        <member name="T:GSG.NET.OSView.EventLogSpy.LogType">
+        <member name="M:GSG.NET.Logging.CsvAppender.ActivateOptions">
             <summary/>
         </member>
-        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Application">
+        <member name="M:GSG.NET.Logging.CsvAppender.WriteHeader">
             <summary/>
         </member>
-        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.System">
-            <summary/>
+        <member name="T:GSG.NET.Logging.FileAppender">
+            <summary>
+            <para>Floware FileAppender</para>
+            <para>-</para>
+            <para>default value</para>
+            <para>BackupDays: 10</para>
+            <para>DatePattern: -MMdd'.log'</para>
+            <para>Layout: %d{MM-dd HH:mm:ss.fff} %-2.2t %-5p %m%n</para>
+            <para>-</para>
+            <para>StaticLogFileName: 최초 파일 생성시 datepattern이 적용된 파일로 생성여부.</para>
+            <para>default: true, xxx.log</para>
+            <para>false: xxx-130405.log</para>
+            <para>폴더 생성 모드를 사용할 경우 자동으로 false로 세팅된다.</para>
+            <para>-</para>
+            <para>PreserveLogFileNameExtension: log4net 1.2.11 이상</para>
+            <para>-</para>
+            <para>폴더 만들기 예제 File</para>
+            <para>"C:/LOG/SECS-I/%d/SECS1"</para>
+            <para>-</para>
+            </summary>
         </member>
-        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Security">
-            <summary/>
+        <member name="M:GSG.NET.Logging.FileAppender.#ctor">
+            <summary>
+            FileAppender constructor
+            </summary>
         </member>
-        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Setup">
+        <member name="M:GSG.NET.Logging.FileAppender.#ctor(log4net.Core.Level)">
+            <summary>
+            FileAppender constructor
+            </summary>
+        </member>
+        <member name="P:GSG.NET.Logging.FileAppender.BackupDays">
             <summary/>
         </member>
-        <member name="M:GSG.NET.OSView.EventLogSpy.Watch(GSG.NET.OSView.EventLogSpy.LogType)">
+        <member name="M:GSG.NET.Logging.FileAppender.ActivateOptions">
             <summary/>
         </member>
-        <member name="M:GSG.NET.OSView.EventLogSpy.Close">
+        <member name="M:GSG.NET.Logging.FileAppender.OpenFile(System.String,System.Boolean)">
             <summary/>
         </member>
-        <member name="M:GSG.NET.OSView.EventLogSpy.WarnOrError(System.Diagnostics.EventLogEntry)">
+        <member name="M:GSG.NET.Logging.FileAppender.AdjustFileBeforeAppend">
             <summary>
-            <para>Waring 또는 에러인지 검사.</para>
+            Logging을 할때마다 아래 함수가 호출되며
+            먼저 파일을 닫고, OpenFile이 호출된다.
             </summary>
         </member>
-        <member name="T:GSG.NET.OSView.Mgnt">
+        <member name="M:GSG.NET.Logging.FileAppender.OnClose">
             <summary>
-            Management
+            appender close
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.PrinterNames">
-            <summary/>
+        <member name="T:GSG.NET.Logging.Logger">
+            <summary>
+            Logger wrapping class
+            </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.CpuUseRate">
+        <member name="M:GSG.NET.Logging.Logger.GetLogger">
             <summary>
-            <para>CPU 사용률 % / 100%기준.</para>
+            Logger를 생성한 Class의 Type을 찾아서 Logger를 만든다.
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ProcCpu1UseRate(System.String)">
+        <member name="M:GSG.NET.Logging.Logger.GetLogger(System.Type)">
             <summary>
-            <para>Process 의 CPU 사용률</para>
-            <para>1 cpu 기준이므로 multi cpu 일 경우 processor count 로 나눠야 한다.</para>
+            Logger factory
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ProcCpuUseRate(System.String)">
+        <member name="M:GSG.NET.Logging.Logger.GetLogger(System.String)">
             <summary>
-            <para>Logical CPU 기준으로 나눈값</para>
+            Logger factory
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ProcMemUseKB(System.String)">
+        <member name="M:GSG.NET.Logging.Logger.D(System.Object)">
             <summary>
-            <para>메모리 사용량 KB</para>
-            <para>PrivateMemorySize</para>
+            Debug
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ProcMemPeakUseKB(System.String)">
+        <member name="M:GSG.NET.Logging.Logger.D(System.String,System.Object[])">
             <summary>
-            <para>Peak 메모리 사용량 KB</para>
-            <para>PrivateMemorySize</para>
+            DebugFormat
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalKB">
+        <member name="P:GSG.NET.Logging.Logger.IsDE">
             <summary>
-            <para>Physical Memory Size KB 단위 추출</para>
+            DebugEnabled
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualKB">
-            <summary>   
-            <para>Virtual Memory Size KB 단위 추출</para>
+        <member name="M:GSG.NET.Logging.Logger.I(System.Object)">
+            <summary>
+            Info
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualFreeKB">
+        <member name="M:GSG.NET.Logging.Logger.I(System.String,System.Object[])">
             <summary>
-            Virtual 기준 Free Kb size
+            InfoFormat
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualUseKB">
+        <member name="M:GSG.NET.Logging.Logger.W(System.Object)">
             <summary>
-            Virtual 기준 Use KB
+            Warn
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalFreeKB">
+        <member name="M:GSG.NET.Logging.Logger.W(System.String,System.Object[])">
             <summary>
-            Physical 기준 Free size
+            WarnFormat
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalUseKB">
+        <member name="M:GSG.NET.Logging.Logger.E(System.Object)">
             <summary>
-            Physical 기준 사용량 KB
+            Error
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalUseRate">
+        <member name="M:GSG.NET.Logging.Logger.E(System.String,System.Object[])">
             <summary>
-            Physical 기준 100분율
+            ErrorFormat
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.OsName">
+        <member name="M:GSG.NET.Logging.Logger.F(System.Object)">
             <summary>
-            <para>OS Name 가져오기.</para>
+            Fatal
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.CpuCountLogical">
+        <member name="M:GSG.NET.Logging.Logger.F(System.String,System.Object[])">
             <summary>
-            <para>Retrieve Total Logical Cpu Count</para>
+            FatalFormat
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualUseRate">
+        <member name="M:GSG.NET.Logging.LoggerUtils.HasLogger(System.String)">
             <summary>
-            <para>메모리 사용률 %</para>
+            Has Logger or not
             </summary>
+            <param name="loggerName">LoggerName</param>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.HddList">
+        <member name="M:GSG.NET.Logging.LoggerUtils.GetLogger(System.String)">
             <summary>
-            <para>Ready 상태이고, HDD 드라이브만 추출</para>
+            <para>Logger가 없을 경우 만들어준다.</para>
+            <para>AddLogger 기능과 같다.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.LocalIpList">
+        <member name="T:GSG.NET.Logging.LogUtils">
             <summary>
-            <para>Local IP Address 가져오기.</para>
+            <para>Log4Net Utils</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.MacAddressList">
+        <member name="M:GSG.NET.Logging.LogUtils.Configure">
             <summary>
-            <para>Local Mac Address 가져오기.</para>
+            <para>empty log4net config</para>
+            <para>log repository...</para>
+            <para>Level: INFO</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.Wql(System.String)">
+        <member name="M:GSG.NET.Logging.LogUtils.Configure(System.String)">
             <summary>
-            wql: SQL for WMI
+            <para>Log4net config file loading</para>
             </summary>
+            <param name="cfgPath"></param>
         </member>
-        <member name="P:GSG.NET.OSView.Mgnt.Is64BitOperatingSystem">
+        <member name="M:GSG.NET.Logging.LogUtils.Configure(System.String,System.Boolean)">
+            <summary/>
+        </member>
+        <member name="P:GSG.NET.Logging.LogUtils.RootLogger">
             <summary>
-            32, 64 bit check
+            <para>Get RootLogger</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.GetDotnetVersion">
+        <member name="M:GSG.NET.Logging.LogUtils.ChangeAdditivity(System.String,System.Boolean)">
             <summary>
-            CLR version retrieve
+            <para>Change additivity option</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.AddFirewall(System.String,System.Int32)">
+        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender">
             <summary>
-            Tcp 방화벽 등록.
+            <para>Create Console Appender</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ServiceStart(System.String)">
+        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender(System.String)">
             <summary/>
+            <param name="name">Appender Name</param>
         </member>
-        <member name="M:GSG.NET.OSView.Mgnt.ServiceStop(System.String)">
+        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender(System.String,log4net.Layout.ILayout)">
             <summary/>
+            <param name="name">Appender Name</param>
+            <param name="layout"></param>
         </member>
-        <member name="T:GSG.NET.Poco">
-            <summary>
-            POCO(Plain Old CLR Object)
-            </summary>
+        <member name="M:GSG.NET.Logging.LogUtils.CommonLogging">
+            <summary/>
         </member>
-        <member name="F:GSG.NET.Poco.T_INT">
+        <member name="M:GSG.NET.Logging.LogUtils.ChangeLevel(log4net.Core.Level)">
             <summary>
-            Int32 타입과 동일
+            <para>RootLogger Change Level</para>
             </summary>
         </member>
-        <member name="F:GSG.NET.Poco.T_LONG">
+        <member name="M:GSG.NET.Logging.LogUtils.ChangeLevel(System.String,log4net.Core.Level)">
             <summary>
-            Int64 타입과 동일
+            <para>Non-RootLogger Change Level</para>
             </summary>
         </member>
-        <member name="F:GSG.NET.Poco.T_FLOAT">
+        <member name="M:GSG.NET.Logging.LogUtils.ChangeThreshold(System.String,log4net.Core.Level)">
             <summary>
-            Single 타입과 동일
+            <para>Change RootLogger Appender's Level</para>
             </summary>
         </member>
-        <member name="F:GSG.NET.Poco.T_DOUBLE">
+        <member name="M:GSG.NET.Logging.LogUtils.ChangeThreshold(System.String,System.String,log4net.Core.Level)">
             <summary>
-            Double 타입과 동일
+            <para>Change Specific Logger Appender's Level</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Poco.ToString">
+        <member name="P:GSG.NET.Logging.LogUtils.DefaultLayout">
             <summary>
-            ToString 재정의
+            <para>%d{MM-dd HH:mm:ss.fff} %-2.2t %-5p %m%n</para>
+            <para>-</para>
+            <para>LoggerName: %-10.10c</para>
+            <para>-</para>
+            <para>%-a.b -:left justify, a:minimum width, b:maximum width</para>
+            <para>-</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Poco.ChgNullValue(System.String)">
+        <member name="M:GSG.NET.Logging.LogUtils.CreateLayout(System.String)">
             <summary>
-            string Property값이 null일 경우 v로 변경.
+            <para>Pattern layout 생성</para>
+            <para>-</para>
+            <para>Class: %c</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Poco.ChgNullValue">
+        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(log4net.Appender.IAppender)">
             <summary>
-            string Property값이 null일 경우 string.Empty로 변경.
+            <para>RootLogger AddAppender</para>
             </summary>
         </member>
-        <member name="F:GSG.NET.Poco.NSS_NULL_STRING">
+        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(System.String,log4net.Appender.IAppender)">
             <summary>
-            Nss Null string setting
-            <para>def: string.Empty</para>
+            <para>Non-RootLogger AddAppender</para>
+            <para>Logger가 없을 경우 생성한다.</para>
+            <para>-</para>
+            <para>AppenderName이 없을 경우 loggerName을 AppenderName으로 세팅한다.</para>
+            <para>-</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Poco.IntV(System.String)">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Poco.DoubleV(System.String)">
-            <summary/>
-        </member>
-        <member name="T:GSG.NET.Interop32">
+        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(System.String,log4net.Appender.IAppender,System.Boolean)">
             <summary>
-            <para>const uint FILE_SHARE_READ = 1;</para>
-            <para></para>
-            <para>const uint FILE_ATTRIBUTE_NORMAL = 0x80;</para>
-            <para></para>
-            <para>const uint GENERIC_READ = 0x80000000;</para>
-            <para>const uint OPEN_EXISTING = 3;</para>
-            <para></para>
-            <para></para>
-            <para></para>
+            <para>Non-RootLogger AddAppender</para>
+            <para>Logger가 없을 경우 생성한다.</para>
+            <para>-</para>
+            <para>AppenderName이 없을 경우 loggerName을 AppenderName으로 세팅한다.</para>
+            <para>-</para>
+            <para>Additivity option</para>
+            <para>-</para>
             </summary>
         </member>
-        <member name="T:GSG.NET.LinqEx">
+        <member name="M:GSG.NET.Logging.LogUtils.RemoveAppender(System.String)">
             <summary>
-            내부적으로 사용하는 Linq 확장함수
-            <para>내부적으로 사용한다는 의미에서 소문자로 시작하는 method 화</para>
+            <para>RootLogger</para>
+            <para>-</para>
+            <para>1. RootLogger에서 Appender 제거함.</para>
+            <para>2. Close Appender</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.avg``1(System.Collections.Generic.IEnumerable{``0})">
+        <member name="M:GSG.NET.Logging.LogUtils.RemoveAppender(System.String,System.String)">
             <summary>
-            source count 0 일 경우 exception 방지
+            <para>Non-RootLogger</para>
+            <para>-</para>
+            <para>1. Logger에서 Appender 제거함.</para>
+            <para>2. Close Appender</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.format(System.Text.StringBuilder,System.String,System.Object[])">
+        <member name="T:GSG.NET.ObjectBase.SingletonBase`1">
             <summary>
-            append format
+            A base class for the singleton design pattern.
             </summary>
+            <typeparam name="T">Class type of the singleton</typeparam>
         </member>
-        <member name="M:GSG.NET.LinqEx.empty``1(System.Collections.Generic.IEnumerable{``0})">
+        <member name="F:GSG.NET.ObjectBase.SingletonBase`1.sInstance">
             <summary>
-            Count, Length == 0
-            <para>source == null: true</para>
+            Static instance. Needs to use lambda expression
+            to construct an instance (since constructor is private).
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.empty(System.String,System.Boolean)">
+        <member name="P:GSG.NET.ObjectBase.SingletonBase`1.Instance">
             <summary>
-            string.IsNullOrEmpty
-            <para>Trim 은 옵션으로 체크</para>
+            Gets the instance of this singleton.
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.multi(System.Single,System.Int32)">
+        <member name="M:GSG.NET.ObjectBase.SingletonBase`1.CreateInstanceOfT">
             <summary>
-            곱하기
+            Creates an instance of T via reflection since T's constructor is expected to be private.
             </summary>
+            <returns></returns>
         </member>
-        <member name="M:GSG.NET.LinqEx.div(System.Int32,System.Int32)">
+        <member name="T:GSG.NET.OSView.EventLogSpy">
             <summary>
-            나누기
+            <para>Event 로그를 읽는것이 느려서</para>
+            <para>EntryWritten을 활용하는 방법으로 구현한다.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.remain(System.Int32,System.Int32)">
-            <summary>
-            나머지
-            </summary>
+        <member name="E:GSG.NET.OSView.EventLogSpy.OnEntryWritten">
+            <summary/>
         </member>
-        <member name="M:GSG.NET.LinqEx.split(System.String,System.String[])">
+        <member name="T:GSG.NET.OSView.EventLogSpy.LogType">
+            <summary/>
+        </member>
+        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Application">
+            <summary/>
+        </member>
+        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.System">
+            <summary/>
+        </member>
+        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Security">
+            <summary/>
+        </member>
+        <member name="F:GSG.NET.OSView.EventLogSpy.LogType.Setup">
+            <summary/>
+        </member>
+        <member name="M:GSG.NET.OSView.EventLogSpy.Watch(GSG.NET.OSView.EventLogSpy.LogType)">
+            <summary/>
+        </member>
+        <member name="M:GSG.NET.OSView.EventLogSpy.Close">
+            <summary/>
+        </member>
+        <member name="M:GSG.NET.OSView.EventLogSpy.WarnOrError(System.Diagnostics.EventLogEntry)">
             <summary>
-            remove empty option 적용, empty string을 제거한다
+            <para>Waring 또는 에러인지 검사.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.stringOf(System.Byte[],System.Text.Encoding)">
+        <member name="T:GSG.NET.OSView.Mgnt">
             <summary>
-            <para>byte array -> string</para>
-            <para>null byte 0 -> 0x20</para>
+            Management
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.stringOf(System.Char[])">
+        <member name="M:GSG.NET.OSView.Mgnt.PrinterNames">
+            <summary/>
+        </member>
+        <member name="M:GSG.NET.OSView.Mgnt.CpuUseRate">
             <summary>
-            char array -> string
+            <para>CPU 사용률 % / 100%기준.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.LinqEx.xFF(System.Byte[])">
+        <member name="M:GSG.NET.OSView.Mgnt.ProcCpu1UseRate(System.String)">
             <summary>
-            byte -&gt; 2byte(0xff) string
-            <para>1,2,3 -gt; 010203</para>
+            <para>Process 의 CPU 사용률</para>
+            <para>1 cpu 기준이므로 multi cpu 일 경우 processor count 로 나눠야 한다.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.AppenderUtils.RemoveAppender(log4net.Repository.Hierarchy.Logger,System.String)">
+        <member name="M:GSG.NET.OSView.Mgnt.ProcCpuUseRate(System.String)">
             <summary>
-            <para>1. Logger에서 Appender 제거함.</para>
-            <para>2. Close Appender</para>
+            <para>Logical CPU 기준으로 나눈값</para>
             </summary>
-            <param name="logger"></param>
-            <param name="name"></param>
         </member>
-        <member name="T:GSG.NET.Logging.CsvAppender">
+        <member name="M:GSG.NET.OSView.Mgnt.ProcMemUseKB(System.String)">
             <summary>
-            Csv Header를 추가한 appender
-            <para>def values</para>
-            <para>File: CSV</para>
-            <para>Name: CsvAppender</para>
-            <para>DatePattern: -yyyyMMdd.'csv'</para>
-            <para>BackupDays: 30</para>
+            <para>메모리 사용량 KB</para>
+            <para>PrivateMemorySize</para>
             </summary>
         </member>
-        <member name="P:GSG.NET.Logging.CsvAppender.Header">
+        <member name="M:GSG.NET.OSView.Mgnt.ProcMemPeakUseKB(System.String)">
             <summary>
-            Csv Header
+            <para>Peak 메모리 사용량 KB</para>
+            <para>PrivateMemorySize</para>
             </summary>
         </member>
-        <member name="P:GSG.NET.Logging.CsvAppender.LogPattern">
+        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalKB">
             <summary>
-            <para>Log content pattern</para>
-            <para>%m%n</para>
+            <para>Physical Memory Size KB 단위 추출</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.CsvAppender.#ctor">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.CsvAppender.ActivateOptions">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.CsvAppender.WriteHeader">
-            <summary/>
-        </member>
-        <member name="T:GSG.NET.Logging.FileAppender">
-            <summary>
-            <para>Floware FileAppender</para>
-            <para>-</para>
-            <para>default value</para>
-            <para>BackupDays: 10</para>
-            <para>DatePattern: -MMdd'.log'</para>
-            <para>Layout: %d{MM-dd HH:mm:ss.fff} %-2.2t %-5p %m%n</para>
-            <para>-</para>
-            <para>StaticLogFileName: 최초 파일 생성시 datepattern이 적용된 파일로 생성여부.</para>
-            <para>default: true, xxx.log</para>
-            <para>false: xxx-130405.log</para>
-            <para>폴더 생성 모드를 사용할 경우 자동으로 false로 세팅된다.</para>
-            <para>-</para>
-            <para>PreserveLogFileNameExtension: log4net 1.2.11 이상</para>
-            <para>-</para>
-            <para>폴더 만들기 예제 File</para>
-            <para>"C:/LOG/SECS-I/%d/SECS1"</para>
-            <para>-</para>
+        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualKB">
+            <summary>   
+            <para>Virtual Memory Size KB 단위 추출</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.FileAppender.#ctor">
+        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualFreeKB">
             <summary>
-            FileAppender constructor
+            Virtual 기준 Free Kb size
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.FileAppender.#ctor(log4net.Core.Level)">
+        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualUseKB">
             <summary>
-            FileAppender constructor
+            Virtual 기준 Use KB
             </summary>
         </member>
-        <member name="P:GSG.NET.Logging.FileAppender.BackupDays">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.FileAppender.ActivateOptions">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.FileAppender.OpenFile(System.String,System.Boolean)">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.FileAppender.AdjustFileBeforeAppend">
+        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalFreeKB">
             <summary>
-            Logging을 할때마다 아래 함수가 호출되며
-            먼저 파일을 닫고, OpenFile이 호출된다.
+            Physical 기준 Free size
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.FileAppender.OnClose">
+        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalUseKB">
             <summary>
-            appender close
+            Physical 기준 사용량 KB
             </summary>
         </member>
-        <member name="T:GSG.NET.Logging.Logger">
+        <member name="M:GSG.NET.OSView.Mgnt.MemPhysicalUseRate">
             <summary>
-            Logger wrapping class
+            Physical 기준 100분율
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.GetLogger">
+        <member name="M:GSG.NET.OSView.Mgnt.OsName">
             <summary>
-            Logger를 생성한 Class의 Type을 찾아서 Logger를 만든다.
+            <para>OS Name 가져오기.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.GetLogger(System.Type)">
+        <member name="M:GSG.NET.OSView.Mgnt.CpuCountLogical">
             <summary>
-            Logger factory
+            <para>Retrieve Total Logical Cpu Count</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.GetLogger(System.String)">
+        <member name="M:GSG.NET.OSView.Mgnt.MemVirtualUseRate">
             <summary>
-            Logger factory
+            <para>메모리 사용률 %</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.D(System.Object)">
+        <member name="M:GSG.NET.OSView.Mgnt.HddList">
             <summary>
-            Debug
+            <para>Ready 상태이고, HDD 드라이브만 추출</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.D(System.String,System.Object[])">
+        <member name="M:GSG.NET.OSView.Mgnt.LocalIpList">
             <summary>
-            DebugFormat
+            <para>Local IP Address 가져오기.</para>
             </summary>
         </member>
-        <member name="P:GSG.NET.Logging.Logger.IsDE">
+        <member name="M:GSG.NET.OSView.Mgnt.MacAddressList">
             <summary>
-            DebugEnabled
+            <para>Local Mac Address 가져오기.</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.I(System.Object)">
+        <member name="M:GSG.NET.OSView.Mgnt.Wql(System.String)">
             <summary>
-            Info
+            wql: SQL for WMI
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.I(System.String,System.Object[])">
+        <member name="P:GSG.NET.OSView.Mgnt.Is64BitOperatingSystem">
             <summary>
-            InfoFormat
+            32, 64 bit check
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.W(System.Object)">
+        <member name="M:GSG.NET.OSView.Mgnt.GetDotnetVersion">
             <summary>
-            Warn
+            CLR version retrieve
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.W(System.String,System.Object[])">
+        <member name="M:GSG.NET.OSView.Mgnt.AddFirewall(System.String,System.Int32)">
             <summary>
-            WarnFormat
+            Tcp 방화벽 등록.
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.E(System.Object)">
+        <member name="M:GSG.NET.OSView.Mgnt.ServiceStart(System.String)">
+            <summary/>
+        </member>
+        <member name="M:GSG.NET.OSView.Mgnt.ServiceStop(System.String)">
+            <summary/>
+        </member>
+        <member name="T:GSG.NET.Poco">
             <summary>
-            Error
+            POCO(Plain Old CLR Object)
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.E(System.String,System.Object[])">
+        <member name="F:GSG.NET.Poco.T_INT">
             <summary>
-            ErrorFormat
+            Int32 타입과 동일
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.F(System.Object)">
+        <member name="F:GSG.NET.Poco.T_LONG">
             <summary>
-            Fatal
+            Int64 타입과 동일
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.Logger.F(System.String,System.Object[])">
+        <member name="F:GSG.NET.Poco.T_FLOAT">
             <summary>
-            FatalFormat
+            Single 타입과 동일
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LoggerUtils.HasLogger(System.String)">
+        <member name="F:GSG.NET.Poco.T_DOUBLE">
             <summary>
-            Has Logger or not
+            Double 타입과 동일
             </summary>
-            <param name="loggerName">LoggerName</param>
         </member>
-        <member name="M:GSG.NET.Logging.LoggerUtils.GetLogger(System.String)">
+        <member name="M:GSG.NET.Poco.ToString">
             <summary>
-            <para>Logger가 없을 경우 만들어준다.</para>
-            <para>AddLogger 기능과 같다.</para>
+            ToString 재정의
             </summary>
         </member>
-        <member name="T:GSG.NET.Logging.LogUtils">
+        <member name="M:GSG.NET.Poco.ChgNullValue(System.String)">
             <summary>
-            <para>Log4Net Utils</para>
+            string Property값이 null일 경우 v로 변경.
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.Configure">
+        <member name="M:GSG.NET.Poco.ChgNullValue">
             <summary>
-            <para>empty log4net config</para>
-            <para>log repository...</para>
-            <para>Level: INFO</para>
+            string Property값이 null일 경우 string.Empty로 변경.
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.Configure(System.String)">
+        <member name="F:GSG.NET.Poco.NSS_NULL_STRING">
             <summary>
-            <para>Log4net config file loading</para>
+            Nss Null string setting
+            <para>def: string.Empty</para>
             </summary>
-            <param name="cfgPath"></param>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.Configure(System.String,System.Boolean)">
+        <member name="M:GSG.NET.Poco.IntV(System.String)">
             <summary/>
         </member>
-        <member name="P:GSG.NET.Logging.LogUtils.RootLogger">
-            <summary>
-            <para>Get RootLogger</para>
-            </summary>
+        <member name="M:GSG.NET.Poco.DoubleV(System.String)">
+            <summary/>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.ChangeAdditivity(System.String,System.Boolean)">
+        <member name="T:GSG.NET.Interop32">
             <summary>
-            <para>Change additivity option</para>
+            <para>const uint FILE_SHARE_READ = 1;</para>
+            <para></para>
+            <para>const uint FILE_ATTRIBUTE_NORMAL = 0x80;</para>
+            <para></para>
+            <para>const uint GENERIC_READ = 0x80000000;</para>
+            <para>const uint OPEN_EXISTING = 3;</para>
+            <para></para>
+            <para></para>
+            <para></para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender">
+        <member name="T:GSG.NET.LinqEx">
             <summary>
-            <para>Create Console Appender</para>
+            내부적으로 사용하는 Linq 확장함수
+            <para>내부적으로 사용한다는 의미에서 소문자로 시작하는 method 화</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender(System.String)">
-            <summary/>
-            <param name="name">Appender Name</param>
-        </member>
-        <member name="M:GSG.NET.Logging.LogUtils.CreateConsoleAppender(System.String,log4net.Layout.ILayout)">
-            <summary/>
-            <param name="name">Appender Name</param>
-            <param name="layout"></param>
-        </member>
-        <member name="M:GSG.NET.Logging.LogUtils.CommonLogging">
-            <summary/>
-        </member>
-        <member name="M:GSG.NET.Logging.LogUtils.ChangeLevel(log4net.Core.Level)">
+        <member name="M:GSG.NET.LinqEx.avg``1(System.Collections.Generic.IEnumerable{``0})">
             <summary>
-            <para>RootLogger Change Level</para>
+            source count 0 일 경우 exception 방지
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.ChangeLevel(System.String,log4net.Core.Level)">
+        <member name="M:GSG.NET.LinqEx.format(System.Text.StringBuilder,System.String,System.Object[])">
             <summary>
-            <para>Non-RootLogger Change Level</para>
+            append format
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.ChangeThreshold(System.String,log4net.Core.Level)">
+        <member name="M:GSG.NET.LinqEx.empty``1(System.Collections.Generic.IEnumerable{``0})">
             <summary>
-            <para>Change RootLogger Appender's Level</para>
+            Count, Length == 0
+            <para>source == null: true</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.ChangeThreshold(System.String,System.String,log4net.Core.Level)">
+        <member name="M:GSG.NET.LinqEx.empty(System.String,System.Boolean)">
             <summary>
-            <para>Change Specific Logger Appender's Level</para>
+            string.IsNullOrEmpty
+            <para>Trim 은 옵션으로 체크</para>
             </summary>
         </member>
-        <member name="P:GSG.NET.Logging.LogUtils.DefaultLayout">
+        <member name="M:GSG.NET.LinqEx.multi(System.Single,System.Int32)">
             <summary>
-            <para>%d{MM-dd HH:mm:ss.fff} %-2.2t %-5p %m%n</para>
-            <para>-</para>
-            <para>LoggerName: %-10.10c</para>
-            <para>-</para>
-            <para>%-a.b -:left justify, a:minimum width, b:maximum width</para>
-            <para>-</para>
+            곱하기
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.CreateLayout(System.String)">
+        <member name="M:GSG.NET.LinqEx.div(System.Int32,System.Int32)">
             <summary>
-            <para>Pattern layout 생성</para>
-            <para>-</para>
-            <para>Class: %c</para>
+            나누기
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(log4net.Appender.IAppender)">
+        <member name="M:GSG.NET.LinqEx.remain(System.Int32,System.Int32)">
             <summary>
-            <para>RootLogger AddAppender</para>
+            나머지
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(System.String,log4net.Appender.IAppender)">
+        <member name="M:GSG.NET.LinqEx.split(System.String,System.String[])">
             <summary>
-            <para>Non-RootLogger AddAppender</para>
-            <para>Logger가 없을 경우 생성한다.</para>
-            <para>-</para>
-            <para>AppenderName이 없을 경우 loggerName을 AppenderName으로 세팅한다.</para>
-            <para>-</para>
+            remove empty option 적용, empty string을 제거한다
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.AddAppender(System.String,log4net.Appender.IAppender,System.Boolean)">
+        <member name="M:GSG.NET.LinqEx.stringOf(System.Byte[],System.Text.Encoding)">
             <summary>
-            <para>Non-RootLogger AddAppender</para>
-            <para>Logger가 없을 경우 생성한다.</para>
-            <para>-</para>
-            <para>AppenderName이 없을 경우 loggerName을 AppenderName으로 세팅한다.</para>
-            <para>-</para>
-            <para>Additivity option</para>
-            <para>-</para>
+            <para>byte array -> string</para>
+            <para>null byte 0 -> 0x20</para>
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.RemoveAppender(System.String)">
+        <member name="M:GSG.NET.LinqEx.stringOf(System.Char[])">
             <summary>
-            <para>RootLogger</para>
-            <para>-</para>
-            <para>1. RootLogger에서 Appender 제거함.</para>
-            <para>2. Close Appender</para>
+            char array -> string
             </summary>
         </member>
-        <member name="M:GSG.NET.Logging.LogUtils.RemoveAppender(System.String,System.String)">
+        <member name="M:GSG.NET.LinqEx.xFF(System.Byte[])">
             <summary>
-            <para>Non-RootLogger</para>
-            <para>-</para>
-            <para>1. Logger에서 Appender 제거함.</para>
-            <para>2. Close Appender</para>
+            byte -&gt; 2byte(0xff) string
+            <para>1,2,3 -gt; 010203</para>
             </summary>
         </member>
         <member name="T:GSG.NET.Quartz.CbTimer">

BIN
Dev/OHV/Assambly/GSG.NET.dll


BIN
Dev/OHV/Assambly/GSG.NET.pdb


BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


+ 214 - 76
Dev/OHV/OHV.SqliteDAL/DAL/AbstractDAL.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Data.Entity;
 using System.Data.Entity.Core.Objects;
 using System.Data.Entity.Infrastructure;
+using System.Data.Entity.Validation;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Text;
@@ -11,14 +12,6 @@ using GSG.NET.Logging;
 
 namespace OHV.SqliteDAL.DAL
 {
-    public interface IRepository<TEntity> where TEntity : class
-    {
-        void Create( TEntity entity );
-        void Delete( TEntity entity );
-        void Delete( Guid id );
-        void Edit( TEntity entity );
-    }
-
     public class GenericDAL<T> where T : class
     {
         public delegate void DlgChangedProperty();
@@ -127,6 +120,22 @@ namespace OHV.SqliteDAL.DAL
         }
     }
 
+    ////////////////////////////////////////////////////////////////////////////////////////
+    public interface IGenericRepository<T> where T : class
+    {
+        event Action OnChangeTable;
+        int Count { get; }
+        IEnumerable<T> GetAll();
+        IEnumerable<T> Get( Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "" );
+        T GetById( object id );
+        void Insert( T obj );
+        void Update( T obj );
+        void Delete( object id );
+        void Delete( Expression<Func<T, bool>> filter = null );
+        void Clean();
+        void Save();
+    }
+
     class GenericRepository<T> : IGenericRepository<T> where T : class
     {
         protected Logger logger = Logger.GetLogger();
@@ -154,125 +163,254 @@ namespace OHV.SqliteDAL.DAL
 
         public IEnumerable<T> GetAll()
         {
-            lock ( this.lockObj )
-                return table.ToList();
-
+            return table.ToList();
         }
 
         public virtual IEnumerable<T> Get( Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "" )
         {
             IQueryable<T> query = this.table;
 
-            lock ( this.lockObj )
-            {
+            if ( filter != null )
+                query = query.Where( filter );
 
-                if ( filter != null )
-                    query = query.Where( filter );
-
-                if ( includeProperties != null )
-                {
-                    foreach ( var includeProperty in includeProperties.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) )
-                        query = query.Include( includeProperty );
-                }
-
-                if ( orderBy != null )
-                    return orderBy( query ).ToList();
-                else
-                    return query.ToList();
+            if ( includeProperties != null )
+            {
+                foreach ( var includeProperty in includeProperties.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) )
+                    query = query.Include( includeProperty );
             }
+
+            if ( orderBy != null )
+                return orderBy( query ).ToList();
+            else
+                return query.ToList();
         }
 
         public T GetById( object id )
         {
-            lock ( this.lockObj )
-                return table.Find( id );
+            return table.Find( id );
         }
+
         public void Insert( T obj )
         {
-            lock ( this.lockObj )
-            {
-                table.Add( obj );
-                this.Save();
-            }
+            table.Add( obj );
+            this.Save();
         }
+
         public void Update( T obj )
         {
-            lock ( this.lockObj )
+            if ( obj == null )
             {
-                if ( obj == null )
-                {
-                    logger.E( $"[DataBase] - Update obj is Null {this.table.GetType().Name}" );
-                    return;
-                }
-
-                table.Attach( obj );
-                _context.Entry( obj ).State = EntityState.Modified;
-                this.Save();
+                logger.E( $"[DataBase] - Update obj is Null {this.table.GetType().Name}" );
+                return;
             }
+
+            table.Attach( obj );
+            _context.Entry( obj ).State = EntityState.Modified;
+            this.Save();
         }
+
         public void Delete( object id )
         {
-            lock ( this.lockObj )
-            {
-                T existing = table.Find( id );
-                if ( existing == null )
-                    return;
+            T existing = table.Find( id );
+            if ( existing == null )
+                return;
 
-                table.Remove( existing );
-                this.Save();
+            if ( _context.Entry( existing ).State == EntityState.Detached )
+            {
+                table.Attach( existing );
             }
+
+            table.Remove( existing );
+            this.Save();
         }
+
         public void Delete( Expression<Func<T, bool>> filter )
         {
-            lock ( this.lockObj )
+            var delList = this.table.Where( filter ).ToList();
+            if ( delList.Count > 0 )
             {
-                var delList = this.table.Where( filter ).ToList();
-                if ( delList.Count > 0 )
-                {
-                    this.table.RemoveRange( delList );
-                    Save();
-                }
+                this.table.RemoveRange( delList );
+                Save();
             }
         }
 
         public void Clean()
         {
-            lock ( this.lockObj )
-            {
-                table.RemoveRange( table );
-                this.Save();
-            }
+            table.RemoveRange( table );
+            this.Save();
         }
+
         public void Save()
         {
             try
             {
                 _context.SaveChanges();
-
             }
-            catch ( DbUpdateConcurrencyException ex )
+            catch ( DbEntityValidationException dbEx )
             {
-                ex.Entries.Single().Reload();
-                logger.E( $"[DataBase] - DbUpdateConcurrencyException {this.table.GetType().Name}" );
+                foreach ( var validationErrors in dbEx.EntityValidationErrors )
+                {
+                    foreach ( var validationError in validationErrors.ValidationErrors )
+                    {
+                        logger.E( "Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage );
+                    }
+                }
+
                 return;
             }
+            //catch ( DbUpdateConcurrencyException ex )
+            //{
+            //    ex.Entries.Single().Reload();
+            //    logger.E( $"[DataBase] - DbUpdateConcurrencyException {this.table.GetType().Name}" );
+            //    return;
+            //}
 
             this.OnChangeTable?.BeginInvoke( null, null );
         }
     }
 
-    public interface IGenericRepository<T> where T : class
+
+    ////////////////////////////////////////////////////////////////////////////////////////
+    public interface IGenericRepositoryType1<T> where T : class
+    {
+        IQueryable<T> GetAll();
+        IQueryable<T> FindBy( Expression<Func<T, bool>> predicate );
+        void Add( T entity );
+        void Delete( T entity );
+        void Edit( T entity );
+        void Save();
+    }
+
+    public abstract class GenericRepository<C, T> : IGenericRepositoryType1<T> where T : class where C : DbContext, new()
+    {
+        private C _entities = new C();
+        public C Context
+        {
+            get { return _entities; }
+            set { _entities = value; }
+        }
+
+        public virtual IQueryable<T> GetAll()
+        {
+            IQueryable<T> query = _entities.Set<T>();
+            return query;
+        }
+
+        public IQueryable<T> FindBy( System.Linq.Expressions.Expression<Func<T, bool>> predicate )
+        {
+            IQueryable<T> query = _entities.Set<T>().Where( predicate );
+            return query;
+        }
+
+        public virtual void Add( T entity )
+        {
+            _entities.Set<T>().Add( entity );
+        }
+
+        public virtual void Delete( T entity )
+        {
+            _entities.Set<T>().Remove( entity );
+        }
+
+        public virtual void Edit( T entity )
+        {
+            _entities.Entry( entity ).State = EntityState.Modified;
+        }
+
+        public virtual void Save()
+        {
+            _entities.SaveChanges();
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////////////
+    public interface IRepository<T> where T : class
     {
-        event Action OnChangeTable;
-        int Count { get; }
         IEnumerable<T> GetAll();
-        IEnumerable<T> Get( Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "" );
-        T GetById( object id );
-        void Insert( T obj );
-        void Update( T obj );
-        void Delete( object id );
-        void Delete( Expression<Func<T, bool>> filter = null );
-        void Clean();
+        T GetById( object Id );
+        T Insert( T obj );
+        void Delete( object Id );
+        T Update( T obj );
         void Save();
     }
+
+    public class Repository<T> : IRepository<T> where T : class
+    {
+        private OHVDbContext context;
+        private DbSet<T> dbSet;
+        public Repository()
+        {
+            context = new OHVDbContext( "OHVDb" );
+            dbSet = context.Set<T>();
+        }
+        public IEnumerable<T> GetAll()
+        {
+            return dbSet.ToList();
+        }
+        public T GetById( object id )
+        {
+            return dbSet.Find( id );
+        }
+        public T Insert( T obj )
+        {
+            dbSet.Add( obj );
+            Save();
+            return obj;
+        }
+
+        public void Delete( object id )
+        {
+            T entityToDelete = dbSet.Find( id );
+            Delete( entityToDelete );
+        }
+
+        public void Delete( T entityToDelete )
+        {
+            if ( context.Entry( entityToDelete ).State == EntityState.Detached )
+            {
+                dbSet.Attach( entityToDelete );
+            }
+
+            dbSet.Remove( entityToDelete );
+        }
+
+        public T Update( T obj )
+        {
+            dbSet.Attach( obj );
+            context.Entry( obj ).State = EntityState.Modified;
+            Save();
+            return obj;
+        }
+
+        public void Save()
+        {
+            try
+            {
+                context.SaveChanges();
+            }
+            catch ( DbEntityValidationException dbEx )
+            {
+                foreach ( var validationErrors in dbEx.EntityValidationErrors )
+                {
+                    foreach ( var validationError in validationErrors.ValidationErrors )
+                    {
+                        System.Console.WriteLine( "Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage );
+                    }
+                }
+            }
+        }
+
+        protected virtual void Dispose( bool disposing )
+        {
+            if ( disposing )
+            {
+                if ( context != null )
+                {
+                    context.Dispose();
+                    context = null;
+                }
+            }
+        }
+    }
+
 }

+ 143 - 82
Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs

@@ -1,12 +1,14 @@
 using GSG.NET.Concurrent;
 using GSG.NET.Extensions;
 using GSG.NET.Logging;
+using GSG.NET.Utils;
 using NetMQ;
 using NetMQ.Monitoring;
 using NetMQ.Sockets;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
 using System;
+using System.Collections;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
@@ -17,6 +19,17 @@ using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem.ControlLayer.MQ
 {
+    public enum eDriveControl
+    {
+        None = 0,
+        ParameterSave,
+        ResetFault,
+        CancelRoute,
+        ServoOn,
+        ServoOff,
+        ClearWarning = 9,
+    }
+
     public class ZmqMessage
     {
         public string Key { get; set; }
@@ -135,7 +148,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
         }
 
         private int currentMCR;
-
         public int CurrentMCR
         {
             get { return currentMCR; }
@@ -148,6 +160,35 @@ namespace VehicleControlSystem.ControlLayer.MQ
             }
         }
 
+        //Drive State Code
+        private int warningCode;
+        public int WarningCode
+        {
+            get { return warningCode; }
+            set { SetField( ref this.warningCode, value ); }
+        }
+
+        private int faultCode;
+        public int FaultCode
+        {
+            get { return faultCode; }
+            set { SetField( ref this.faultCode, value ); }
+        }
+
+        private string warningMessage;
+        public string WarningMessage
+        {
+            get { return warningMessage; }
+            set { SetField( ref this.warningMessage, value ); }
+        }
+
+        private string faultMessage;
+        public string FaultMessage
+        {
+            get { return faultMessage; }
+            set { SetField( ref this.faultMessage, value ); }
+        }
+
         #endregion
 
         public ZmqManager( BMUManager bMU, Steering steering )
@@ -165,8 +206,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
             sub = new SubscriberSocket();
             sub.Connect( "tcp://127.0.0.1:5565" );
-            //sub.Connect( "tcp://127.0.0.1:5566" );
-            //sub.Connect( "tcp://127.0.0.1:5577" );
             sub.Subscribe( "" ); //All
             sub.ReceiveReady += Sub_ReceiveReady;
 
@@ -261,6 +300,8 @@ namespace VehicleControlSystem.ControlLayer.MQ
             var ret = e.Socket.ReceiveMultipartStrings();
             logger.D( $"[rep] - {ret[1]}" );
 
+            //rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
+
             try
             {
                 if ( ret[0].Equals( "setm" ) )
@@ -321,13 +362,26 @@ namespace VehicleControlSystem.ControlLayer.MQ
                             }
                             break;
 
+                        case "4094":
+                            {
+                                var mb = new MemoryBuffer();
+                                for ( int i = 1; i < v.Length; i++ )
+                                {
+                                    var _2b = v[i].Replace( "0x", "" );
+                                    mb.Append( HexaUtils.StringToByte( _2b ) );
+                                }
+                                var ba = new BitArray( mb.ToBytes );
+                            }
+                            break;
+
+                        case "4098":
+                            break;
+
                         default:
                             break;
                     }
-
                 }
-
-                if ( ret[0].Equals( "getm" ) )
+                else if ( ret[0].Equals( "getm" ) )
                 {
                     var v = ret[1].Split( '/' );
                     switch ( v[0] )
@@ -355,6 +409,20 @@ namespace VehicleControlSystem.ControlLayer.MQ
                             break;
                     }
                 }
+                else if ( ret[0].Equals( "sync" ) )
+                {
+                    var v = ret[1].Split( '/' );
+                    rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
+
+                }
+                else if ( ret[0].Equals( "parameter" ) )
+                {
+                    var v = ret[1].Split( '/' );
+                    rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" ); //응답처리 부터 하자.
+
+                }
+                else
+                    rep.SendMoreFrame( ret[0] ).SendFrame( $"ok/{ret[1]}" );
 
             }
             catch ( Exception exception )
@@ -390,23 +458,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                     }
                     break;
 
-                case "3050": //TargetSteering
-                    {
-                        //switch ( ret[1] )
-                        //{
-                        //    case "1":
-                        //        this.RequestSteering = eSteeringState.Left;
-                        //        break;
-                        //    case "-1":
-                        //        this.RequestSteering = eSteeringState.Right;
-                        //        break;
-                        //    default:
-                        //        this.RequestSteering = eSteeringState.None;
-                        //        break;
-                        //}
-                    }
-                    break;
-
                 case "111": //0=StartUp, 1=DeviceOpened, 2=DiviceOpenFailed, 3=ManualOP, 4=AutomaticOp, 5=DeviceCloseed, 6=Finished
                     break;
 
@@ -655,6 +706,34 @@ namespace VehicleControlSystem.ControlLayer.MQ
         #endregion
 
         #region Get Request Method
+        public int GetWarningCode()
+        {
+            int ret = 0;
+
+            var rll = this.GetRequest( "4094" );
+            if ( rll.Count == 0 )
+                return 0;
+
+            if ( !int.TryParse( rll[0], out ret ) )
+                logger.E( $"[Get Warning Code] - Try Parse Error" );
+
+            return ret;
+        }
+
+        public int GetFaultCode()
+        {
+            int ret = 0;
+
+            var rll = this.GetRequest( "4098" );
+            if ( rll.Count == 0 )
+                return 0;
+
+            if ( !int.TryParse( rll[0], out ret ) )
+                logger.E( $"[Get Fault Code] - Try Parse Error" );
+
+            return ret;
+        }
+
         public eOperatationMode GetOperationMode()
         {
             var rll = GetRequest( "111" );
@@ -668,19 +747,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return eOperatationMode.AutoMode;
             else
                 return eOperatationMode.ManualMode;
-
-
-            //List<string> rll;
-            //if ( !this.GetRequst( "111", out rll ) )
-            //{
-            //    logger.E( $"[Get Operation Mode] - Response Time Out" );
-            //    return eOperatationMode.InitialMode;
-            //}
-
-            //if ( rll[0].Equals( "1" ) )
-            //    return eOperatationMode.AutoMode;
-            //else
-            //    return eOperatationMode.ManualMode;
         }
 
         public int GetCurrentPointNo()
@@ -695,19 +761,44 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 logger.E( $"[Get Current Point] - Try Parse Error" );
 
             return ret;
-
-            //if ( this.GetRequst( "3009", out rll ) )
-            //{
-            //    int.TryParse( rll[0], out ret );
-            //}
-            //else
-            //    logger.E( $"[Get Current Point] - Response Time Out" );
-
-            //return ret;
         }
         #endregion
 
         #region Set Request Method
+        internal int SetDriveControl( eDriveControl control )
+        {
+            int result = ConstInt.EXECUTE_SUCCESS;
+
+            switch ( control )
+            {
+                case eDriveControl.None:
+                    break;
+                case eDriveControl.ParameterSave:
+                    break;
+                case eDriveControl.ResetFault:
+                    break;
+                case eDriveControl.CancelRoute:
+                    break;
+                case eDriveControl.ServoOn:
+                    break;
+                case eDriveControl.ServoOff:
+                    break;
+                case eDriveControl.ClearWarning:
+                    break;
+                default:
+                    break;
+            }
+
+            var rll = this.RequestDrive( "setm", $"4011/{( (int)control ).ToString()}" );
+            if ( rll.Count == 0 )
+            {
+                logger.E( $"[Set Drive Control] - Response Time Out" );
+                return 38;
+            }
+
+            return result;
+        }
+
         internal int SetStartMove( bool isArrayCommand = false )
         {
             string cmd = string.Empty;
@@ -723,12 +814,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return 38;
             }
 
-            //if ( !SetRequest( "3031", cmd ) )
-            //{
-            //    logger.E( $"[Set Start Move] - Response Time Out" );
-            //    return 38;
-            //}
-
             return ConstInt.EXECUTE_SUCCESS;
         }
 
@@ -741,12 +826,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return 38;
             }
 
-            //if ( !SetRequest( "3033", point ) )
-            //{
-            //    logger.E( $"[Set TargetPoint] - Response Time Out" );
-            //    return 38;
-            //}
-
             return ConstInt.EXECUTE_SUCCESS;
         }
 
@@ -758,13 +837,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 logger.E( $"[Set TargetPoint] - Response Time Out" );
                 return 38;
             }
-
-            //if ( !SetRequest( "3034", point ) )
-            //{
-            //    logger.E( $"[Set TargetPoint] - Response Time Out" );
-            //    return 38;
-            //}
-
             return ConstInt.EXECUTE_SUCCESS;
         }
 
@@ -778,15 +850,19 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 case eObstacleState.Normal:
                     val = "0";
                     break;
+                   
                 case eObstacleState.Abnormal:
                     val = "3";
                     break;
+
                 case eObstacleState.Blocked:
                     val = "2";
                     break;
+
                 case eObstacleState.Decelerate:
                     val = "1";
                     break;
+
                 default:
                     break;
             }
@@ -794,9 +870,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
             var rll = this.RequestDrive( "setm", $"5001/{val}" );
             if ( rll.Count == 0 )
                 logger.E( $"[Set Obstruction] - Response Time Out" );
-
-            //if ( !this.SetRequest( "5001", val ) )
-            //    logger.E( $"[Set Obstruction] - Response Time Out" );
         }
 
         internal void SetOperationState( eOperatationMode mode )
@@ -814,9 +887,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
             var rll = this.RequestDrive( "setm", $"112/{val}" );
             if ( rll.Count == 0 )
                 logger.E( $"[Set Operation State] - Response Time Out" );
-
-            //if ( !SetRequest( "112", val ) )
-            //    logger.E( $"[Set Operation State] - Response Time Out" );
         }
 
         internal void SetMCState( bool isOn )
@@ -832,9 +902,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
             var rll = this.RequestDrive( "setm", $"5000/{val}" );
             if ( rll.Count == 0 )
                 logger.E( $"[Set MCState] - Response Time Out" );
-
-            //if ( !this.SetRequest( "5000", val ) )
-            //    logger.E( $"[Set MCState] - Response Time Out" );
         }
 
         internal void SetCurrentSteeringState( eSteeringState state )
@@ -863,9 +930,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return;
             }
 
-            //if ( !this.SetRequest( "3060", val ) )
-            //    logger.E( $"[Set Current Steering] - Response Time Out" );
-
             logger.D( $"[Steering_Req] - 3060/{val}" );
         }
 
@@ -878,9 +942,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return;
             }
 
-            //if ( !this.SetRequest( "6105", "1" ) )
-            //    logger.E( $"[Set Safety Bumper] - Bumper is Pushed Time Out" );
-
             logger.D( $"[Set Safety Bumper] - Bumper is Pushed" );
         }
 
@@ -888,7 +949,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
         /// forward 1, backward -1
         /// </summary>
         /// <param name="isForward"></param>
-        internal void SetJogMove(bool isForward = true )
+        internal void SetJogMove( bool isForward = true )
         {
             string v = string.Empty;
             if ( isForward )
@@ -904,7 +965,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
             }
         }
 
-        #endregion
+#endregion
 
         #region Get/Set Parameter
         internal double GetJogSpeed()
@@ -1000,6 +1061,6 @@ namespace VehicleControlSystem.ControlLayer.MQ
             logger.D( $"[Set Drive Speed] - Set Drive Speed Accel {accel}, Decel {decel}, Creep{creep}/{creepDistance}" );
         }
 
-        #endregion
+#endregion
     }
 }

+ 7 - 8
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -6,6 +6,7 @@ using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using System;
+using System.Collections.Generic;
 using System.Text;
 using VehicleControlSystem.ControlLayer.MQ;
 using VehicleControlSystem.Managers;
@@ -71,11 +72,15 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
         ZmqManager zmq = null;
 
+        List<Alarm> DriveAcitveAlarms { get; set; }
+
         public GSIDrive( SqliteManager sql, Steering steering, ZmqManager zmq )
         {
             this.sql = sql;
             this.steering = steering;
             this.zmq = zmq;
+
+            this.DriveAcitveAlarms = new List<Alarm>();
         }
 
         public void Init()
@@ -291,23 +296,17 @@ namespace VehicleControlSystem.ControlLayer.Drive
         }
 
         /// <summary>
-        /// 급정시 사용.
+        /// 급 정시 사용.
         /// </summary>
         //public void EStop() => OHVdriveSetServoCommand(3);
 
         /// <summary>
-        /// Manual 상태에서 가감속 Stop
+        /// Manual 상태 에서 가감속 Stop
         /// </summary>
         public void Stop()
         {
         }
 
-        //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
-        //public void JogBackward() => OHVdriveSetManualOperationCommand( -1 );
-        //public void ServoOn() => OHVdriveSetServoCommand( 1 );
-        //public void ServoOff() => OHVdriveSetServoCommand( 2 );
-        //public void AmpFaultReset() => OHVdriveSetServoCommand( -1 );
-
         public void SetObstacleState( eObstacleState state ) => zmq.SetObstruction( state );
 
         public bool VelocityChainge( double velocity )

+ 20 - 7
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -35,16 +35,22 @@ namespace VehicleControlSystem.Managers
             {
                 if ( this.isErrorProcessing == value ) return;
                 this.isErrorProcessing = value;
+
                 if ( value )
                 {
-                    if ( this.activeAlarm == null ) return;
-                    this.OnOccurAlarm?.BeginInvoke( this.activeAlarm.AlarmId, null, null );
+                    //if ( this.activeAlarm == null ) return;
+                    //this.OnOccurAlarm?.BeginInvoke( this.activeAlarm.AlarmId, null, null );
                 }
                 else
                 {
-                    if ( this.activeAlarm == null ) return;
-                    this.OnClearAlarm?.BeginInvoke( this.activeAlarm.AlarmId, null, null );
-                    this.activeAlarm = null;
+                    this.ActiveAlarms.ForEach( x =>
+                    {
+                        this.OnClearAlarm?.BeginInvoke( x.AlarmId, null, null );
+                    } );
+                    this.ActiveAlarms.Clear();
+                    //if ( this.activeAlarm == null ) return;
+                    //this.OnClearAlarm?.BeginInvoke( this.activeAlarm.AlarmId, null, null );
+                    //this.activeAlarm = null;
                     this.BuzzerOnOff( false );
                 }
             }
@@ -52,8 +58,13 @@ namespace VehicleControlSystem.Managers
         public event Action<int> OnOccurAlarm;
         public event Action<int> OnClearAlarm;
         Alarm activeAlarm = null;
+
+        //Alarm List
         List<Alarm> Alarms { get; set; }
 
+        //현재 발생 된 알람 리스트
+        List<Alarm> ActiveAlarms { get; set; }
+
         IEventAggregator eventAggregator = null;
         SqliteManager sql = null;
 
@@ -256,7 +267,6 @@ namespace VehicleControlSystem.Managers
             logger.D( "[AutoManager] - Work Thread Dispose" );
         }
 
-
         public void DoWork()
         {
             switch ( this.OperationModeProperty )
@@ -308,7 +318,7 @@ namespace VehicleControlSystem.Managers
                 alarm.AlarmId = alarmID;
                 alarm.Text = "Not Define Alarm";
 
-                logger.E( $"[{this.GetType().Name}] - Not Defiine Alarm No {alarmID}" );
+                logger.E( $"[{this.GetType().Name}] - Not Define Alarm No {alarmID}" );
             }
             else
             {
@@ -321,6 +331,9 @@ namespace VehicleControlSystem.Managers
 
             logger.I( $"[Alarm Occur] - ID : {alarmID} / Text : {hisAlarm.Text}" );
 
+            this.ActiveAlarms.Add( alarm );
+            this.OnOccurAlarm?.BeginInvoke( alarm.AlarmId, null, null );
+
             //UI 로는 처음 발생한 Error 만 전송한다.
             if ( IsErrorProcessing )
                 return;

+ 21 - 0
Dev/OHV/VehicleControlSystem/VCSystem.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -8,6 +9,7 @@ using GSG.NET.Excel;
 using GSG.NET.Extensions;
 using GSG.NET.Logging;
 using GSG.NET.Quartz;
+using GSG.NET.Utils;
 using OHV.Common.Events;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
@@ -63,6 +65,25 @@ namespace VehicleControlSystem
 
         public void Init()
         {
+            string warningList = "4094/0xff/0x00/0x00/0x01";
+
+            var v = warningList.Split( '/' );
+
+            var mb = new MemoryBuffer();
+            for ( int i = 1; i < v.Length; i++ )
+            {
+                var _2b = v[i].Replace( "0x", "" );
+                mb.Append( HexaUtils.StringToByte( _2b ) );
+            }
+
+            var bs = mb.ToBytes;
+
+            var bitA = new BitArray( bs );
+            
+
+
+
+
             QuartzUtils.Invoke( "HIS_ALARM", QuartzUtils.GetExpnHour( 5 ), this.CleanHisAlarm );
 
             this.Alarms = new ExcelMapper( Path.Combine( System.Environment.CurrentDirectory ) + @"\Config\AlarmDefind.xlsx" ).Fetch<Alarm>( ).ToList();

+ 7 - 1
Dev/OHVLoggerTest/OHVLoggerTest.sln

@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.29905.134
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OHVLoggerTest", "OHVLoggerTest\OHVLoggerTest.csproj", "{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OHVDriveSimulator", "OHVLoggerTest\OHVDriveSimulator.csproj", "{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GSG.NET", "..\..\..\GSG\GSG\GSG.NET\GSG.NET.csproj", "{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
 		{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 96 - 84
Dev/OHVLoggerTest/OHVLoggerTest/Config/log4net.xml

@@ -1,21 +1,25 @@
 <log4net>
 
-	<root name="root">
-		<level value="ALL" />
-		<appender-ref ref="FileAppender" />
-		<!--<appender-ref ref="WarnFileAppender" />-->
-		<!--<appender-ref ref="MongoAppender" />-->
-	</root>
+  <root name="root">
+    <level value="ALL" />
+    <appender-ref ref="FileAppender" />
+    <appender-ref ref="ListViewAppender" />
+    <!--<appender-ref ref="MongoAppender" />-->
+  </root>
 
-	<logger name="PhysicalCheckup_Front" additivity="false">
-		<appender-ref ref="PhysicalCheckupFileAppender_Front" />
-	</logger>
+  <logger name="PhysicalCheckup_Front" additivity="false">
+    <appender-ref ref="PhysicalCheckupFileAppender_Front" />
+  </logger>
 
-	<logger name="PhysicalCheckup_Rear" additivity="false">
-		<appender-ref ref="PhysicalCheckupFileAppender_Rear" />
-	</logger>
+  <logger name="PhysicalCheckup_Rear" additivity="false">
+    <appender-ref ref="PhysicalCheckupFileAppender_Rear" />
+  </logger>
 
-	<!--
+  <logger name="lvwLogger" additivity="false">
+    <appender-ref ref="ListViewAppender" />
+  </logger>
+
+  <!--
 	ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
 	•All
 	•DEBUG  •DEBUG
@@ -26,81 +30,89 @@
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	-->
 
-	<appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<threshold value="INFO"/>
-		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Front_Wheel.log" />
-		<staticLogFileName value="true"/>
-		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
-		<appendToFile value="true" />
-		<rollingStyle value="Date" />
-		<backupDays value="10" />
-		<datePattern value="-MMdd'.log'" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
-		</layout>
-	</appender>
+  <appender name="ListViewAppender" type="GSG.NET.Logging.ListViewAppender, GSG.NET">
+    <threshold value="ALL"/>
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+      <!--<param name="ConversionPattern" value="%m%n" />-->
+    </layout>
+  </appender>
+
+  <appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
+    <threshold value="INFO"/>
+    <file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Front_Wheel.log" />
+    <staticLogFileName value="true"/>
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+    <appendToFile value="true" />
+    <rollingStyle value="Date" />
+    <backupDays value="10" />
+    <datePattern value="-MMdd'.log'" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+    </layout>
+  </appender>
 
-	<appender name="PhysicalCheckupFileAppender_Rear" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<threshold value="INFO"/>
-		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Rear_Wheel.log" />
-		<staticLogFileName value="true"/>
-		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
-		<appendToFile value="true" />
-		<rollingStyle value="Date" />
-		<backupDays value="10" />
-		<datePattern value="-MMdd'.log'" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
-		</layout>
-	</appender>
+  <appender name="PhysicalCheckupFileAppender_Rear" type="GSG.NET.Logging.FileAppender, GSG.NET">
+    <threshold value="INFO"/>
+    <file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Rear_Wheel.log" />
+    <staticLogFileName value="true"/>
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+    <appendToFile value="true" />
+    <rollingStyle value="Date" />
+    <backupDays value="10" />
+    <datePattern value="-MMdd'.log'" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+    </layout>
+  </appender>
 
-	<appender name="FileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
-		<file type="log4net.Util.PatternString">
-			<conversionPattern value="C:\LOG\OHV\DriveLogger\DriveLogger.log"  />
-		</file>
-		<appendToFile value="true" />
-		<rollingStyle value="Date" />
-		<backupDays value="10" />
-		<datePattern value="-MMdd'.log'" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %-2t %p %m%n" />
-		</layout>
-	</appender>
+  <appender name="FileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+    <file type="log4net.Util.PatternString">
+      <conversionPattern value="C:\LOG\OHV\DriveLogger\DriveLogger.log"  />
+    </file>
+    <appendToFile value="true" />
+    <rollingStyle value="Date" />
+    <backupDays value="10" />
+    <datePattern value="-MMdd'.log'" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %-2t %p %m%n" />
+    </layout>
+  </appender>
 
-	<appender name="DebugFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<filter type="log4net.Filter.LevelRangeFilter">
-			<param name="LevelMin" value="DEBUG"></param>
-			<param name="LevelMax" value="DEBUG"></param>
-		</filter>
-		<threshold value="DEBUG"/>
-		<file value="C:\LOG\OHV\DEBUG\Vehicle_DEBUG.log" />
-		<appendToFile value="true" />
-		<rollingStyle value="Date" />
-		<backupDays value="10" />
-		<datePattern value="-MMdd'.log'" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
-		</layout>
-	</appender>
+  <appender name="DebugFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
+    <filter type="log4net.Filter.LevelRangeFilter">
+      <param name="LevelMin" value="DEBUG"></param>
+      <param name="LevelMax" value="DEBUG"></param>
+    </filter>
+    <threshold value="DEBUG"/>
+    <file value="C:\LOG\OHV\DEBUG\Vehicle_DEBUG.log" />
+    <appendToFile value="true" />
+    <rollingStyle value="Date" />
+    <backupDays value="10" />
+    <datePattern value="-MMdd'.log'" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+    </layout>
+  </appender>
 
-	<appender name="WarnFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<threshold value="WARN"/>
-		<file value="C:\LOG\OHV\Vehicle\Vehicle_WARN.log" />
-		<appendToFile value="true" />
-		<rollingStyle value="Date" />
-		<backupDays value="180" />
-		<datePattern value="-MMdd'.log'" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
-		</layout>
-	</appender>
+  <appender name="WarnFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
+    <threshold value="WARN"/>
+    <file value="C:\LOG\OHV\Vehicle\Vehicle_WARN.log" />
+    <appendToFile value="true" />
+    <rollingStyle value="Date" />
+    <backupDays value="180" />
+    <datePattern value="-MMdd'.log'" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%d{MM-dd HH:mm:ss.fff} %2t %p %m%n" />
+    </layout>
+  </appender>
 
-	<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
-		<layout type="log4net.Layout.PatternLayout">
-			<param name="ConversionPattern" value="%d %m%n" />
-		</layout>
-		<threshold value="ALL"/>
-	</appender>
+  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
+    <layout type="log4net.Layout.PatternLayout">
+      <param name="ConversionPattern" value="%d %m%n" />
+    </layout>
+    <threshold value="ALL"/>
+  </appender>
 
 </log4net>

+ 16 - 4
Dev/OHVLoggerTest/OHVLoggerTest/Form1.Designer.cs

@@ -1,4 +1,4 @@
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
     partial class Form1
     {
@@ -30,11 +30,12 @@
         {
             this.button1 = new System.Windows.Forms.Button();
             this.button2 = new System.Windows.Forms.Button();
+            this.listLog = new System.Windows.Forms.ListView();
             this.SuspendLayout();
             // 
             // button1
             // 
-            this.button1.Location = new System.Drawing.Point(34, 22);
+            this.button1.Location = new System.Drawing.Point(962, 12);
             this.button1.Name = "button1";
             this.button1.Size = new System.Drawing.Size(132, 49);
             this.button1.TabIndex = 0;
@@ -44,7 +45,7 @@
             // 
             // button2
             // 
-            this.button2.Location = new System.Drawing.Point(172, 22);
+            this.button2.Location = new System.Drawing.Point(962, 67);
             this.button2.Name = "button2";
             this.button2.Size = new System.Drawing.Size(132, 49);
             this.button2.TabIndex = 1;
@@ -52,11 +53,21 @@
             this.button2.UseVisualStyleBackColor = true;
             this.button2.Click += new System.EventHandler(this.button2_Click);
             // 
+            // listLog
+            // 
+            this.listLog.HideSelection = false;
+            this.listLog.Location = new System.Drawing.Point(17, 20);
+            this.listLog.Name = "listLog";
+            this.listLog.Size = new System.Drawing.Size(939, 409);
+            this.listLog.TabIndex = 2;
+            this.listLog.UseCompatibleStateImageBehavior = false;
+            // 
             // Form1
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(800, 450);
+            this.ClientSize = new System.Drawing.Size(1106, 450);
+            this.Controls.Add(this.listLog);
             this.Controls.Add(this.button2);
             this.Controls.Add(this.button1);
             this.Name = "Form1";
@@ -69,6 +80,7 @@
 
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.ListView listLog;
     }
 }
 

+ 68 - 15
Dev/OHVLoggerTest/OHVLoggerTest/Form1.cs

@@ -16,13 +16,14 @@ using GSG.NET.Logging;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
     public partial class Form1 : Form
     {
         Logger frontWheelLogger = Logger.GetLogger( "PhysicalCheckup_Front" );
         Logger rearWheelLogger = Logger.GetLogger( "PhysicalCheckup_Rear" );
         Logger logger = Logger.GetLogger();
+        //Logger lvwLogger = Logger.GetLogger( "lvwLogger" );
 
         ThreadCancel threadCancel = new ThreadCancel();
 
@@ -47,38 +48,89 @@ namespace OHVLoggerTest
             this.threadCancel.Cancel();
             this.threadCancel.StopWaitAll();
 
-            Redis.Instance.Dispose();
+            this.mq.Dispose();
+
+            //Redis.Instance.Dispose();
         }
 
         private void Form1_Load( object sender, EventArgs e )
         {
-            Redis.Instance.Init();
+            ListViewAppender.SetListView( this.listLog );
+
+            logger.I( "Start Simulator" );
+
+            mq = new NetMq();
+            mq.Init();
+            mq.OnRequestMoveStart += Mq_OnRequestMoveStart;
+
+            //Redis.Instance.Init();
             this.button1_Click( this, null );
 
             this.threadCancel.AddGo( Thread_Dowork );
             this.threadCancel.AddGo( Thread_DriveRun );
 
-            this.zmq = new ZmqManager();
+            //this.zmq = new ZmqManager();
             //this.mq = new NetMq();
         }
 
+        int currentTag = 2;
+        bool isStartMove = false;
+        TaskCancel taskCancel = new TaskCancel();
+        private void Mq_OnRequestMoveStart()
+        {
+            if ( this.isStartMove )
+                return;
+
+
+            uint f = (uint)currentTag;
+            uint t = uint.Parse( this.mq.TargetTag );
+            ShortestPathResult result = this.graph.Dijkstra( f, t );
+            var route = result.GetPath();
+
+            var ll = route.ToList();
+
+            this.taskCancel.Cancel();
+            this.taskCancel.WaitAll();
+
+            var task = Task.Run( () =>
+            {
+                mq.SetMoving();
+                logger.D( "Start Move" );
+                foreach ( var point in ll )
+                {
+                    if ( this.taskCancel.Canceled ) 
+                        break;
+
+                    LockUtils.Wait( 2000 );
+                    mq.SetCurrentTag( point.ToString(), "0" );
+                    this.currentTag = (int)point;
+
+                    logger.I( $"[Tag Changed] - {point}" );
+                }
+                mq.ResetMoving();
+                logger.D( "Stop Move" );
+            } );
+
+            taskCancel.Add( task );
+
+        }
+
         void Thread_Dowork()
         {
             while ( !this.threadCancel.Canceled )
             {
                 try
                 {
-                    LockUtils.Wait( 1000 );
-
-                    if ( Redis.Instance.GetMoveStart() )
-                    {
-                        Redis.Instance.ResetMoveStart();
+                    LockUtils.Wait( 5000 );
+                    //if ( Redis.Instance.GetMoveStart() )
+                    //{
+                    //    Redis.Instance.ResetMoveStart();
 
-                        this.RunDrive();
-                    }
+                    //    this.RunDrive();
+                    //}
 
                 }
-                catch ( Exception e)
+                catch ( Exception e )
                 {
                 }
             }
@@ -104,12 +156,13 @@ namespace OHVLoggerTest
             this.Points.ForEach( p =>
             {
                 this.graph.AddNode( p.ID );
-                logger.D( $"AddNode : {p.ID}" );
+                //logger.D( $"AddNode : {p.ID}" );
             } );
 
             this.graph.Connect( 20, 19, 20, null );
             this.graph.Connect( 1, 21, 10, null );
-            this.graph.Connect( 2, 22, 10, null);
+            this.graph.Connect( 1, 16, 20, null );
+            this.graph.Connect( 2, 22, 10, null );
             this.graph.Connect( 3, 2, 10, null );
             this.graph.Connect( 4, 3, 10, null );
             this.graph.Connect( 5, 23, 10, null );
@@ -162,7 +215,7 @@ namespace OHVLoggerTest
             //} );
         }
 
-        void RunDrive( )
+        void RunDrive()
         {
             var redis = Redis.Instance;
             var currentPoint = redis.CurrentPointID();

+ 141 - 11
Dev/OHVLoggerTest/OHVLoggerTest/NetMq.cs

@@ -1,37 +1,167 @@
 using GSG.NET.Concurrent;
+using GSG.NET.Logging;
 using NetMQ;
+using NetMQ.Monitoring;
 using NetMQ.Sockets;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
-    public class NetMq
+    public class NetMq : IDisposable
     {
+        static Logger logger = Logger.GetLogger();
+
         PublisherSocket pub = null;
-        ThreadCancel threadCancel = new ThreadCancel();
+        SubscriberSocket sub = null;
+
+        RequestSocket req = null;
+        ResponseSocket rep = null;
+
+        NetMQPoller poller = null;
+        NetMQMonitor monitor = null;
+
+        string endServer = "tcp://127.0.0.1:5568";
+
+        #region Properties
+        public string TargetTag { get; set; } = string.Empty;
+        #endregion
+
+        #region Event
+        public event Action OnRequestMoveStart;
+        #endregion
 
         public NetMq()
         {
-            pub = new PublisherSocket();
-            pub.Bind( "tcp://127.0.0.1:5565" );
+            NetMQ.NetMQConfig.Cleanup();
+        }
+
+        public void Dispose()
+        {
+            this.poller.Stop();
+            this.poller.Dispose();
+
+            this.monitor.Stop();
+            this.monitor.Dispose();
+
+            this.rep.Dispose();
+            this.req.Dispose();
+        }
+
+        public void Init()
+        {
+            this.rep = new ResponseSocket();
+            rep.Bind( "tcp://127.0.0.1:5567" );
+            rep.ReceiveReady += Rep_ReceiveReady;
+
+            this.poller = new NetMQPoller();
+            this.poller.Add( this.rep );
+            this.poller.RunAsync();
+
+            this.req = new RequestSocket();
+            req.Connect( endServer );
+            this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
+
+            this.monitor.Connected += ( s, a ) =>
+            {
+                logger.D( "[Request Connected]" );
+                //StressTeset();
+            };
+            this.monitor.Disconnected += ( s, a ) =>
+            {
+                logger.D( "[Request Disconnected]" );
+            };
+
+            this.monitor.StartAsync();
+        }
+
+        void StressTeset()
+        {
+            var sw = new Stopwatch();
+            sw.Start();
+            for ( int i = 0; i < 1000; i++ )
+            {
+                SetMoving();
+            }
+            Console.WriteLine( sw.ElapsedMilliseconds );
+            sw.Stop();
+        }
+
+        private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
+        {
+            var receive = e.Socket.ReceiveMultipartStrings();
+            rep.SendMoreFrame( receive[0] ).SendFrame( $"ok/{receive[1]}" );
+
+            try
+            {
+                if ( receive[0].Equals( "setm" ) )
+                {
+                    var msg = receive[1].Split( '/' );
+                    //rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{msg[0]}" );
+
+                    switch ( msg[0] )
+                    {
+                        case "3031":
+                            this.OnRequestMoveStart?.Invoke();
+                            break;
+
+                        case "3033":
+                        case "3034":
+                            this.TargetTag = msg[msg.Length - 1];
+                            break;
 
-            threadCancel.AddGo( Th_Pub );
+                        case "3060":
+                            break;
+
+                        default:
+                            break;
+                    }
+                }
+            }
+            catch ( Exception  ex)
+            {
+                logger.E( ex );
+            }
         }
 
-        void Th_Pub()
+        List<string> RequestMQ(string index, string msg )
         {
-            while ( !this.threadCancel.Canceled )
+            List<string> ll = new List<string>();
+
+            var guid = Guid.NewGuid();
+            using ( var req = new RequestSocket { Options = { Linger = TimeSpan.Zero, Identity = Encoding.Unicode.GetBytes( guid.ToString() ) } } )
             {
-                LockUtils.Wait( 1000 );
-                this.pub.SendMoreFrame( "1000" ).SendFrame( "Test" );
-                LockUtils.Wait( 100 );
+                req.Connect( this.endServer );
+
+                req.SendMoreFrame( index ).SendFrame( msg );
+
+                if ( !req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 1 ), ref ll ) )
+                    logger.E( $"req Receive TimeOut - Index[{index}] / Message - {msg}" );
             }
+
+            return ll;
         }
 
+        bool SetRequest(string index, string msg )
+        {
+            var ll = this.RequestMQ( "setm", $"{index}/{msg}" );
+
+            if ( ll.Count < 0 )
+                return false;
+
+            return true;
+        }
+
+        #region Set
+        public void SetMoving() => this.SetRequest( "4012", "3" );
+        public void ResetMoving() => this.SetRequest( "4012", "0" );
+        public void SetCurrentTag( string tag, string segment ) => this.SetRequest( "3009", $"{tag}/{segment}" );
+        #endregion
+
 
     }
 }

+ 9 - 9
Dev/OHVLoggerTest/OHVLoggerTest/OHVLoggerTest.csproj

@@ -6,8 +6,8 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProjectGuid>{29027F4C-8DFC-420E-9B5E-AA947A9D8DFF}</ProjectGuid>
     <OutputType>WinExe</OutputType>
-    <RootNamespace>OHVLoggerTest</RootNamespace>
-    <AssemblyName>OHVLoggerTest</AssemblyName>
+    <RootNamespace>OHVDriveSimulator</RootNamespace>
+    <AssemblyName>OHVDriveSimulator</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <Deterministic>true</Deterministic>
@@ -38,12 +38,6 @@
     <Reference Include="Dijkstra.NET, Version=1.2.1.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Dijkstra.NET.1.2.1\lib\net40\Dijkstra.NET.dll</HintPath>
     </Reference>
-    <Reference Include="GSG.NET">
-      <HintPath>..\..\OHV\Assambly\GSG.NET.dll</HintPath>
-    </Reference>
-    <Reference Include="GSG.NET.PLC">
-      <HintPath>..\..\..\..\GSG\GSG\bin\PLC\GSG.NET.PLC.dll</HintPath>
-    </Reference>
     <Reference Include="log4net">
       <HintPath>..\..\OHV\Assambly\log4net.dll</HintPath>
     </Reference>
@@ -102,6 +96,7 @@
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>
       <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
     </Compile>
     <None Include="Json\ohv_testmap7.json">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
@@ -125,6 +120,11 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\GSG\GSG\GSG.NET\GSG.NET.csproj">
+      <Project>{11e12a58-fdbc-444a-90e6-db96b7e98ff4}</Project>
+      <Name>GSG.NET</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 1 - 1
Dev/OHVLoggerTest/OHVLoggerTest/Program.cs

@@ -4,7 +4,7 @@ using GSG.NET.Concurrent;
 using GSG.NET.Logging;
 using GSG.NET.Utils;
 
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
     static class Program
     {

+ 24 - 32
Dev/OHVLoggerTest/OHVLoggerTest/Properties/Resources.Designer.cs

@@ -8,62 +8,54 @@
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace OHVLoggerTest.Properties
-{
-
-
+namespace OHVDriveSimulator.Properties {
+    using System;
+    
+    
     /// <summary>
     ///   지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
     /// </summary>
     // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
     // 클래스에서 자동으로 생성되었습니다.
-    // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여
-    // ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute( "System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0" )]
+    // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
+    // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    internal class Resources
-    {
-
+    internal class Resources {
+        
         private static global::System.Resources.ResourceManager resourceMan;
-
+        
         private static global::System.Globalization.CultureInfo resourceCulture;
-
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute( "Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode" )]
-        internal Resources()
-        {
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
         }
-
+        
         /// <summary>
         ///   이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
         /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )]
-        internal static global::System.Resources.ResourceManager ResourceManager
-        {
-            get
-            {
-                if ( ( resourceMan == null ) )
-                {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager( "OHVLoggerTest.Properties.Resources", typeof( Resources ).Assembly );
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OHVDriveSimulator.Properties.Resources", typeof(Resources).Assembly);
                     resourceMan = temp;
                 }
                 return resourceMan;
             }
         }
-
+        
         /// <summary>
         ///   이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
         ///   재정의합니다.
         /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )]
-        internal static global::System.Globalization.CultureInfo Culture
-        {
-            get
-            {
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
                 return resourceCulture;
             }
-            set
-            {
+            set {
                 resourceCulture = value;
             }
         }

+ 14 - 18
Dev/OHVLoggerTest/OHVLoggerTest/Properties/Settings.Designer.cs

@@ -1,28 +1,24 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.42000
+//     이 코드는 도구를 사용하여 생성되었습니다.
+//     런타임 버전:4.0.30319.42000
 //
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
+//     파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+//     이러한 변경 내용이 손실됩니다.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace OHVLoggerTest.Properties
-{
-
-
+namespace OHVDriveSimulator.Properties {
+    
+    
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute( "Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0" )]
-    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
-    {
-
-        private static Settings defaultInstance = ( (Settings)( global::System.Configuration.ApplicationSettingsBase.Synchronized( new Settings() ) ) );
-
-        public static Settings Default
-        {
-            get
-            {
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
                 return defaultInstance;
             }
         }

+ 1 - 1
Dev/OHVLoggerTest/OHVLoggerTest/Redis.cs

@@ -7,7 +7,7 @@ using GSG.NET.Extensions;
 using GSG.NET.ObjectBase;
 using StackExchange.Redis;
 
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
     public class Redis : SingletonBase<Redis>, IDisposable
     {

+ 1 - 1
Dev/OHVLoggerTest/OHVLoggerTest/ZmqManager.cs

@@ -6,7 +6,7 @@ using System.Text;
 using System.Threading.Tasks;
 using ZeroMQ;
 
-namespace OHVLoggerTest
+namespace OHVDriveSimulator
 {
     public class ZmqManager
     {