Program.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5. using System.Diagnostics;
  6. using Microsoft.Win32;
  7. using System.IO;
  8. namespace FPER
  9. {
  10. //
  11. // 진입점 및 공용 이벤트, Enum 선언
  12. //
  13. static class Program
  14. {
  15. /// <summary>
  16. /// 해당 응용 프로그램의 주 진입점입니다.
  17. /// </summary>
  18. [STAThread]
  19. static void Main()
  20. {
  21. // cyim 2013.10.11 : 데이타베이스 동작 가능 상태 확인
  22. if (Process_Excute("fbserver") == false || Process_Excute("fbguard") == false)
  23. {
  24. MessageBox.Show("Fire Bird 데이타베이스가 실행되지 않았습니다. 프로그램을 종료합니다.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  25. return;
  26. }
  27. // cyim 2015.7.29 수신반 모드
  28. // ini 파일을 열어서 수신반이 될지 수신기가 될지 알아본다
  29. // 만약 ini 파일이 없다면 기본적으로 수신기 모드로 동작한다
  30. // 0 : 수신기, 1 : 수신반
  31. string mode = _Ini.Read_Ini("PROGRAM", "MODE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  32. // cyim 2016.12.26 : UI 이탈방지 코드 추가 (후킹)
  33. _Data.Hook_Enable = _Ini.Read_Ini("PROGRAM", "HOOK_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  34. if (mode == "1")
  35. {
  36. // cyim 2015.7.29 수신반 모드
  37. _Data.FireDeskMode = true;
  38. // 현장명
  39. _Data.Site_Name = _Ini.Read_Ini("PROGRAM", "SITE_NAME", 1024, Environment.CurrentDirectory + "\\Config.ini");
  40. // cyim 2016.12.20 : 푸시메세지 연동 기능 추가
  41. _Data.MOBILE_ENABLE = _Ini.Read_Ini("PROGRAM", "MOBILE_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  42. _Data.GCM_ENABLE = _Ini.Read_Ini("PROGRAM", "GCM_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  43. _Data.GCM_API_KEY = _Ini.Read_Ini("PROGRAM", "GCM_API_KEY", 1024, Environment.CurrentDirectory + "\\Config.ini");
  44. _Data.GCM_TEST_MODE = _Ini.Read_Ini("PROGRAM", "GCM_TEST_MODE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  45. _Data.GCM_INFO_FIRE = _Ini.Read_Ini("PROGRAM", "GCM_INFO_FIRE", 1024, Environment.CurrentDirectory + "\\Config.ini");
  46. _Data.GCM_INFO_FACILITY = _Ini.Read_Ini("PROGRAM", "GCM_INFO_FACILITY", 1024, Environment.CurrentDirectory + "\\Config.ini");
  47. _Data.GCM_INFO_COMERROR = _Ini.Read_Ini("PROGRAM", "GCM_INFO_COMERROR", 1024, Environment.CurrentDirectory + "\\Config.ini");
  48. _Data.GCM_INFO_BLOCK = _Ini.Read_Ini("PROGRAM", "GCM_INFO_BLOCK", 1024, Environment.CurrentDirectory + "\\Config.ini");
  49. _Data.GCM_INFO_CUT = _Ini.Read_Ini("PROGRAM", "GCM_INFO_CUT", 1024, Environment.CurrentDirectory + "\\Config.ini");
  50. _Data.GCM_INFO_CHECK = _Ini.Read_Ini("PROGRAM", "GCM_INFO_CHECK", 1024, Environment.CurrentDirectory + "\\Config.ini");
  51. // cyim 2015.9.30 수신반은 ini 파일을 이용해서 데이타베이스 접속
  52. string Temp_DATABASE_NAME = _Ini.Read_Ini("PROGRAM", "DATABASE_NAME", 1024, Environment.CurrentDirectory + "\\Config.ini");//rk.GetValue("DATABASE_NAME").ToString();
  53. _Data.Registry_DATABASE_NAME = Temp_DATABASE_NAME;
  54. _Data.Registry_DATABASE_NAME_IP = Temp_DATABASE_NAME.Substring(0, Temp_DATABASE_NAME.IndexOf(":"));
  55. _Data.Registry_DATABASE_NAME_PATH = Temp_DATABASE_NAME.Substring(Temp_DATABASE_NAME.IndexOf(":") + 1);
  56. }
  57. else
  58. {
  59. //
  60. // cyim 2015.7.29 수신반 루틴을 위해 외부 파라미터로 동작하도록 수정
  61. //
  62. // 레지스트리 값 읽기
  63. RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\I_FPER_COMM_DAEMON", false);
  64. if (rk == null)
  65. {
  66. MessageBox.Show("레지스트리 읽기 실패!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  67. return;
  68. }
  69. else
  70. {
  71. // 수신기 아이디
  72. _Data.Registry_ReceiverID = Convert.ToInt16(rk.GetValue("RECEIVER_ID").ToString());
  73. // 데이타베이스 정보
  74. string Temp_DATABASE_NAME = rk.GetValue("DATABASE_NAME").ToString();
  75. _Data.Registry_DATABASE_NAME = Temp_DATABASE_NAME;
  76. _Data.Registry_DATABASE_NAME_IP = Temp_DATABASE_NAME.Substring(0, Temp_DATABASE_NAME.IndexOf(":"));
  77. _Data.Registry_DATABASE_NAME_PATH = Temp_DATABASE_NAME.Substring(Temp_DATABASE_NAME.IndexOf(":") + 1);
  78. // 모니터데몬 정보
  79. try
  80. {
  81. _Data.Registry_MonitorDaemon_Enable = (rk.GetValue("MAIN_MONITOR_ACTIVE").ToString() == "1") ? true : false;
  82. _Data.Registry_MonitorDaemon_IP = rk.GetValue("MAIN_MONITOR_SERVER_IP").ToString();
  83. }
  84. catch
  85. {
  86. // cyim 2015.8.18 레지스트리값 읽기 실패하면 기본값을 강제로 셋팅
  87. // 모니터 데몬 정보가 현장에서 주로 셋팅할때 레지스트리값이 없으므로 보완한다
  88. // 단, 기존의 Main Monitor 관련 변수만 셋팅한다
  89. MessageBox.Show("레지스트리 읽기 실패! 기본값 셋팅 [MAIN_MONITOR_ACTIVE] 합니다. 종료하고 다시 시작해주세요", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  90. // 레지스트리에 값을 쓰기
  91. RegistryKey Set_Rk = Registry.LocalMachine.CreateSubKey("SOFTWARE").CreateSubKey("I_FPER_COMM_DAEMON");
  92. Set_Rk.SetValue("MAIN_MONITOR_ACTIVE", 0);
  93. Set_Rk.SetValue("MAIN_MONITOR_SERVER_IP", "192.168.0.1");
  94. Set_Rk.SetValue("MAIN_MONITOR_SERVER_PORT", 9003);
  95. Set_Rk.SetValue("MAIN_MONITOR_SERVER_PROCESS_DELAY", 5000);
  96. Set_Rk.SetValue("MAIN_MONITOR_SERVER_READ_TIMEOUT", 30000);
  97. return;
  98. }
  99. //
  100. // 중요사항
  101. //
  102. // 네트워크 수신기에서 수신기아이디가 2인경우에도 Receiver1 폴더로 접근하도록 되어있다
  103. // 폴더명과 ODBC 를 바꿔서 설정해야하는 불편함이 있다. 또한 런쳐가 실행되는 경로가 틀려져서 윈도우 부팅후 시작할수가 없다
  104. // 결국 무조건 수신기 아이디와는 상관없이 폴더명은 Receiver1로 고정되므로 주의해야한다
  105. // 프로젝트 정보
  106. _Data.Registry_Project_Directory = rk.GetValue("PROJECT_DIR").ToString();
  107. }
  108. }
  109. //
  110. // MUTEX 처리
  111. //
  112. bool createdNew;
  113. Mutex dup = new Mutex(true, "__FIRE_UI_MUTEX__", out createdNew);
  114. if (createdNew)
  115. {
  116. Application.EnableVisualStyles();
  117. Application.SetCompatibleTextRenderingDefault(false);
  118. switch (mode)
  119. {
  120. // 수신반
  121. case "1":
  122. Application.Run(new FireDesk_BigReceiver());
  123. break;
  124. // 수신기
  125. default:
  126. Application.AddMessageFilter(new AltF4Filter()); // Add a message filter
  127. Application.Run(new MDIParent(_Data.Registry_ReceiverID, null)); // cyim 2015.7.29 수신반 모드: 평상시에는 레지스트리값으로 아이디를 알아낸다 // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  128. break;
  129. }
  130. dup.ReleaseMutex();
  131. }
  132. else
  133. {
  134. //MessageBox.Show("Already Program is Running!");// cyim 2015.2.11 중복방지 알림팝업창 제거
  135. }
  136. }
  137. public class AltF4Filter : IMessageFilter
  138. {
  139. public bool PreFilterMessage(ref Message m)
  140. {
  141. const int WM_SYSKEYDOWN = 0x0104;
  142. if (m.Msg == WM_SYSKEYDOWN)
  143. {
  144. bool alt = ((int)m.LParam & 0x20000000) != 0;
  145. if (alt && (m.WParam == new IntPtr((int)Keys.F4)))
  146. Console.WriteLine("ALT+F4 Filtering됨.");
  147. return true; // eat it!
  148. }
  149. return false;
  150. }
  151. }
  152. // 프로세스 실행여부
  153. public static bool Process_Excute(string ProcessName)
  154. {
  155. bool result = false;
  156. Process[] mProcess = Process.GetProcessesByName(ProcessName);
  157. if (mProcess.Length == 0) result = false;
  158. else result = true;
  159. return result;
  160. }
  161. }
  162. //
  163. //화면 인터페이스 모드 (GroupUIChange 함수의 인자값)
  164. //
  165. public enum UIMode
  166. {
  167. input, // 입력 및 수정
  168. cancel // 보기
  169. }
  170. //
  171. //DATABASE 작업 모드
  172. //
  173. public enum QUERYMode
  174. {
  175. select, insert, update, delete, InsertAndUpdate
  176. }
  177. //
  178. //TB_COMM의 COMM_LOOP 필드 상수 (고정된값)
  179. //
  180. public enum COMMLOOP
  181. {
  182. FrontLoop = 1,
  183. BackLoop = 2, // 사용안함
  184. IO = 3,
  185. KEYPAD = 4,
  186. BroadCast = 5 // 비상방송 5 // cyim 2013.7.10 디자인개선작업 : 수신기설정
  187. }
  188. //
  189. // 명령응답을 처리하는 이벤트선언
  190. //
  191. public delegate void dCommandResponse(CmdInfo d);
  192. //
  193. // 화면전환을 처리하는 이벤트선언 (예 : 화재발생시)
  194. //
  195. public delegate void dCommandFuctionCall(int id);
  196. //
  197. // 팝업 우선순위 (낮을수록 높은 등급)
  198. //
  199. public enum MappingStatus
  200. {//2010.10.29,k.s.d, pop up message level chnage.
  201. FireOn = 0,
  202. AccumulateOn = 1,
  203. WriteOn = 2,
  204. FaultOn = 16,//3, //2011.04.06,k.s.d, pop up message level chnage.
  205. PhoneOn = 4,
  206. CommConnectError = 5,
  207. FireOff = 6,
  208. WriteOff = 7,
  209. FaultOff = 17,//8, //2011.04.06,k.s.d, pop up message level chnage.
  210. FireRecovery = 9,
  211. AccumulateOff = 10,
  212. PhoneOff = 11,
  213. Normal = 12,
  214. CommConnectNormal = 13,
  215. ProgramStart = 14,
  216. ProgramEnd = 15,
  217. Log = 16, // cyim 2015.2.10 LOG
  218. DemonInit = 18,// add init message
  219. }
  220. //
  221. // 회로 타입
  222. //
  223. /* 'I' : 입력,'O' : 출력 */
  224. public struct code_InOutType
  225. {
  226. public const String Input = "I";
  227. public const String Output = "O";
  228. }
  229. //
  230. // 미사용
  231. //
  232. /* 'G':그룹, 'D':DEVICE */
  233. public struct code_processType
  234. {
  235. public const String Group = "G";
  236. public const String Device = "D";
  237. }
  238. //
  239. // 필터링 조건 // cyim 2013.10.2 : 발생위치 필터링 기능 추가
  240. //
  241. public enum DB_Result_Filter
  242. {
  243. None, // 필터링 조건 사용안함
  244. Device, // 디바이스명만
  245. Positon, // 발생위치만
  246. AND // 교집합
  247. }
  248. }