// Path: src/main/java/net/epsilony/utils/codec/modbus/Utils.java
// public class Utils {
//     public static int crc(ByteBuf byteBuf, int start, int numBytes) {
//         int polynomial = 0xA001;
//         int crc = 0xFFFF;
//         for (int i = start; i < start + numBytes; i++) {
//             byte b = byteBuf.getByte(i);
//             int low = (crc & 0xFF) ^ (b & 0xFF);
//             crc &= (0xFF00);
//             crc |= (low);
//             for (int j = 0; j < 8; j++) {
//                 int t = crc & 0x01;
//                 crc >>= 1;
//                 if (t == 0) {
//                     continue;
//                 }
//                 crc ^= polynomial;
//             }
//         }
//         int first = (crc & 0xFF) << 8;
//         crc = (crc & 0xFF00) >> 8 | first;
//         return crc;
//     }
// }
// 
// Path: src/main/java/net/epsilony/utils/codec/modbus/reqres/ModbusRequest.java
// public class ModbusRequest {
//     private ModbusFunction function;
//     private int transectionId;
//     private int unitId;
// 
//     public ModbusFunction getFunction() {
//         return function;
//     }
// 
//     public void setFunction(ModbusFunction function) {
//         this.function = function;
//     }
// 
//     public int getTransectionId() {
//         return transectionId;
//     }
// 
//     public void setTransectionId(int transectionId) {
//         this.transectionId = transectionId;
//     }
// 
//     public int getUnitId() {
//         return unitId;
//     }
// 
//     public void setUnitId(int unitId) {
//         this.unitId = unitId;
//     }
// 
//     public ModbusRequest(int transectionId, int unitId, ModbusFunction function) {
//         this.transectionId = transectionId;
//         this.unitId = unitId;
//         this.function = function;
//     }
// 
//     public ModbusRequest() {
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((function == null) ? 0 : function.hashCode());
//         result = prime * result + transectionId;
//         result = prime * result + unitId;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         ModbusRequest other = (ModbusRequest) obj;
//         if (function == null) {
//             if (other.function != null)
//                 return false;
//         } else if (!function.equals(other.function))
//             return false;
//         if (transectionId != other.transectionId)
//             return false;
//         if (unitId != other.unitId)
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "ModbusRequest [transectionId=" + transectionId + ", unitId=" + unitId + ", function=" + function + "]";
//     }
// 
// }


import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import net.epsilony.utils.codec.modbus.Utils;
import net.epsilony.utils.codec.modbus.reqres.ModbusRequest;
/*
 *
 * The MIT License (MIT)
 * 
 * Copyright (C) 2013 Man YUAN <epsilon@epsilony.net>
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package net.epsilony.utils.codec.modbus.handler;


/**
 * @author <a href="mailto:epsilony@epsilony.net">Man YUAN</a>
 *
 */
public class ModbusMasterRequestEncoder extends MessageToByteEncoder<ModbusRequest> {

    private boolean withCheckSum = false;

    public ModbusMasterRequestEncoder() {
    }

    public boolean isWithCheckSum() {
        return withCheckSum;
    }

    public void setWithCheckSum(boolean withCheckSum) {
        this.withCheckSum = withCheckSum;
    }

    @Override
// Path: src/main/java/net/epsilony/utils/codec/modbus/Utils.java
// public class Utils {
//     public static int crc(ByteBuf byteBuf, int start, int numBytes) {
//         int polynomial = 0xA001;
//         int crc = 0xFFFF;
//         for (int i = start; i < start + numBytes; i++) {
//             byte b = byteBuf.getByte(i);
//             int low = (crc & 0xFF) ^ (b & 0xFF);
//             crc &= (0xFF00);
//             crc |= (low);
//             for (int j = 0; j < 8; j++) {
//                 int t = crc & 0x01;
//                 crc >>= 1;
//                 if (t == 0) {
//                     continue;
//                 }
//                 crc ^= polynomial;
//             }
//         }
//         int first = (crc & 0xFF) << 8;
//         crc = (crc & 0xFF00) >> 8 | first;
//         return crc;
//     }
// }
// 
// Path: src/main/java/net/epsilony/utils/codec/modbus/reqres/ModbusRequest.java
// public class ModbusRequest {
//     private ModbusFunction function;
//     private int transectionId;
//     private int unitId;
// 
//     public ModbusFunction getFunction() {
//         return function;
//     }
// 
//     public void setFunction(ModbusFunction function) {
//         this.function = function;
//     }
// 
//     public int getTransectionId() {
//         return transectionId;
//     }
// 
//     public void setTransectionId(int transectionId) {
//         this.transectionId = transectionId;
//     }
// 
//     public int getUnitId() {
//         return unitId;
//     }
// 
//     public void setUnitId(int unitId) {
//         this.unitId = unitId;
//     }
// 
//     public ModbusRequest(int transectionId, int unitId, ModbusFunction function) {
//         this.transectionId = transectionId;
//         this.unitId = unitId;
//         this.function = function;
//     }
// 
//     public ModbusRequest() {
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((function == null) ? 0 : function.hashCode());
//         result = prime * result + transectionId;
//         result = prime * result + unitId;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         ModbusRequest other = (ModbusRequest) obj;
//         if (function == null) {
//             if (other.function != null)
//                 return false;
//         } else if (!function.equals(other.function))
//             return false;
//         if (transectionId != other.transectionId)
//             return false;
//         if (unitId != other.unitId)
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "ModbusRequest [transectionId=" + transectionId + ", unitId=" + unitId + ", function=" + function + "]";
//     }
// 
// }


// Path: src/main/java/net/epsilony/utils/codec/modbus/handler/ModbusMasterRequestEncoder.java
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import net.epsilony.utils.codec.modbus.Utils;
import net.epsilony.utils.codec.modbus.reqres.ModbusRequest;

/*
 *
 * The MIT License (MIT)
 * 
 * Copyright (C) 2013 Man YUAN <epsilon@epsilony.net>
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package net.epsilony.utils.codec.modbus.handler;


/**
 * @author <a href="mailto:epsilony@epsilony.net">Man YUAN</a>
 *
 */
public class ModbusMasterRequestEncoder extends MessageToByteEncoder<ModbusRequest> {

    private boolean withCheckSum = false;

    public ModbusMasterRequestEncoder() {
    }

    public boolean isWithCheckSum() {
        return withCheckSum;
    }

    public void setWithCheckSum(boolean withCheckSum) {
        this.withCheckSum = withCheckSum;
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, ModbusRequest msg, ByteBuf out) throws Exception {