package gmt.stddecoder;

import gmt.stddecoder.vo.*;
import gmt.stddecoder.type.GmtSTDType;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import gmt.common.util.GmtUtils;
import gmt.stddecoder.STDDecoder;

public class STDDecoder {
	
	public STDDecoder() {
		
	}
	
	public Object parse7x(String data) {
		StdVO stdVO = new StdVO();
		
		try {
			if(data.length() > 0 && data.substring(0, 1).equals("$")) {

				if (data.substring(0,3).equals("$82")) {
					stdVO = parseLTEM(data);
					return stdVO;
				}

				if (data.substring(0,3).equals("$92")) {
					stdVO = parseDMFHF(data);
					return stdVO;
				}

				if (data.substring(0,3).equals("$90")) {
					stdVO = parseVPASS(data);
					return stdVO;
				}
				
				if (data.substring(0,3).equals("$17") || data.substring(0,3).equals("$19")) {
					stdVO = parseVHF(data);
					return stdVO;
				}
				if(data.substring(3, 4).equals("5")) {
					if(data.substring(39, 41).equals("15")) {
						SARVO sarVO = new SARVO();

						sarVO.setTargetSensor(data.substring(1, 3).trim());
						sarVO.setPacketID(data.substring(3, 4).trim());
						sarVO.setShipID(data.substring(4, 16).trim());
						sarVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						sarVO.setAreaID(data.substring(30, 39).trim());
						sarVO.setMsgType(data.substring(39, 41).trim());
						sarVO.setDataLength(data.substring(41, 44).trim());

						sarVO.setAltitude(Integer.parseInt(data.substring(44, 48).trim()));
						sarVO.setPosAcc(Integer.parseInt(data.substring(48, 49).trim()));
						sarVO.setLonInt(Integer.parseInt(data.substring(49, 59).trim()));
						sarVO.setLatInt(Integer.parseInt(data.substring(59, 68).trim()));
						sarVO.setLon(Double.parseDouble(data.substring(49, 59).trim())/600000);
						sarVO.setLat(Double.parseDouble(data.substring(59, 68).trim())/600000);
						sarVO.setSOG(Double.parseDouble(data.substring(68, 72).trim()));
						sarVO.setCOG(Double.parseDouble(data.substring(72, 76).trim())/10);
						sarVO.setNaviStatus(Integer.parseInt(data.substring(76, 78).trim()));

						if (sarVO.getAltitude() == -9999)      return null;
						if (sarVO.getPosAcc()   == -9999)      return null;
						if (sarVO.getLonInt()   == -999999999) return null;
						if (sarVO.getLatInt()   == -999999999) return null;
						if (sarVO.getSOG() == -9999) 		   return null;
						if (sarVO.getCOG() == -9999) 		   return null;
						if (sarVO.getNaviStatus() == -9999)    return null;

						if (sarVO.getAltitude() > 4095) 	   return null;
						if (sarVO.getLonInt()   > 108600000)   return null;
						if (sarVO.getLatInt()   > 54600000)    return null;
						if (sarVO.getSOG()      > 1023) 	   return null;

						stdVO.setStdType(GmtSTDType.prSAR);
						stdVO.setSarVO(sarVO);
						return stdVO;

					}else if(data.substring(39, 41).equals("19")) {
						AtoNVO atoNVO = new AtoNVO();

						atoNVO.setTargetSensor(data.substring(1, 3));
						atoNVO.setPacketID(data.substring(3, 4));
						atoNVO.setShipID(data.substring(4, 16).trim());
						atoNVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						atoNVO.setAreaID(data.substring(30, 39));
						atoNVO.setMsgType(data.substring(39, 41));
						atoNVO.setDataLength(data.substring(41, 44));

						atoNVO.setMode(Integer.parseInt(data.substring(44, 45).trim()));
						atoNVO.setAToNType(Integer.parseInt(data.substring(45, 47).trim()));
						atoNVO.setName(data.substring(47, 81).trim());
						atoNVO.setPosAcc(Integer.parseInt(data.substring(81, 82).trim()));
						atoNVO.setLonInt(Integer.parseInt(data.substring(82, 92).trim()));
						atoNVO.setLatInt(Integer.parseInt(data.substring(92, 101).trim()));
						atoNVO.setLon(Double.parseDouble(data.substring(82, 92).trim())/600000);
						atoNVO.setLat(Double.parseDouble(data.substring(92, 101).trim())/600000);
						atoNVO.setDimA(Integer.parseInt(data.substring(101, 104).trim()));
						atoNVO.setDimB(Integer.parseInt(data.substring(104, 107).trim()));
						atoNVO.setDimC(Integer.parseInt(data.substring(107, 110).trim()));
						atoNVO.setDimD(Integer.parseInt(data.substring(110, 113).trim()));
						atoNVO.setEPFD(Integer.parseInt(data.substring(113, 115).trim()));
						atoNVO.setOffPos(Integer.parseInt(data.substring(115, 116).trim()));
						atoNVO.setReserved(data.substring(116, 119).trim());
						atoNVO.setRaim(Integer.parseInt(data.substring(119, 120).trim()));

						if (atoNVO.getMode() == -9999)     return null;
						if (atoNVO.getAToNType() == -9999) return null;
						if (atoNVO.getPosAcc() == -9999)   return null;
						if (atoNVO.getLonInt() == -999999999)   return null;
						if (atoNVO.getLatInt() == -999999999)   return null;
						if (atoNVO.getDimA() == -9999) 	   return null;
						if (atoNVO.getDimB() == -9999) 	   return null;
						if (atoNVO.getDimC() == -9999) 	   return null;
						if (atoNVO.getDimD() == -9999)	   return null;
						if (atoNVO.getEPFD() == -9999)	   return null;
						if (atoNVO.getOffPos() == -9999)   return null;
						if (atoNVO.getRaim() == -9999) 	   return null;

						if (atoNVO.getMode()   != 0 && atoNVO.getMode()   != 1) return null;
						if (atoNVO.getPosAcc() != 0 && atoNVO.getPosAcc() != 1) return null;
						if (atoNVO.getRaim()   != 0 && atoNVO.getRaim()   != 1) return null;

						if (atoNVO.getLonInt() > 108600000) return null;
						if (atoNVO.getLatInt() > 54600000)  return null;

						stdVO.setStdType(GmtSTDType.prAToN);
						stdVO.setAtoNVO(atoNVO);
						return stdVO;

					}else {
						DynamicVO dynamicVO = new DynamicVO();

						dynamicVO.setTargetSensor(data.substring(1, 3).trim());
						dynamicVO.setPacketID(data.substring(3, 4).trim());
						dynamicVO.setShipID(data.substring(4, 16).trim());
						dynamicVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						dynamicVO.setAreaID(data.substring(30, 39).trim());
						dynamicVO.setMsgType(data.substring(39, 41).trim());
						dynamicVO.setDataLength(data.substring(41, 44).trim());

						dynamicVO.setMode(Integer.parseInt(data.substring(44, 45).trim()));
						dynamicVO.setRot(Integer.parseInt(data.substring(45, 49).trim()));
						dynamicVO.setSog(Integer.parseInt(data.substring(49, 53).trim()));
						dynamicVO.setPosacc(Integer.parseInt(data.substring(53, 54).trim()));
						dynamicVO.setLonInt(Integer.parseInt(data.substring(54, 64).trim()));
						dynamicVO.setLatInt(Integer.parseInt(data.substring(64, 73).trim()));
						dynamicVO.setLongitude(Double.parseDouble(data.substring(54, 64).trim())/600000);
						dynamicVO.setLatitude(Double.parseDouble(data.substring(64, 73).trim())/600000);
						dynamicVO.setCog(Integer.parseInt(data.substring(73, 77).trim()));
						dynamicVO.setHeading(Integer.parseInt(data.substring(77, 80).trim()));

						if (dynamicVO.getMode() == -9999)    return null;
						if (dynamicVO.getRot() == -9999)     return null;
						if (dynamicVO.getSog() == -9999)     return null;
						if (dynamicVO.getPosacc() == -9999)  return null;
						if (dynamicVO.getLonInt() == -9999)  return null;
						if (dynamicVO.getLatInt() == -9999)  return null;
						if (dynamicVO.getCog() == -9999)     return null;
						if (dynamicVO.getHeading() == -9999) return null;

						if (dynamicVO.getSog() > 1023)         return null;
						if (dynamicVO.getLonInt() > 108600000) return null;
						if (dynamicVO.getLatInt() > 54600000)  return null;

						if (dynamicVO.getHeading() > 359 && dynamicVO.getHeading() != 511) return null;

						if (dynamicVO.getSog() != 0) dynamicVO.setSog(dynamicVO.getSog()/10);
						if (dynamicVO.getCog() != 0) dynamicVO.setCog(dynamicVO.getCog()/10);

						stdVO.setStdType(GmtSTDType.prDynamic);
						stdVO.setDynamicVO(dynamicVO);
						return stdVO;
					}
				}
				//Packet ID : 6
				if(data.substring(3, 4).equals("6")) {
					if(data.substring(39, 41).equals("12")) {
						StaticVO staticVO = new StaticVO();

						staticVO.setTargetSensor(data.substring(1, 3).trim());
						staticVO.setPacketID(data.substring(3, 4).trim());
						staticVO.setShipID(data.substring(4, 16).trim());
						staticVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						staticVO.setAreaID(data.substring(30, 39).trim());
						staticVO.setMsgType(data.substring(39, 41).trim());
						staticVO.setDataLength(data.substring(41, 44).trim());

						staticVO.setImo(data.substring(44, 53).trim());
						staticVO.setName(data.substring(53, 83).trim());
						staticVO.setCallsign(data.substring(83, 90).trim());
						staticVO.setVmsType(data.substring(90, 94).trim());
						staticVO.setDimA(Integer.parseInt(data.substring(94, 97).trim()));
						staticVO.setDimB(Integer.parseInt(data.substring(97, 100).trim()));
						staticVO.setDimC(Integer.parseInt(data.substring(100, 103).trim()));
						staticVO.setDimD(Integer.parseInt(data.substring(103, 106).trim()));
						staticVO.setDraught(Double.parseDouble(data.substring(106, 110).trim()));

						if (staticVO.getDimA() == -9999)    return null;
						if (staticVO.getDimB() == -9999)    return null;
						if (staticVO.getDimC() == -9999)    return null;
						if (staticVO.getDimD() == -9999)    return null;
						if (staticVO.getDraught() == -9999) return null;

						if (staticVO.getDraught() != 0) staticVO.setDraught(staticVO.getDraught()/10);

						stdVO.setStdType(GmtSTDType.prStatic);
						stdVO.setStaticVO(staticVO);
						return stdVO;
					}
					else {
						stdVO.setStdType(GmtSTDType.prFail);
						return stdVO;
					}
				}
			}
			return null;
		}catch (Exception e) {
			System.out.println("parse Error!! : " + e.getMessage());
			throw e;
//			return null;
		}
	}

