shjung 2 年之前
父节点
当前提交
2cd98fea5d

+ 10 - 0
src/main/java/com/its/app/utils/SysUtils.java

@@ -1,5 +1,6 @@
 package com.its.app.utils;
 
+import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.text.SimpleDateFormat;
@@ -97,6 +98,15 @@ public final class SysUtils
 		return -1;
 	}
 
+	public static byte[] stringToByteArr(String text) {
+		//return text.getBytes(StandardCharsets.UTF_8);
+		try {
+			return text.getBytes("EUC_KR");
+		} catch (UnsupportedEncodingException e) {
+			return text.getBytes();
+		}
+	}
+
 	public static String byteArrayToString(byte[] data) {
 		StringBuilder sb = new StringBuilder(data.length);
 		for (int ii = 0; ii < data.length; ++ ii) {

+ 73 - 25
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -485,11 +485,11 @@ public class TbVmsCtlrDto implements Serializable {
         int forms = 0;
         int formCnt = this.formManager.count();
         if (formCnt == 0) {
-            log.info("downloadScheduleForm: VMS {}, Form Data Not Found.", this.vmsCtlrNmbr);
+            log.info("downloadForm: VMS {}, Form Data Not Found.", this.vmsCtlrNmbr);
             return true;
         }
         if (formCnt > this.maxPhaseNum) {
-            log.error("downloadScheduleForm: VMS {}, Form Count Over: {}/{} EA.", this.vmsCtlrNmbr, formCnt, this.maxPhaseNum);
+            log.error("downloadForm: VMS {}, Form Count Over: {}/{} EA.", this.vmsCtlrNmbr, formCnt, this.maxPhaseNum);
             formCnt = this.maxPhaseNum;
         }
 
@@ -497,13 +497,13 @@ public class TbVmsCtlrDto implements Serializable {
         for (int ii = 0; ii < formCnt; ii++) {
             VmsForm pForm = this.formManager.getItem(ii);
             if (!pForm.isSuccess()) {
-                log.error("VMS {}, SEQ {}, SUCCESS {}", this.vmsCtlrNmbr, ii, pForm.isSuccess());
+                log.error("downloadForm: VMS {}, SEQ {}, SUCCESS {}", this.vmsCtlrNmbr, ii, pForm.isSuccess());
                 continue;
             }
             Integer vmsFormId = pForm.getVmsFormId();
             TbVmsFormDto vmsForm = formService.find(vmsFormId);
             if (vmsForm == null) {
-                log.error("VMS {}, SEQ {}, FORM ID {} Not Found.", this.vmsCtlrNmbr, ii, vmsFormId);
+                log.error("downloadForm: VMS {}, SEQ {}, FORM ID {} Not Found.", this.vmsCtlrNmbr, ii, vmsFormId);
                 continue;
             }
 
@@ -517,7 +517,7 @@ public class TbVmsCtlrDto implements Serializable {
             units[forms].setBkClr(pForm.getVmsFormColrCd());
 
             VmsDownloadForm downloadForm = this.downloadFormMap.get(vmsFormId);
-            units[forms].setBitmapId((vmsFormId % 1000) + 1000);
+            //units[forms].setBitmapId((vmsFormId % 1000) + 1000);
             // 홍보폼이면서 신규폼이 아니면서 이전 다운로드 목록이 존재하는 경우에 다운로드 여부를 체크한다.
             if (vmsForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue() && !vmsForm.isNewForm() && downloadForm != null) {
                 if (downloadForm.isAlreadyDownload()) {
@@ -546,7 +546,7 @@ public class TbVmsCtlrDto implements Serializable {
         }
 
         for (int ii = 0; ii < forms; ii++) {
-            log.info("VMS {}, Form schedule({}), VMS_FORM_ID: {}, FormIdx: {}, FormId: {}, BitmapId: {}, IsDownload: {}",
+            log.info("downloadForm: VMS {}, Form schedule({}), VMS_FORM_ID: {}, FormIdx: {}, FormId: {}, BitmapId: {}, IsDownload: {}",
                     this.vmsCtlrNmbr, ii, units[ii].getVmsFormId(), units[ii].getFormIdx(), units[ii].getFormNo(), units[ii].getBitmapId(), units[ii].isDownload());
         }
 
@@ -587,7 +587,7 @@ public class TbVmsCtlrDto implements Serializable {
             return true;
         }
 
-        //formCnt = 1;
+        log.info("downloadDefaultFrom: VMS {}, Form {} EA.", this.vmsCtlrNmbr, formCnt);
         VmsFormDataDto formData = new VmsFormDataDto(0, formCnt);
         VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
         for (int ii = 0; ii < formCnt; ii++) {
@@ -595,27 +595,27 @@ public class TbVmsCtlrDto implements Serializable {
             List<VmsFormObject> objects = pForm.getObjects();
             VmsFormDto formDto = formData.addForm(units[ii].getVmsFormId(), units[ii].getDisplaySec(), units[ii].getDisplayType(), units[ii].getBkClr(), objects.size());
             for (int jj = 0; jj < objects.size(); jj++) {
-                VmsFormObject object = objects.get(jj);
+                VmsFormObject formObj = objects.get(jj);
 
-                int objSize = object.getObjectSize();
-                int blinking = object.getBlinking();
-                int posX = object.getPosX();
-                int posY = object.getPosY();
-                int bkClr = object.getBkColor();
+                int objSize = formObj.getObjectSize();
+                int blinking = formObj.getBlinking();
+                int posX = formObj.getPosX();
+                int posY = formObj.getPosY();
+                int bkClr = formObj.getBkColor();
 
                 VmsFormObj formObjDto;
                 if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
-                    int clrR = object.getFontClr().getRed();
-                    int clrG = object.getFontClr().getGreen();
-                    int clrB = object.getFontClr().getBlue();
-                    formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, object.getFontSize(), object.getFontNameCd(), object.getFontBold(), object.getTextData());
+                    int clrR = formObj.getFontClr().getRed();
+                    int clrG = formObj.getFontClr().getGreen();
+                    int clrB = formObj.getFontClr().getBlue();
+                    formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), formObj.getFontNameCd(), formObj.getFontBold(), formObj.getTextData());
                 }
                 else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
-                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
                 }
                 else {
-                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
-                    //formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), object.getImageData());
+                    //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+                    formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
                 }
                 formObjDto.calSize();
                 formDto.addObject(formObjDto);
@@ -640,6 +640,7 @@ public class TbVmsCtlrDto implements Serializable {
             return true;
         }
         int downloadCnt = this.downloadData.getDownloadCnt();
+        log.info("downloadAutoFixForm: VMS {}, Form {} EA, Download Count {} EA.", this.vmsCtlrNmbr, formCnt, downloadCnt);
         if (downloadCnt >= formCnt) {
             // 폼정보를 모두 다운로드 했기때문에 폼파일을 다운로드 해야 한다.
             this.downloadData.setDownloadCnt(0); // 폼이미지파일을 다운로드해야 하기때문에 다운로드 인덱스를 다시 0으로 리셋
@@ -650,11 +651,11 @@ public class TbVmsCtlrDto implements Serializable {
         // 폼아이디를 여기서 설정해 주어야 한다.
         VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
         int formId   = units[downloadCnt].getFormNo();
+        int downloadFormCnt = 1;
         int displaySec = 1;//units[downloadCnt].getDisplaySec();
         int displayType = units[downloadCnt].getDisplayType();
-        int bitmapId = 11;//units[downloadCnt].getBitmapId();
+        int bitmapId = units[downloadCnt].getBitmapId();
         int formIdx  = units[downloadCnt].getFormIdx();
-        int downloadFormCnt = 1;
         VmsForm pForm = this.formManager.getItem(formIdx);
         int objSize = 1;
         int blinking = pForm.getVmsFormDsplMthdCd();
@@ -669,6 +670,48 @@ public class TbVmsCtlrDto implements Serializable {
         formDto.addObject(formObjDto);
         formData.calFormCount();
 
+        log.info("downloadAutoFixForm: DownloadCnt: VMS {}, IDX {}, FormId {}, BitmapId {}, VMS_FORM_ID: {}", this.vmsCtlrNmbr, formCnt, formId, bitmapId, this.downloadFormId);
+
+//        VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
+//        int ii = downloadCnt;
+//        VmsForm pForm = this.formManager.getItem(units[ii].getFormIdx());
+//        List<VmsFormObject> objects = pForm.getObjects();
+//        VmsFormDto formDto = formData.addForm(units[ii].getVmsFormId(), units[ii].getDisplaySec(), units[ii].getDisplayType(), units[ii].getBkClr(), objects.size());
+//        for (int jj = 0; jj < objects.size(); jj++) {
+//            VmsFormObject formObj = objects.get(jj);
+//
+//            int objSize = formObj.getObjectSize();
+//            int blinking = formObj.getBlinking();
+//            int posX = formObj.getPosX();
+//            int posY = formObj.getPosY();
+//            int bkClr = formObj.getBkColor();
+//
+//            String fileName = String.format("C:\\DRIVE_E\\ANDONG_VMS_FTP\\FORM\\%d_%d_%d-%d-%d-%d-%d.bmp", this.vmsCtlrNmbr, ii, jj, posX, posY, formObj.getDsplWidth(), formObj.getDsplHeight());
+//
+//            VmsFormObj formObjDto;
+//            if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
+//                int clrR = formObj.getFontClr().getRed();
+//                int clrG = formObj.getFontClr().getGreen();
+//                int clrB = formObj.getFontClr().getBlue();
+//                int fontNameCd = formObj.getFontNameCd();
+//                formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), fontNameCd, formObj.getFontBold(), formObj.getTextData());
+//            }
+//            else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
+//                //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
+//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
+//            }
+//            else {
+//                //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
+//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
+//            }
+//            formObjDto.calSize();
+//            formDto.addObject(formObjDto);
+//        }
+//        formDto.calObjCount();
+//        formData.calFormCount();
+
         this.downloadData.setDownloadCnt(downloadCnt+1);
 
         VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(this, formData);
@@ -682,11 +725,12 @@ public class TbVmsCtlrDto implements Serializable {
     public boolean downloadFile() {
         int formCnt = this.downloadData.getMaxSchedule();
         if (formCnt <= 0) {
-            log.info(" downloadFile: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
+            log.info("downloadFile: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
             return true;
         }
 
         int downloadCnt = this.downloadData.getDownloadCnt();
+        log.info("downloadFile: VMS {}, Form {} EA, Download Count {} EA.", this.vmsCtlrNmbr, formCnt, downloadCnt);
         if (downloadCnt >= formCnt) {
             // 폼파일이(폼이미지파일) 모두 다운로드 되었으므로 스케쥴 정보를 다운로드 한다.
             return downloadFormSchedule();  // Display Schedule Form
@@ -701,7 +745,7 @@ public class TbVmsCtlrDto implements Serializable {
             int bitmapId = units[ii].getBitmapId();
             int formIdx  = units[ii].getFormIdx();
             VmsForm pForm = this.formManager.getItem(formIdx);
-            if (config.isCheckNewForm() && units[ii].isDownload()) {
+            if (config.isCheckNewForm() && !units[ii].isDownload()) {
                 // 이미 다운로드 했기 때문에 다시 다운로드 하지 않는다.
                 log.info("downloadFile: VMS {}, IDX {}, FormId {}, BitmapId {}, already download...", this.vmsCtlrNmbr, ii, formId, bitmapId);
                 continue;
@@ -730,7 +774,7 @@ public class TbVmsCtlrDto implements Serializable {
         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);
+            log.info("downloadScheduleForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
             return true;
         }
 
@@ -741,14 +785,17 @@ public class TbVmsCtlrDto implements Serializable {
             dispSec[ii] = 0;
         }
 
+        log.info("downloadFormSchedule: VMS {}, Schedule {} EA, Default Schedule {}.", this.vmsCtlrNmbr, maxSchedule, this.downloadData.isDefault());
         if (this.downloadData.isDefault()) {
             formId[0] = (short)VmsConstants.DEFAULT_FORM_ID;
             dispSec[0] = 4;
+            log.info("downloadFormSchedule: VMS {}, Schedule {} EA, Default Schedule {}.", this.vmsCtlrNmbr, maxSchedule, this.downloadData.isDefault());
         }
         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);
+                log.info("downloadFormSchedule: VMS {}, Schedule {} EA, FormId {}, DisplayTm {} .", this.vmsCtlrNmbr, maxSchedule, formId[ii], dispSec[ii]);
             }
         }
 
@@ -761,6 +808,7 @@ public class TbVmsCtlrDto implements Serializable {
      * @return
      */
     public boolean downloadBlank() {
+        log.info("downloadBlank: VMS {}.", this.vmsCtlrNmbr);
         VmsReqBlank reqBlank = new VmsReqBlank(this);
         return sendData(reqBlank.getByteBuffer(), 10, reqBlank.getOpCodeDesc());
     }

+ 37 - 0
src/main/java/com/its/vms/dto/TbVmsSymbLibDnldDto.java

@@ -0,0 +1,37 @@
+package com.its.vms.dto;
+
+import com.its.vms.entity.TbVmsSymbLibDnld;
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * VMS 심볼 제어기 다운로드 정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSymbLibDnldDto(VMS 심볼 제어기 다운로드 정보)")
+public class TbVmsSymbLibDnldDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long vmsCtlrNmbr;
+    private Integer dnldSymbLibNmbr;
+    private String dnldDt;
+    private Integer dnldCnt;
+    private Integer symbLibNmbr;
+    private String updtDt;
+
+    public TbVmsSymbLibDnld toEntity() {
+        return TbVmsSymbLibDnld.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .dnldSymbLibNmbr(this.dnldSymbLibNmbr)
+                .dnldDt(this.dnldDt)
+                .dnldCnt(this.dnldCnt)
+                .symbLibNmbr(this.symbLibNmbr)
+                .updtDt(this.updtDt)
+                .build();
+    }
+
+}

+ 41 - 0
src/main/java/com/its/vms/entity/TbVmsSymbLibDnld.java

@@ -0,0 +1,41 @@
+package com.its.vms.entity;
+
+import com.its.vms.dto.TbVmsSymbLibDnldDto;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * VMS 심볼 제어기 다운로드 정보 Entity Class
+ */
+@ApiModel("VMS 심볼 제어기 다운로드 정보")
+@Getter
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVmsSymbLibDnld implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long vmsCtlrNmbr;
+    private Integer dnldSymbLibNmbr;
+    private String dnldDt;
+    private Integer dnldCnt;
+    private Integer symbLibNmbr;
+    private String updtDt;
+
+    public TbVmsSymbLibDnldDto toDto() {
+        return TbVmsSymbLibDnldDto.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .dnldSymbLibNmbr(this.dnldSymbLibNmbr)
+                .dnldDt(this.dnldDt)
+                .dnldCnt(this.dnldCnt)
+                .symbLibNmbr(this.symbLibNmbr)
+                .updtDt(this.updtDt)
+                .build();
+    }
+
+}

+ 12 - 13
src/main/java/com/its/vms/service/VmsManageService.java

@@ -470,7 +470,7 @@ public class VmsManageService {
                         TbVmsScheduleDto schedule = vmsObj.getSchedule().getUnits().get(ii);
                         eVmsScheduleType scheduleFormType = eVmsScheduleType.getValue(schedule.getVmsSchFormType());
                         if (scheduleFormType == eVmsScheduleType.eSchTp_incident || //돌발
-                            scheduleFormType == eVmsScheduleType.eSchTp_gongsa ||   //공사/행사
+                            scheduleFormType == eVmsScheduleType.eSchTp_gongsa   || //공사/행사
                             scheduleFormType == eVmsScheduleType.eSchTp_deture      //우회도로
                         ) {
                             if (schedule.getEvent() != null && Objects.equals(schedule.getEvent().getVmsIfscId(), frstVmsIfscId)) {
@@ -658,6 +658,8 @@ public class VmsManageService {
                     TbVmsScheduleDto evehSchedule = schedule.clone();
                     vmsObj.getSchedule().add(evehSchedule);
                     break;
+                default:
+                    break;
             }
         });
         log.info("VmsManageService.loadVmsDsplSchedule: {} ms.", elapsed.milliSeconds());
@@ -789,8 +791,6 @@ public class VmsManageService {
             VmsSchedule scheObj = vmsObj.getSchedule();
             int downLoadForms = Math.min(vmsObj.getMaxPhaseNum(), scheObj.size());
             vmsObj.getControlMode().setMaxDisplayForm(downLoadForms);
-            //log.info("VmsManageService.makeVmsProvideForm: VMS {}, DownloadForms/Schedule/MaxPhase {}/{}/{} EA. FormDir {}, FtpDir {}",
-            //        ctlrNmbr, scheObj.size(), downLoadForms, scheObj.size(), vmsObj.getLocalFormDir(), vmsObj.getFtpFormDir());
 
             this.config.makeDirectory(vmsObj.getLocalFormDir(), "VMS " + vmsObj.getVmsCtlrNmbr() + " Directory.");
 
@@ -821,8 +821,6 @@ public class VmsManageService {
                             ctlrNmbr, schedule.getVmsFormId(), vmsForm.getVmsFormTypeCd());
                     continue;
                 }
-//                log.info("VmsManageService.makeVmsProvideForm: VMS {}, FORM {}, Schedule {}, ScheduleType {}, FormType {}.",
-//                        ctlrNmbr, vmsForm.getVmsFormId(), scheduleIdx, vmsSchFormType, vmsFormType);
 
                 if (isEVehIngForm) {
                     // 긴급차량 진행중 메시지 표출
@@ -941,13 +939,6 @@ public class VmsManageService {
                                     schedule.setFrstImgIfscId(schedule.getVmsIfscId());
                                 }
                                 break;
-//                            case  1: // 심볼(소통정보 시점 종점 사이 화살표)
-//                                if ("->".equals(obj.getVmsDsplTxt().trim())) {
-//                                    if (schedule.getVmsIfscId() == 0L) {
-//                                        continue; //하단에 표출할 정보제공구간이 없는 경우임
-//                                    }
-//                                }
-//                                break;
                             default: break;
                         }
                     } // (vmsFormType == eVmsFormType.eFormTp_figure)
@@ -1084,7 +1075,15 @@ public class VmsManageService {
                             break;
                         case 1:     // 심볼
                         case 2:     // 파일이미지
-                            // Do nothing
+                            TbVmsSymbLibDto tSymb = this.symbService.find(formObj.getImageId());
+                            if (tSymb == null) {
+                                log.error("VmsManageService.makeVmsProvideForm: VMS({}), FormId({}), Not Found Symbol, File Image Symbol {}.",
+                                        ctlrNmbr, schedule.getVmsFormId(), formObj.getImageId());
+                            }
+                            else {
+                                formObj.setImageData(tSymb.getImageData());
+                            }
+                            formObj.setImageId(formObj.getImageId());
                             break;
                         case 17:    // 1단,소통정보이미지1
                         case 27:    // 2단,소통정보이미지2

+ 1 - 0
src/main/java/com/its/vms/ui/SubUI.java

@@ -74,6 +74,7 @@ public abstract class SubUI {
         Font d2font = new Font("D2Coding", Font.PLAIN, 12);
         taLog.setFont(d2font);
 
+        txtPort.setVisible(false);
         SpinnerModel value = new SpinnerNumberModel(0, 0, 100, 1);
         spControl.setModel(value);
 

+ 1 - 3
src/main/java/com/its/vms/xnettcp/vms/VmsTcpCommServerInitializer.java

@@ -12,8 +12,6 @@ import com.its.vms.xnettcp.vms.handler.VmsServerPacketInboundHandler;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
-import io.netty.handler.logging.LogLevel;
-import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.timeout.IdleStateHandler;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -47,7 +45,7 @@ public class VmsTcpCommServerInitializer extends ChannelInitializer<Channel> {
                     TimeUnit.SECONDS);
 
             ChannelPipeline pipeline = channel.pipeline();
-            pipeline.addLast(new LoggingHandler(LogLevel.INFO));
+            //pipeline.addLast(new LoggingHandler(LogLevel.INFO));
             pipeline.addLast("vmsTcpIdleStateHandler", tcpIdleStateHandler);
             pipeline.addLast("vmsServerIdleStateHandler", new VmsServerIdleStateHandler(obj, this.dbmsDataProcess));   // packet idle state handler, event handler
             if (obj.getProtocolVer() == 0) {

+ 20 - 3
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java

@@ -79,6 +79,8 @@ public class TcpServerRecvDataProcess {
                 packet = new VmsDleFramePacket(resFramePacket.getPacket(), resFramePacket.getMsgLen());
             }
 
+            String opCodeValue = String.format("0x%02X", packet.getOpCode());
+
             VmsResponse response = null;
             eVmsOpCode opCode = eVmsOpCode.getValue(packet.getOpCode());
             switch(opCode) {
@@ -97,9 +99,24 @@ public class TcpServerRecvDataProcess {
                 case OP_VMS_DOWNLOAD_FORM:
                     response = new VmsResDownloadForm(vmsObj, packet);
                     break;
+                case OP_VMS_DOWNLOAD_FORM_SCHEDULE:
+                    response = new VmsResDownloadFormSchedule(vmsObj, packet);
+                    break;
                 case OP_VMS_BLANK:
                     response = new VmsResBlank(vmsObj, packet);
                     break;
+                case OP_VMS_STATUS_CONTROL:
+                    response = new VmsResStatusControl(vmsObj, packet);
+                    break;
+                case OP_VMS_DATA_DOWNLOAD:
+                    response = new VmsResDataDownload(vmsObj, packet);
+                    break;
+                case OP_VMS_FORM_DATA_DISPLAY:
+                    response = new VmsResFormDataDisplay(vmsObj, packet);
+                    break;
+                case OP_VMS_DATA_UPLOAD:
+                    response = new VmsResDataUpload(vmsObj, packet);
+                    break;
                 case OP_VMS_STOP_IMAGE_REQ:
                     response = new VmsResStopImage(vmsObj, packet);
                     break;
@@ -114,19 +131,19 @@ public class TcpServerRecvDataProcess {
                     break;
                 case OP_VMS_UPLOAD_FORM_SCHEDULE:
                     response = new VmsResUploadFormSchedule(vmsObj, packet);
+                    break;
                 default:
-                    log.warn("TcpServerRecvDataProcess.process: Unknown Op Code Packet: VMS {}, {}", vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", packet.getOpCode()));
                     break;
             }
 
             if (response != null) {
                 if (!response.process()) {
-                    log.error("TcpServerRecvDataProcess.process: response error. VMS {}, {}, will be closed.", vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", packet.getOpCode()));
+                    log.error("TcpServerRecvDataProcess.process: response error. VMS {}, {}, will be closed.", vmsObj.getVmsCtlrNmbr(), opCodeValue);
                     VmsServerIdleStateHandler.disconnectChannel(vmsObj, ctx.channel());
                 }
             }
             else {
-                log.error("TcpServerRecvDataProcess.process: Unknown Op Code Packet: VMS {}, {}, will be closed.", vmsObj.getVmsCtlrNmbr(), packet.getOpCode());
+                log.error("TcpServerRecvDataProcess.process: Unknown Op Code Packet: VMS {}, {}, will be closed.", vmsObj.getVmsCtlrNmbr(), opCodeValue);
                 VmsServerIdleStateHandler.disconnectChannel(vmsObj, ctx.channel());
             }
 

+ 3 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDataDownload.java

@@ -52,6 +52,9 @@ public class VmsResDataDownload implements VmsResponse {
         }
         log.info("{}", toString());
 
+        if (this.error == eVmsErrorCode.ERROR_NONE) {
+            this.vmsObj.downloadFile();
+        }
         return true;
     }
 

+ 8 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadForm.java

@@ -52,6 +52,14 @@ public class VmsResDownloadForm implements VmsResponse {
         }
         log.info("{}", toString());
 
+        if (this.error == eVmsErrorCode.ERROR_NONE) {
+            if (this.vmsObj.getDownloadData().isDefault()) {
+                this.vmsObj.downloadFile();
+            }
+            else {
+                this.vmsObj.downloadAutoFixForm();
+            }
+        }
         return true;
     }
 

+ 3 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadFormSchedule.java

@@ -52,6 +52,9 @@ public class VmsResDownloadFormSchedule implements VmsResponse {
         }
         log.info("{}", toString());
 
+        if (this.error == eVmsErrorCode.ERROR_NONE) {
+            this.vmsObj.downloadBlank();
+        }
         return true;
     }
 

+ 2 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjText.java

@@ -1,5 +1,6 @@
 package com.its.vms.xnettcp.vms.protocol.dto;
 
+import com.its.app.utils.SysUtils;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
 import lombok.Getter;
 import lombok.Setter;
@@ -35,7 +36,7 @@ public class VmsFormObjText extends VmsFormObj {
 
     @Override
     public void calSize() {
-        byte[] textArr = this.text.getBytes();
+        byte[] textArr = SysUtils.stringToByteArr(this.text);
         setSize(7 + textArr.length);
     }
 }

+ 0 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java

@@ -14,7 +14,6 @@ public enum eVmsOpCode {
     OP_VMS_POWER_MODULE_STATUS_REQ      (0x8C, "0x8C.전원 모듈 상태 요구"),     // 전원 모듈 상태를 검사 결과를 요청,         SERVER→VMS
     OP_VMS_DISPLAY_MODULE_STATUS_REQ    (0x8E, "0x8E.표출 모듈 상태 요구"),     // 표출 모듈 상태를 검사 결과를 요청,         SERVER→VMS
     OP_VMS_STOP_IMAGE_REQ               (0x90, "0x90.VMS 정지영상 요구"),       // 현재 표출되는 이미지 송신 요구,            SERVER→VMS
-    OP_VMS_PIXEL_IMAGE_REQ              (0x92, "0x92.VMS Pixel Image 요구"),    // VMS LED Pixel 상태요구                     SERVER→VMS
     OP_VMS_UPLOAD_CURRENT_DISPLAY_FORM  (0x94, "0x94.현재 표출폼 Upload"),      // Local 에서 표출 중인 폼 Upload 요구,       SERVER→VMS
     OP_VMS_DOWNLOAD_FORM_SCHEDULE       (0x96, "0x96.Download Schedule"),       // 계획된 Form Schedule 을 download,          SERVER→VMS
     OP_VMS_DISPLAY_DEFAULT_FORM         (0x98, "0x98.Display Default Form"),    // 디폴트 Form 표출 요구,                     SERVER→VMS

+ 2 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadForm.java

@@ -1,5 +1,6 @@
 package com.its.vms.xnettcp.vms.protocol.impl;
 
+import com.its.app.utils.SysUtils;
 import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsReqFramePacket;
@@ -80,7 +81,7 @@ public class VmsReqDownloadForm implements VmsReqFramePacket {
                     byteBuffer.put((byte)(txtObj.getFontKind() & 0xFF));        // 폰트 종류
                     byteBuffer.put((byte)(txtObj.getFontBold() & 0xFF));        // 폰트 굵기
                     byteBuffer.put((byte)(txtObj.getReserved() & 0xFF));        // 기타, Reserved, 0x00
-                    byteBuffer.put(txtObj.getText().getBytes());
+                    byteBuffer.put(SysUtils.stringToByteArr(txtObj.getText()));
                 }
                 else if (obj.getObjType() == eVmsFormObjectKind.OBJECT_BITMAP_ID.getValue()) {
                     VmsFormObjBitmapId idObj = (VmsFormObjBitmapId)obj;

+ 2 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFramePacket.java

@@ -140,7 +140,8 @@ public class VmsDleFramePacket implements VmsFramePacket {
         list.add(this.head.getDle());
         list.add(this.head.getStx());
         byte[] headArr = this.head.getBuffer();
-        for (byte hb: headArr) {
+        for (int ii = 2; ii < headArr.length; ii++) {
+            byte hb = headArr[ii];
             list.add(hb);
             if (hb == VmsProtocolConst.VMS_DLE) {
                 list.add(hb);

+ 1 - 1
src/main/resources/mybatis/mapper/VmsSymbMapper.xml

@@ -58,7 +58,7 @@
               group by vms_form_id, symb_lib_nmbr) b,
              (select symb_lib_nmbr, updt_dt
               from tb_vms_symb_lib
-              where symb_type in ('SBT0', 'SBT2', 'SBT4')) c
+              where symb_type in ('SBT2', 'SBT4')) c
         where a.vms_form_id = b.vms_form_id
           and b.symb_lib_nmbr = c.symb_lib_nmbr
         group by a.vms_ctlr_nmbr, b.symb_lib_nmbr

+ 47 - 0
src/test/java/com/its/app/VmsCommServerApplicationTests.java

@@ -1,10 +1,13 @@
 package com.its.app;
 
+import com.its.app.utils.SysUtils;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.junit.jupiter.api.Test;
 
+import java.io.UnsupportedEncodingException;
+
 @Slf4j
 //@SpringBootTest(classes = VmsCommServerApplication.class)
 public class VmsCommServerApplicationTests {
@@ -45,4 +48,48 @@ public class VmsCommServerApplicationTests {
 //        int arc1 = VmsDleFramePacket.getCRC16ARC(data, 2, data.length - 6);
 //        log.info("ARC: {}, {}", arc1, String.format("%X", arc1));
     }
+
+    @Test
+    void hangul() {
+        String str = "30km 이하 서행!";
+        //default charset 으로 인코딩된 바이트 배열
+        byte[] bytes = str.getBytes();
+        //인코딩된 바이트 출력
+
+        System.out.print("Default charset encoding: ");
+        for(int i=0;i<bytes.length;i++)
+            System.out.print(bytes[i]+" ");
+        System.out.println();
+
+        //default charset 으로 디코딩된 문자열 출력
+        String decoded = new String(bytes);
+        System.out.println(decoded);
+
+        System.out.println();
+        try {
+            //UTF-8로 인코딩된 바이트 배열
+            bytes = str.getBytes("UTF-8");
+            System.out.print("UTF-8 charset encoding: ");
+            for(int i=0;i<bytes.length;i++)
+                System.out.print(bytes[i]+" ");
+            System.out.println();
+            //이 바이트 배열을 default charset 으로 디코딩된 문자열 출력 : charset 이 다르므로 한글이 깨짐.
+            decoded = new String(bytes);
+            System.out.println(decoded);
+            //인코딩된 UTF-8로 디코딩되어 한글이 깨지지 않음.
+            decoded = new String(bytes,"UTF-8");
+            System.out.println(decoded);
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    void hangul2() {
+        String str = "30km 이하 서행!";
+        byte[] arr1 = str.getBytes();
+        byte[] arr2 = SysUtils.stringToByteArr(str);
+        log.error("{}, {}, {}", str.length(), arr1.length, arr2.length);
+    }
 }