FrmCctvCtrlF.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "FrmCctvCtrlF.h"
  5. #include "TVS.h"
  6. //---------------------------------------------------------------------------
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma link "cxClasses"
  10. #pragma link "cxContainer"
  11. #pragma link "cxControls"
  12. #pragma link "cxEdit"
  13. #pragma link "cxGraphics"
  14. #pragma link "cxHint"
  15. #pragma link "cxLabel"
  16. #pragma link "cxLookAndFeelPainters"
  17. #pragma link "cxLookAndFeels"
  18. #pragma link "cxMaskEdit"
  19. #pragma link "cxPC"
  20. #pragma link "cxPCdxBarPopupMenu"
  21. #pragma link "cxSpinEdit"
  22. #pragma link "cxTextEdit"
  23. #pragma link "dxBar"
  24. #pragma link "dxCustomHint"
  25. #pragma link "dxRibbon"
  26. #pragma link "dxRibbonGallery"
  27. #pragma link "dxRibbonSkins"
  28. #pragma link "dxRibbonStatusBar"
  29. #pragma link "dxScreenTip"
  30. #pragma link "dxSkinBlack"
  31. #pragma link "dxSkinBlue"
  32. #pragma link "dxSkinCaramel"
  33. #pragma link "dxSkinChooserGallery"
  34. #pragma link "dxSkinCoffee"
  35. #pragma link "dxSkinDarkRoom"
  36. #pragma link "dxSkinDarkSide"
  37. #pragma link "dxSkinFoggy"
  38. #pragma link "dxSkinGlassOceans"
  39. #pragma link "dxSkiniMaginary"
  40. #pragma link "dxSkinLilian"
  41. #pragma link "dxSkinLiquidSky"
  42. #pragma link "dxSkinLondonLiquidSky"
  43. #pragma link "dxSkinMcSkin"
  44. #pragma link "dxSkinMoneyTwins"
  45. #pragma link "dxSkinOffice2007Black"
  46. #pragma link "dxSkinOffice2007Blue"
  47. #pragma link "dxSkinOffice2007Green"
  48. #pragma link "dxSkinOffice2007Pink"
  49. #pragma link "dxSkinOffice2007Silver"
  50. #pragma link "dxSkinOffice2010Black"
  51. #pragma link "dxSkinOffice2010Blue"
  52. #pragma link "dxSkinOffice2010Silver"
  53. #pragma link "dxSkinsCore"
  54. #pragma link "dxSkinscxPCPainter"
  55. #pragma link "dxSkinsdxBarPainter"
  56. #pragma link "dxSkinsdxRibbonPainter"
  57. #pragma link "dxSkinSeven"
  58. #pragma link "dxSkinsForm"
  59. #pragma link "dxSkinSharp"
  60. #pragma link "dxSkinSilver"
  61. #pragma link "dxSkinStardust"
  62. #pragma link "dxStatusBar"
  63. #pragma link "dxTabbedMDI"
  64. #pragma link "IdAntiFreeze"
  65. #pragma link "IdAntiFreezeBase"
  66. #pragma link "IdBaseComponent"
  67. #pragma link "cxButtons"
  68. #pragma link "cxGroupBox"
  69. #pragma link "ImageBtn"
  70. #pragma link "TVSLib_OCX"
  71. #pragma link "cxDropDownEdit"
  72. #pragma resource "*.dfm"
  73. TFrmCctvCtrl *FrmCctvCtrl = NULL;
  74. //---------------------------------------------------------------------------
  75. __fastcall TFrmCctvCtrl::TFrmCctvCtrl(TComponent* Owner)
  76. : TForm(Owner)//TdxCustomRibbonForm(Owner)//TForm(Owner)
  77. {
  78. //DoubleBuffered = true;
  79. Application->OnException = OnAppException;
  80. reMsg->Lines->Clear();
  81. m_lCurChID = 0;
  82. ::CoInitialize(NULL);
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall TFrmCctvCtrl::FormCreate(TObject *Sender)
  86. {
  87. /* 레지스터리 등록 IE 최신버전 */
  88. String sExeName = ExtractFileName(Application->ExeName);
  89. UpdateExplorerEmulatorVersion(sExeName);
  90. Application->ShowMainForm = false;
  91. try {
  92. Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
  93. } catch(...) { ShowMessage("LoadFromResourceName failed"); }
  94. Application->ShowMainForm = true;
  95. Application->OnHint = OnAppHint;
  96. }
  97. //---------------------------------------------------------------------------
  98. void __fastcall TFrmCctvCtrl::reMsgDblClick(TObject *Sender)
  99. {
  100. reMsg->Lines->Clear();
  101. }
  102. //---------------------------------------------------------------------------
  103. #include <Registry.hpp>
  104. bool __fastcall TFrmCctvCtrl::UpdateExplorerEmulatorVersion(String AAppName)
  105. {
  106. TRegistry *reg = new TRegistry(KEY_READ|KEY_WRITE|KEY_WOW64_64KEY);
  107. if (reg == NULL) return false;
  108. String sKey = "SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";
  109. reg->RootKey = HKEY_LOCAL_MACHINE;
  110. if (!reg->KeyExists(sKey))
  111. {
  112. //MessageDlg("Key not found! Created now.", mtInformation, TMsgDlgButtons() << mbOK, 0);
  113. bool bOpenKey = reg->CreateKey(sKey);
  114. //return false;
  115. }
  116. reg->Access = KEY_WRITE;
  117. bool openResult = reg->OpenKey(sKey, true);
  118. if(!openResult)
  119. {
  120. //MessageDlg("Unable to create key! Exiting.", mtError, TMsgDlgButtons() << mbOK, 0);
  121. return false;
  122. }
  123. if (!reg->KeyExists(AAppName))
  124. {
  125. reg->WriteInteger(AAppName, 10000);
  126. }
  127. reg->CloseKey();
  128. reg->Free();
  129. return true;
  130. }
  131. //---------------------------------------------------------------------------
  132. void __fastcall TFrmCctvCtrl::FormShow(TObject *Sender)
  133. {
  134. Refresh();
  135. Application->ProcessMessages();
  136. VARIANT var;
  137. VariantInit(&var);
  138. var.vt = VT_I4;
  139. var.lVal = 1;// / MAX_INSTANCE;
  140. TVSLiveControl1->set_LocalConfig(TN_LCI_MAX_DISPLAY_CHANNEL, var);
  141. var = TVSLiveControl1->get_LocalConfig(TN_LCI_OSD_MODE);
  142. var.lVal = TN_OSD_MODE_D3D;//GDI
  143. TVSLiveControl1->set_LocalConfig(TN_LCI_OSD_MODE, var);
  144. var = TVSLiveControl1->get_LocalConfig(TN_LCI_MAX_DISPLAY_CHANNEL);
  145. m_pDisp = TVSLiveControl1->GetDisplay();
  146. m_pDisp->set_LayoutMode(0, TN_LM_4X4);
  147. //VARIANT var;
  148. var.vt = VT_I4;
  149. var.lVal = 4;
  150. //m_dlgVideo[m_nLastSelInst].m_tvsLive.SetLocalConfig(TN_LCI_BUFFER_FRAMES, var);
  151. TVSLiveControl1->set_LocalConfig(TN_LCI_BUFFER_FRAMES, var);
  152. TVSLiveControl1->set_LocalConfig(TN_LCI_DISPLAY_GRID_ON, var);
  153. TVSLiveControl1->set_LocalConfig(TN_LCI_DISPLAY_GRID_COLOR, var);
  154. TVSLiveControl1->set_LocalConfig(TN_LCI_DISPLAY_GRID_WIDTH, var);
  155. TmrOnShow->Enabled = true;
  156. }
  157. //---------------------------------------------------------------------------
  158. void __fastcall TFrmCctvCtrl::TmrOnShowTimer(TObject *Sender)
  159. {
  160. Refresh();
  161. TmrOnShow->Enabled = false;
  162. Application->ProcessMessages();
  163. }
  164. //---------------------------------------------------------------------------
  165. void __fastcall TFrmCctvCtrl::FormClose(TObject *Sender, TCloseAction &Action)
  166. {
  167. CommClose();
  168. Action = caFree;
  169. }
  170. //---------------------------------------------------------------------------
  171. void __fastcall TFrmCctvCtrl::CommClose()
  172. {
  173. try
  174. {
  175. Disconnect();
  176. ::CoUninitialize();
  177. }
  178. catch(...)
  179. {
  180. }
  181. }
  182. //---------------------------------------------------------------------------
  183. void __fastcall TFrmCctvCtrl::OnAppHint(TObject *Sender)
  184. {
  185. }
  186. //---------------------------------------------------------------------------
  187. void __fastcall TFrmCctvCtrl::OnAppException(TObject *Sender, Exception *exception)
  188. {
  189. String sClassName = (NULL != Sender) ? Sender->ClassName() : String("Unknown_Class");
  190. String sErrMsg = (NULL != exception) ? exception->Message : String("Unknown_Error");
  191. String sError = sClassName + " : " + sErrMsg;
  192. //Application->ShowException(&exception);
  193. Application->NormalizeTopMosts();
  194. Application->MessageBox(sError.c_str(), L"System Error", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  195. Application->RestoreTopMosts();
  196. }
  197. //---------------------------------------------------------------------------
  198. void __fastcall TFrmCctvCtrl::ApplicationEvents1SettingChange(TObject *Sender, int Flag,
  199. const UnicodeString Section, int &Result)
  200. {
  201. DateSeparator = '-';
  202. TimeSeparator = ':';
  203. ShortDateFormat = "yyyy-MM-dd";
  204. ShortTimeFormat = "HH:NN:SS";
  205. LongTimeFormat = "HH:NN:SS";
  206. cxFormatController()->BeginUpdate();
  207. cxFormatController()->UseDelphiDateTimeFormats = true;
  208. cxFormatController()->EndUpdate();
  209. cxFormatController()->GetFormats();
  210. cxFormatController()->NotifyListeners();
  211. }
  212. //---------------------------------------------------------------------------
  213. bool __fastcall TFrmCctvCtrl::Connect()
  214. {
  215. if (m_lCurChID <= 0)
  216. {
  217. int nProtocol = 0;
  218. bool bHD = false; // High Definition
  219. bool bAudio = false;
  220. String sAddress = "";
  221. String sAudio = "";
  222. String sVideo = "";
  223. String sStream = "";
  224. m_IpAddr = EdIp->Text.Trim();
  225. m_Port = EdPort->Text.Trim();
  226. m_nChannel = CbChannel->ItemIndex + 1;
  227. m_nStream = CbStream->ItemIndex;
  228. m_UserId = EdUserId->Text.Trim();
  229. m_UserPswd = EdUserPswd->Text.Trim();
  230. if (bAudio) sAudio = "+audio" + String(m_nChannel);
  231. sStream = (m_nStream == 1) ? "s" : ""; // secondary == s, primary == null
  232. sVideo = "video" + String(m_nChannel) + sStream;
  233. //"vsnm://210.99.141.193:2323/video1s+audio1";
  234. if (nProtocol == 0) // tcp
  235. sAddress = "vsnm://" + m_IpAddr + ":" + m_Port + "//" + sVideo + sAudio;
  236. else if (nProtocol == 1) // multicate
  237. sAddress = "vsnm-multicast://" + m_IpAddr + ":" + m_Port + "//" + sVideo + sAudio;
  238. else // udp
  239. sAddress = "vsnm-udp://" + m_IpAddr + ":" + m_Port + "//" + sVideo + sAudio;
  240. VARIANT var;
  241. VariantInit(&var);
  242. var.vt = VT_I4;
  243. var.lVal = bHD ? 1 : 0;
  244. TVSLiveControl1->set_LocalConfig(TN_LCI_MAX_HD_CHANNEL, var);
  245. m_lCurChID = TVSLiveControl1->Connect(sAddress.c_str(), m_UserId.c_str(), m_UserPswd.c_str());
  246. if (m_lCurChID <= 0)
  247. {
  248. reMsg->Lines->Add("Connection error(" + String(m_lCurChID) + ")");
  249. return false;
  250. }
  251. m_pDisp->set_MapChannel(0, 0, m_lCurChID);
  252. VARIANT_BOOL vb;
  253. vb = true;
  254. TVSLiveControl1->set_AutoReconnect(m_lCurChID, vb);
  255. TVSLiveControl1->set_VideoOn(m_lCurChID, true);
  256. TVSLiveControl1->Play(m_lCurChID);
  257. //TVSLiveControl1->Pause(m_lCurChID);
  258. m_pDisp->set_ShowToolbar(1, 0);
  259. m_pDisp->set_OsdBackColor(0, 0);
  260. PnlCamConrtol->Enabled = true;
  261. }
  262. return true;
  263. }
  264. //---------------------------------------------------------------------------
  265. void __fastcall TFrmCctvCtrl::Disconnect()
  266. {
  267. if (m_lCurChID > 0)
  268. {
  269. if (TVSLiveControl1->get_ChannelState(m_lCurChID) & TN_CS_CONNECTED)
  270. {
  271. TVSLiveControl1->Disconnect(m_lCurChID);
  272. }
  273. m_lCurChID = 0;
  274. BtnCamera->Caption = "영상 연결";
  275. BtnCamera->Tag = 0;
  276. }
  277. }
  278. //---------------------------------------------------------------------------
  279. void __fastcall TFrmCctvCtrl::TVSLiveControl1ChannelNotify(TObject *Sender, long lChID, long eNewState, long eReason)
  280. {
  281. if (eNewState & TN_CS_CONNECTED)
  282. {
  283. reMsg->Lines->Add("ChannelNotify(TN_CS_CONNECTED)");
  284. }
  285. else
  286. {
  287. if (eReason < 10)
  288. {
  289. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:reason=" + String(eReason));
  290. }
  291. else
  292. {
  293. switch (eReason)
  294. {
  295. case TN_SNC_CN_SERVER_UNREACHABLE:
  296. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Server is unreachable for connection)");
  297. //m_pdlgMain->Pause();
  298. break;
  299. case TN_SNC_CN_TOO_MANY_CONNECTION:
  300. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Too many connections on the server)");
  301. break;
  302. case TN_SNC_CN_PASSWORD_MISMATCH:
  303. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Password is incorrect)");
  304. break;
  305. case TN_SNC_CN_CONNECTION_DISABLED:
  306. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Server disabled the connection)");
  307. break;
  308. case TN_SNC_CN_ID_NOT_EXIST:
  309. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Login ID doesn't exist)");
  310. break;
  311. case TN_SNC_CN_DOMAINNAME_UNKNOWN:
  312. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Can't resolve the domain name)");
  313. break;
  314. /* case TN_SNC_CN_PARAMETER_OUTOFRANGE:
  315. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Invalid channels is one of this case)");
  316. break;
  317. */ case TN_SNC_CN_DUPLICATE_CONNECT:
  318. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Multiple connections to a channel are not allowed)");
  319. break;
  320. case TN_SNC_CN_KEEPALIVE_FAILED:
  321. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:Disconnected due to keep alive timeout)");
  322. //m_pdlgMain->Pause();
  323. break;
  324. case TN_SNC_CN_NO_AUTHORITY_OPERATION:
  325. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:No authority operation)");
  326. break;
  327. case TN_SNC_CN_OPERATION_FAILED:
  328. reMsg->Lines->Add("ChannelNotify(NOT CONNECTED:General failure)");
  329. break;
  330. }
  331. Disconnect();
  332. }
  333. }
  334. if (eNewState & TN_CS_STREAMED)
  335. {
  336. reMsg->Lines->Add("ChannelNotify(TN_CS_STREAMED)");
  337. }
  338. if (eNewState & TN_CS_DECODED)
  339. {
  340. reMsg->Lines->Add("ChannelNotify(TN_CS_DECODED)");
  341. }
  342. if (eNewState & TN_CS_DISPLAYED)
  343. {
  344. reMsg->Lines->Add("ChannelNotify(TN_CS_DISPLAYED)");
  345. }
  346. if (eNewState & TN_CS_RECORDED)
  347. {
  348. reMsg->Lines->Add("ChannelNotify(TN_CS_RECORDED)");
  349. }
  350. }
  351. //---------------------------------------------------------------------------
  352. void __fastcall TFrmCctvCtrl::TVSLiveControl1ServerEvent(TObject *Sender, long lChID, long eEventType, short nIndex, long eEventStatus,
  353. Variant vData)
  354. {
  355. switch (eEventType)
  356. {
  357. case TN_ET_DI:
  358. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_DI=" + String(eEventStatus) + ")");
  359. break;
  360. case TN_ET_VIDEOLOSS:
  361. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_VIDEOLOSS=" + String(eEventStatus) + ")");
  362. break;
  363. case TN_ET_MOTION:
  364. //reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_MOTION=" + String(eEventStatus) + ")");
  365. break;
  366. case TN_ET_TIMECHANGED:
  367. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_TIMECHANGED=" + String(eEventStatus) + ")");
  368. break;
  369. case TN_ET_DO:
  370. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_DO=" + String(eEventStatus) + ")");
  371. break;
  372. case TN_ET_RECORD:
  373. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_RECORD=" + String(eEventStatus) + ")");
  374. break;
  375. case TN_ET_RESOLUTIONCHANGED:
  376. reMsg->Lines->Add("ServerEvent([%" + String(nIndex) + "] TN_ET_RESOLUTIONCHANGED=" + String(eEventStatus) + ")");
  377. break;
  378. default:
  379. reMsg->Lines->Add("ServerEvent(unknown)");
  380. break;
  381. }
  382. }
  383. //---------------------------------------------------------------------------
  384. void __fastcall TFrmCctvCtrl::BtnCameraClick(TObject *Sender)
  385. {
  386. if (BtnCamera->Tag == 0)
  387. {
  388. if (Connect())
  389. {
  390. BtnCamera->Caption = "영상 연결 해제";
  391. BtnCamera->Tag = 1;
  392. }
  393. }
  394. else
  395. {
  396. Disconnect();
  397. }
  398. }
  399. //---------------------------------------------------------------------------
  400. void __fastcall TFrmCctvCtrl::BtnPTZMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
  401. {
  402. TImageBtn *pBtn = (TImageBtn*)Sender;
  403. long lPTZSpeed = PTZSpeed->Position;
  404. try
  405. {
  406. //nType Type of control. 0: PAN, 1: TILT, 2: ZOOM
  407. switch(pBtn->Tag)
  408. {
  409. //case 0: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_HOME); break; // HOME
  410. case 1: // Tilt Up
  411. case 2: // Tilt Down
  412. TVSLiveControl1->SetPTZControlSpeed(m_lCurChID, 1, lPTZSpeed);
  413. break;
  414. case 3: // Pan left
  415. case 4: // Pan right
  416. TVSLiveControl1->SetPTZControlSpeed(m_lCurChID, 0, lPTZSpeed);
  417. break;
  418. case 9: // Zoom In
  419. case 10: // Zoom Out
  420. TVSLiveControl1->SetPTZControlSpeed(m_lCurChID, 2, lPTZSpeed);
  421. break;
  422. case 12: // Focus In
  423. case 13: // Focus Out
  424. break;
  425. default: return;
  426. }
  427. switch(pBtn->Tag)
  428. {
  429. case 0: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_HOME); break; // HOME
  430. case 1: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_UP); break; // Tilt Up
  431. case 2: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_DOWN); break; // Tilt Down
  432. case 3: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_LEFT); break; // Pan left
  433. case 4: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_RIGHT); break; // Pan right
  434. case 9: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_ZOOMIN); break; // Zoom In
  435. case 10: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_ZOOMOUT); break; // Zoom Out
  436. case 12: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_FOCUSNEAR); break; // Focus In
  437. case 13: TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_FOCUSFAR); break; // Focus Out
  438. default: return;
  439. }
  440. }
  441. catch(...) {}
  442. }
  443. //---------------------------------------------------------------------------
  444. void __fastcall TFrmCctvCtrl::BtnPTZMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
  445. {
  446. TImageBtn *pBtn = (TImageBtn*)Sender;
  447. String sPTZSpeed = String(PTZSpeed->Position);
  448. TVSLiveControl1->SendPTZCommand(m_lCurChID, TN_PTZ_STOP);
  449. }
  450. //---------------------------------------------------------------------------