|
@@ -16,6 +16,34 @@ public class SigMapData {
|
|
|
public static final int MAX_SIGMAP_LSU = 16; /* 최대 lcu 갯수 */
|
|
|
public static final int MAX_SIGMAP_STEP = 32; /* 최대 step 갯수 */
|
|
|
|
|
|
+ public static final int MAXMAPDATASIZE = 608;
|
|
|
+ public static final int MAX_VAR_CNT = 40;
|
|
|
+
|
|
|
+ public static final int SP_SIZE = 19;
|
|
|
+ public static final int SP_MIN = 16;
|
|
|
+ public static final int SP_MAX = 17;
|
|
|
+ public static final int SP_EOP = 18;
|
|
|
+
|
|
|
+ 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 */
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 2010 protocol
|
|
|
+ */
|
|
|
+ public static final int MAX_COLUM = 16; /* 16 LSU */
|
|
|
+ public static final int MAX_STEP = 32;
|
|
|
+ public static final byte MIN_EOP3SEC = (byte)0x03;
|
|
|
+ public static final byte MIN_3SEC = (byte)0x02;
|
|
|
+ public static final byte MIN_VAR = (byte)0x01;
|
|
|
+ public static final byte MAX_VAR = (byte)0x00;
|
|
|
+
|
|
|
+ public static final byte DELIMITER = (byte)0xFF;
|
|
|
+
|
|
|
|
|
|
private SigMapInfo[] step; // signal map data - step1 ~ step32
|
|
|
|
|
@@ -58,4 +86,200 @@ public class SigMapData {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ public static short gen16LRC(byte[] s, int size) {
|
|
|
+ int sLrc = 0;
|
|
|
+ for (int ii = 0; ii < size; ii++) {
|
|
|
+ sLrc += (ii + 1) * (s[ii] & 0xFF); // Ensure unsigned value
|
|
|
+ }
|
|
|
+
|
|
|
+ byte lrc0 = (byte) (sLrc / 256);
|
|
|
+ byte lrc1 = (byte) (sLrc % 256);
|
|
|
+
|
|
|
+ return (short) ((lrc0 << 8) | (lrc1 & 0xFF));
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 inx;
|
|
|
+ int data;
|
|
|
+
|
|
|
+ /* find the first delimiter 0xFF */
|
|
|
+ data = compData[sp];
|
|
|
+ if (data != DELIMITER || sp >= ep) {
|
|
|
+ sp = 0;
|
|
|
+ while (sp <= ep) {
|
|
|
+ data = compData[sp];
|
|
|
+ if (data == DELIMITER) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sp++;
|
|
|
+ }
|
|
|
+ data = compData[sp];
|
|
|
+ if (data != DELIMITER || sp >= ep) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sp++;
|
|
|
+ cop = cp = sp;
|
|
|
+
|
|
|
+ /* find the second delimiter 0xFF to backward */
|
|
|
+ sp = ep;
|
|
|
+ while (sp > cp) {
|
|
|
+ data = compData[sp];
|
|
|
+ if (data == DELIMITER) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sp--;
|
|
|
+ }
|
|
|
+ data = compData[sp];
|
|
|
+ if (data != DELIMITER || sp <= cp) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ sp++;
|
|
|
+ up = sp;
|
|
|
+ sp = 0;
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ 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) {
|
|
|
+ return byteCount+1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ inxCount += 2;
|
|
|
+ if ((inxCount % 8) == 0) {
|
|
|
+ inxCount = 0;
|
|
|
+ cp++;
|
|
|
+ }
|
|
|
+ dp++;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ deCompData[dp++] = (byte)0x00;
|
|
|
+ }
|
|
|
+ if (dp >= MAXMAPDATASIZE) {
|
|
|
+ return MAXMAPDATASIZE; /* PREVENT OVERRANGE */
|
|
|
+ }
|
|
|
+ byteCount++;
|
|
|
+ }
|
|
|
+ if (sp >= ep) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sp++;
|
|
|
+ }
|
|
|
+ return byteCount + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static int signalMapDecompress2010(byte[] compData, int start, int length, byte[] deCompData) {
|
|
|
+ int ep = length;
|
|
|
+ int sp = 0;
|
|
|
+ int cnt = 0;
|
|
|
+ int tCnt = 0;
|
|
|
+ int data;
|
|
|
+ int value;
|
|
|
+ int dp = 0;
|
|
|
+ byte lsu;
|
|
|
+
|
|
|
+ data = compData[sp];
|
|
|
+ while ((sp < ep) && (data > 0)) {
|
|
|
+ /* LSU 코드 값이 없으면 while 문이 종료됨 */
|
|
|
+ lsu = (byte)(data & 0xE0);
|
|
|
+ if (lsu == (byte)0xE0) {
|
|
|
+ cnt = (data & 0x1F) * 256 + compData[sp+1];
|
|
|
+ sp++;
|
|
|
+ sp++;
|
|
|
+ }
|
|
|
+ else if (lsu == (byte)0xC0) {
|
|
|
+ cnt = (data & 0x1F);
|
|
|
+ sp++;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cnt = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = compData[sp];
|
|
|
+ if ((data & 0xE0) == 0xC0){
|
|
|
+ value = 0x00; /* 00코드가 생략되었는지 확인 */
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ value = data;
|
|
|
+ sp++;
|
|
|
+ }
|
|
|
+ /* baseStep 구조체에 저장하기(LSU 값만 저장함) */
|
|
|
+ for (int ii = 0; ii < cnt; ii++, tCnt++) {
|
|
|
+ dp = (tCnt % MAX_STEP) * SP_SIZE;
|
|
|
+ deCompData[dp + (tCnt/MAX_STEP)] = (byte)value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ data = compData[sp++];
|
|
|
+ if (data > 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int varAttr, attr;
|
|
|
+ varAttr = attr = sp;
|
|
|
+ while (varAttr < ep && compData[varAttr++] != 0x00) {
|
|
|
+ ; /*3초아닌 스텝시간 영역으로 이동*/
|
|
|
+ }
|
|
|
+ if (varAttr >= ep) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int stepIdx;
|
|
|
+ for (int step = 0; step < MAX_STEP; step++) {
|
|
|
+ if ((step > 0) && (step % 4 != 0)) {
|
|
|
+ attr++;
|
|
|
+ if (compData[attr] == 0x00) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ value = (((compData[attr]) >> ((step%4)*2)) & 0x03);
|
|
|
+ stepIdx = step*SP_SIZE;
|
|
|
+ switch(value)
|
|
|
+ {
|
|
|
+ case MIN_EOP3SEC:
|
|
|
+ deCompData[stepIdx+SP_MIN] = 3;
|
|
|
+ deCompData[stepIdx+SP_EOP] = 1;
|
|
|
+ break; /*3초인 EOP 스텝인 경우 */
|
|
|
+ case MIN_3SEC:
|
|
|
+ deCompData[stepIdx+SP_MIN] = 3;
|
|
|
+ break;
|
|
|
+ case MAX_VAR:
|
|
|
+ deCompData[stepIdx+SP_MAX] = compData[varAttr++];
|
|
|
+ if (deCompData[stepIdx+SP_MAX] == (byte) 0x01) {
|
|
|
+ if ((compData[varAttr] & 0x80) > 0) {
|
|
|
+ deCompData[stepIdx+SP_EOP] = 1;
|
|
|
+ }
|
|
|
+ deCompData[stepIdx+SP_MIN] = (byte)(compData[varAttr++] & (byte) 0x7F);
|
|
|
+ deCompData[stepIdx+SP_MAX] = compData[varAttr++];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MIN_VAR:
|
|
|
+ deCompData[stepIdx+SP_MIN] = (byte)(compData[varAttr] & (byte) 0x7F);
|
|
|
+ if ((compData[varAttr++] & 0x80) > 0) {
|
|
|
+ deCompData[stepIdx+SP_EOP] = 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return MAXMAPDATASIZE;
|
|
|
+ }
|
|
|
}
|