瀏覽代碼

新增几种控制命令

xiuwei 3 年之前
父節點
當前提交
8be63595d3

+ 1 - 1
pom.xml

@@ -33,7 +33,7 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
         <protocol.version>1.1.10</protocol.version>
-        <iec104.version>1.4.15</iec104.version>
+        <iec104.version>1.4.16</iec104.version>
         <modbus.version>2.2.4</modbus.version>
         <cdt.version>1.0.0</cdt.version>
     </properties>

+ 5 - 0
protocol-core/src/main/java/wei/yigulu/netty/HSConnectionListener.java

@@ -39,6 +39,11 @@ public class HSConnectionListener implements ChannelFutureListener {
 
 	@Override
 	public void operationComplete(ChannelFuture channelFuture) throws Exception {
+		try {
+			log.warn("通道任务和重连任务是否是一个:" + channelFuture.equals(masterBuilder.getFuture()));
+		}catch ( Exception e){
+
+		}
 		if (channelFuture == null || channelFuture.channel() == null || !channelFuture.channel().isActive()) {
 			this.masterBuilder.getOrCreateWorkGroup().schedule(() -> {
 				try {

+ 5 - 0
protocol-core/src/main/java/wei/yigulu/netty/SimpleTcpConnectionListener.java

@@ -37,6 +37,11 @@ public class SimpleTcpConnectionListener implements ChannelFutureListener {
 
 	@Override
 	public void operationComplete(ChannelFuture channelFuture) throws Exception {
+		try {
+			log.warn("通道任务和重连任务是否是一个:" + channelFuture.equals(masterBuilder.getFuture()));
+		}catch ( Exception e){
+
+		}
 		if (channelFuture == null || channelFuture.channel() == null || !channelFuture.channel().isActive()) {
 			this.future = this.masterBuilder.getOrCreateWorkGroup().schedule(() -> {
 				try {

+ 108 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/DoubleBooleanCommand.java

@@ -0,0 +1,108 @@
+package wei.yigulu.iec104.asdudataframe;
+
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.val;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.apdumodel.Vsq;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeDoubleBooleanCommand;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeSingleBooleanCommand;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
+import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
+import wei.yigulu.iec104.util.CommandWaiter;
+import wei.yigulu.iec104.util.SendAndReceiveNumUtil;
+import wei.yigulu.iec104.util.SendCommandHelper;
+
+import java.util.List;
+
+/**
+ * 双点遥控命令
+ *
+ * @author: xiuwei
+ * @version:
+ */
+@NoArgsConstructor
+@Data
+public class DoubleBooleanCommand extends AbstractDataFrameType {
+
+	/**
+	 * TYPEID
+	 */
+	public static final int TYPEID = TechnicalTerm.DOUBLE_BOOLEAN_COMMAND_TYPE;
+
+	private InformationBodyAddress addresses = new InformationBodyAddress();
+
+	private IeDoubleBooleanCommand val = new IeDoubleBooleanCommand(1);
+
+
+	/**
+	 * 短浮命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 */
+	public DoubleBooleanCommand(Integer address, int val) {
+		if (address != null) {
+			this.addresses = new InformationBodyAddress(address);
+		}
+		this.val = new IeDoubleBooleanCommand(val);
+	}
+
+
+	@Override
+	public void loadByteBuf(ByteBuf is, Vsq vsq) {
+		try {
+			this.addresses = new InformationBodyAddress(is);
+			this.val = new IeDoubleBooleanCommand(is);
+		} catch (Iec104Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void encode(List<Byte> buffer) {
+		this.addresses.encode(buffer);
+		this.val.encode(buffer);
+	}
+
+	@Override
+	public Asdu generateBack() {
+		Asdu asdu = new Asdu();
+		asdu.setTypeId(TYPEID);
+		asdu.setDataFrame(this);
+		asdu.getVsq().setSq(0);
+		asdu.getVsq().setNum(1);
+		asdu.setOriginatorAddress(0);
+		asdu.setCommonAddress(1);
+		return asdu;
+	}
+
+	@Override
+	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
+		if (apdu.getAsdu().getCot().getNot() == 6) {
+			byte[][] bs = new byte[1][];
+			apdu.getAsdu().getCot().setNot(7);
+			SendAndReceiveNumUtil.setSendAndReceiveNum(apdu, apdu.getChannel().id());
+			bs[0] = apdu.encode();
+			return bs;
+		} else {
+			DoubleBooleanCommand doubleBooleanCommand = (DoubleBooleanCommand) apdu.getAsdu().getDataFrame();
+			CommandWaiter commandWaiter = new CommandWaiter(apdu.getChannel().id(), apdu, doubleBooleanCommand.getAddresses().getAddress());
+			commandWaiter.set(doubleBooleanCommand.getVal());
+			SendCommandHelper.setIecValue(commandWaiter);
+			return null;
+		}
+	}
+
+
+	@Override
+	public String toString() {
+		String s = "双点遥控命令——";
+		s += this.addresses.toString();
+		s += this.val;
+		return s;
+	}
+}

+ 127 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NormalizationValueCommand.java

@@ -0,0 +1,127 @@
+package wei.yigulu.iec104.asdudataframe;
+
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.apdumodel.Vsq;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortFloat;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortInteger;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
+import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
+import wei.yigulu.iec104.util.CommandWaiter;
+import wei.yigulu.iec104.util.SendAndReceiveNumUtil;
+import wei.yigulu.iec104.util.SendCommandHelper;
+
+import java.util.List;
+
+/**
+ * 归一化值控制命令
+ *
+ * @author: xiuwei
+ * @version:
+ */
+@NoArgsConstructor
+@Data
+public class NormalizationValueCommand extends AbstractDataFrameType {
+
+	/**
+	 * TYPEID
+	 */
+	public static final int TYPEID = TechnicalTerm.NORMALIZATION_COMMAND_TYPE;
+
+	private InformationBodyAddress addresses = new InformationBodyAddress();
+
+	private IeShortInteger val = new IeShortInteger(0);
+
+	private IeMeasuredQuality quality = new IeMeasuredQuality();
+
+
+	/**
+	 * 归一化命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 * @param quality 质量
+	 */
+	public NormalizationValueCommand(Integer address, int val, IeMeasuredQuality quality) {
+		if (address != null) {
+			this.addresses = new InformationBodyAddress(address);
+		}
+		this.val = new IeShortInteger(val);
+		if (quality != null) {
+			this.quality = quality;
+		}
+	}
+
+	/**
+	 * 短浮命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 */
+	public NormalizationValueCommand(Integer address, int val) {
+		new NormalizationValueCommand(address, val, null);
+	}
+
+
+	@Override
+	public void loadByteBuf(ByteBuf is, Vsq vsq) {
+		try {
+			this.addresses = new InformationBodyAddress(is);
+			this.val =  new IeShortInteger(is);
+			this.quality = new IeMeasuredQuality(is);
+		} catch (Iec104Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void encode(List<Byte> buffer) {
+		this.addresses.encode(buffer);
+		this.val.encode(buffer);
+		buffer.add((byte) this.quality.encode());
+	}
+
+	@Override
+	public Asdu generateBack() {
+		Asdu asdu = new Asdu();
+		asdu.setTypeId(TYPEID);
+		asdu.setDataFrame(this);
+		asdu.getVsq().setSq(0);
+		asdu.getVsq().setNum(1);
+		asdu.setOriginatorAddress(0);
+		asdu.setCommonAddress(1);
+		return asdu;
+	}
+
+	@Override
+	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
+		if (apdu.getAsdu().getCot().getNot() == 6) {
+			byte[][] bs = new byte[1][];
+			apdu.getAsdu().getCot().setNot(7);
+			SendAndReceiveNumUtil.setSendAndReceiveNum(apdu, apdu.getChannel().id());
+			bs[0] = apdu.encode();
+			return bs;
+		} else {
+			NormalizationValueCommand normalizationValueCommand = (NormalizationValueCommand) apdu.getAsdu().getDataFrame();
+			CommandWaiter commandWaiter = new CommandWaiter(apdu.getChannel().id(), apdu, normalizationValueCommand.getAddresses().getAddress());
+			commandWaiter.set(normalizationValueCommand.getVal());
+			SendCommandHelper.setIecValue(commandWaiter);
+			return null;
+		}
+	}
+
+
+	@Override
+	public String toString() {
+		String s = "归一化值控制命令——";
+		s += "地址:" + this.addresses.toString();
+		s += "设定值:" + this.val + ";";
+		s += this.quality.toString();
+		return s;
+	}
+}

+ 108 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/SingleBooleanCommand.java

@@ -0,0 +1,108 @@
+package wei.yigulu.iec104.asdudataframe;
+
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.apdumodel.Vsq;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortFloat;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeSingleBooleanCommand;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
+import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
+import wei.yigulu.iec104.util.CommandWaiter;
+import wei.yigulu.iec104.util.SendAndReceiveNumUtil;
+import wei.yigulu.iec104.util.SendCommandHelper;
+
+import java.util.List;
+
+/**
+ * 双点遥控命令
+ *
+ * @author: xiuwei
+ * @version:
+ */
+@NoArgsConstructor
+@Data
+public class SingleBooleanCommand extends AbstractDataFrameType {
+
+	/**
+	 * TYPEID
+	 */
+	public static final int TYPEID = TechnicalTerm.SINGLE_BOOLEAN_COMMAND_TYPE;
+
+	private InformationBodyAddress addresses = new InformationBodyAddress();
+
+	private IeSingleBooleanCommand val = new IeSingleBooleanCommand(false);
+
+
+	/**
+	 * 短浮命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 */
+	public SingleBooleanCommand(Integer address, boolean val) {
+		if (address != null) {
+			this.addresses = new InformationBodyAddress(address);
+		}
+		this.val = new IeSingleBooleanCommand(val);
+	}
+
+
+	@Override
+	public void loadByteBuf(ByteBuf is, Vsq vsq) {
+		try {
+			this.addresses = new InformationBodyAddress(is);
+			this.val = new IeSingleBooleanCommand(is);
+		} catch (Iec104Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void encode(List<Byte> buffer) {
+		this.addresses.encode(buffer);
+		this.val.encode(buffer);
+	}
+
+	@Override
+	public Asdu generateBack() {
+		Asdu asdu = new Asdu();
+		asdu.setTypeId(TYPEID);
+		asdu.setDataFrame(this);
+		asdu.getVsq().setSq(0);
+		asdu.getVsq().setNum(1);
+		asdu.setOriginatorAddress(0);
+		asdu.setCommonAddress(1);
+		return asdu;
+	}
+
+	@Override
+	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
+		if (apdu.getAsdu().getCot().getNot() == 6) {
+			byte[][] bs = new byte[1][];
+			apdu.getAsdu().getCot().setNot(7);
+			SendAndReceiveNumUtil.setSendAndReceiveNum(apdu, apdu.getChannel().id());
+			bs[0] = apdu.encode();
+			return bs;
+		} else {
+			SingleBooleanCommand singleBooleanCommand = (SingleBooleanCommand) apdu.getAsdu().getDataFrame();
+			CommandWaiter commandWaiter = new CommandWaiter(apdu.getChannel().id(), apdu, singleBooleanCommand.getAddresses().getAddress());
+			commandWaiter.set(singleBooleanCommand.getVal());
+			SendCommandHelper.setIecValue(commandWaiter);
+			return null;
+		}
+	}
+
+
+	@Override
+	public String toString() {
+		String s = "单点遥控命令——";
+		s += this.addresses.toString();
+		s += this.val;
+		return s;
+	}
+}

+ 0 - 16
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBooleanCommand.java

@@ -1,16 +0,0 @@
-package wei.yigulu.iec104.asdudataframe.typemodel;
-
-/**
- * 布尔的命令值,针对单点、双点遥信,升降信号
- *
- * @author: xiuwei
- * @version:
- */
-public class IeBooleanCommand implements IecDataInterface {
-
-
-	@Override
-	public Object getIecValue() {
-		return null;
-	}
-}

+ 159 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeDoubleBooleanCommand.java

@@ -0,0 +1,159 @@
+package wei.yigulu.iec104.asdudataframe.typemodel;
+
+import io.netty.buffer.ByteBuf;
+import lombok.AllArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 布尔的命令值,针对双点遥信
+ *
+ * @author: xiuwei
+ * @version:
+ */
+public class IeDoubleBooleanCommand implements IecDataInterface {
+
+	DoubleBoolean val = DoubleBoolean.OFF;
+	/**
+	 * 命令类型
+	 */
+	CommandType commandType = CommandType.CHOICE;
+	/**
+	 * 控制属性
+	 */
+	ControlProperty controlProperty = ControlProperty.UNDEFINED;
+
+
+	public IeDoubleBooleanCommand(Integer val) {
+		this.val = DoubleBoolean.valueOf(val);
+	}
+
+	public IeDoubleBooleanCommand(ByteBuf is) {
+		int b = is.readUnsignedByte();
+		this.val =  DoubleBoolean.valueOf(b & 3);
+		this.commandType = CommandType.valueOf(b >> 7 & 1);
+		this.controlProperty = ControlProperty.valueOf((b & 127) >> 2);
+	}
+
+	/**
+	 * Encode  编码
+	 *
+	 * @param buffer buffer
+	 */
+	public void encode(List<Byte> buffer) {
+		int b = 0;
+		b = b | this.val.code;
+		b = b | (this.controlProperty.code << 2);
+		b = b | (this.commandType.code << 7);
+		buffer.add((byte) b);
+	}
+
+	@Override
+	public DoubleBoolean getIecValue() {
+		return val;
+	}
+
+	@Override
+	public String toString() {
+		String s;
+		s = "值:" + val.msg + ";";
+		s += "命令类型:" + commandType.msg + ";";
+		s += "控制属性:" + controlProperty.msg + ";";
+		return s;
+	}
+
+	@AllArgsConstructor
+	public enum DoubleBoolean {
+		/**
+		 * 不确定
+		 */
+		INDETERMINACY(0, "不确定"),
+		/**
+		 * 开启 闭合
+		 */
+		ON(2, "合"),
+		/**
+		 * 关闭 断开
+		 */
+		OFF(1, "分"),
+		/**
+		 * 不确定
+		 */
+		INDETERMINACY2(3, "不确定");
+
+		private Integer code;
+
+		private String msg;
+
+		public static DoubleBoolean valueOf(Integer code) {
+			if (code == 0) {
+				return DoubleBoolean.INDETERMINACY;
+			} else if (code == 1) {
+				return DoubleBoolean.OFF;
+			} else if (code == 2) {
+				return DoubleBoolean.ON;
+			} else if (code == 3) {
+				return DoubleBoolean.INDETERMINACY2;
+			}else {
+				throw new IllegalArgumentException();
+			}
+		}
+
+	}
+
+
+	@AllArgsConstructor
+	public enum CommandType {
+		/**
+		 * 选择
+		 */
+		CHOICE(1, "选择"),
+		/**
+		 * 执行
+		 */
+		EXECUTE(0, "执行");
+
+		private Integer code;
+
+		private String msg;
+
+		public static CommandType valueOf(Integer code) {
+			if (code == 0) {
+				return CommandType.EXECUTE;
+			} else if (code == 1) {
+				return CommandType.CHOICE;
+			} else {
+				throw new IllegalArgumentException();
+			}
+		}
+	}
+
+
+	@AllArgsConstructor
+	public enum ControlProperty {
+
+		UNDEFINED(0, "无定义"),
+		SHORT_PULSE_DURATION(1, "短脉冲持续时间"),
+		LONG_PULSE_DURATION(2, "长脉冲持续时间"),
+		CONTINUOUS_OUTPUT(3, "持续输出");
+
+		private Integer code;
+
+		private String msg;
+
+		public static ControlProperty valueOf(Integer code) {
+			switch (code) {
+				case 0:
+					return ControlProperty.UNDEFINED;
+				case 1:
+					return ControlProperty.SHORT_PULSE_DURATION;
+				case 2:
+					return ControlProperty.LONG_PULSE_DURATION;
+				case 3:
+					return ControlProperty.CONTINUOUS_OUTPUT;
+				default:
+					throw new IllegalArgumentException();
+			}
+		}
+	}
+}

+ 119 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeSingleBooleanCommand.java

@@ -0,0 +1,119 @@
+package wei.yigulu.iec104.asdudataframe.typemodel;
+
+import io.netty.buffer.ByteBuf;
+import lombok.AllArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 布尔的命令值,针对单点信号
+ *
+ * @author: xiuwei
+ * @version:
+ */
+public class IeSingleBooleanCommand implements IecDataInterface {
+
+	public IeSingleBooleanCommand(boolean val){
+		this.val=val;
+	}
+
+
+	public IeSingleBooleanCommand(ByteBuf is){
+		int b=is.readUnsignedByte();
+		this.val=(b&1)==1;
+		this.commandType=CommandType.valueOf(b>>7&1);
+		this.controlProperty=ControlProperty.valueOf((b&127)>>1);
+	}
+
+
+	boolean val=false;
+	/**
+	 * 命令类型
+	 */
+	CommandType commandType=CommandType.CHOICE;
+
+	@AllArgsConstructor
+	public enum CommandType{
+		/**
+		 * 选择
+		 */
+		CHOICE(1,"选择"),
+		/**
+		 * 执行
+		 */
+		EXECUTE(0,"执行");
+
+		private Integer code;
+
+		private String msg;
+
+		public static CommandType valueOf(Integer code){
+			if(code==0){
+				return CommandType.EXECUTE;
+			}else if(code==1){
+				return CommandType.CHOICE;
+			}else{
+				throw new IllegalArgumentException();
+			}
+		}
+	}
+
+
+	/**
+	 * 控制属性
+	 */
+	ControlProperty controlProperty=ControlProperty.UNDEFINED;
+
+	@AllArgsConstructor
+	public enum ControlProperty{
+
+		UNDEFINED(0,"无定义"),
+		SHORT_PULSE_DURATION(1,"短脉冲持续时间"),
+		LONG_PULSE_DURATION(2,"长脉冲持续时间"),
+		CONTINUOUS_OUTPUT(3,"持续输出");
+
+		private Integer code;
+
+		private String msg;
+
+		public static ControlProperty valueOf(Integer code){
+			switch (code){
+				case 0:return ControlProperty.UNDEFINED;
+				case 1:return  ControlProperty.SHORT_PULSE_DURATION;
+				case 2:return ControlProperty.LONG_PULSE_DURATION;
+				case 3:return ControlProperty.CONTINUOUS_OUTPUT;
+				default:throw  new IllegalArgumentException();
+			}
+		}
+	}
+
+	/**
+	 * Encode  编码
+	 *
+	 * @param buffer buffer
+	 */
+	public void encode(List<Byte> buffer) {
+		int b=0;
+		b=b|(val?1:0);
+		b=b|(this.controlProperty.code<<1);
+		b=b|(this.commandType.code<<7);
+		buffer.add((byte)b);
+	}
+
+
+
+	@Override
+	public Boolean getIecValue() {
+		return val;
+	}
+
+
+	@Override
+	public String toString(){
+		String s;
+		s="值:"+val+";";
+		s+="命令类型:"+commandType.msg+";";
+		s+="控制属性:"+controlProperty.msg+";";
+		return s;
+	}
+}

+ 19 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/TechnicalTerm.java

@@ -119,6 +119,25 @@ public class TechnicalTerm {
 
 
 	/**
+	 * 单点遥控命令
+	 */
+	public static final Integer SINGLE_BOOLEAN_COMMAND_TYPE = 0x2D;
+
+
+
+	/**
+	 * 归一化值遥调命令
+	 */
+	public static final Integer NORMALIZATION_COMMAND_TYPE = 0x30;
+
+
+	/**
+	 * 双点遥控命令
+	 */
+	public static final Integer DOUBLE_BOOLEAN_COMMAND_TYPE = 0x2E;
+
+
+	/**
 	 * 对时帧
 	 */
 	public static final Integer DATESYNCHRONIZATION_TYPE = 0x67;

+ 1 - 1
protocol-iec104/src/test/java/MasterTest.java

@@ -13,7 +13,7 @@ public class MasterTest {
 
 	public static void main(String[] args) throws Exception {
 		ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
-		Iec104HSMasterBuilder masterBuilder = new Iec104HSMasterBuilder("127.0.0.1", 2404);
+		Iec104HSMasterBuilder masterBuilder = new Iec104HSMasterBuilder("127.0.0.1", 2409);
 
 		masterBuilder.createByUnBlock();
 		Thread.sleep(3000L);

+ 2 - 2
protocol-iec104/src/test/java/SlaveTest.java

@@ -10,7 +10,7 @@ public class SlaveTest {
 
 	public static void main(String[] args) throws Exception {
 		Iec104SlaverBuilder slaverBuilder = new Iec104SlaverBuilder(2404);
-		slaverBuilder.getConnectFilterManager().appendFilter((c) -> {
+		/*slaverBuilder.getConnectFilterManager().appendFilter((c) -> {
 			if (slaverBuilder.getChannels().size() >= 1) {
 				return -1;
 			}
@@ -22,7 +22,7 @@ public class SlaveTest {
 			} else {
 				return 1;
 			}
-		});
+		});*/
 		slaverBuilder.create();
 	}
 

+ 9 - 2
protocol-modbus/src/test/java/Test.java

@@ -13,7 +13,7 @@ public class Test {
 		master.stop();
 		master.createByUnBlock();*/
 		//43 b0 ca ed
-		byte[] bs = new byte[]{(byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x18};
+/*		byte[] bs = new byte[]{(byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x18};
 		System.out.println("ABCD:" + new ABCD().decode(bs, 0).getValue());
 		System.out.println("CDAB:" + new CDAB().decode(bs, 0).getValue());
 		System.out.println("DCBA:" + new DCBA().decode(bs, 0).getValue());
@@ -21,7 +21,14 @@ public class Test {
 		System.out.println("P_ABCD:" + new P_ABCD().decode(bs, 0).getValue());
 		System.out.println("P_CDAB:" + new P_CDAB().decode(bs, 0).getValue());
 		System.out.println("AB:" + new PM_AB().decode(bs, 1).getValue());
-		System.out.println("BA:" + new PM_BA().decode(bs, 1).getValue());
+		System.out.println("BA:" + new PM_BA().decode(bs, 1).getValue());*/
+		int b=130;
+		b=b&127;
+		System.out.println(b);
+		b=b>>2;
+		System.out.println((byte)b);
+
+
 
 
 	}