	public Object parse7xExt(String data) {
		StdVO mainVO = new StdVO();

		String parseData = data.substring(44, data.length()-3);
		int DataLength = parseData.length();

		try {

			if(data.length() > 0 && data.substring(0, 1).equals("$")) {
				//Packet ID : 5
				if (data.substring(0,3).equals("$90")) {
					mainVO = parseVPASS(data);
					return mainVO;
				}

				if (data.substring(0,3).equals("$17") || data.substring(0,3).equals("$19")) {
					mainVO = parseVHF(data);
					return mainVO;
				}
				if(data.substring(3, 4).equals("5")) {
					if(data.substring(39, 41).equals("15")) {
						if (DataLength < 78) {
							return null;
						}

						SARVO sarVO = new SARVO();

						sarVO.setTargetSensor(data.substring(1, 3));
						sarVO.setPacketID(data.substring(3, 4));
						sarVO.setShipID(data.substring(4, 16).trim());
						sarVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						sarVO.setAreaID(data.substring(30, 39));
						sarVO.setMsgType(data.substring(39, 41));
						sarVO.setDataLength(data.substring(41, 44));

						sarVO.setAltitude(Integer.parseInt(data.substring(44, 48).trim()));
						sarVO.setPosAcc(Integer.parseInt(data.substring(48, 49).trim()));
						sarVO.setLonInt(Integer.parseInt(data.substring(49, 59).trim()));
						sarVO.setLatInt(Integer.parseInt(data.substring(59, 68).trim()));
						sarVO.setLon(Double.parseDouble(data.substring(49, 59).trim())/600000);
						sarVO.setLat(Double.parseDouble(data.substring(59, 68).trim())/600000);
						sarVO.setSOG(Double.parseDouble(data.substring(68, 72).trim()));
						sarVO.setCOG(Double.parseDouble(data.substring(72, 76).trim())/10);
						sarVO.setNaviStatus(Integer.parseInt(data.substring(76, 78).trim()));
						sarVO.setCommState(data.substring(78,79).trim());
						sarVO.setSyncState(data.substring(79,80).trim());
						sarVO.setSlotTimeOut(data.substring(80,81).trim());
						sarVO.setSubMessage(data.substring(81,86).trim());
						sarVO.setSlotInc(data.substring(86,91).trim());
						sarVO.setNumberOffSlot(data.substring(91,92).trim());
						sarVO.setSlotOffSet(data.substring(92,97).trim());
						sarVO.setKeepFlag(data.substring(97,98).trim());
						sarVO.setAltitudeSesor(Integer.parseInt(data.substring(98,99).trim()));
						sarVO.setDte(Integer.parseInt(data.substring(99,100).trim()));
						sarVO.setModeFlag(Integer.parseInt(data.substring(100,101).trim()));
						sarVO.setRaim(Integer.parseInt(data.substring(101,102).trim()));
						sarVO.setIsRepeat(Integer.parseInt(data.substring(102,103).trim()));
						sarVO.setBsUTCStr(data.substring(103,117).trim());
						sarVO.setTimeStamp(Integer.parseInt(data.substring(117,119).trim()));
						sarVO.setmSec(Integer.parseInt(data.substring(119,122).trim()));
						sarVO.setBsUTC(str2DateTime(sarVO.getBsUTCStr(), false));

						if (sarVO.getAltitude()      == -9999) return null;
						if (sarVO.getPosAcc()        == -9999)  return null;
						if (sarVO.getLonInt()        == -999999999) return null;
						if (sarVO.getLatInt()        == -999999999) return null;
						if (sarVO.getSOG()           == -9999) return null;
						if (sarVO.getCOG() 	         == -9999) return null;
						if (sarVO.getNaviStatus()    == -9999) return null;
						if (sarVO.getAltitudeSesor() == -9999) return null;
						if (sarVO.getDte() 			 == -9999) return null;
						if (sarVO.getRaim() 		 == -9999) return null;
						if (sarVO.getIsRepeat() 	 == -9999) return null;
						if (sarVO.getTimeStamp() 	 == -9999) return null;
						if (sarVO.getmSec() 		 == -9999) return null;

						if (sarVO.getAltitude()  > 4095)      return null;
						if (sarVO.getLonInt()    > 108600000) return null;
						if (sarVO.getLatInt()    > 54600000)  return null;
						if (sarVO.getSOG()       > 1023)      return null;
						if (sarVO.getTimeStamp() > 63)        return null;
						if (sarVO.getmSec()      > 999)       return null;

						if (sarVO.getAltitudeSesor() != 0 && sarVO.getAltitudeSesor() != 1) return null;
						if (sarVO.getDte()           != 0 && sarVO.getDte() 	 	  != 1) return null;
						if (sarVO.getModeFlag() 	 != 0 && sarVO.getModeFlag() 	  != 1) return null;
						if (sarVO.getRaim() 		 != 0 && sarVO.getRaim() 		  != 1) return null;

						if (sarVO.getIsRepeat() 	 != 0 && sarVO.getIsRepeat() 		  != 1 &&
								sarVO.getIsRepeat()      != 2 && sarVO.getIsRepeat()          !=3 ) return null;

						if (sarVO.getCOG() != 0) sarVO.setCOG(sarVO.getCOG()/10);

						sarVO.setDateTime(str2DateTime(data.substring(16, 30).trim()+ sarVO.getmSec(), true));

						mainVO.setStdType(GmtSTDType.prSAR);
						mainVO.setSarVO(sarVO);
						return mainVO;

					}else if(data.substring(39, 41).equals("19")) {

						if (DataLength < 100) {
							return null;
						}

						AtoNVO atoNVO = new AtoNVO();

						atoNVO.setTargetSensor(data.substring(1, 3).trim());
						atoNVO.setPacketID(data.substring(3, 4).trim());
						atoNVO.setShipID(data.substring(4, 16).trim());
						atoNVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						atoNVO.setAreaID(data.substring(30, 39).trim());
						atoNVO.setMsgType(data.substring(39, 41).trim());
						atoNVO.setDataLength(data.substring(41, 44).trim());

						atoNVO.setMode(Integer.parseInt(data.substring(44, 45).trim()));
						atoNVO.setAToNType(Integer.parseInt(data.substring(45, 47).trim()));
						atoNVO.setName(data.substring(47, 81).trim());
						atoNVO.setPosAcc(Integer.parseInt(data.substring(81, 82).trim()));
						atoNVO.setLonInt(Integer.parseInt(data.substring(82, 92).trim()));
						atoNVO.setLatInt(Integer.parseInt(data.substring(92, 101).trim()));
						atoNVO.setLon(Double.parseDouble(data.substring(82, 92).trim())/600000);
						atoNVO.setLat(Double.parseDouble(data.substring(92, 101).trim())/600000);
						atoNVO.setDimA(Integer.parseInt(data.substring(101, 104).trim()));
						atoNVO.setDimB(Integer.parseInt(data.substring(104, 107).trim()));
						atoNVO.setDimC(Integer.parseInt(data.substring(107, 110).trim()));
						atoNVO.setDimD(Integer.parseInt(data.substring(110, 113).trim()));
						atoNVO.setEPFD(Integer.parseInt(data.substring(113, 115).trim()));
						atoNVO.setOffPos(Integer.parseInt(data.substring(115, 116).trim()));
						atoNVO.setReserved(data.substring(116, 119).trim());
						atoNVO.setRaim(Integer.parseInt(data.substring(119, 120).trim()));
						atoNVO.setaToNStatus(Integer.parseInt(data.substring(120, 123).trim()));
						atoNVO.setVirtualFlag(Integer.parseInt(data.substring(123, 124).trim()));
						atoNVO.setIsRepeat(Integer.parseInt(data.substring(124, 125).trim()));
						atoNVO.setBsUTCStr(data.substring(125, 139).trim());
						atoNVO.setTimeStamp(Integer.parseInt(data.substring(139, 141).trim()));
						atoNVO.setmSec(Integer.parseInt(data.substring(141, 144).trim()));

						if (atoNVO.getMode() == -9999)     return null;
						if (atoNVO.getAToNType() == -9999) return null;
						if (atoNVO.getPosAcc() == -9999)   return null;
						if (atoNVO.getLonInt() == -999999999)   return null;
						if (atoNVO.getLatInt() == -999999999)   return null;
						if (atoNVO.getDimA() == -9999) 	   return null;
						if (atoNVO.getDimB() == -9999) 	   return null;
						if (atoNVO.getDimC() == -9999) 	   return null;
						if (atoNVO.getDimD() == -9999)	   return null;
						if (atoNVO.getEPFD() == -9999)	   return null;
						if (atoNVO.getOffPos() == -9999)   return null;
						if (atoNVO.getRaim() == -9999) 	   return null;
						if (atoNVO.getaToNStatus() == -9999) return null;
						if (atoNVO.getVirtualFlag() == -9999) return null;
						if (atoNVO.getIsRepeat() == -9999) return null;
						if (atoNVO.getTimeStamp() == -9999) return null;
						if (atoNVO.getmSec() == -9999) return null;

						if (atoNVO.getLonInt()    > 108600000) return null;
						if (atoNVO.getLatInt()    > 54600000)  return null;
						if (atoNVO.getTimeStamp() > 63) 	   return null;
						if (atoNVO.getTimeStamp() > 999) 	   return null;

						if (atoNVO.getMode()   		  != 0 && atoNVO.getMode()  	    != 1) return null;
						if (atoNVO.getPosAcc() 		  != 0 && atoNVO.getPosAcc() 		!= 1) return null;
						if (atoNVO.getRaim()   		  != 0 && atoNVO.getRaim()   		!= 1) return null;
						if (atoNVO.getVirtualFlag()   != 0 && atoNVO.getVirtualFlag()   != 1) return null;
						if (atoNVO.getIsRepeat()      != 0 && atoNVO.getIsRepeat()      != 1 &&
								atoNVO.getIsRepeat()      != 2 && atoNVO.getIsRepeat()      != 3) return null;

						atoNVO.setDateTime(str2DateTime(data.substring(16, 30).trim() + String.valueOf(atoNVO.getmSec()), true));

						mainVO.setStdType(GmtSTDType.prAToN);
						mainVO.setAtoNVO(atoNVO);
						return mainVO;

					}else {
						if (DataLength < 86) {
							return null;
						}

						DynamicVO dynamicVO = new DynamicVO();

						dynamicVO.setTargetSensor(data.substring(1, 3).trim());
						dynamicVO.setPacketID(data.substring(3, 4).trim());
						dynamicVO.setShipID(data.substring(4, 16).trim());
						dynamicVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
						dynamicVO.setAreaID(data.substring(30, 39).trim());
						dynamicVO.setMsgType(data.substring(39, 41).trim());
						dynamicVO.setDataLength(data.substring(41, 44).trim());

						dynamicVO.setMode(Integer.parseInt(data.substring(44, 45)));
						dynamicVO.setRot(Integer.parseInt(data.substring(45, 49).trim()));
						dynamicVO.setSog(Integer.parseInt(data.substring(49, 53).trim()));
						dynamicVO.setPosacc(Integer.parseInt(data.substring(53, 54)));
						dynamicVO.setLongitude(Double.parseDouble(data.substring(54, 64).trim())/600000);
						dynamicVO.setLatitude(Double.parseDouble(data.substring(64, 73).trim())/600000);
						dynamicVO.setLonInt(Integer.parseInt(data.substring(54, 64).trim()));
						dynamicVO.setLatInt(Integer.parseInt(data.substring(64, 73).trim()));
						dynamicVO.setCog(Integer.parseInt(data.substring(73, 77).trim()));
						dynamicVO.setHeading(Integer.parseInt(data.substring(77, 80).trim()));
						dynamicVO.setCommState(data.substring(80, 81).trim());
						dynamicVO.setSyncState(data.substring(81, 82).trim());
						dynamicVO.setSlotTimeOut(data.substring(82, 83).trim());
						dynamicVO.setSubMessage(data.substring(83, 88).trim());
						dynamicVO.setSlotInc(data.substring(88, 93).trim());
						dynamicVO.setNumberOfSlot(data.substring(93, 94).trim());
						dynamicVO.setSlotOffSet(data.substring(94, 99).trim());
						dynamicVO.setKeepFlag(data.substring(99, 100).trim());
						dynamicVO.setNaviStatus(Integer.parseInt(data.substring(100, 102).trim()));
						dynamicVO.setSpecialManoeuve(Integer.parseInt(data.substring(102, 103).trim()));
						dynamicVO.setClassBUnit(data.substring(103, 104).trim());
						dynamicVO.setClassBDisplay(data.substring(104, 105).trim());
						dynamicVO.setClassBBand(data.substring(105, 106).trim());
						dynamicVO.setClassBMsg22(data.substring(106, 107).trim());
						dynamicVO.setClassBDSC(data.substring(107, 108).trim());
						dynamicVO.setModeFlag(Integer.parseInt(data.substring(108, 109).trim()));
						dynamicVO.setRaim(Integer.parseInt(data.substring(109, 110).trim()));
						dynamicVO.setIsRepeat(Integer.parseInt(data.substring(110, 111).trim()));
						dynamicVO.setbSUTCStr(data.substring(111, 125).trim());
						dynamicVO.setbSUTC(str2DateTime(dynamicVO.getbSUTCStr(),false));
						dynamicVO.setTimeStamp(Integer.parseInt(data.substring(125, 127).trim()));
						dynamicVO.setmSec(Integer.parseInt(data.substring(127, 130).trim()));

						if (dynamicVO.getMode() 		   == -9999) return null;
						if (dynamicVO.getRot() 			   == -9999) return null;
						if (dynamicVO.getSog() 			   == -9999) return null;
						if (dynamicVO.getPosacc() 		   == -9999) return null;
						if (dynamicVO.getLonInt() 		   == -999999999)  return null;
						if (dynamicVO.getLatInt() 		   == -999999999)  return null;
						if (dynamicVO.getCog() 			   == -9999) return null;
						if (dynamicVO.getHeading() 		   == -9999) return null;
						if (dynamicVO.getNaviStatus()      == -9999) return null;
						if (dynamicVO.getSpecialManoeuve() == -9999) return null;
						if (dynamicVO.getRaim()			   == -9999) return null;
						if (dynamicVO.getIsRepeat() 	   == -9999) return null;
						if (dynamicVO.getTimeStamp() 	   == -9999) return null;
						if (dynamicVO.getmSec() 		   == -9999) return null;

						if (dynamicVO.getSog() > 1023)         return null;
						if (dynamicVO.getLonInt() > 108600000) return null;
						if (dynamicVO.getLatInt() > 54600000)  return null;
						if (dynamicVO.getTimeStamp() > 63)     return null;
						if (dynamicVO.getmSec() > 999)         return null;

						if (dynamicVO.getHeading() > 359 && dynamicVO.getHeading() != 511) return null;

						if (dynamicVO.getModeFlag()   != 0 && dynamicVO.getModeFlag() != 1) return null;
						if (dynamicVO.getRaim()       != 0 && dynamicVO.getRaim()     != 1) return null;
						if (dynamicVO.getIsRepeat()   != 0 && dynamicVO.getIsRepeat() != 1 &&
								dynamicVO.getIsRepeat()   != 2 && dynamicVO.getIsRepeat() != 3) return null;

						if (dynamicVO.getSog() != 0) dynamicVO.setSog(dynamicVO.getSog()/10);
						if (dynamicVO.getCog() != 0) dynamicVO.setCog(dynamicVO.getCog()/10);

						dynamicVO.setDateTime(str2DateTime(data.substring(16, 30).trim()+ dynamicVO.getmSec(), true));

						mainVO.setStdType(GmtSTDType.prDynamic);
						mainVO.setDynamicVO(dynamicVO);
						return mainVO;

					}
				}
				//Packet ID : 6
				if(data.substring(3, 4).equals("6")) {
					if (DataLength < 108) {
						return 0;
					}

					StaticVO staticVO = new StaticVO();

					staticVO.setTargetSensor(data.substring(1, 3).trim());
					staticVO.setPacketID(data.substring(3, 4).trim());
					staticVO.setShipID(data.substring(4, 16).trim());
					staticVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
					staticVO.setAreaID(data.substring(30, 39).trim());
					staticVO.setMsgType(data.substring(39, 41).trim());
					staticVO.setDataLength(data.substring(41, 44).trim());

					staticVO.setImo(data.substring(44, 53).trim());
					staticVO.setName(data.substring(53, 83).trim());
					staticVO.setCallsign(data.substring(83, 90).trim());
					staticVO.setVmsType(data.substring(90, 94).trim());
					staticVO.setDimA(Integer.parseInt(data.substring(94, 97).trim()));
					staticVO.setDimB(Integer.parseInt(data.substring(97, 100).trim()));
					staticVO.setDimC(Integer.parseInt(data.substring(100, 103).trim()));
					staticVO.setDimD(Integer.parseInt(data.substring(103, 106).trim()));
					staticVO.setDraught(Double.parseDouble(data.substring(106, 110).trim()));
					staticVO.setEpfd(Integer.parseInt(data.substring(110, 112).trim()));
					staticVO.setEtaStr(data.substring(112, 120).trim());
					staticVO.setDestination(data.substring(120, 140).trim());
					staticVO.setDte(Integer.parseInt(data.substring(140, 141).trim()));
					staticVO.setRaim(Integer.parseInt(data.substring(141, 142).trim()));
					staticVO.setPartNo(Integer.parseInt(data.substring(142, 143).trim()));
					staticVO.setVender(data.substring(143, 150).trim());
					staticVO.setIsRepeat(Integer.parseInt(data.substring(150, 151).trim()));
					staticVO.setAisVer(Integer.parseInt(data.substring(151, 152).trim()));

					if (staticVO.getDimA()     == -9999) return null;
					if (staticVO.getDimB() 	   == -9999) return null;
					if (staticVO.getDimC() 	   == -9999) return null;
					if (staticVO.getDimD()     == -9999) return null;
					if (staticVO.getDraught()  == -9999) return null;
					if (staticVO.getEpfd()	   == -9999) return null;
					if (staticVO.getDte() 	   == -9999) return null;
					if (staticVO.getRaim()     == -9999) return null;
					if (staticVO.getPartNo()   == -9999) return null;
					if (staticVO.getIsRepeat() == -9999) return null;
					if (staticVO.getAisVer()   == -9999) return null;

					if (staticVO.getDte()  != 0 && staticVO.getDte()  != 1) return null;
					if (staticVO.getRaim() != 0 && staticVO.getRaim() != 1) return null;
					if (staticVO.getIsRepeat() != 0 && staticVO.getIsRepeat() != 1 &&
							staticVO.getIsRepeat() != 2 && staticVO.getIsRepeat() != 3) return null;

					if (staticVO.getDraught() != 0) staticVO.setDraught(staticVO.getDraught() /10);

					mainVO.setStdType(GmtSTDType.prStatic);
					mainVO.setStaticVO(staticVO);
					return mainVO;
				}
			}
			return null;
		}catch (Exception e) {
			System.out.println("parse Error!! : " + e.getMessage());
			return null;
		}
	}

	private StdVO parseVPASS(String data) {
		StdVO mainVO = new StdVO();

		Double LonInt, LatInt;
		Double Lon, Lat;
		String DtStr;

		if (data.substring(3,4).equals("5")) {
			VPassDynamicVO vpassDynamicVO = new VPassDynamicVO();

			vpassDynamicVO.setTargetSensor(data.substring(1, 3).trim());
			vpassDynamicVO.setPacketID(data.substring(3, 4).trim());
			vpassDynamicVO.setShipID(data.substring(4, 16).trim());
			vpassDynamicVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			vpassDynamicVO.setAreaID(data.substring(30, 39).trim());
			vpassDynamicVO.setMsgType(data.substring(39, 41).trim());
			vpassDynamicVO.setDataLength(data.substring(41, 44).trim());

			String strData = data.substring(44);
			String[] vparseList = strData.split("\\|");

			if (vparseList.length > 18) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			vpassDynamicVO.setGps(Integer.parseInt(vparseList[0].trim()));
			vpassDynamicVO.setOutPort(Integer.parseInt(vparseList[1].trim()));
			vpassDynamicVO.setBattery(Integer.parseInt(vparseList[2].trim()));
			vpassDynamicVO.setSos(Integer.parseInt(vparseList[3].trim()));
			vpassDynamicVO.setSn(Integer.parseInt(vparseList[4].trim()));
			vpassDynamicVO.setWe(Integer.parseInt(vparseList[5].trim()));
			vpassDynamicVO.setInPort(Integer.parseInt(vparseList[6].trim()));
			vpassDynamicVO.setInOutStatus(Integer.parseInt(vparseList[7].trim()));
			vpassDynamicVO.setBatterycapa(Integer.parseInt(vparseList[8].trim()));
			LonInt = Double.parseDouble(vparseList[9].trim());
			LatInt = Double.parseDouble(vparseList[10].trim());
			vpassDynamicVO.setLonInt(Integer.parseInt(vparseList[9].trim()));
			vpassDynamicVO.setLatInt(Integer.parseInt(vparseList[10].trim()));

			vpassDynamicVO.setSog(Integer.parseInt(vparseList[11].trim()));
			vpassDynamicVO.setCog(Integer.parseInt(vparseList[12].trim()));

			DtStr = vparseList[13].trim();

			vpassDynamicVO.setDtStr(DtStr);
			vpassDynamicVO.setDtHH(GmtUtils.strToIntDef(DtStr.substring(0, 2).trim(),24));
			vpassDynamicVO.setDtNN(GmtUtils.strToIntDef(DtStr.substring(2, 4).trim(),60));
			vpassDynamicVO.setDtSS(GmtUtils.strToIntDef(DtStr.substring(4, 6).trim(),60));
			vpassDynamicVO.setSosType(Integer.parseInt(vparseList[14].trim()));
			vpassDynamicVO.setAccType(Integer.parseInt(vparseList[15].trim()));
			vpassDynamicVO.setCompany(Integer.parseInt(vparseList[16].trim()));
			vpassDynamicVO.setSeq(Integer.parseInt(vparseList[17].substring(0, vparseList[17].length()-3).trim()));

			if (vpassDynamicVO.getGps() == -9999) 		  return null;
			if (vpassDynamicVO.getOutPort() == -9999) 	  return null;
			if (vpassDynamicVO.getBattery() == -9999) 	  return null;
			if (vpassDynamicVO.getSos() == -9999) 		  return null;
			if (vpassDynamicVO.getInPort() == -9999) 	  return null;
			if (vpassDynamicVO.getInOutStatus() == -9999) return null;
			if (vpassDynamicVO.getBatterycapa() == -9999) return null;
			if (vpassDynamicVO.getSog() == -9999) 		  return null;
			if (vpassDynamicVO.getCog() == -9999) 		  return null;
			if (vpassDynamicVO.getSosType() == -9999) 	  return null;
			if (vpassDynamicVO.getAccType() == -9999)	  return null;
			if (vpassDynamicVO.getCompany() == -9999)	  return null;
			if (vpassDynamicVO.getSeq() == -9999)		  return null;
			if (vpassDynamicVO.getLonInt() == -9999)	  return null;
			if (vpassDynamicVO.getLatInt() == -9999)	  return null;

			if (vpassDynamicVO.getGps() 	!= 0 && vpassDynamicVO.getGps() 	!= 1) return null;
			if (vpassDynamicVO.getOutPort() != 0 && vpassDynamicVO.getOutPort() != 1) return null;
			if (vpassDynamicVO.getBattery() != 0 && vpassDynamicVO.getBattery() != 1) return null;
			if (vpassDynamicVO.getSos() 	!= 0 && vpassDynamicVO.getSos() 	!= 1) return null;
			if (vpassDynamicVO.getSn() 		!= 0 && vpassDynamicVO.getSn() 		!= 1) return null;
			if (vpassDynamicVO.getWe() 		!= 0 && vpassDynamicVO.getWe() 		!= 1) return null;
			if (vpassDynamicVO.getInPort()  != 0 && vpassDynamicVO.getInPort()  != 1) return null;
			if (vpassDynamicVO.getInOutStatus() != 0 && vpassDynamicVO.getInOutStatus() != 1) return null;

			if (vpassDynamicVO.getBatterycapa() > 100) return null;

			if (vpassDynamicVO.getDtHH() >= 24) return null;
			if (vpassDynamicVO.getDtNN() >= 60) return null;
			if (vpassDynamicVO.getDtSS() >= 60) return null;


			vpassDynamicVO.setLongitude(LonInt/600000);
			vpassDynamicVO.setLatitude(LatInt/600000);

			mainVO.setStdType(GmtSTDType.prVPassDynamic);
			mainVO.setVPassDynamicVO(vpassDynamicVO);
			return mainVO;
		}
		//V-PASS Packet ID : 6
		else if (data.charAt(3) == '6') {
			VPassStaticVO vpassStaticVO = new VPassStaticVO();

			vpassStaticVO.setTargetSensor(data.substring(1, 3).trim());
			vpassStaticVO.setPacketID(data.substring(3, 4).trim());
			vpassStaticVO.setShipID(data.substring(4, 16).trim());
			vpassStaticVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			vpassStaticVO.setAreaID(data.substring(30, 39).trim());
			vpassStaticVO.setMsgType(data.substring(39, 41).trim());
			vpassStaticVO.setDataLength(data.substring(41, 44).trim());

			String strData = data.substring(44);
			String[] vparseList = strData.split("\\|");

			if (vparseList.length > 5) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			vpassStaticVO.setShipNo(vparseList[0].trim());
			vpassStaticVO.setShipName(vparseList[1].trim());
			vpassStaticVO.setLength(Double.parseDouble(vparseList[2].trim()));
			vpassStaticVO.setWidth(Double.parseDouble(vparseList[3].trim()));
			vpassStaticVO.setWeight(Double.parseDouble(vparseList[4].substring(0, vparseList[4].length()-3).trim()));

			if (vpassStaticVO.getLength() == -9999) return null;
			if (vpassStaticVO.getWidth()  == -9999) return null;
			if (vpassStaticVO.getWeight() == -9999) return null;


			mainVO.setStdType(GmtSTDType.prVPassStatic);
			mainVO.setVPassStaticVO(vpassStaticVO);
			return mainVO;
		}

		mainVO.setStdType(GmtSTDType.prFail);
		return mainVO;
	}


	private StdVO parseVHF(String data) {
		StdVO mainVO = new StdVO();

		String shipID, areaID;
		Double lat, lon;

		if (data.substring(3,4).equals("5")) {
			SHDynamicVO shDynamicVO = new SHDynamicVO();

			shDynamicVO.setTargetSensor(data.substring(1, 3).trim());
			shDynamicVO.setPacketID(data.substring(3, 4).trim());
			shipID = data.substring(4,16).trim();
			areaID = data.substring(30,39).trim();

			if (data.substring(1,3).equals( "17")) {
				shipID = shipID + areaID;
			}

			shDynamicVO.setShipID(shipID);
			shDynamicVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			shDynamicVO.setAreaID(areaID);
			shDynamicVO.setMsgType(data.substring(39, 41));
			shDynamicVO.setDataLength(data.substring(41, 44));

			String strData = data.substring(44);
			String[] vparseList = strData.split("\\|");

			if (vparseList.length > 7) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			lon = Double.parseDouble(vparseList[1])/600000;
			lat = Double.parseDouble(vparseList[2])/600000;

			shDynamicVO.setGubun(Integer.parseInt(vparseList[0]));
			shDynamicVO.setLonInt(Integer.parseInt(vparseList[1]));
			shDynamicVO.setLatInt(Integer.parseInt(vparseList[2]));
			shDynamicVO.setSog(Double.parseDouble(vparseList[3]));
			shDynamicVO.setCog(Double.parseDouble(vparseList[4]));

			if (shDynamicVO.getGubun() != 0 && shDynamicVO.getGubun() != 1 &&
				shDynamicVO.getGubun() != 2) return null;
			if (shDynamicVO.getLonInt() > 108600000) return null;
			if (shDynamicVO.getLatInt() > 54600000)  return null;
			if (shDynamicVO.getLonInt() < 0) 		 return null;
			if (shDynamicVO.getLatInt() < 0)  		 return null;
			if (shDynamicVO.getSog()    > 1023)      return null;
			if (shDynamicVO.getSog()    < 0)     	 return null;
			if (shDynamicVO.getCog()    > 3600)      return null;
			if (shDynamicVO.getCog()    < 0)      	 return null;

			shDynamicVO.setLongitude(lon);
			shDynamicVO.setLatitude(lat);

			if (shDynamicVO.getSog() != 0) shDynamicVO.setSog(shDynamicVO.getSog()/10);
			if (shDynamicVO.getCog() != 0) shDynamicVO.setCog(shDynamicVO.getCog()/10);

			shDynamicVO.setDtStr(vparseList[5]);

			shDynamicVO.setDtHH(GmtUtils.strToIntDef(shDynamicVO.getDtStr().substring(0,2).trim(),24));
			shDynamicVO.setDtNN(GmtUtils.strToIntDef(shDynamicVO.getDtStr().substring(2,4).trim(),60));
			shDynamicVO.setDtSS(GmtUtils.strToIntDef(shDynamicVO.getDtStr().substring(4,6).trim(),60));

			shDynamicVO.setMmsi(vparseList[6].substring(0, vparseList[6].length()-3));

			mainVO.setStdType(GmtSTDType.prSHDynamic);
			mainVO.setSHDynamicVO(shDynamicVO);
			return mainVO;
		}
		else if (data.charAt(3) == '6') {
			SHStaticVO shStaticVO = new SHStaticVO();

			shipID = data.substring(4,16).trim();
			areaID = data.substring(30,39).trim();

			if (data.substring(1,3).equals( "17")) {
				shipID = shipID + areaID;
			}

			shStaticVO.setTargetSensor(data.substring(1, 3));
			shStaticVO.setPacketID(data.substring(3, 4));
			shStaticVO.setShipID(shipID);
			shStaticVO.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			shStaticVO.setAreaID(areaID);
			shStaticVO.setMsgType(data.substring(39, 41));
			shStaticVO.setDataLength(data.substring(41, 44));

			String strData = data.substring(44);
			String[] vparseList = strData.split("\\|");

			if (vparseList.length > 10) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			shStaticVO.setShipNo(vparseList[0]);
			shStaticVO.setShipName(vparseList[1]);
			shStaticVO.setCallSign(vparseList[2]);
			shStaticVO.setGubun(Integer.parseInt(vparseList[3]));
			shStaticVO.setCommBSID(vparseList[4]);
			shStaticVO.setLength(Double.parseDouble(vparseList[5]));
			shStaticVO.setWidth(Double.parseDouble(vparseList[6]));
			shStaticVO.setTon(Double.parseDouble(vparseList[7]));
			shStaticVO.setMmsi(vparseList[8]);
			shStaticVO.setShipType(vparseList[9].substring(0, vparseList[9].length()-3));

			if (shStaticVO.getGubun() != 0 && shStaticVO.getGubun() != 1 && shStaticVO.getGubun() != 2) return null;
			if (shStaticVO.getLength() == -9999) return null;
			if (shStaticVO.getWidth()  == -9999) return null;
			if (shStaticVO.getTon()    == -9999) return null;

			mainVO.setStdType(GmtSTDType.prSHStatic);
			mainVO.setSHStaticVO(shStaticVO);
			return mainVO;
		}

		mainVO.setStdType(GmtSTDType.prFail);
		return mainVO;
	}

	public StdVO parseDMFHF(String data) {
		StdVO mainVO = new StdVO();
		if (data.substring(3,4).equals("4")) {
			DMFHFDistressVO vo = new DMFHFDistressVO();

			vo.setTargetSensor(data.substring(1, 3).trim());
			vo.setPacketID(data.substring(3, 4).trim());
			vo.setShipID(data.substring(4, 16).trim());
			vo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			vo.setAreaID(data.substring(30, 39).trim());
			vo.setMsgType(data.substring(39, 41).trim());
			vo.setDataLength(data.substring(41, 44).trim());

			String[] dataList = data.substring(44, data.length()).split("\\|");

			if (dataList.length > 13) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			// 재난종류 추가
			int distress_kind = Integer.parseInt(dataList[1].trim());

			int longitude = Integer.parseInt(dataList[6].trim());
			if (Math.abs(longitude) > 181*600000) return null;

			int latitude = Integer.parseInt(dataList[7].trim());
			if (Math.abs(latitude) > 91*600000) return null;

			int sog = Integer.parseInt(dataList[8].trim());
			if (sog > 100*10 && sog != 1023) return null;

			int cog = Integer.parseInt(dataList[9].trim());
			if (cog > 360*10 && cog != 4095) return null;

			int battery_status = Integer.parseInt(dataList[10].trim());
			if (battery_status < 0 || battery_status > 3) return null;

			String temp = dataList[11].trim();
			String battery = temp.substring(0, temp.indexOf("*"));
			int battery_level = Integer.parseInt(battery);
			if (battery_level < 0 || (battery_level > 50 && battery_level != 63)) return null;

			int dsast_src = Integer.parseInt(dataList[12].trim());

			vo.setDstrss_knd(distress_kind);
			vo.setFshrbt_no(dataList[2].trim());
			vo.setShip_nm(dataList[3].trim());
			vo.setClsgn(dataList[4].trim());
			vo.setTn(Double.parseDouble(dataList[5].trim()));
			vo.setLo(latitude);
			vo.setLa(longitude);
			vo.setSog(sog);
			vo.setCog(cog);
			vo.setBtry_sttus(battery_status);
			vo.setBtry_level(battery_level);
			vo.setDsast_src(dsast_src);

			mainVO.setStdType(GmtSTDType.prDMFHFDistress);
			mainVO.setDMFHFDistressVO(vo);
			return mainVO;

		} else if (data.substring(3,4).equals("5")) {
			DMFHFDynamicVO dvo = new DMFHFDynamicVO();

			dvo.setTargetSensor(data.substring(1, 3).trim());
			dvo.setPacketID(data.substring(3, 4).trim());
			dvo.setSlot_no(Integer.parseInt(data.substring(4, 16).trim()));
			dvo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			dvo.setAreaID(data.substring(30, 39).trim());
			dvo.setMsgType(data.substring(39, 41).trim());
			dvo.setDataLength(data.substring(41, 44).trim());

			String[] dataList = data.substring(45, data.length()).split("\\|");

			if (dataList.length > 8) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			int longitude = Integer.parseInt(dataList[0].trim());
			if (Math.abs(longitude) > 181*600000) return null;

			int latitude = Integer.parseInt(dataList[1].trim());
			if (Math.abs(latitude) > 91*600000) return null;

			int cog = 511;
			int sog = 16383;

			switch (dvo.getMsgType()) {
				case "12":
					cog = Integer.parseInt(dataList[2].trim());
					if ((cog < 0) || (cog > 359 && cog != 511)) return null;

					sog = Integer.parseInt(dataList[3].trim());
					if ((sog < 0) || (sog > 9999 && sog != 16383)) return null;

					break;

				default:
					break;
			}


			int[] sArray = {0,1,9};

			int ale = Integer.parseInt(dataList[4].trim());
			boolean hasALE = IntStream.of(sArray).anyMatch(i->i == ale);
			if (!hasALE) return null;

			int battery_status = Integer.parseInt(dataList[5].trim());
			boolean hasBattery_status = IntStream.of(sArray).anyMatch(i->i == battery_status);
			if (!hasBattery_status) return null;

//			int battery_level = Integer.parseInt(dataList[7].trim());
//			if (battery_level < 0 || (battery_level > 50 && battery_level != 63)) return null;

			String temp = dataList[6].trim();
			String broadcastID = temp.substring(0, temp.indexOf("*"));
			int last_received_brodcast_id = Integer.parseInt(broadcastID);
			if (last_received_brodcast_id < 0 || (last_received_brodcast_id > 99 && last_received_brodcast_id != 255)) return null;

			dvo.setLo(longitude);
			dvo.setLa(latitude);
			dvo.setSog(sog);
			dvo.setCog(cog);
			dvo.setAle(ale);
			dvo.setBtry_sttus(battery_status);
			dvo.setLast_rcv_brdcst_id(last_received_brodcast_id);

			mainVO.setStdType(GmtSTDType.prDMFHFDynamic);
			mainVO.setDMFHFDynamicVO(dvo);
			return mainVO;
		} else if (data.substring(3,4).equals("6")) {
			DMFHFStaticVO svo = new DMFHFStaticVO();

			svo.setTargetSensor(data.substring(1, 3).trim());
			svo.setPacketID(data.substring(3, 4).trim());
			svo.setShipID(data.substring(4, 16).trim());
			svo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			svo.setAreaID(data.substring(30, 39).trim());
			svo.setMsgType(data.substring(39, 41).trim());
			svo.setDataLength(data.substring(41, 44).trim());



			String[] dataList = data.substring(44, data.length()).split("\\|");

			if (dataList.length > 5) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			svo.setFshrbt_no(dataList[0].trim());
			svo.setShip_nm(dataList[1].trim());
			svo.setClsgn(dataList[2].trim());

			String temp = dataList[3].trim();
			String tonnage = temp.substring(0, temp.indexOf("*"));
			svo.setTn(Double.parseDouble(tonnage));

			mainVO.setStdType(GmtSTDType.prDMFHFStatic);
			mainVO.setDMFHFStaticVO(svo);
			return mainVO;
		}

		mainVO.setStdType(GmtSTDType.prFail);
		return mainVO;
	}

	public StdVO parseLTEM(String data) {
		StdVO mainVO = new StdVO();

		if (data.substring(3,4).equals("4")) {
			LTEMSosVO svo = new LTEMSosVO();

			svo.setTargetSensor(data.substring(1, 3).trim());
			svo.setPacketID(data.substring(3, 4).trim());

			if ("".equals(data.substring(30, 39).trim())) {
				svo.setShipID(data.substring(4, 16).trim());	//Area ID가 공백인 경우는 Ship ID는 MMSI
			} else {
				svo.setShipID(data.substring(4, 16).trim() + data.substring(30, 39).trim());
			}

			svo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			svo.setMsgType(data.substring(39, 41).trim());
			svo.setDataLength(data.substring(41, 44).trim());

			String[] dataList = data.substring(44, data.length()).split("\\|");

			if (dataList.length != 12) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			int longitude = Integer.parseInt(dataList[5].trim());
			if (Math.abs(longitude) > 181*600000) return null;

			int latitude = Integer.parseInt(dataList[6].trim());
			if (Math.abs(latitude) > 91*600000) return null;

			int sog = Integer.parseInt(dataList[7].trim());
			if (Math.abs(sog) > 1023) return null;

			int cog = Integer.parseInt(dataList[8].trim());
			if (Math.abs(cog) > 3600) return null;

			svo.setAlarm_cd("0100");
			svo.setAlarm_id(dataList[1].trim());
			svo.setShip_mrn(dataList[2].trim());
			svo.setSituation_cd(Integer.parseInt(dataList[3].trim()));
			svo.setSend_cd(Integer.parseInt(dataList[4].trim()));
			svo.setLo(longitude);
			svo.setLa(latitude);
			svo.setSog(sog);
			svo.setCog(cog);
			svo.setGps_sttus(Integer.parseInt(dataList[9].trim()));

			mainVO.setStdType(GmtSTDType.prLTEMSos);
			mainVO.setLTEMSosVO(svo);
			return mainVO;
		} else if (data.substring(3,4).equals("5")) {
			LTEMDynamicVO dvo = new LTEMDynamicVO();
			dvo.setRaw(data);
			dvo.setTargetSensor(data.substring(1, 3).trim());
			dvo.setPacketID(data.substring(3, 4).trim());

			if ("".equals(data.substring(30, 39).trim())) {
				dvo.setShipID(data.substring(4, 16).trim());	//Area ID가 공백인 경우는 Ship ID는 MMSI
			} else {
				dvo.setShipID(data.substring(4, 16).trim() + data.substring(30, 39).trim());
			}


			try{
				dvo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			}catch(Exception e){
				e.printStackTrace();
				throw e;
			}
			dvo.setMsgType(data.substring(39, 41).trim());
			dvo.setDataLength(data.substring(41, 44).trim());

			String[] dataList = data.substring(44, data.length()).split("\\|");

			if (dataList.length != 13) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

			int longitude = Integer.parseInt(dataList[5].trim());
			if (Math.abs(longitude) > 181*600000) return null;

			int latitude = Integer.parseInt(dataList[6].trim());
			if (Math.abs(latitude) > 91*600000) return null;

			int sog = Integer.parseInt(dataList[7].trim());
			if (Math.abs(sog) > 1023) return null;

			int cog = Integer.parseInt(dataList[8].trim());
			if (Math.abs(cog) > 3600) return null;

			dvo.setMrn(dataList[0].trim());
			dvo.setRsrp(Integer.parseInt(dataList[1].trim()));
			dvo.setRssi(Integer.parseInt(dataList[2].trim()));
			dvo.setSignal_quality(Integer.parseInt(dataList[3].trim()));
			dvo.setSinr(Integer.parseInt(dataList[4].trim()));
			dvo.setLo(longitude);
			dvo.setLa(latitude);
			dvo.setSog(sog);
			dvo.setCog(cog);
			dvo.setGps_sttus(Integer.parseInt(dataList[9].trim()));
			dvo.setBattery_use_yn(Integer.parseInt(dataList[10].trim()));

			mainVO.setStdType(GmtSTDType.prLTEMDynamic);
			mainVO.setLTEMDynamicVO(dvo);
			return mainVO;
		} else if (data.substring(3,4).equals("6")) {
			LTEMStaticVO stvo = new LTEMStaticVO();

			stvo.setTargetSensor(data.substring(1, 3).trim());
			stvo.setPacketID(data.substring(3, 4).trim());

			if ("".equals(data.substring(30, 39).trim())) {
				stvo.setShipID(data.substring(4, 16).trim());	//Area ID가 공백인 경우는 Ship ID는 MMSI
			} else {
				stvo.setShipID(data.substring(4, 16).trim() + data.substring(30, 39).trim());
			}

			stvo.setDateTime(str2DateTime(data.substring(16, 30).trim(), false));
			stvo.setMsgType(data.substring(39, 41).trim());
			stvo.setDataLength(data.substring(41, 44).trim());

			String[] dataList = data.substring(44, data.length()).split("\\|");

			if ( (dataList.length != 17) || "".equals(stvo.getShipID())) {
				mainVO.setStdType(GmtSTDType.prFail);
				return mainVO;
			}

//			if (dataList.length != 17) {
//				mainVO.setStdType(GmtSTDType.prFail);
//				return mainVO;
//			}

			stvo.setMrn(dataList[0].trim());
			stvo.setArea(dataList[1].trim());
			stvo.setShip_nm(dataList[2].trim());
			stvo.setShip_no(dataList[3].trim());
			stvo.setFshrbt_no(dataList[4].trim());
			stvo.setMmsi(dataList[5].trim());
			stvo.setRfid(dataList[6].trim());
			stvo.setImo(dataList[7].trim());
			stvo.setClsgn(dataList[8].trim());
			stvo.setShip_ty(dataList[9].trim());

			if (("").equals(dataList[10].trim())) {
				stvo.setLength(0.0);
			} else if (dataList[10].trim().length() > 5) {
				stvo.setLength(Double.parseDouble(dataList[10].trim().substring(0, 5)));
			} else {
				stvo.setLength(Double.parseDouble(dataList[10].trim()));
			}

			if (("").equals(dataList[11].trim())) {
				stvo.setWidth(0.0);
			} else {
				stvo.setWidth(Double.parseDouble(dataList[11].trim()));
			}

			if (("").equals(dataList[12].trim())) {
				stvo.setDepth(0.0);
			} else {
				stvo.setDepth(Double.parseDouble(dataList[12].trim()));
			}

			if (("").equals(dataList[13].trim())) {
				stvo.setDraft(0.0);
			} else {
				stvo.setDraft(Double.parseDouble(dataList[13].trim()));
			}

			if (("").equals(dataList[14].trim())) {
				stvo.setTn(0.0);
			} else {
				stvo.setTn(Double.parseDouble(dataList[14].trim()));
			}

			List<String> ucList = Arrays.asList(dataList[15].trim().split(":"));
			stvo.setUc(ucList);

			mainVO.setStdType(GmtSTDType.prLTEMStatic);
			mainVO.setLTEMStaticVO(stvo);
			return mainVO;
		}

		mainVO.setStdType(GmtSTDType.prFail);
		return mainVO;
	}

	public LocalDateTime str2DateTime(String dt, boolean withMSec) {
		//YYYYMMDDHHNNSS
		int yy,mm,dd;
		int hh,nn,ss;
		int msec;
		int checkLength;

		if (withMSec) {
			checkLength = 17;
		}else checkLength = 14;

		if (!dt.equals("") && checkLength == dt.length()) {
			yy = GmtUtils.strToIntDef(dt.substring(0,4).trim(), 1899);
			mm = GmtUtils.strToIntDef(dt.substring(4,6).trim(),   12);
			dd = GmtUtils.strToIntDef(dt.substring(6,8).trim(),   30);
			hh = GmtUtils.strToIntDef(dt.substring(8,10).trim(),  00);
			nn = GmtUtils.strToIntDef(dt.substring(10,12).trim(), 00);
			ss = GmtUtils.strToIntDef(dt.substring(12,14).trim(), 00);

			if (withMSec) {
				msec = GmtUtils.strToIntDef(dt.substring(14,17).trim(), 000);
			}
			else msec = 000;

			return LocalDateTime.of(yy, mm, dd, hh, nn, ss, msec*1000000);
		}
		else return LocalDateTime.of(1899, 12, 30, 00, 00, 00);
	}

}
