| 
					
				 | 
			
			
				@@ -2,6 +2,7 @@ package com.its.vms.dto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.app.AppUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.app.utils.SysUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.its.vms.config.ApplicationConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.domain.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.domain.enums.eVmsFormType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.entity.TbVmsCtlr; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,11 +13,13 @@ import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.process.TcpServerSendData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.process.TcpServerSendDataProcess; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.protocol.dto.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.its.vms.xnettcp.vms.protocol.enums.eControlCommand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.its.vms.xnettcp.vms.protocol.enums.eControlDeviceId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFileSaveLocation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.protocol.enums.eVmsImageType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.its.vms.xnettcp.vms.protocol.impl.VmsReqBlank; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDataDownload; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDownloadForm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDownloadFormSchedule; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.its.vms.xnettcp.vms.task.VmsTimeoutTask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import io.netty.channel.Channel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import io.netty.channel.ChannelFuture; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -129,6 +132,7 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private long              syncTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private VmsFrameSequence  seq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Integer downloadFormId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private VmsDownloadFile downloadFile;           // 제어기로 다운로드할 파일정보(TB_VMS_DOWNLOAD) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private VmsDownloadData downloadData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ConcurrentHashMap<Integer, VmsDownloadForm> downloadFormMap = null; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -327,18 +331,18 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public int reset(int devcType, int cntlType, TbVmsCtrlHs ctrlHs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (getChannel() == null || getNetState() == NET.CLOSED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("Reset Request: channel not connected: [{}]", this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        eControlDeviceId controlDeviceId = eControlDeviceId.getByValue(devcType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        eControlCommand commandType = eControlCommand.getByValue(cntlType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (controlDeviceId == null || commandType == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("Reset Request: control type missMatched: [{}], {}, {}", this, controlDeviceId, commandType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.warn("[{}] [{},{}], controlDeviceId: {}, commandType: {}", this.vmsCtlrNmbr, devcType, cntlType, controlDeviceId.toString(), commandType.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (getChannel() == null || getNetState() == NET.CLOSED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            log.error("Reset Request: channel not connected: [{}]", this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        eControlDeviceId controlDeviceId = eControlDeviceId.getByValue(devcType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        eControlCommand commandType = eControlCommand.getByValue(cntlType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (controlDeviceId == null || commandType == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            log.error("Reset Request: control type missMatched: [{}], {}, {}", this, controlDeviceId, commandType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            return 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        log.warn("[{}] [{},{}], controlDeviceId: {}, commandType: {}", this.vmsCtlrNmbr, devcType, cntlType, controlDeviceId.toString(), commandType.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //		boolean res = ControlDeviceService.getInstance().requestResetCommand(true, this, getChannel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //		if (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //			log.info("RSE REQ CONTROL SEND OK: [{}] [{},{}]", this.RSE_CTLR_NMBR, devcType, cntlType); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -486,11 +490,15 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 스케쥴 다운로드 초기화 작업을 수행한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 제어기에 메시지를 표출하기 위한 작업. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 1. 제어기에 표출할 폼 정보를 다운로드 한다. - downloadForm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 2. 파일 다운로드(이미지, 심볼) - downloadFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 3. 폼 스케쥴 다운로드 - downloadFormSchedule 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 4. Blank - downloadBlank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param isSchedule 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean downloadScheduleForm(boolean isSchedule) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadForm(boolean isSchedule) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         VmsFormService formService = (VmsFormService) AppUtils.getBean(VmsFormService.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.controlMode.setSchedule(isSchedule); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.txtOpCode = (byte)0x00; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -574,7 +582,7 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_file_download          = 0x82,//    데이터 다운로드                         송신    INI, CFG , Bitmap , Data파일송신            센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_download_schedule_form = 0x96,//    Display Schedule Form                   송신    계획된 Form 표출 요구                       센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_blank                  = 0x9E,//    Blank                                   송신    schedule 표출                               센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            downloadDefaultSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            downloadDefaultFrom(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 스케쥴 모드인 경우(A:자동, F:고정) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -582,21 +590,26 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_file_download          = 0x82,//    데이터 다운로드                         송신    INI, CFG , Bitmap , Data파일송신            센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_download_schedule_form = 0x96,//    Display Schedule Form                   송신    계획된 Form 표출 요구                       센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //e_vms_blank                  = 0x9E,//    Blank                                   송신    schedule 표출                               센터 → VMS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            downloadDefaultSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            downloadAutoFixForm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean downloadDefaultSchedule() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 기본 스케쥴의 폼 정보는 하나의 폼 패킷에 다운로드 해야 여러 폼을 표출할 수 있다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 제어기에서 FID0000 인 폼이 기본 표출폼 이기 때문이다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadDefaultFrom() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Download Form  (기본폼은 하나의 폼에 여러폼을 다운로드한다.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         int formCnt = this.downloadData.getMaxSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (formCnt <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.info("VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("downloadDefaultFrom: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        formCnt = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //formCnt = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         VmsFormDataDto formData = new VmsFormDataDto(0, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (int ii = 0; ii < formCnt; ii++) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -637,9 +650,115 @@ public class TbVmsCtlrDto implements Serializable { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return sendData(downloadForm.getByteBuffer(), 10, downloadForm.getOpCodeDesc()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean downloadAutoFixSchedule() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 자동 및 고정 스케쥴인 경우 폼정보 하나를 하나의 패킷으로 전송한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadAutoFixForm() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Download Form  (기본폼은 하나의 폼에 하나의 폼만 다운로드한다.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int formCnt = this.downloadData.getMaxSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (formCnt <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("downloadAutoFixForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 폼 이미지 및 기타 폼에 표출할 심볼 이미지가 다운로드 완료가 된후에 스케쥴 정보를 표출하도록 한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadFile() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int formCnt = this.downloadData.getMaxSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (formCnt <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(" downloadFile: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int downloadCnt = this.downloadData.getDownloadCnt(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (downloadCnt >= formCnt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 폼파일이(폼이미지파일) 모두 다운로드 되었으므로 스케쥴 정보를 다운로드 한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return downloadFormSchedule();  // Display Schedule Form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ApplicationConfig config = (ApplicationConfig)AppUtils.getBean(ApplicationConfig.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        boolean endDownload = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int ii = downloadCnt; ii < formCnt; ii++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.downloadData.setDownloadCnt(downloadCnt+1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int formId   = units[ii].getFormNo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int bitmapId = units[ii].getBitmapId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int formIdx  = units[ii].getFormIdx(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VmsForm pForm = this.formManager.getItem(formIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (config.isCheckNewForm() && units[ii].isDownload()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 이미 다운로드 했기 때문에 다시 다운로드 하지 않는다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                log.info("downloadFile: VMS {}, IDX {}, FormId {}, BitmapId {}, already download...", this.vmsCtlrNmbr, ii, formId, bitmapId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            endDownload = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.downloadFormId = units[ii].getVmsFormId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("downloadFile: DownloadCnt: VMS {}, IDX {}, FormId {}, BitmapId {}, VMS_FORM_ID: {}", this.vmsCtlrNmbr, ii, formId, bitmapId, this.downloadFormId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            int fileNameSize = 11; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            int fileSize     = pForm.getImageData().length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String fileName = String.format("BID%04d.BMP", bitmapId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            eVmsFileSaveLocation saveLoc = eVmsFileSaveLocation.LOC_DOWNLOAD_PROG_IMAGE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VmsReqDataDownload dataDownload = new VmsReqDataDownload(this, saveLoc, fileName, pForm.getImageData()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return sendData(dataDownload.getByteBuffer(), 10, dataDownload.getOpCodeDesc()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (endDownload) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 폼이미지 정보가 모두 다운로드 되었으므로 스케쥴 정보를 다운로드 한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return downloadFormSchedule();  // Display Schedule Form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 제어기에 표출할 폼의 스케쥴 정보를 다운로드 한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadFormSchedule() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 도로공사 표준에 최대 10개의 스케쥴을 사용하도록 되어 있음. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int maxSchedule = VmsConstants.VMS_MIN_DOWNLOAD_FORMS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int formCnt = this.downloadData.getMaxSchedule(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (formCnt <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(" downloadScheduleForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        short[] formId = new short[maxSchedule]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte[] dispSec = new byte[maxSchedule]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int ii = 0; ii < maxSchedule; ii++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formId[ii] = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dispSec[ii] = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (this.downloadData.isDefault()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            formId[0] = (short)VmsConstants.DEFAULT_FORM_ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dispSec[0] = 4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int ii = 0; ii < formCnt && ii < maxSchedule; ii++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                formId[ii] = (short) this.downloadData.getUnits()[ii].getFormNo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dispSec[ii] = (byte)(this.downloadData.getUnits()[ii].getDisplaySec() & 0xFF); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VmsReqDownloadFormSchedule downloadFormSchedule = new VmsReqDownloadFormSchedule(this, formId, dispSec); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return sendData(downloadFormSchedule.getByteBuffer(), 10, downloadFormSchedule.getOpCodeDesc()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 스케쥴을 표출하도록 Blank 명령을 전송한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean downloadBlank() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VmsReqBlank reqBlank = new VmsReqBlank(this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return sendData(reqBlank.getByteBuffer(), 10, reqBlank.getOpCodeDesc()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |