shjung 11 months ago
parent
commit
8e68ce53dd

+ 36 - 30
src/main/java/com/sig/comm/server/xnet/server/process/protocol/SigMapData.java

@@ -29,10 +29,10 @@ public class SigMapData {
     public static final byte CODE_PED_GREEN = (byte)0x10;
     public static final byte CODE_PED_FLASH = (byte)0x20;
     public static final byte CODE_CAR_GREEN = (byte)0x01;
-    public static final byte CODE_PED_GINX  = (byte)0x00; /* 0b00000000 */
-    public static final byte CODE_PED_FINX  = (byte)0x01; /* 0b00000001 */
-    public static final byte CODE_CAR_GINX  = (byte)0x02; /* 0b00000010 */
-    public static final byte CODE_USER_INX  = (byte)0x03; /* 0b00000011 */
+    public static final int CODE_PED_GINX  = 0x00; /* 0b00000000 */
+    public static final int CODE_PED_FINX  = 0x01; /* 0b00000001 */
+    public static final int CODE_CAR_GINX  = 0x02; /* 0b00000010 */
+    public static final int CODE_USER_INX  = 0x03; /* 0b00000011 */
 
     /*
      * 2010 protocol
@@ -44,7 +44,7 @@ public class SigMapData {
     public static final byte MIN_VAR = (byte)0x01;
     public static final byte MAX_VAR = (byte)0x00;
 
-    public static final byte DELIMITER = (byte)0xFF;
+    public static final int DELIMITER = 0xFF;
 
 
     public SigMapInfo[] step; // signal map data - step1 ~ step32
@@ -100,24 +100,24 @@ public class SigMapData {
     public static int signalMapDecompress(byte[] compData, int start, int length, byte[] deCompData) {
         int dp = 0;
         int cop, cp, up;
-        int ep = length;
-        int sp = 77;
+        int end_src = start + length;
+        int sp = start + 77;
         int inx;
         int data;
 
         /* find the first delimiter 0xFF */
-        data = compData[sp];
-        if (data != DELIMITER || sp >= ep) {
-            sp = 0;
-            while (sp <= ep) {
-                data = compData[sp];
+        data = compData[sp] & 0xFF;
+        if (data != DELIMITER || sp >= end_src) {
+            sp = start;
+            while (sp <= end_src) {
+                data = compData[sp] & 0xFF;
                 if (data == DELIMITER) {
                     break;
                 }
                 sp++;
             }
-            data = compData[sp];
-            if (data != DELIMITER || sp >= ep) {
+            data = compData[sp] & 0xFF;
+            if (data != DELIMITER || sp >= end_src) {
                 return 0;
             }
         }
@@ -125,37 +125,42 @@ public class SigMapData {
         cop = cp = sp;
 
         /* find the second delimiter 0xFF to backward */
-        sp = ep;
+        sp = end_src;
         while (sp > cp) {
-            data = compData[sp];
+            data = compData[sp] & 0xFF;
             if (data == DELIMITER) {
                 break;
             }
             sp--;
         }
-        data = compData[sp];
+
+        data = compData[sp] & 0xFF;
         if (data != DELIMITER || sp <= cp) {
             return 0;
         }
 
         sp++;
         up = sp;
-        sp = 0;
+        sp = start;
+        int temp;
+        int bitCount;
         int inxCount = 0;
         int byteCount = 0;
-        while(sp < cop-1) {
-            for (int bitCount = 0; bitCount < 8; bitCount++) {
-                data = compData[sp];
-                if ((data & (0x01 << bitCount)) > 0) {
-                    inx = compData[cp];
-                    inx = (inx & (0x03 << inxCount) ) >> inxCount;
-                    switch(inx) {
+        while(sp < (cop-1)) {
+            for (bitCount = 0; bitCount < 8; bitCount++) {
+                data = compData[sp] & 0xFF;
+                temp = data & (0x0001 << bitCount);
+                if (temp > 0) {
+                    inx = compData[cp] & 0xFF;
+                    temp = (inx & (0x03 << inxCount) ) >> inxCount;
+                    switch(temp) {
                         case CODE_PED_GINX: deCompData[dp] = CODE_PED_GREEN; break;
                         case CODE_PED_FINX: deCompData[dp] = CODE_PED_FLASH; break;
                         case CODE_CAR_GINX: deCompData[dp] = CODE_CAR_GREEN; break;
                         case CODE_USER_INX:
-                            deCompData[dp] = compData[up++];
-                            if (deCompData[up] == 0x00) {
+                            deCompData[dp] = (byte)(compData[up] & 0xFF);
+                            up++;
+                            if ((deCompData[up] & 0xFF) == (byte)0x00) {
                                 return byteCount+1;
                             }
                             break;
@@ -168,14 +173,15 @@ public class SigMapData {
                     dp++;
                 }
                 else {
-                    deCompData[dp++] = (byte)0x00;
+                    deCompData[dp] = (byte)0x00;
+                    dp++;
                 }
                 if (dp >= MAXMAPDATASIZE) {
-                    return MAXMAPDATASIZE; /* PREVENT OVERRANGE */
+                    return MAXMAPDATASIZE; /* PREVENT OVER RANGE */
                 }
                 byteCount++;
             }
-            if (sp >= ep) {
+            if (sp >= end_src) {
                 break;
             }
             sp++;

+ 50 - 27
src/main/java/com/sig/comm/server/xnet/server/process/response/SigSignalMap.java

@@ -205,19 +205,19 @@ public class SigSignalMap implements SigCommResponse {
                 int planTp = (buffer[idx++] & 0xFF);    /* map 계획구분, 0:일반제, 1~5:시차제, 6:보행맵 */
                 int compSize = (buffer[idx++] & 0xFF);
 
-                byte[] compData = new byte[SigMapData.MAX_COMPRESS_DATA_SIZE];
-//                byte[] deCompData = new byte[SigMapData.MAX_DECOMPRESS_DATA_SIZE];
-                System.arraycopy(buffer, idx, compData, 0, compData.length);
+//                byte[] compData = new byte[SigMapData.MAX_COMPRESS_DATA_SIZE];
+                byte[] deCompData = new byte[SigMapData.MAX_DECOMPRESS_DATA_SIZE];
+//                System.arraycopy(buffer, idx, compData, 0, compData.length);
 
                 mapData.init();
 
                 if (lcType == SigMapData.ESIGMAP_LC_TYPE_2004) {
-                    continue;
-                    //res = SigMapData.signalMapDecompress(compData, idx, compSize, deCompData);
+                    log.info("INT_NO: {}, RING_NO: {}, PLAN_TP: {}", intNo, ringNo, planTp);
+                    res = SigMapData.signalMapDecompress(buffer, idx, compSize, deCompData);
                 }
                 else {
-                    log.info("INT_NO: {}, RING_NO: {}, PLAN_TP: {}", intNo, ringNo, planTp);
-                    res = SigMapData.signalMapDecompress2010(buffer, idx, compSize, mapData);
+                    continue;
+//                    res = SigMapData.signalMapDecompress2010(buffer, idx, compSize, mapData);
                 }
 
                 if (res == 0 && res == -999) {
@@ -237,6 +237,7 @@ public class SigSignalMap implements SigCommResponse {
                     }
                 }
 
+                int spIdx = 0;
                 for (int jj = 0; jj < SigMapData.MAX_SIGMAP_STEP; jj++) {
                     HashMap<String, Object> param = new HashMap<>();
 
@@ -246,26 +247,48 @@ public class SigSignalMap implements SigCommResponse {
                     param.put("PLAN_TP",    planTp);                    /*계획구분(0:일반제, 1:시차제, 2:시차제, 3:시차제, 4:시차제, 5:시차제, 6:보행맵) */
                     param.put("STEP_NO",    jj+1);                      /*스텝번호(1~32) */
 
-                    param.put("CAR1",   mapData.step[jj].code[ 0] & 0xFF);   /*차량등 1 (2004-LSU1) */
-                    param.put("PED1",   mapData.step[jj].code[ 1] & 0xFF);   /*보행등 1 (2004-LSU2) */
-                    param.put("CAR2",   mapData.step[jj].code[ 2] & 0xFF);
-                    param.put("PED2",   mapData.step[jj].code[ 3] & 0xFF);
-                    param.put("CAR3",   mapData.step[jj].code[ 4] & 0xFF);
-                    param.put("PED3",   mapData.step[jj].code[ 5] & 0xFF);
-                    param.put("CAR4",   mapData.step[jj].code[ 6] & 0xFF);
-                    param.put("PED4",   mapData.step[jj].code[ 7] & 0xFF);
-                    param.put("CAR5",   mapData.step[jj].code[ 8] & 0xFF);
-                    param.put("PED5",   mapData.step[jj].code[ 9] & 0xFF);
-                    param.put("CAR6",   mapData.step[jj].code[10] & 0xFF);
-                    param.put("PED6",   mapData.step[jj].code[11] & 0xFF);
-                    param.put("CAR7",   mapData.step[jj].code[12] & 0xFF);
-                    param.put("PED7",   mapData.step[jj].code[13] & 0xFF);
-                    param.put("CAR8",   mapData.step[jj].code[14] & 0xFF);   /*차량등 8 (2004-LSU15) */
-                    param.put("PED8",   mapData.step[jj].code[15] & 0xFF);   /*보행등 8 (2004-LSU16) */
-                    param.put("MIN_TM", mapData.step[jj].code[16] & 0xFF);   /*최소시간 */
-                    param.put("MAX_TM", mapData.step[jj].code[17] & 0xFF);   /*최대시간 */
-                    param.put("EOP",    mapData.step[jj].code[18] & 0xFF);   /*현시종료여부(1:종료) */
-
+                    if (lcType == SigMapData.ESIGMAP_LC_TYPE_2004) {
+                        param.put("CAR1",   deCompData[spIdx++] & 0xFF);   /*차량등 1 (2004-LSU1) */
+                        param.put("PED1",   deCompData[spIdx++] & 0xFF);   /*보행등 1 (2004-LSU2) */
+                        param.put("CAR2",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED2",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR3",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED3",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR4",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED4",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR5",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED5",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR6",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED6",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR7",   deCompData[spIdx++] & 0xFF);
+                        param.put("PED7",   deCompData[spIdx++] & 0xFF);
+                        param.put("CAR8",   deCompData[spIdx++] & 0xFF);   /*차량등 8 (2004-LSU15) */
+                        param.put("PED8",   deCompData[spIdx++] & 0xFF);   /*보행등 8 (2004-LSU16) */
+                        param.put("MIN_TM", deCompData[spIdx++] & 0xFF);   /*최소시간 */
+                        param.put("MAX_TM", deCompData[spIdx++] & 0xFF);   /*최대시간 */
+                        param.put("EOP",    deCompData[spIdx++] & 0xFF);   /*현시종료여부(1:종료) */
+                    }
+                    else {
+                        param.put("CAR1", mapData.step[jj].code[0] & 0xFF);   /*차량등 1 (2004-LSU1) */
+                        param.put("PED1", mapData.step[jj].code[1] & 0xFF);   /*보행등 1 (2004-LSU2) */
+                        param.put("CAR2", mapData.step[jj].code[2] & 0xFF);
+                        param.put("PED2", mapData.step[jj].code[3] & 0xFF);
+                        param.put("CAR3", mapData.step[jj].code[4] & 0xFF);
+                        param.put("PED3", mapData.step[jj].code[5] & 0xFF);
+                        param.put("CAR4", mapData.step[jj].code[6] & 0xFF);
+                        param.put("PED4", mapData.step[jj].code[7] & 0xFF);
+                        param.put("CAR5", mapData.step[jj].code[8] & 0xFF);
+                        param.put("PED5", mapData.step[jj].code[9] & 0xFF);
+                        param.put("CAR6", mapData.step[jj].code[10] & 0xFF);
+                        param.put("PED6", mapData.step[jj].code[11] & 0xFF);
+                        param.put("CAR7", mapData.step[jj].code[12] & 0xFF);
+                        param.put("PED7", mapData.step[jj].code[13] & 0xFF);
+                        param.put("CAR8", mapData.step[jj].code[14] & 0xFF);   /*차량등 8 (2004-LSU15) */
+                        param.put("PED8", mapData.step[jj].code[15] & 0xFF);   /*보행등 8 (2004-LSU16) */
+                        param.put("MIN_TM", mapData.step[jj].code[16] & 0xFF);   /*최소시간 */
+                        param.put("MAX_TM", mapData.step[jj].code[17] & 0xFF);   /*최대시간 */
+                        param.put("EOP", mapData.step[jj].code[18] & 0xFF);   /*현시종료여부(1:종료) */
+                    }
                     lists.add(param);
                 }
             }