bts
whyclxw
2024-12-18 783eb3cb284bce0ae7dfe57479550fce0591dcb2
bts
4个文件已修改
16个文件已添加
2860 ■■■■■ 已修改文件
src/main/java/com/whyc/bts/BTS_BattParam.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_CapState.java 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_ChargeData.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_ChargeParam.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_ChargeState.java 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_ComBase.java 497 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_Crc16.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_DataType.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_DateTime.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_DisChargeData.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_DischargeParam.java 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_FbsData.java 559 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_TestTime.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_Test_Main.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/TestController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/fbo/FboDataHeadStart.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mcp/FBSData.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BtsChargeDataService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BtsDisChargeService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/FboDataInfService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/bts/BTS_BattParam.java
New file
@@ -0,0 +1,361 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
 *     电池参数
 * @author DELL
 *
 */
public class BTS_BattParam implements Cloneable{
    private final int BYTE_LEN = 44;                //常规BTS长度
    private final int BYTE_LEN_Li = 46;                //锂电BTS长度
    public double STD_CAP = 0.0;                //标称容量
    public double STD_RES = 0.0;                //标称内阻
    public int BattGroupCount = 0;                //电池组数
    public int EachGroupBattCount = 0;            //每组单体数目
    public double MonomerVol = 0.0;                //单体电压
    public double GroupVol = 0.0;                //组端电压
    public double BattTemp = 0.0;                //电池温度
    public double FloatChargeVol = 0.0;            //浮充电压
    public double FloatChargeCurr = 0.0;        //浮充电压
    public double OnlineVolLow = 0.0;            //在线压低
    public int GroupConnType = 0;
    /**
     * @lijun 2021-09-03 锂电BTS新增电池参数
     */
    public int BattGroupCountSum;                 //电池组总数(铅酸+锂电,只读)
    public int LiBattGroupCount;                 //锂电组数
    public int LiEachGroupBattCount;             //锂电节数
    public double bakeup3 = 0;
    public double bakeup4 = 0;
    public double bakeup5 = 0;
    public double bakeup6 = 0;
    public double bakeup7 = 0;
    public double bakeup8 = 0;
    public double bakeup9 = 0;
    public double bakeup10 = 0;
    public int CRC = 0;
    /**
     * 复制一个当前对象(引用不同);
     */
    public BTS_BattParam clone()
    {
        BTS_BattParam obj = null;
        try
        {
            obj = (BTS_BattParam)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return obj;
    }
    /**
     * 清空当前对象
     */
    public void clear()
    {
        STD_CAP = 0.0;
        STD_RES = 0.0;
        BattGroupCount = 0;
        EachGroupBattCount = 0;
        MonomerVol = 0.0;
        GroupVol = 0.0;
        BattTemp = 0.0;
        FloatChargeVol = 0.0;
        FloatChargeCurr = 0.0;
        OnlineVolLow = 0.0;
        GroupConnType = 0;
        BattGroupCountSum = 0;                 //电池组总数(铅酸+锂电,只读)
        LiBattGroupCount = 0;                 //锂电组数
        LiEachGroupBattCount = 0;             //锂电节数
        bakeup4 = 0;
        bakeup5 = 0;
        bakeup6 = 0;
        bakeup7 = 0;
        bakeup8 = 0;
        bakeup9 = 0;
        bakeup10 = 0;
        CRC = 0;
    }
    public boolean putByteBuffer(final ByteBuffer bf,int BTSE_DevType) {
        if(BTS_ComBase.BTSE_DevType_LIBTS == BTSE_DevType) {
            //锂电BTS
            return putLiBTSByteBuffer(bf);
        }else {
            return putBTSByteBuffer(bf);
        }
    }
    /**
     * 将bytebuffer中的数据取出放入该对象的属性中,并返回是否取出成功
     *
     * @param bf
     * @return
     */
    public boolean putBTSByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN) {
            ////System.out.println("长度错误");
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
        if(crc0 != crc1) {
            ////System.out.println("Crc 错误");
            return false;
        }
        tmpbuf.position(0);
        STD_CAP = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        STD_RES = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())*10;//uΩ
        BattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        EachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        MonomerVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        BattTemp = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeCurr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        OnlineVolLow = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupConnType = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        BattGroupCountSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiBattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiEachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup4 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup5 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup6 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup7 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup8 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup9 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup10 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    /**
     * 将bytebuffer中的数据取出放入该对象的属性中,并返回是否取出成功
     *
     * @param bf
     * @return
     */
    public boolean putLiBTSByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN_Li) {
            //System.out.println("长度错误");
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN_Li-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN_Li-2);
        if(crc0 != crc1) {
            ////System.out.println("Crc 错误");
            return false;
        }
        tmpbuf.position(0);
        STD_CAP = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        STD_RES = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())*10;//uΩ
        BattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        EachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        MonomerVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        BattTemp = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeCurr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        OnlineVolLow = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupConnType = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        BattGroupCountSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiBattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiEachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup3 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup4 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup5 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup6 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup7 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup8 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup9 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup10 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    /**
     * 将bytebuffer中的数据取出放入该对象的属性中,并返回是否取出成功
     *
     * @param bf
     * @return
     */
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN) {
            //System.out.println("长度错误");
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
        if(crc0 != crc1) {
            //System.out.println("Crc 错误");
            return false;
        }
        //System.out.println("crc0:"+crc0);
        tmpbuf.position(0);
        STD_CAP = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        STD_RES = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())*10;//uΩ
        BattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        EachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        MonomerVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        BattTemp = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeVol = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        FloatChargeCurr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        OnlineVolLow = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        GroupConnType = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        BattGroupCountSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiBattGroupCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        LiEachGroupBattCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup4 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup5 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup6 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup7 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup8 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup9 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup10 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        CRC= BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        tmpbuf.compact();
        tmpbuf.flip();
        ////System.out.println(this);
        return true;
    }
    public ByteBuffer getByteBuffer(int BTSE_DevType) {
        if(BTS_ComBase.BTSE_DevType_LIBTS == BTSE_DevType) {
            //锂电BTS
            return getLiByteBuffer();
        }else {
            return getByteBuffer();
        }
    }
    /**
     * 将数据放入bytebuffer中并返回
     * @return
     */
    public ByteBuffer getLiByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN_Li);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(STD_CAP));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(STD_RES/10));//uΩ
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(BattGroupCount));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(EachGroupBattCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonomerVol*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupVol));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(BattTemp*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(FloatChargeVol*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(FloatChargeCurr*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(OnlineVolLow*10));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(GroupConnType));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(BattGroupCountSum));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(LiBattGroupCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(LiEachGroupBattCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup3));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup4));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup5));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup6));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup7));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup8));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup9));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup10));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.position());
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        return bytebuffer;
    }
    /**
     * 将数据放入bytebuffer中并返回
     * @return
     */
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(STD_CAP));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(STD_RES/10));//uΩ
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(BattGroupCount));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(EachGroupBattCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonomerVol*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupVol));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(BattTemp*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(FloatChargeVol*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(FloatChargeCurr*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(OnlineVolLow*10));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(GroupConnType));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(BattGroupCountSum));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(LiBattGroupCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(LiEachGroupBattCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup4));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup5));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup6));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup7));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup8));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup9));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup10));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.position());
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        return bytebuffer;
    }
    @Override
    public String toString() {
        return "FBS9100_ParamBatt [BYTE_LEN=" + BYTE_LEN + ", STD_CAP=" + STD_CAP + ", STD_RES=" + STD_RES
                + ", BattGroupCount=" + BattGroupCount + ", EachGroupBattCount=" + EachGroupBattCount + ", MonomerVol="
                + MonomerVol + ", GroupVol=" + GroupVol + ", BattTemp=" + BattTemp + ", FloatChargeVol="
                + FloatChargeVol + ", FloatChargeCurr=" + FloatChargeCurr + ", OnlineVolLow=" + OnlineVolLow
                + ", GroupConnType=" + GroupConnType + ", BattGroupCountSum=" + BattGroupCountSum + ", LiBattGroupCount=" + LiBattGroupCount + ", LiEachGroupBattCount="
                + LiEachGroupBattCount + ", bakeup4=" + bakeup4 + ", bakeup5=" + bakeup5 + ", bakeup6=" + bakeup6 + ", bakeup7="
                + bakeup7 + ", bakeup8=" + bakeup8 + ", bakeup9=" + bakeup9 + ", bakeup10=" + bakeup10 + ", CRC=" + CRC
                + "]";
    }
}
src/main/java/com/whyc/bts/BTS_CapState.java
New file
@@ -0,0 +1,224 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
public class BTS_CapState implements Cloneable{
    private final int BYTE_LEN = 222;            //原来
    //private final int BYTE_LEN = 126;
    private final int BATTGROUP_COUNT = BTS_ComBase.BattGroupCountMax;
    public BTS_DateTime StartDT = new BTS_DateTime();                //启动放电的日期时间
    public BTS_DateTime StopDT = new BTS_DateTime();                //终止放电的日期时间
    public BTS_TestTime Test_Time = new BTS_TestTime();                //已测试时间(HMS)
    public int TestState;                                            //测试状态(停止/暂停/放电)
    public int TestType;                                            //测试类型(放电/充电)
    public int TestGroupNum;                                        //被测试电池组编号(1~4)
    public int SaveDataEN;                                            //保存数据标识
    public int BackUp;                                                //备份
    public int MonomerLowCount[] = new int[BTS_ComBase.BattGroupCountMax];    //每组已到单体下限数量
    public double TestCur[] = new double[BTS_ComBase.BattGroupCountMax];
    public double GroupVol[] = new double[BTS_ComBase.BattGroupCountMax];
    public double OnlineVol[] = new double[BTS_ComBase.BattGroupCountMax];
    public double TestCapInt[] = new double[BTS_ComBase.BattGroupCountMax];
    public double GroupCapInt[] = new double[BTS_ComBase.BattGroupCountMax];
    public double GroupRestCapInt[] = new double[BTS_ComBase.BattGroupCountMax];
    public int MonMaxNum[] = new int[BTS_ComBase.BattGroupCountMax];
    public int MonMinNum[] = new int[BTS_ComBase.BattGroupCountMax];
    public double MonMaxValue[] = new double[BTS_ComBase.BattGroupCountMax];
    public double MonMinValue[] = new double[BTS_ComBase.BattGroupCountMax];
    public int RestTest_Time[] = new int[BTS_ComBase.BattGroupCountMax];    //剩余容量可放电时间(HMS)
    public int    CRC;
    public BTS_CapState clone()
    {
        BTS_CapState obj = null;
        try
        {
            obj = (BTS_CapState)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return obj;
    }
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN) {
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
        //if(crc0 != crc1) {
            //System.out.println("crc0:"+crc0+"===crc1"+crc1);
        //    return false;
        //}
        tmpbuf.position(0);
        StartDT.year = BTS_ComBase.changeByteToInt(  tmpbuf.get());
        StartDT.month = BTS_ComBase.changeByteToInt( tmpbuf.get());
        StartDT.day = BTS_ComBase.changeByteToInt(   tmpbuf.get());
        StartDT.hour = BTS_ComBase.changeByteToInt(  tmpbuf.get());
        StartDT.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.year = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.month = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.day = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestState = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestType = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestGroupNum = BTS_ComBase.changeByteToInt(tmpbuf.get());
        SaveDataEN = BTS_ComBase.changeByteToInt(tmpbuf.get());
        BackUp = BTS_ComBase.changeByteToInt(tmpbuf.get());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonomerLowCount[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            TestCur[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            GroupVol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            OnlineVol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            TestCapInt[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            GroupCapInt[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            GroupRestCapInt[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMaxNum[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMinNum[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMaxValue[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 1000;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMinValue[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 1000;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            RestTest_Time[n] = tmpbuf.getInt();
        //System.out.println(this);
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.year));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.month));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.day));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.year));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.month));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.day));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestState));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestType));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestGroupNum));
        bytebuffer.put(BTS_ComBase.changeIntToByte(SaveDataEN));
        bytebuffer.put(BTS_ComBase.changeIntToByte(BackUp));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonomerLowCount[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(TestCur[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupVol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(OnlineVol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(TestCapInt[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupCapInt[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupRestCapInt[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonMaxNum[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonMinNum[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonMaxValue[n]*1000));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonMinValue[n]*1000));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putInt(RestTest_Time[n]);
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.capacity()-2);
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        ////System.out.println(bytebuffer.limit()+"&&&&&&&&&&&&&&&&");
        return bytebuffer;
    }
    @Override
    public String toString() {
        return "BTS_CapState [BYTE_LEN=" + BYTE_LEN + ", BATTGROUP_COUNT=" + BATTGROUP_COUNT + ", StartDT="
                + StartDT + ", StopDT=" + StopDT + ", Test_Time=" + Test_Time + ", TestState=" + TestState
                + ", TestType=" + TestType + ", TestGroupNum=" + TestGroupNum + ", SaveDataEN=" + SaveDataEN
                + ", BackUp=" + BackUp + ", MonomerLowCount=" + Arrays.toString(MonomerLowCount) + ", TestCur="
                + Arrays.toString(TestCur) + ", GroupVol=" + Arrays.toString(GroupVol) + ", OnlineVol="
                + Arrays.toString(OnlineVol) + ", TestCapInt=" + Arrays.toString(TestCapInt) + ", GroupCapInt="
                + Arrays.toString(GroupCapInt) + ", GroupRestCapInt=" + Arrays.toString(GroupRestCapInt)
                + ", MonMaxNum=" + Arrays.toString(MonMaxNum) + ", MonMinNum=" + Arrays.toString(MonMinNum)
                + ", MonMaxValue=" + Arrays.toString(MonMaxValue) + ", MonMinValue=" + Arrays.toString(MonMinValue)
                + ", RestTest_Time=" + Arrays.toString(RestTest_Time) + ", CRC=" + CRC + "]";
    }
    public static void main(String[] args) {
        //System.out.println(new BTS_CapState().putByteBuffer(new BTS_CapState().getByteBuffer()));
    }
}
src/main/java/com/whyc/bts/BTS_ChargeData.java
New file
@@ -0,0 +1,137 @@
package com.whyc.bts;
import com.whyc.util.ComFn;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
/**
 *     充电数据
 * @author DELL
 *
 */
@Component
public class BTS_ChargeData {
    public int parse_result = BTS_ComBase.PARSE_RESULT_NULL;
    public BTS_BattParam battParam;                    //电池参数
    public BTS_ChargeParam chargeParam;                //充电参数
    public BTS_ChargeState charState;                //充电状态
    public List<BTS_FbsData> fbsDatas;                //每次记录的单体数据
    public BTS_ChargeData() {
        battParam = new BTS_BattParam();
        chargeParam = new BTS_ChargeParam();
        charState = new BTS_ChargeState();
        fbsDatas = new ArrayList<BTS_FbsData>();
    }
    /**
     *     解析充电数据
     * @param filePath
     */
    public void readChrFile(String filePath)
    {
        FileInputStream fis = null;
        try {
            File f = new File(filePath);
            if(!filePath.endsWith(".CHR") || !filePath.toUpperCase().endsWith(".CHR")) {
                //文件格式错误
                parse_result = BTS_ComBase.PARSE_RESULT_FILETYPEERR;
                return;
            }
            if(!f.exists()) {
                //文件不存在
                parse_result = BTS_ComBase.PARSE_RESULT_NOTFOUNDFILE;
                return;
                ////System.out.println("文件不存在..........");
            }
            fis = new FileInputStream(f);
            byte[] buf = new byte[2048];
            if(fis.read(buf, 0, buf.length) == 2048)
            {
                if(this.checkTestDataHead(buf)) {
                    parse_result = BTS_ComBase.PARSE_RESULT_SUCCESS;
                }else {
                    parse_result = BTS_ComBase.PARSE_RESULT_FILEERROR;
                }
                BTS_DataType dataType = new BTS_DataType();
                while(true)
                {
                    int tag = dataType.checkDataHead(fis);
                    if((0xFD == tag) || (0xFC == tag) || (0xFB == tag))
                    {
                        //System.out.println("#################");
                        byte[] databuf = new byte[BTS_FbsData.BASIC_LEN + (battParam.EachGroupBattCount*battParam.BattGroupCount)*2 -4];
                        if(fis.read(databuf) == databuf.length)
                        {
                            ByteBuffer bf = ByteBuffer.allocate(databuf.length + BTS_DataType.BYTE_LEN);
                            bf.order(ByteOrder.LITTLE_ENDIAN);
                            bf.put(dataType.getDataTypeByte());
                            bf.put(databuf);
                            bf.flip();
                            bf.position(0);
                            //System.out.println(ComFn.bytesToHexString(databuf, databuf.length));
                            BTS_FbsData fbsData = new BTS_FbsData();
                            if(fbsData.putByteBuffer(bf, 0, 0)) {
                                fbsDatas.add(fbsData);
                            }
                        }
                    }
                    if(tag == 1)
                        break;
                }
            }else {
                parse_result = BTS_ComBase.PARSE_RESULT_FILEERROR;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != fis)
            {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     *     解析文件头数据
     * @return
     */
    public boolean checkTestDataHead(byte[] buf) {
        boolean checkOk = true;
        ByteBuffer buffer = ByteBuffer.allocate(buf.length);
        buffer.order(ByteOrder.LITTLE_ENDIAN);
        buffer.put(buf);
        buffer.flip();
        buffer.position(0);
        checkOk = checkOk && battParam.putByteBuffer(buffer);
        //System.out.println("checkTestDataHead:"+checkOk);
        checkOk = checkOk && chargeParam.putByteBuffer(buffer);
        //System.out.println("checkTestDataHead:"+checkOk);
        charState.putByteBuffer(buffer);
        return checkOk;
    }
}
src/main/java/com/whyc/bts/BTS_ChargeParam.java
New file
@@ -0,0 +1,178 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
 *     充电参数
 * @author DELL
 *
 */
public class BTS_ChargeParam implements Cloneable{
    private final int BYTE_LEN = 44;
    public int HourRate = 0;                //小时率
    public double ChargeCurr = 0;            //充电电流
    public double ChargeCap = 0;            //充电容量
    public int ChargeTime = 0;                //充电时间
    public double GroupVol_High = 0;        //组端上限
    public double MonomerVol_High = 0;        //单体上限
    public int MonomerHighCount = 0;        //单体上限数量
    public int BattGroupNum = 0;
    public int OnlineVolLowAction = 0;
    public int StaticTime = 0;
    public int ChargeTestCount = 0;
    public int bakeup1 = 0;
    public int bakeup2 = 0;
    public int bakeup3 = 0;
    public int bakeup4 = 0;
    public int bakeup5 = 0;
    public int bakeup6 = 0;
    public int bakeup7 = 0;
    public int bakeup8 = 0;
    public int bakeup9 = 0;
    public int bakeup10 = 0;
    public int CRC = 0;
    public BTS_ChargeParam clone()
    {
        BTS_ChargeParam obj = null;
        try
        {
            obj = (BTS_ChargeParam)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return obj;
    }
    public void clear()
    {
        HourRate = 0;
        ChargeCurr = 0;
        ChargeCap = 0;
        ChargeTime = 0;
        GroupVol_High = 0;
        MonomerVol_High = 0;
        MonomerHighCount = 0;
        BattGroupNum = 0;
        OnlineVolLowAction = 0;
        StaticTime = 0;
        ChargeTestCount = 0;
        bakeup1 = 0;
        bakeup2 = 0;
        bakeup3 = 0;
        bakeup4 = 0;
        bakeup5 = 0;
        bakeup6 = 0;
        bakeup7 = 0;
        bakeup8 = 0;
        bakeup9 = 0;
        bakeup10 = 0;
        CRC = 0;
    }
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN) {
            ////System.out.println("bf.limit():"+bf.limit());
            return false;
        }
        ByteBuffer tmpbuf = bf;
        ////System.err.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
        if(crc0 != crc1) {
            //System.out.println("crc0:" + crc0 + "===crc1:" +crc1);
            return false;
        }
        tmpbuf.position(0);
        HourRate = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        ChargeCurr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        ChargeCap = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        ChargeTime = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        GroupVol_High = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        MonomerVol_High = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        MonomerHighCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        BattGroupNum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        OnlineVolLowAction = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        StaticTime = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        ChargeTestCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup1 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup2 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup3 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup4 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup5 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup6 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup7 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup8 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup9 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup10 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(HourRate));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(ChargeCurr));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(ChargeCap));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(ChargeTime));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupVol_High*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonomerVol_High*1000));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonomerHighCount));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(BattGroupNum));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(OnlineVolLowAction));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(StaticTime));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(ChargeTestCount));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup1));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup2));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup3));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup4));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup5));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup6));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup7));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup8));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup9));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup10));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.position());
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        return bytebuffer;
    }
    @Override
    public String toString() {
        return "FBS9100_ParamCharge [BYTE_LEN=" + BYTE_LEN + ", HourRate=" + HourRate + ", ChargeCurr=" + ChargeCurr
                + ", ChargeCap=" + ChargeCap + ", ChargeTime=" + ChargeTime + ", GroupVol_High=" + GroupVol_High
                + ", MonomerVol_High=" + MonomerVol_High + ", MonomerHighCount=" + MonomerHighCount + ", BattGroupNum="
                + BattGroupNum + ", OnlineVolLowAction=" + OnlineVolLowAction + ", StaticTime=" + StaticTime
                + ", ChargeTestCount=" + ChargeTestCount + ", bakeup1=" + bakeup1 + ", bakeup2=" + bakeup2
                + ", bakeup3=" + bakeup3 + ", bakeup4=" + bakeup4 + ", bakeup5=" + bakeup5 + ", bakeup6=" + bakeup6
                + ", bakeup7=" + bakeup7 + ", bakeup8=" + bakeup8 + ", bakeup9=" + bakeup9 + ", bakeup10=" + bakeup10
                + ", CRC=" + CRC + "]";
    }
}
src/main/java/com/whyc/bts/BTS_ChargeState.java
New file
@@ -0,0 +1,201 @@
package com.whyc.bts;
import com.whyc.util.ComFn;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
 *     充电状态
 * @author DELL
 *
 */
public class BTS_ChargeState implements Cloneable{
    private final int BYTE_LEN = 120 + 32;
    private final int BATTGROUP_COUNT = BTS_ComBase.BattGroupCountMax;
    public BTS_DateTime StartDT = new BTS_DateTime();                //启动放电的日期时间
    public BTS_DateTime StopDT = new BTS_DateTime();                //终止放电的日期时间
    public BTS_TestTime Test_Time = new BTS_TestTime();                //已测试时间(HMS)
    public int TestState;                    //测试状态(停止/暂停/放电)
    public int TestType;                    //测试类型(放电/充电)
    public int TestGroupNum;                //被测试电池组编号(1~4)
    public int SaveDataEN;                    //保存数据标识
    public int ChargeEN;                    //开始充电标识
    public int ChargeOverTime;                //充电过流超时
    public int LastCapTestAlarmRes;            //上次容量放电测试结果
    public double TestCur[] = new double[BTS_ComBase.BattGroupCountMax];
    public double GroupVol[] = new double[BTS_ComBase.BattGroupCountMax];
    public double OnlineVol[] = new double[BTS_ComBase.BattGroupCountMax];
    public double TestCapInt[] = new double[BTS_ComBase.BattGroupCountMax];
    public int MonMaxNum[] = new int[BTS_ComBase.BattGroupCountMax];
    public int MonMinNum[] = new int[BTS_ComBase.BattGroupCountMax];
    public double MonMaxValue[] = new double[BTS_ComBase.BattGroupCountMax];
    public double MonMinValue[] = new double[BTS_ComBase.BattGroupCountMax];
    public double TestCap[] = new double[BTS_ComBase.BattGroupCountMax];        //每组已测试容量
    public int    CRC;
    public BTS_ChargeState clone()
    {
        BTS_ChargeState obj = null;
        try
        {
            obj = (BTS_ChargeState)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return obj;
    }
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN) {
            return false;
        }
        //System.err.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
//        if(crc0 != crc1) {
//            //System.err.println("crc0:" + crc0 + "===crc1:" +crc1);
//            return false;
//        }
        tmpbuf.position(0);
        StartDT.year = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.month = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.day = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StartDT.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.year     = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.month = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.day     = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.hour  = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        StopDT.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        Test_Time.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestState = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestType = BTS_ComBase.changeByteToInt(tmpbuf.get());
        TestGroupNum = BTS_ComBase.changeByteToInt(tmpbuf.get());
        SaveDataEN = BTS_ComBase.changeByteToInt(tmpbuf.get());
        ChargeEN = BTS_ComBase.changeByteToInt(tmpbuf.get());
        ChargeOverTime = BTS_ComBase.changeByteToInt(tmpbuf.get());
        LastCapTestAlarmRes = BTS_ComBase.changeByteToInt(tmpbuf.get());
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            TestCur[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
//            //System.out.println("TestCur:"+TestCur[n]);
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            GroupVol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
//            //System.out.println("GroupVol:"+GroupVol[n]);
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            OnlineVol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 10;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            TestCapInt[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMaxNum[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMinNum[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMaxValue[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 1000;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            MonMinValue[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort()) / 1000;
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            TestCap[n] = tmpbuf.getDouble();
//            //System.out.println("TestCap:"+TestCap[n]);
        }
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        //System.out.println("CRC:"+CRC);
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.year));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.month));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.day));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StartDT.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.year));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.month));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.day));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(StopDT.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(Test_Time.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestState));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestType));
        bytebuffer.put(BTS_ComBase.changeIntToByte(TestGroupNum));
        bytebuffer.put(BTS_ComBase.changeIntToByte(SaveDataEN));
        bytebuffer.put(BTS_ComBase.changeIntToByte(ChargeEN));
        bytebuffer.put(BTS_ComBase.changeIntToByte(ChargeOverTime));
        bytebuffer.put(BTS_ComBase.changeIntToByte(LastCapTestAlarmRes));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(TestCur[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(GroupVol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(OnlineVol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(TestCapInt[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonMaxNum[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonMinNum[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonMaxValue[n]*1000));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(MonMinValue[n]*1000));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.capacity()-2);
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        //System.out.println("bytebuffer  limit:"+bytebuffer.limit());
        return bytebuffer;
    }
}
src/main/java/com/whyc/bts/BTS_ComBase.java
New file
@@ -0,0 +1,497 @@
package com.whyc.bts;
public class BTS_ComBase
{
    public static final int DataType_Dis     = 0xFD;            //放电
    public static final int DataType_Char     = 0xFC;            //充电
    public static final int DataType_Peac     = 0xFB;            //常规
    public static final int PARSE_RESULT_NULL = 0;            //未知
    public static final int PARSE_RESULT_SUCCESS = 1;        //解析成功
    public static final int PARSE_RESULT_NOTFOUNDFILE = 2;    //文件未找到
    public static final int PARSE_RESULT_FILETYPEERR = 3;    //文件格式错误
    public static final int PARSE_RESULT_FILEERROR = 4;        //文件异常
    //----------------------------------------------------------------------------
    public static final int     BattGroupCountMax                =    4;
    public static final int     BattGroupCountMax_Mutl            =    9;
    /**
     * 2022-03-29 lijun 新疆锂电BTS扩展支持2组每组320节单体情况
     */
    public static final int     MonomerCountMax                    =    640;
    //----------------------------------------------------------------------------
    public static final int     BTS_DCDC_CountMax                =    8;
    public static final int     LIBTS_DCDC_CountMax                =     4;                    //锂电BTS的最大DCDC模块信息
    //----------------------------------------------------------------------------
    public static final int     CMD_NULL                        =    0x00;
    //----------------------------------------------------------------------------
    //------------ 重启FBS9100设备 ------------------------------------------------
    public static final int     CMD_ResetSystemAck                =     0x0F;
    public static final int     CMD_ResetSystem                    =     0x10;
    //------------ 升级FBS9100软件 ------------------------------------------------
    public static final int     CMD_SystemUpdate                =    0x11;
    public static final int     CMD_SystemUpdateAck                =    0x12;
    //----------------------------------------------------------------------------
    //------------ 读取设备版本号、实时任务列表等 ----------------------------------
    public static final int     CMD_GetDeviceInf                =    0x15;
    public static final int     CMD_GetDeviceTaskInfAck            =    0x16;
    public static final int     CMD_GetDeviceTaskInf            =    0x17;
    public static final int        CMD_GetSyslogFileLen            =    0x18;
    public static final int        CMD_GetSyslogFileStr            =    0x19;
    public static final int        CMD_ClearSyslogFile                =    0x1A;
    public static final int      CMD_Connect                     =    0x20;
    public static final int      CMD_GetState                     =    0x22;
    //public static final int     CMD_GETDEVID                  =   0x23;        //获取设备id
    //----------------------------------------------------------------------------
    //------------ 启动放电测试和读取设置参数,读取放电测试状态----------------------
    public static final int     CMD_StartDischarge                =    0x25;
    public static final int     CMD_StartDischargeAck            =    0x26;
    public static final int     CMD_SetDischargeParmAck            =    0x27;
    public static final int     CMD_SetDischargeParm            =    0x28;
    public static final int     CMD_GetDischargeParm            =    0x29;
    public static final int     CMD_GetDischargeParmAck            =    0x30;
    public static final int     CMD_GetDischargeState            =    0x31;
    //----------------------------------------------------------------------------
    //------------ 启动内阻测试和读取内阻测试状态-----------------------------------
    public static final int     CMD_StartResDischarge            =    0x32;
    public static final int        CMD_GetResTestState                =    0x34;
    //-----------------------------------------------------------------------------
    //------------ 读取和设置电池参数-----------------------------------------------
    public static final int        CMD_GetBattParam                =    0x36;
    public static final int        CMD_SetBattParam                =    0x37;
    public static final int        CMD_GetBattParamACK                =    0x38;
    public static final int        CMD_SetBattParamACK                =    0x39;
    //----------------------------------------------------------------------------
    //------------ 启动充电测试和读取设置参数,读取充电测试状态-----------------------
    public static final int     CMD_StartCharge                    =    0x40;
    public static final int      CMD_SetChargeParm                =    0x43;
    public static final int      CMD_GetChargeParm                =    0x44;
    public static final int     CMD_GetChargeState                =    0x46;
    public static final int     CMD_Set_BattOFFLine                =    0x4A;
    public static final int     CMD_Set_BattONLine                =    0x4B;
    //-----------------------------------------------------------------------------
    //------------ 停止任何的测试 --------------------------------------------------
    public static final int     CMD_Start                        =    0x51;
    public static final int     CMD_StartAck                    =    0x52;
    public static final int     CMD_Stop                        =    0x53;
    public static final int     CMD_StopAck                        =    0x54;
    //----------------------------------------------------------------------------
    //------------ 读取电压电流、充放电测试、内阻测试数据 ---------------------------
    public static final int     CMD_GetVIData                    =    0x60;
    public static final int      CMD_GetMonomerData                =    0x61;
    public static final int     CMD_GetMonomerRES                =    0x62;
    public static final int      CMD_GetMonomerCAP                =    0x63;
    public static final int      CMD_GetMonomerChargeCAP            =    0x64;
    public static final int      CMD_GetMonomerTMP                =    0x65;
    public static final int      CMD_GetMonomerJHcurr            =    0x66;
    public static final int     CMD_Get_DCDC_Data                =    0x67;        //铁塔版本获取DCDC命令
    public static final int     CMD_Get_K_D_TestData            =     0x68;
    /**
     * 2021-08-31 @lijun  假负载版本新增均衡电流和漏液电压读取
     */
    public static final int     CMD_GetMonomerLYVolt            =    0x78;        //漏液电压
    public static final int     CMD_GetMonomerJHCUR                =    0x69;        //增加均衡电流
    public static final int     CMD_GetLiDCDCParam                =    0x8B;        //读取锂电DCDC参数
    public static final int     CMD_SetLiDCDCParam                =    0x8C;        //设置锂电DCDC参数
    public static final int     CMD_GetPbDCDCParam                =    0x8D;        //读取铅酸DCDC参数
    public static final int     CMD_SetPbDCDCParam                =    0x8E;        //设置铅酸DCDC参数
    public static final int     CMD_GetSXDCDCData                =    0x8F;        //读取双向DCDC内部数据
    public static final int     CMD_GetLiBMSData                =    0x95;        //读取锂电池BMS模拟量
    public static final int     CMD_GetLiBMSState                =    0x96;        //读取锂电池BMS告警量
    public static final int     CMD_ReStartDCDC                    =    0x9A;        //远程重启内部DCDC模块
    /**
     * 读取新疆锂电的组合BMS信心命令
     */
    public static final int     CMD_ReadLiBTSData                =    0x9B;        //读取新疆锂电BMS组合信息
    /**
     * 读取切换箱正负极开关状态
     */
    public static final int     CMD_ReadQHZZFZCDState            =    0xC3;        //读取切换箱正负极开关状态
    /**
     * 2022-01-06 edit by lijun 逆变设备新增机柜头数据
     *
     * 读取
     */
    public static final int     CMD_GetSimData                    =   0x99;        //读取逆变机柜头数据
    //------------ 平台锂电池命令 -----------------------------------------------------------------
    public static final int     CMD_GetLiDCDCParam_Ack            =     0x8D;        //读取锂电BTS参数成功
    public static final int      CMD_SetLiDCDCParam_Ack            =     0x8E;        //设置锂电BTS参数成功
    public static final int     CMD_GetSXDCDCData_Ack            =     0x92;        //读取双向DCDC内部数据成功
    public static final int     CMD_GetLiBMSData_Ack            =     0x93;        //读取锂电池BMS模拟量
    public static final int     CMD_GetLiBMSState_Ack            =     0x94;        //读取锂电池BMS告警量
    public static final int     CMD_ReStartDCDC_Ack                =    0x9B;        //远程重启内部DCDC模块成功
    //----------------------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //------------ 在线电压校准 ----------------------------------------------------
    public static final int     CMD_GetOnlineVolAdjParam        =    0x6A;
    public static final int     CMD_SetOnlineVolAdjParam        =    0x6B;
    //------------ 组端电压校准 ----------------------------------------------------
    public static final int     CMD_GetBattGroupVolAdjParam        =    0x6C;
    public static final int     CMD_SetBattGroupVolAdjParam        =    0x6D;
    //------------ 放电电流校准 ----------------------------------------------------
    public static final int     CMD_GetDischargeCurrAdjParam    =    0x6E;
    public static final int     CMD_SetDischargeCurrAdjParam    =    0x6F;
    //------------ 充电电流校准 ----------------------------------------------------
    public static final int     CMD_GetChargeCurrAdjParam        =    0x70;
    public static final int     CMD_SetChargeCurrAdjParam        =    0x71;
    //------------ 单体内阻校准 ----------------------------------------------------
    public static final int     CMD_GetBattResAdjParam            =   0x72;
    public static final int     CMD_SetBattResAdjParam            =    0x73;
    //------------ 单体电压偏移/斜率校准 --------------------------------------------
    public static final int     CMD_GetMonVolAdjParam            =    0x74;
    public static final int     CMD_SetMonVolAdjOffset            =    0x75;
    public static final int     CMD_SetMonVolAdjSlope            =    0x76;
    public static final int     CMD_ResetMonVolAdjParam            =    0x77;
    //-----------------------------------------------------------------------------
    //------------ 设置日期时间 ----------------------------------------------------
    public static final int     CMD_SetDateTime                    =   0x7A;
    //------------ 读取设置系统参数和告警参数 ---------------------------------------
    public static final int     CMD_GetSYSSetParamAck            =    0x7E;
    public static final int     CMD_SetSYSSetParamAck            =    0x7F;
    public static final int     CMD_GetSYSSetParam                =    0x80;
    public static final int     CMD_SetSYSSetParam                =    0x81;
    public static final int     CMD_GetAlarmParam                =    0x82;
    public static final int     CMD_SetAlarmParam                =    0x83;
    public static final int     CMD_GetAlarmParamAck            =    0x84;
    public static final int     CMD_SetAlarmParamAck            =    0x85;
    public static final int     CMD_GetJuHengParam                =   0xC1;                    //读取均衡参数
    public static final int     CMD_GetJuHengParamAck            =   0xC2;                    //读取均衡参数成功
    public static final int     CMD_SetJuHengParam                =   0xC3;                    //设置均衡参数
    public static final int     CMD_SetJuHengParamAck            =   0xC4;                    //设置均衡参数成功
    //-------------- 清除告警     --------------------------------------------------
    public static final int        CMD_ClearSysAlarm               =   0xB8;                    //清除告警
    public static final int        CMD_ClearSysAlarm_ACK           =   0xB9;                    //清除告警成功
    //------------------------------------------------------------------------------
    //------------ DFU 命令 ---------------------------------------------------------
    public static final int     CMD_FBS9100_WriteDFU            =     0x86;
    public static final int     CMD_FBS9100_ReadDFU             =     0x87;
    //------------------------------------------------------------------------------
    //读取cmcc的电压电流
    public static final int     CMD_ReadCMCCVolCurr             =   0x8A;
    //读取GPRS模块的信号质量
    public static final int     CMD_ReadGPRSCSQ                 =   0x91;
    public static final int     CMD_ReadGPRSCSQAck                 =   0x92;
    //读取干节点数据
    public static final int     CMD_ReadStemNode                =   0xC2;
    //清除告警
    public static final int     CMD_ClearAlarm                    =   0x90;
    /**
     *     @lijun 2021-11-13
     *     假负载BTS新增连接条阻抗信息以及温湿度信息读取
     */
    public static final int     CMD_ReadConnRes                    =   0x97;                    //读取连接条阻抗信息
    public static final int     CMD_ReadTmpHum                    =   0x98;                    //读取温湿度传感器信息
    public static final int     CMD_ReadBusCoupleState            =   0x9D;                    //读取智能母联状态
    public static final int     CMD_GetJunHengState                =   0xA8;                    //读取均衡供电模块信息
    public static final int     CMD_ReadJunHengParam            =   0xB0;                    //读取均衡参数信息
    public static final int     CMD_WriteJunHengParam            =   0xB1;                    //设置均衡参数信息
    public static final int     CMD_MutilMode_Control            =   0xB3;                    //并联电源控制命令
    public static final int     CMD_ReadMutilMode_Control        =   0xB4;                    //并联电源控制命令
    public static final int     CMD_WriteMutilMode_Control        =   0xB5;                    //并联电源控制命令
    public static final int     CMD_GetMutilMode_Param            =   0xB4;                    //读取并联电源参数
    public static final int     CMD_GetMutilMode_Param_Ack        =   0xB2;                    //读取并联电源参数成功
    public static final int     CMD_SetMutilMode_Param            =   0xB5;                    //设置并联电源参数
    public static final int     CMD_SetMutilMode_Param_Ack        =   0xB6;                    //设置并联电源参数成功
    /**
     * @lijun 2022-08-23
     * 并联电源新增并联参数相关读取设置主机命令
     */
    public static final int     CMD_ReadMultModeParam            =   0x3A;                    //读取并联电源模块参数
    public static final int     CMD_WriteMultModeParam            =   0x3B;                    //设置并联电源模块参数
    public static final int     CMD_GetMultModeParam            =   0x3A;                    //读取并联电源模块参数
    public static final int     CMD_GetMultModeParam_Ack        =   0x3C;                    //读取并联电源模块参数成功
    public static final int     CMD_SetMultModeParam            =   0x3B;                    //设置并联电源模块参数
    public static final int     CMD_SetMultModeParam_Ack        =   0x3D;                    //设置并联电源模块参数成功
    public static final int     CMD_ReadMutilTopology            =   0xB6;                    //读取并联BTS拓扑状态信息
    public static final int     CMD_ReadMutilMode_Param            =   0xB7;                    //读取并联BTS参数[9组]
    public static final int     CMD_WriteMutilMode_Param        =   0xB8;                    //设置并联BTS参数[9组]
    //------------ 测试类型 ---------------------------------------------------------
    public static final int        TestType_NULL                    =    0x00;
    public static final int        TestType_VOL                    =    0xF9;
    public static final int        TestType_MDISCHARGE                =    0xFA;
    public static final int        TestType_MCHARGE                =    0xFB;
    public static final int        TestType_Charge                    =    0xFC;
    public static final int        TestType_CAP                    =    0xFD;                    //正常核容放电测试类型
    public static final int        TestType_RES                    =    0xFE;
    public static final int        TestType_Charge_HELUQI            =    0xBC;
    public static final int        TestType_CAP_HELUQI                =    0xBD;                    //升压续航放电测试类型
    public static final int        TestType_SwitchDiode            =     0xD1;                    //KD测试
    //------------------------------------------------------------------------------
    //------------ 电池状态 ---------------------------------------------------------
    public static final int        BattState_Float                    =    0x00;
    public static final int        BattState_Discharge                =    0x01;
    public static final int        BattState_Charge                =    0x02;
    //------------------------------------------------------------------------------
    //------------ 数据类型 ---------------------------------------------------------
    public static final int        DataType_Null                    =    0x00;
    public static final int        DataType_MonVol                    =    0x01;
    public static final int        DataType_MonCap                    =    0x02;
    public static final int        DataType_MonRes                    =    0x03;
    public static final int        DataType_Temp                    =    0x04;
    public static final int        DataType_GrpVol                    =    0x05;
    public static final int        DataType_Curr                    =    0x06;
    public static final int        DataType_MonTmp                    =    0x07;
    public static final int        DataType_MonJHcurr                =    0x08;                    //均衡电流
    public static final int     DataType_MonLYvol                =    0x09;                    //漏液电压
    public static final int     DataType_MonConnRes                =    0x10;                    //连接条阻抗
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    public static final int     BTSE_DevType_BTS                =   0x02;                    //常规BTS
    public static final int     BTSE_DevType_XJBTS                =   0x09;                    //新疆锂电BTS
    public static final int     BTSE_DevType_TieTa                =    0x08;                    //铁塔版本的bt
    public static final int     BTSE_DevType_NiBian                =   0x06;                    //逆变版本的bts
    public static final int     BTSE_DevType_LIBTS                =   0x05;                    //锂电池版本的bts
    public static final int      BTSE_DevType_MULBTS                =   0x04;                    //并联BTS
    //------------------------------------------------------------------------------
    public static final int     SYS_STATE_STOPPED                =    0x00;
    public static final int     SYS_STATE_DISCHARGING            =    0x01;
    public static final int     SYS_STATE_CHARGING                =    0x02;
    public static final int     SYS_STATE_HELUQI_DISCHARGING    =    0x03;
    //------------------------------------------------------------------------------
    public static final int  STOP_CommErr                          =      0;       //核容中模块内部通信故障,核容失败
     public static final int  STOP_Manual                          =      1;       //手动停止核容,核容失败
     public static final int  STOP_VolLow2Min                     =      2;      //时长过短,核容失败
     public static final int  STOP_TimeOut                          =      3;      //达到最长核容时间,核容失败
     public static final int  STOP_Success                          =      4;      //电池电压低于核容终止电压,核容成功
     public static final int  STOP_CurrLow                          =    5;      //核容放电电流过小,核容失败
     public static final int  STOP_User                           =      6;      //手动停止
     public static final int  STOP_TimeEnd                         =     7;      //时间到停止
     public static final int  STOP_MonVolL                         =     8;      //单体下限停止
     public static final int  STOP_BattVolL                        =     9;      //电池电压下限到
     public static final int  STOP_MonTmpH                        =     10;     //单体温度上限到
    //-------------------------------------------------------------------------------------------
    public static final int     ALARM_NULL                         =    0;        //无
    public static final int     ALARM_PAUSED                    =    1;        //暂停
    public static final int     ALARM_DISCHARGING                =    2;        //正在放电测试
    public static final int     ALARM_DISCHARGEWAIT                =    3;        //正在等待放电
    public static final int     ALARM_LimitCHARGING                =    4;        //正在限流充电
    public static final int     ALARM_LargeCHARGING                =    5;        //正在直连充电
    public static final int     ALARM_CHARGEWAIT                   =    6;        //正在等待充电
    public static final int     ALARM_TIMESTOP                     =    7;        //放电时间到停止
    public static final int     ALARM_CAPSTOP                     =    8;        //放电容量到停止
    public static final int     ALARM_MVLLSTOP                     =    9;        //单体电压下限到停止
    public static final int     ALARM_SVLLSTOP                     =    10;        //组端电压下限到停止
    public static final int     ALARM_POWERBREAKSTOP             =    11;        //市电中断停止
    public static final int     ALARM_FLASHUPSTOP                 =    12;        //存储数据满停止
    public static final int     ALARM_TEMPHIGHSTOP               =    13;        //机内温度异常停止
    public static final int     ALARM_CURRSTOP                    =    14;        //放电电流过流停止
    public static final int     ALARM_PCCOMMBREAKSTOP             =    15;        //后台通信中断停止
    public static final int     ALARM_LoaderCOMMBREAKSTOP         =    16;        //负载模块通信中断停止
    public static final int     ALARM_Sel2TO1COMMBREAKSTOP         =    17;        //选择模块通信中断停止
    public static final int     ALARM_LoaderPowerError             =    18;        //负载模块放电过功率停止
    public static final int     ALARM_Malloc_ERROR                 =    19;        //内部程序异常停止
    public static final int     ALARM_POWERRESUMESTOP_HELUQI     =    20;        //合路器放电功能,市电恢复停止升压放电
    public static final int     ALARM_POWERBREAKSTOP_HELUQI     =    21;        //合路器放电功能,充电过程中市电中断
    public static final int     ALARM_SVLLSTOP_HELUQI             =    22;        //合路器放电功能组端电压下限
    public static final int     ALARM_MOMTEMP_HL_STOP             =    23;        //单体温度上限到停止
    public static final int     ALARM_ONLINEVOL_HL_STOP         =    24;        //在线电压异常高停止
    public static final int     ALARM_XIEZHUANG_COMM_ERR_STOP    =    25;        //协转通信异常停止
    public static final int     ALARM_MONOMER_COMM_ERR_STOP        =    26;        //单体通信异常停止
    public static final int     ALARM_UNKOWN                     =    27;        //未知
    //-------------------------------------------------------------------------------------------
    public static byte changeIntToByte(int data)
    {
        return (byte)(data & 0xFF);
    }
    //------------------------------------------------------------------------------
    public static short changeIntToShort(int data)
    {
        return (short)(data & 0xFFFF);
    }
    //------------------------------------------------------------------------------
    public static byte changeShortToByte(short data)
    {
        return (byte)(data & 0xFF);
    }
    //------------------------------------------------------------------------------
    public static int changeByteToInt(byte data)
    {
        int tmp = data;
        return (tmp & 0xFF);
    }
    //------------------------------------------------------------------------------
    public static int changeShortToInt(short data)
    {
        int tmp = data;
        return (tmp & 0xFFFF);
    }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    /**
     *     有符号数转成int
     * @param data
     * @return
     */
    public static int changeSingeShortToInt(short data)
    {
        int tmp = data;
        return (tmp);
    }
    //------------------------------------------------------------------------------
    public static double changeShortToDouble(short data)
    {
        int tmp = data & 0xFFFF;
        return (double)(tmp);
    }
    public static float changeShortToFloat(short data)
    {
        int tmp = data & 0xFFFF;
        return (float)(tmp);
    }
    //------------------------------------------------------------------------------
    public static short changeDoubleToShort(double data)
    {
        int tmp = (int)data;
        //System.out.println("tmp:"+tmp);
        return (short)(tmp & 0xFFFF);
    }
    public static short changeFloatToShort(float data)
    {
        int tmp = (int)data;
        return (short)(tmp & 0xFFFF);
    }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    public static double GetFDCurrent(double stdcap, int hourrate)
    {
        double res = 0.055;
        switch(hourrate)
        {
            case 1: res = 0.514; break;
            case 2: res = 0.306; break;
            case 3: res = 0.250; break;
            case 4: res = 0.200; break;
            case 5: res = 0.166; break;
            case 6: res = 0.146; break;
            case 7: res = 0.131; break;
            case 8: res = 0.118; break;
            case 9: res = 0.108; break;
            case 10: res = 0.100; break;
            case 20: res = 0.055; break;
            default: res = 0.055; break;
        }
        return (stdcap * res);
    }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    public static int GetHourRate(int stdah, int current)
    {
        int index = 0;
        int value[]={514, 306, 250, 200, 166, 146, 131, 118, 108, 100, 55};
        int res;
        res = (current*100)/(stdah/10);
        if(res>=514) return 1;
        else if(res<=55) return 20;
        else
        {
            for(index=0; index<10; index++)
            {
                if((res<=value[index]) && (res>value[index+1]))    break;
                else continue;
            }
            if((value[index]-res) < (res-value[index+1]))
            {
                return (index+1);
            }
            else
            {
                if(index+2 > 10) return (20);
                else return (index+2);
            }
        }
    }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    public static double N_TO_10H(int n_H)
    {
        switch(n_H)
        {
            case  1 : return(1/0.55);
            case  2 : return(1/0.61);
            case  3 : return(1/0.75);
            case  4 : return(1/0.79);
            case  5 : return(1/0.833);
            case  6 : return(1/0.876);
            case  7 : return(1/0.917);
            case  8 : return(1/0.944);
            case  9 : return(1/0.974);
            case  10: return(1/1);
            case  20: return(1/1.1);
        }
        return 1.0;
    }
    //-------------------------------------------------------------------------------
    /*
    //-------------------------------------------------------------------------------
    double GetMonomerCap(double STDAH, int HourRate, double SumAH, double MaxMonomerVol,
                        double MonomerVol, double MonomerVolType, int CapType)
    {
        if(MaxMonomerVol - MonomerVolType*0.9 == 0)
            return 0;
        if(SumAH < 0)
            SumAH *= (-1);
        double tmp_cap;
        tmp_cap = MonomerVol - MonomerVolType * 0.9;
        tmp_cap *= (STDAH - SumAH * N_TO_10H(HourRate));
        tmp_cap = tmp_cap/(MaxMonomerVol - MonomerVolType*0.9);
        if(tmp_cap < 0)
            tmp_cap = 0;
        if(CapType == CapType_Rest)
            return tmp_cap;
        else if(CapType == CapType_Sum)
            return (tmp_cap + SumAH * N_TO_10H(HourRate));
        else
            return ((tmp_cap + SumAH * N_TO_10H(HourRate))*100 / STDAH);
    }
    //----------------------------------------------------------------------------------
    */
}
src/main/java/com/whyc/bts/BTS_Crc16.java
New file
@@ -0,0 +1,61 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
public class BTS_Crc16 {
    private final static int CRC16Table[] =
    {
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
        0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
        0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
        0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
        0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
        0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
        0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
        0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
        0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
        0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
        0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
        0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
        0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
        0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
        0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
        0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
        0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
        0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
        0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
        0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
        0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
        0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
        0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
        0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
        0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
        0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
        0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
        0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
        0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
        0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
        0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
        0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
    };
    public static int CalCRC16(final ByteBuffer buf, int count)
    {
        ByteBuffer tmpbuf = buf;
        tmpbuf.position(0);
        int crc = 0xFFFF;    //关键性的初值...
        int tmp;
        for (int i=0; i<count; i++)
        {
                if(!buf.hasRemaining())
                    break;
                tmp = crc;
                crc = CRC16Table[(int)((((tmp&0xFFFF) >> 8) ^ (tmpbuf.get())) & 0xFF)];
                crc = crc ^ ((tmp&0xFFFF) << 8);
        }
        return (crc & 0xFFFF);
    }
}
src/main/java/com/whyc/bts/BTS_DataType.java
New file
@@ -0,0 +1,74 @@
package com.whyc.bts;
import java.io.FileInputStream;
import java.io.IOException;
public class BTS_DataType {
    public static final int BYTE_LEN = 4;
    public int typeTag0;
    public int typeTag1;
    public int typeTag2;
    public int typeTag3;
    public int checkDataHead(FileInputStream fis)
    {
        boolean file_end = false;
        byte type_tag = 0;
        byte[] tag = new byte[1];
        try {
            while(true)
            {
                type_tag = 0;
                int n = 0;
                for(n=0; n<4; n++)
                {
                    if(1 != fis.read(tag, 0, 1))
                    {
                        file_end = true;
                        break;
                    }
                    if((0xFD != (tag[0]&0xFF)) && (0xFC != (tag[0]&0xFF)) && (0xFB != (tag[0]&0xFF)))
                    {
                        break;
                    }
                }
                if(n >= 4)
                {
                    type_tag = tag[0];
                    break;
                }
                if(true == file_end)
                {
                    type_tag = 1;
                    break;
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
        }
        setType(type_tag&0xFF);
        return (typeTag0);
    }
    public byte[] getDataTypeByte() {
        byte[] data = new byte[BYTE_LEN];
        data[0] = BTS_ComBase.changeIntToByte(typeTag0);
        data[1] = BTS_ComBase.changeIntToByte(typeTag1);
        data[2] = BTS_ComBase.changeIntToByte(typeTag2);
        data[3] = BTS_ComBase.changeIntToByte(typeTag3);
        return data;
    }
    public void setType(int type)
    {
        typeTag0 = type;
        typeTag1 = type;
        typeTag2 = type;
        typeTag3 = type;
    }
}
src/main/java/com/whyc/bts/BTS_DateTime.java
New file
@@ -0,0 +1,73 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Calendar;
public class BTS_DateTime {
    public int year = 0;
    public int month = 1;
    public int day = 1;
    public int hour = 0;
    public int minute = 0;
    public int second = 0;
    public BTS_DateTime clone()
    {
        BTS_DateTime obj = new BTS_DateTime();
        obj.year = year;
        obj.month = month;
        obj.day = day;
        obj.hour = hour;
        obj.minute = minute;
        obj.second = second;
        return obj;
    }
    public void putByteBuffer(final ByteBuffer bf)
    {
        year = BTS_ComBase.changeByteToInt(bf.get());
        month = BTS_ComBase.changeByteToInt(bf.get());
        day = BTS_ComBase.changeByteToInt(bf.get());
        hour = BTS_ComBase.changeByteToInt(bf.get());
        minute = BTS_ComBase.changeByteToInt(bf.get());
        second = BTS_ComBase.changeByteToInt(bf.get());
    }
    public ByteBuffer getPCDateTimeBytes()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(12);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        Calendar cad = Calendar.getInstance();
        //cad.set(23, 5, 10);
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.YEAR)%100));
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.MONTH)+1));
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.DAY_OF_MONTH)));
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.HOUR_OF_DAY)));
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.MINUTE)));
        bytebuffer.put(BTS_ComBase.changeIntToByte(cad.get(Calendar.SECOND)));
        bytebuffer.flip();
        //System.out.println("设置时间:"+cad.get(Calendar.YEAR)+"-"+(cad.get(Calendar.MONTH)+1)+"-"+cad.get(Calendar.DAY_OF_MONTH)+" "+cad.get(Calendar.HOUR_OF_DAY)+":"+cad.get(Calendar.MINUTE)+":"+cad.get(Calendar.SECOND));
        return bytebuffer;
    }
    public long getTimeInMillis() {
        Calendar ca = Calendar.getInstance();
        int month_t = month;
        if(month_t > 0) {
            month_t -= 1;
        }
        ca.set(year+2000, month_t, day, hour, minute, second);
        return ca.getTimeInMillis();
    }
    @Override
    public String toString() {
        return "FBS9100_DateTime [year=" + year + ", month=" + month + ", day=" + day + ", hour=" + hour + ", minute="
                + minute + ", second=" + second + "]";
    }
}
src/main/java/com/whyc/bts/BTS_DisChargeData.java
New file
@@ -0,0 +1,142 @@
package com.whyc.bts;
import com.whyc.util.ComFn;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
/**
 *     放电数据
 * @author DELL
 *
 */
@Component
public class BTS_DisChargeData {
    public int parse_result = BTS_ComBase.PARSE_RESULT_NULL;    //解析结果
    public BTS_BattParam battParam;                    //电池参数
    public BTS_DischargeParam dischargeParam;        //核容参数
    public BTS_CapState capState;                    //容量参数
    public List<BTS_FbsData> fbsDatas;                //每次记录的单体数据
    public BTS_DisChargeData() {
        battParam = new BTS_BattParam();
        dischargeParam = new BTS_DischargeParam();
        capState = new BTS_CapState();
        fbsDatas = new ArrayList<BTS_FbsData>();
    }
    /**
     *     解析充电数据
     * @param filePath
     */
    public void readDisFile(String filePath)
    {
        FileInputStream fis = null;
        try {
            File f = new File(filePath);
            if(!filePath.endsWith(".BCP") || !filePath.toUpperCase().endsWith(".BCP")) {
                //文件格式错误
                parse_result = BTS_ComBase.PARSE_RESULT_FILETYPEERR;
                return;
            }
            if(!f.exists()) {
                //文件不存在
                parse_result = BTS_ComBase.PARSE_RESULT_NOTFOUNDFILE;
                return;
                ////System.out.println("文件不存在..........");
            }
            fis = new FileInputStream(f);
            byte[] buf = new byte[2048];
            if(fis.read(buf, 0, buf.length) == 2048)
            {
                if(this.checkTestDataHead(buf)) {
                    parse_result = BTS_ComBase.PARSE_RESULT_SUCCESS;
                }else {
                    parse_result = BTS_ComBase.PARSE_RESULT_FILEERROR;
                }
                BTS_DataType dataType = new BTS_DataType();
                while(true)
                {
                    int tag = dataType.checkDataHead(fis);
                    if((0xFD == tag) || (0xFC == tag) || (0xFB == tag))
                    {
                        //System.out.println("#################");
                        byte[] databuf = new byte[BTS_FbsData.BASIC_LEN + (battParam.EachGroupBattCount*battParam.BattGroupCount)*2 -4];
                        if(fis.read(databuf) == databuf.length)
                        {
                            ByteBuffer bf = ByteBuffer.allocate(databuf.length + BTS_DataType.BYTE_LEN);
                            bf.order(ByteOrder.LITTLE_ENDIAN);
                            bf.put(dataType.getDataTypeByte());
                            bf.put(databuf);
                            bf.flip();
                            bf.position(0);
                            //System.out.println(ComFn.bytesToHexString(databuf, databuf.length));
                            BTS_FbsData fbsData = new BTS_FbsData();
                            if(fbsData.putByteBuffer(bf, 0, 0)) {
                                fbsDatas.add(fbsData);
                            }
                        }
                    }
                    if(tag == 1)
                        break;
                }
            }else {
                parse_result = BTS_ComBase.PARSE_RESULT_FILEERROR;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != fis)
            {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     *     解析文件头数据
     * @return
     */
    public boolean checkTestDataHead(byte[] buf) {
        boolean checkOk = true;
        ByteBuffer buffer = ByteBuffer.allocate(buf.length);
        buffer.order(ByteOrder.LITTLE_ENDIAN);
        buffer.put(buf);
        buffer.flip();
        buffer.position(0);
        checkOk = checkOk && battParam.putByteBuffer(buffer);
        //System.out.println(battParam);
        //System.out.println("checkTestDataHead:"+checkOk);
        checkOk = checkOk && dischargeParam.putByteBuffer(buffer);
        //System.out.println(dischargeParam);
        //System.out.println("checkTestDataHead:"+checkOk);
        capState.putByteBuffer(buffer);
        return checkOk;
    }
}
src/main/java/com/whyc/bts/BTS_DischargeParam.java
New file
@@ -0,0 +1,200 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
 *     核容参数
 * @author DELL
 *
 */
public class BTS_DischargeParam implements Cloneable{
    private final int BYTE_LEN = 44;
    //private final int BYTE_LEN = 45;
    public int op_cmd = 0;
    public int test_cmd = 0;
    public int HourRate = 0;
    public float DisCurr = 0;
    public float DisCap = 0;
    public int DisTime = 0;
    public float GroupVol_LOW = 0;
    public float MonomerVol_LOW = 0;
    public int MonomerLowCount = 0;
    public int BattGroupNum = 0;
    public int OnlineVolLowAction = 0;
    public int StaticTime = 0;
    public int DisTestCount = 0;
    public float DCVolHighLimit = 0;
    public float ChargeCurrSet = 0;
    public int bakeup3 = 0;
    public float MonomerTmp_High = 0;        //温度上限
    public float ChargeVolt = 0;            //均充电压[0.1V](18~57.5)
    public int bakeup6 = 0;
    public int bakeup7 = 0;
    public int bakeup8 = 0;
    public int bakeup9 = 0;
    public int bakeup10 = 0;
    public int CRC = 0;
    public BTS_DischargeParam clone()
    {
        BTS_DischargeParam obj = null;
        try
        {
            obj = (BTS_DischargeParam)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return obj;
    }
    public void clear()
    {
        HourRate = 0;
        DisCurr = 0;
        DisCap = 0;
        DisTime = 0;
        GroupVol_LOW = 0;
        MonomerVol_LOW = 0;
        MonomerLowCount = 0;
        BattGroupNum = 0;
        OnlineVolLowAction = 0;
        StaticTime = 0;
        DisTestCount = 0;
        DCVolHighLimit = 0;
        ChargeCurrSet = 0;
        bakeup3 = 0;
        MonomerTmp_High = 0;
        ChargeVolt = 0;
        bakeup6 = 0;
        bakeup7 = 0;
        bakeup8 = 0;
        bakeup9 = 0;
        bakeup10 = 0;
        CRC = 0;
    }
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN){
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(BYTE_LEN-2) & 0xFFFF;
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BYTE_LEN-2);
        if(crc0 != crc1){
            //System.out.println("FBS9100_ParamDischarge:crc0:"+crc0+"===crc1:"+crc1);
            return false;
        }
        tmpbuf.position(0);
        HourRate = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        DisCurr = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        DisCap = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        DisTime = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        GroupVol_LOW = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        MonomerVol_LOW = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        MonomerLowCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        BattGroupNum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        OnlineVolLowAction = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        StaticTime = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        DisTestCount = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        DCVolHighLimit = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        ChargeCurrSet = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
        bakeup3 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        MonomerTmp_High = (float)BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
        ChargeVolt = (float)BTS_ComBase.changeShortToFloat(tmpbuf.getShort())/10;
        bakeup6 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup7 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup8 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup9 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        bakeup10 = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        CRC =  BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer getByteBuffer()
    {
        //System.out.println(this);
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(HourRate));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(DisCurr));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(DisCap));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(DisTime));
        //bytebuffer.putShort(BTS_ComBase.changeDoubleToShort((GroupVol_LOW+0.000001)*10));
        bytebuffer.putShort(BTS_ComBase.changeFloatToShort((GroupVol_LOW)*10));
        bytebuffer.putShort(BTS_ComBase.changeFloatToShort((MonomerVol_LOW)*1000));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(MonomerLowCount));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(BattGroupNum));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(OnlineVolLowAction));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(StaticTime));
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(DisTestCount));
        bytebuffer.putShort(BTS_ComBase.changeFloatToShort((DCVolHighLimit)*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(ChargeCurrSet));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup3));
        bytebuffer.putShort(BTS_ComBase.changeFloatToShort((MonomerTmp_High)*10));
        bytebuffer.putShort(BTS_ComBase.changeFloatToShort((ChargeVolt)*10));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup6));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup7));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup8));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup9));
        bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(bakeup10));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.position());
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        ////System.out.println(this+"$$$$$$$$$$$$$$$$$$$$$$$$$");
        bytebuffer.flip();
        return bytebuffer;
    }
    @Override
    public String toString() {
        return "FBS9100_ParamDischarge [BYTE_LEN=" + BYTE_LEN + ", op_cmd=" + op_cmd + ", test_cmd=" + test_cmd
                + ", HourRate=" + HourRate + ", DisCurr=" + DisCurr + ", DisCap=" + DisCap + ", DisTime=" + DisTime
                + ", GroupVol_LOW=" + GroupVol_LOW + ", MonomerVol_LOW=" + MonomerVol_LOW + ", MonomerLowCount="
                + MonomerLowCount + ", BattGroupNum=" + BattGroupNum + ", OnlineVolLowAction=" + OnlineVolLowAction
                + ", StaticTime=" + StaticTime + ", DisTestCount=" + DisTestCount + ", DCVolHighLimit=" + DCVolHighLimit
                + ", ChargeCurrSet=" + ChargeCurrSet + ", bakeup3=" + bakeup3 + ", bakeup4=" + MonomerTmp_High + ", ChargeVolt=" + ChargeVolt
                + ", bakeup6=" + bakeup6 + ", bakeup7=" + bakeup7 + ", bakeup8=" + bakeup8 + ", bakeup9=" + bakeup9
                + ", bakeup10=" + bakeup10 + ", CRC=" + CRC + "]";
    }
    public static void main(String[] args) {
        double d = 56.6;
        float f = (float)d;
        float ff = (56.6f)*10;
        //System.err.println(f);
        double dd = 56.6;
        //System.out.println("dd:"+dd);
        BTS_ComBase.changeDoubleToShort((dd)*10);
        //System.out.println((int)ff);
    }
}
src/main/java/com/whyc/bts/BTS_FbsData.java
New file
@@ -0,0 +1,559 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
public class BTS_FbsData {
    private final int BYTE_LEN = 1500;
    private final static int BATTGROUP_COUNT = BTS_ComBase.BattGroupCountMax;
    public static final int BASIC_LEN = 12 + 20*BATTGROUP_COUNT;
    //public FBS9100_SysState m_SysState = new FBS9100_SysState();
    public int dataType[] = {0xAA, 0xAA, 0xAA, 0xAA};
    public int CRC = 0;
    public BTS_TestTime testTime = new BTS_TestTime();
    public int battGroup = 1;
    public int battSum = 24;
    public int battGroupNum = 1;
    public int battXuHangTime = 0;
    public int stationPowerOffTLong = 0;
    public int stationPowerOffCNT = 0;
    public double conresist  = 0;                //组1接触器导通阻抗 (0.001mR)
    public double conresist1 = 0;                //组2接触器导通阻抗 (0.001mR)
    public double condvoldp  = 0;                //组1二极管压降(0.01V)
    public double condvoldp1 = 0;                //组2二极管压降(0.01V)
    public double onlinevol[] = new double[BTS_ComBase.BattGroupCountMax_Mutl];    //在线电压
    public double groupvol[] = new double[BTS_ComBase.BattGroupCountMax_Mutl];    //组端电压
    public int battstate[] = new int[BTS_ComBase.BattGroupCountMax];            //充放电状态     3   5   9
    public double battcurr[] = new double[BTS_ComBase.BattGroupCountMax_Mutl];    //电池组电流
    public double battcap[] = new double[BTS_ComBase.BattGroupCountMax];        //电池组容量
    public double batttemp[] = new double[BTS_ComBase.BattGroupCountMax_Mutl];  //电池组温度
    public int monMAX_num[] = new int[BTS_ComBase.BattGroupCountMax];            //最大单体编号
    public int monMIN_num[] = new int[BTS_ComBase.BattGroupCountMax];            //最低按单体编号
    public double monvolMAX[] = new double[BTS_ComBase.BattGroupCountMax];        //最大单体电压
    public double monvolMIN[] = new double[BTS_ComBase.BattGroupCountMax];        //最低单体电压
    /**
     * @2022-06-15 lijun 并联BTS新增结构体
     */
    public double onlinecurr[] = new double[BTS_ComBase.BattGroupCountMax];        //并联BTS时读取的电流
    public double vol[] = new double[BTS_ComBase.MonomerCountMax];                //单体电压
    public BTS_FbsData clone()
    {
        BTS_FbsData obj = new BTS_FbsData();
        //obj.m_SysState = (FBS9100_SysState) m_SysState.clone();
        obj.dataType = dataType.clone();
        obj.CRC = CRC;
        obj.testTime = testTime;
        obj.battGroup = battGroup;
        obj.battSum = battSum;
        obj.onlinevol = onlinevol.clone();
        obj.groupvol = groupvol.clone();
        obj.battstate = battstate.clone();
        obj.battcurr = battcurr.clone();
        obj.battcap = battcap.clone();
        obj.batttemp = batttemp.clone();
        obj.monMAX_num = monMAX_num.clone();
        obj.monMIN_num = monMIN_num.clone();
        obj.monvolMAX = monvolMAX.clone();
        obj.monvolMIN = monvolMIN.clone();
        obj.vol = vol.clone();
        return obj;
    }
    public boolean putByteBuffer(byte[] data, int dev_type, int soft_ver)
    {
        ByteBuffer bf = ByteBuffer.allocate(data.length);
        bf.order(ByteOrder.LITTLE_ENDIAN);
        bf.put(data);
        bf.flip();
        bf.position(0);
        if(bf.limit() < BASIC_LEN)
            return false;
        int battcount = bf.getShort(10);
        if(battcount > BTS_ComBase.MonomerCountMax) {
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(4) & 0xFFFF;
        tmpbuf.putShort(4, (short) 0);
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BASIC_LEN + 2*battcount);
        if(crc0 != crc1) {
            return false;
        }
        tmpbuf.position(0);
        for(int n=0; n<4; n++)
            dataType[n] = BTS_ComBase.changeByteToInt(tmpbuf.get());
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        testTime.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battGroup = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        /***  2020-12-04 lijun 逆变版本的设备在线电压和组端电压不用/10  ****/
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double o_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) || (soft_ver >= 35)) && (0x06 != dev_type)) {
                o_v /= 10;
            }
            onlinevol[n] = o_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double g_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) || (soft_ver >= 35)) && (0x06 != dev_type)) {
                g_v /= 10;
            }
            groupvol[n] = g_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            battstate[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_curr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_curr *= -1;
            }
            battcurr[n] = b_curr;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_cap = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_cap *= -1;
            }
            battcap[n] = b_cap;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()-(short)100))/10;
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMAX_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        battXuHangTime = (monMAX_num[0]<<16) + monMAX_num[1];
        stationPowerOffTLong = (monMAX_num[2]<<16) + monMAX_num[3];
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMIN_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        stationPowerOffCNT = monMIN_num[0];
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMAX[n] = ((double)BTS_ComBase.changeShortToDouble(tmpbuf.getShort()))/100;
        conresist = monvolMAX[0]/10;
        conresist1 = monvolMAX[1]/10;
        condvoldp = monvolMAX[2];
        condvoldp1 = monvolMAX[3];
        ////System.out.println(conresist+"=="+conresist1+"=="+condvoldp+"=="+condvoldp1);
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMIN[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        for(int n=0; n<battSum; n++) {
            vol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        }
        //System.out.println(this);
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public boolean putByteBuffer(final ByteBuffer bf, int dev_type, int soft_ver)
    {
        if(bf.limit() < BASIC_LEN)
            return false;
        int battcount = bf.getShort(10);
        if(battcount > BTS_ComBase.MonomerCountMax) {
            ////System.out.println("battcount:"+battcount);
            return false;
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(4) & 0xFFFF;
        tmpbuf.putShort(4, (short) 0);
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BASIC_LEN + 2*battcount);
        if(crc0 != crc1) {
            ////System.out.println("crc0:"+crc0+"===crc1:"+crc1);
            return false;
        }
        tmpbuf.position(0);
        for(int n=0; n<4; n++)
            dataType[n] = BTS_ComBase.changeByteToInt(tmpbuf.get());
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        testTime.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battGroup = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        /***  2020-12-04 lijun 逆变版本的设备在线电压和组端电压不用/10  ****/
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double o_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
//            if(((0x08 == dev_type) || (soft_ver >= 35)) && (0x06 != dev_type)) {
                o_v /= 10;
//            }
            onlinevol[n] = o_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double g_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
//            if(((0x08 == dev_type) || (soft_ver >= 35)) && (0x06 != dev_type)) {
                g_v /= 10;
//            }
            groupvol[n] = g_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            battstate[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_curr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_curr *= -1;
            }
            battcurr[n] = b_curr;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_cap = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_cap *= -1;
            }
            battcap[n] = b_cap;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()-(short)100))/10;
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMAX_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        battXuHangTime = (monMAX_num[0]<<16) + monMAX_num[1];
        stationPowerOffTLong = (monMAX_num[2]<<16) + monMAX_num[3];
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMIN_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        stationPowerOffCNT = monMIN_num[0];
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMAX[n] = ((double)BTS_ComBase.changeShortToDouble(tmpbuf.getShort()))/100;
        conresist = monvolMAX[0]/10;
        conresist1 = monvolMAX[1]/10;
        condvoldp = monvolMAX[2];
        condvoldp1 = monvolMAX[3];
        ////System.out.println(conresist+"=="+conresist1+"=="+condvoldp+"=="+condvoldp1);
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMIN[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        for(int n=0; n<battSum; n++) {
            vol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        }
        //System.out.println(this);
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    /**
     * 2021-05-11 911设备用于区分大功率假负载设备读取在线电压和组端电压数据修改
     * @param bf
     * @param dev_type
     * @param soft_ver
     * @param hard_ver
     * @return
     */
    public boolean putByteBuffer(final ByteBuffer bf, int dev_type, int soft_ver,int hard_ver)
    {
        if(bf.limit() < BASIC_LEN)
            return false;
        int battcount = bf.getShort(10);
        if(BTS_ComBase.BTSE_DevType_LIBTS != dev_type) {
            ////System.out.println("单体数目:"+battcount +"===设备类型:"+dev_type);
            if(battcount > BTS_ComBase.MonomerCountMax) {
                return false;
            }
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(4) & 0xFFFF;
        tmpbuf.putShort(4, (short) 0);
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BASIC_LEN + 2*battcount);
        if(crc0 != crc1) {
            //System.out.println("crc0:"+crc0+"=crc1"+crc1);
            return false;
        }
        tmpbuf.position(0);
        for(int n=0; n<4; n++)
            dataType[n] = BTS_ComBase.changeByteToInt(tmpbuf.get());
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        testTime.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battGroup = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        /***  2020-12-04 lijun 逆变版本的设备在线电压和组端电压不用/10  ****/
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double o_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) ||(0x05 == dev_type)||(0x07 == dev_type) || (soft_ver >= 35)) && ((0x06 != dev_type) || (0x06 == dev_type && hard_ver >70 && hard_ver < 80))) {
                o_v /= 10;
            }
            onlinevol[n] = o_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double g_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) ||(0x05 == dev_type)||(0x07 == dev_type) || (soft_ver >= 35)) && ((0x06 != dev_type) || (0x06 == dev_type && hard_ver >70 && hard_ver < 80))) {
                g_v /= 10;
            }
            groupvol[n] = g_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            battstate[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_curr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_curr *= -1;
            }
            battcurr[n] = b_curr;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_cap = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_cap *= -1;
            }
            //battcap[n] = b_cap;
            battcap[n] = b_cap/100;                //锂电BTS,消耗的电能
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            /**
             * 2021-10-27 @lijun 修复温度<10度时,温度显示bug
             */
            //batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()-(short)100))/10;
            batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()))/10 -10;
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMAX_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        battXuHangTime = (monMAX_num[0]<<16) + monMAX_num[1];
        stationPowerOffTLong = (monMAX_num[2]<<16) + monMAX_num[3];
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMIN_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        stationPowerOffCNT = monMIN_num[0];
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMAX[n] = ((double)BTS_ComBase.changeShortToDouble(tmpbuf.getShort()))/100;
        conresist = monvolMAX[0]/10;
        conresist1 = monvolMAX[1]/10;
        condvoldp = monvolMAX[2];
        condvoldp1 = monvolMAX[3];
        ////System.out.println(conresist+"=="+conresist1+"=="+condvoldp+"=="+condvoldp1);
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMIN[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        //battSum = 48;
        ////System.out.println("电池组单体数目:"+battSum);
        for(int n=0; n<battSum; n++) {
            vol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        }
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    /**
     * 2021-05-11 911设备用于区分大功率假负载设备读取在线电压和组端电压数据修改
     * @param bf
     * @param dev_type
     * @param soft_ver
     * @param hard_ver
     * @return
     */
    public boolean putByteMutlBuffer(final ByteBuffer bf, int dev_type, int soft_ver,int hard_ver)
    {
        if(bf.limit() < BASIC_LEN)
            return false;
        int battcount = bf.getShort(10);
        if(BTS_ComBase.BTSE_DevType_LIBTS != dev_type) {
            ////System.out.println("单体数目:"+battcount +"===设备类型:"+dev_type);
            if(battcount > BTS_ComBase.MonomerCountMax) {
                return false;
            }
        }
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(4) & 0xFFFF;
        tmpbuf.putShort(4, (short) 0);
        //每组增添后备电流数据
        int crc1 = BTS_Crc16.CalCRC16(tmpbuf, BASIC_LEN + 2*battcount+8);
        if(crc0 != crc1) {
            //System.out.println("crc0:"+crc0+"=crc1"+crc1);
            return false;
        }
        tmpbuf.position(0);
        for(int n=0; n<4; n++)
            dataType[n] = BTS_ComBase.changeByteToInt(tmpbuf.get());
        CRC = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        testTime.hour = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.minute = BTS_ComBase.changeByteToInt(tmpbuf.get());
        testTime.second = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battGroup = BTS_ComBase.changeByteToInt(tmpbuf.get());
        battSum = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        /***  2020-12-04 lijun 逆变版本的设备在线电压和组端电压不用/10  ****/
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double o_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) ||(0x05 == dev_type)||(0x04 == dev_type) || (soft_ver >= 35)) && ((0x06 != dev_type) || (0x06 == dev_type && hard_ver >70 && hard_ver < 80))) {
                o_v /= 10;
            }
            onlinevol[n] = o_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double g_v = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(((0x08 == dev_type) ||(0x05 == dev_type)||(0x04 == dev_type) || (soft_ver >= 35)) && ((0x06 != dev_type) || (0x06 == dev_type && hard_ver >70 && hard_ver < 80))) {
                g_v /= 10;
            }
            groupvol[n] = g_v;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            battstate[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_curr = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/10;
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_curr *= -1;
            }
            battcurr[n] = b_curr;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            double b_cap = BTS_ComBase.changeShortToDouble(tmpbuf.getShort());
            if(BTS_ComBase.BattState_Discharge == battstate[n]) {
                b_cap *= -1;
            }
            battcap[n] = b_cap;
        }
        for(int n=0; n<BATTGROUP_COUNT; n++)
            /**
             * 2021-10-27 @lijun 修复温度<10度时,温度显示bug
             */
            //batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()-(short)100))/10;
            batttemp[n] = BTS_ComBase.changeShortToDouble((short)(tmpbuf.getShort()))/10 -10;
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMAX_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        battXuHangTime = (monMAX_num[0]<<16) + monMAX_num[1];
        stationPowerOffTLong = (monMAX_num[2]<<16) + monMAX_num[3];
        for(int n=0; n<BATTGROUP_COUNT; n++) {
            monMIN_num[n] = BTS_ComBase.changeShortToInt(tmpbuf.getShort());
        }
        stationPowerOffCNT = monMIN_num[0];
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMAX[n] = ((double)BTS_ComBase.changeShortToDouble(tmpbuf.getShort()))/100;
        conresist = monvolMAX[0]/10;
        conresist1 = monvolMAX[1]/10;
        condvoldp = monvolMAX[2];
        condvoldp1 = monvolMAX[3];
        ////System.out.println(conresist+"=="+conresist1+"=="+condvoldp+"=="+condvoldp1);
        for(int n=0; n<BATTGROUP_COUNT; n++)
            monvolMIN[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        for(int n=0; n<BATTGROUP_COUNT; n++)
            onlinecurr[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        //battSum = 48;
        ////System.out.println("电池组单体数目:"+battSum);
        for(int n=0; n<battSum; n++) {
            vol[n] = BTS_ComBase.changeShortToDouble(tmpbuf.getShort())/1000;
        }
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        for(int n=0; n<4; n++)
            bytebuffer.put(BTS_ComBase.changeIntToByte(dataType[n]));
        CRC = 0;
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.put(BTS_ComBase.changeIntToByte(testTime.hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(testTime.minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(testTime.second));
        bytebuffer.put(BTS_ComBase.changeIntToByte(battGroup));
        ////System.err.println(bytebuffer.position()+"#########################");
        bytebuffer.putShort(BTS_ComBase.changeIntToShort(battSum));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(onlinevol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(groupvol[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(battstate[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(battcurr[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(battcap[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(batttemp[n]*10));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(monMAX_num[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeIntToShort(monMIN_num[n]));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(monvolMAX[n]*1000));
        for(int n=0; n<BATTGROUP_COUNT; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(monvolMIN[n]*1000));
        for(int n=0; n<battSum; n++)
            bytebuffer.putShort(BTS_ComBase.changeDoubleToShort(vol[n]*1000));
        CRC = BTS_Crc16.CalCRC16(bytebuffer, bytebuffer.position());
        bytebuffer.putShort(4, BTS_ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        ////System.err.println("buffer  limit:"+bytebuffer.limit());
        return bytebuffer;
    }
    @Override
    public String toString() {
        return "BTS_FbsData [testTime=" + testTime + ", battGroup=" + battGroup + ", battSum=" + battSum
                + ", battGroupNum=" + battGroupNum + ", battXuHangTime=" + battXuHangTime + ", stationPowerOffTLong="
                + stationPowerOffTLong + ", stationPowerOffCNT=" + stationPowerOffCNT + ", conresist=" + conresist
                + ", conresist1=" + conresist1 + ", condvoldp=" + condvoldp + ", condvoldp1=" + condvoldp1
                + ", onlinevol=" + Arrays.toString(onlinevol) + ", groupvol=" + Arrays.toString(groupvol)
                + ", battstate=" + Arrays.toString(battstate) + ", battcurr=" + Arrays.toString(battcurr) + ", battcap="
                + Arrays.toString(battcap) + ", batttemp=" + Arrays.toString(batttemp) + ", monMAX_num="
                + Arrays.toString(monMAX_num) + ", monMIN_num=" + Arrays.toString(monMIN_num) + ", monvolMAX="
                + Arrays.toString(monvolMAX) + ", monvolMIN=" + Arrays.toString(monvolMIN) + ", onlinecurr="
                + Arrays.toString(onlinecurr) + ", vol=" + Arrays.toString(vol) + "]";
    }
}
src/main/java/com/whyc/bts/BTS_TestTime.java
New file
@@ -0,0 +1,62 @@
package com.whyc.bts;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class BTS_TestTime
{
    public int hour = 0;
    public int minute = 0;
    public int second = 0;
    public void putByteBuffer(final ByteBuffer bf)
    {
        hour = BTS_ComBase.changeByteToInt(bf.get());
        minute = BTS_ComBase.changeByteToInt(bf.get());
        second = BTS_ComBase.changeByteToInt(bf.get());
    }
    public ByteBuffer getBytes()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(6);
        bytebuffer.order(ByteOrder.LITTLE_ENDIAN);
        bytebuffer.put(BTS_ComBase.changeIntToByte(hour));
        bytebuffer.put(BTS_ComBase.changeIntToByte(minute));
        bytebuffer.put(BTS_ComBase.changeIntToByte(second));
        bytebuffer.flip();
        return bytebuffer;
    }
    public int getSecondCount()
    {
        return (hour*3600 + minute*60 + second);
    }
    public static int getMinutesCount(String str)
    {
        int mcount = 0;
        try
        {
            // 先找到字符串中:的位置
            int position = str.indexOf(":");
            // 将每个:之间的字符串转换成整型
            mcount = Integer.parseInt(str.substring(0, position))*60;
            mcount += Integer.parseInt(str.substring(position + 1));
        }
        catch(Exception e)
        {
            mcount = 0;
        }
        return mcount;
    }
    @Override
    public String toString() {
        return "FBS9100_TestTime [hour=" + hour + ", minute=" + minute + ", second=" + second + "]";
    }
}
src/main/java/com/whyc/bts/BTS_Test_Main.java
New file
@@ -0,0 +1,16 @@
package com.whyc.bts;
public class BTS_Test_Main {
    public static void main(String[] args) {
        BTS_ChargeData data = new BTS_ChargeData();
        //解析充电数据
//        data.readChrFile("C:\\Users\\DELL\\Documents\\WeChat Files\\wxid_wwepud71epso21\\FileStorage\\File\\2024-12\\sd导出的放电记录\\BATT_CHR\\CHR10001.CHR");
        BTS_DisChargeData disdata = new BTS_DisChargeData();
        //解析放电数据
        disdata.readDisFile("D:\\桌面文件备份\\公司各种设备资料\\BTS设备相关文件\\BTS历史数据文件解析\\sd导出的放电记录\\BATT_CAP\\CAPNEW_1.BCP");
    }
}
src/main/java/com/whyc/controller/TestController.java
@@ -1,5 +1,7 @@
package com.whyc.controller;
import com.whyc.bts.BTS_ChargeData;
import com.whyc.bts.BTS_DisChargeData;
import com.whyc.fbo.FboData;
import com.whyc.fbo.FboDataHeadStart;
import com.whyc.fbo.FboDataHeadStop;
@@ -7,10 +9,7 @@
import com.whyc.mcp.TestDataInfo;
import com.whyc.pojo.Response;
import com.whyc.res.RESDataInfo;
import com.whyc.service.ExcelExportService;
import com.whyc.service.FboDataInfService;
import com.whyc.service.RESDataInfoService;
import com.whyc.service.TestDataInfoService;
import com.whyc.service.*;
import com.whyc.util.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -47,6 +46,12 @@
    @Autowired
    private TestDataInfoService testDataInfoService;
    @Autowired
    private BtsDisChargeService disDataService;
    @Autowired
    private BtsChargeDataService chargeDataService;
    @GetMapping("/hello")
    public Response hello(){
        return new Response().set(1,"hello");
@@ -75,6 +80,12 @@
            case "mch":TestDataInfo testDataInfoMch=testDataInfoService.readFileData(filePath);
                       response.set(1,testDataInfoMch,filePath);
                       break;
            case "bcp": BTS_DisChargeData disData=disDataService.getDisData(filePath);
                response.set(1,disData,filePath);
                break;
            case "chr":BTS_ChargeData chargeData=chargeDataService.getChrData(filePath);
                response.set(1,chargeData,filePath);
                break;
            default:response.set(1,false,filePath);
        }
src/main/java/com/whyc/fbo/FboDataHeadStart.java
@@ -86,13 +86,13 @@
            this.hour = ComBase.changeByteToInt(bf.get());
            this.minute = ComBase.changeByteToInt(bf.get());
            this.second = ComBase.changeByteToInt(bf.get());
            System.out.println(year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second);
            //System.out.println(year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second);
        }
        
        public Date getFBODateTime() {
            Calendar c = Calendar.getInstance();
            c.set(2000+year, month, day, hour, minute, second);
            //System.out.println("测试开始时间"+Com.getDateTimeFormat(c.getTime(),Com.DTF_YMDhms));
            ////System.out.println("测试开始时间"+Com.getDateTimeFormat(c.getTime(),Com.DTF_YMDhms));
            return c.getTime();
            //return Com.get_DT_FromStr(year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second, Com.DTF_YMDhms);
        }
@@ -100,7 +100,7 @@
    public void setDataInf(byte[] buf,FboDataHeadStop fboHeadStop) {
        if(buf.length < BYTE_LEN) {
            System.out.println("头部数据长度异常");
            //System.out.println("头部数据长度异常");
            return;
        }        
        ByteBuffer bf = ByteBuffer.allocate(buf.length);
@@ -157,7 +157,7 @@
    
    private void checkBattBrand() {
        byte[] batt_brand_tmp = new byte[batt_brand_len];
        System.arraycopy(this.batt_brand, 0, batt_brand_tmp, 0, batt_brand_tmp.length);
        //System.arraycopy(this.batt_brand, 0, batt_brand_tmp, 0, batt_brand_tmp.length);
        this.battBrandStr = new String(batt_brand_tmp);
    }
@@ -165,13 +165,13 @@
    public void checkBattName() {
        byte[] batt = new byte[battname_len];
        System.arraycopy(this.battname, 0, batt, 0, batt.length);
        //System.arraycopy(this.battname, 0, batt, 0, batt.length);
        this.battNameStr = new String(batt);
    }
    public void checkBattDate() {
        byte[] date = new byte[batt_date_len];
        System.arraycopy(this.batt_date, 0, date, 0, date.length);
        //System.arraycopy(this.batt_date, 0, date, 0, date.length);
        this.batt_date_str = new String(date);
    }
    
src/main/java/com/whyc/mcp/FBSData.java
@@ -27,8 +27,8 @@
    public boolean setData(byte[] databuf) {
        boolean flag = true;
        //System.out.println(databuf.length + "===" + BYTE_LEN);
        //System.out.println(ComFn.bytesToHexString(databuf, databuf.length));
        ////System.out.println(databuf.length + "===" + BYTE_LEN);
        ////System.out.println(ComFn.bytesToHexString(databuf, databuf.length));
        ByteBuffer bf = ByteBuffer.allocate(databuf.length + dataType.length);
        bf.order(ByteOrder.LITTLE_ENDIAN);
        bf.position(0);
@@ -39,14 +39,14 @@
            bf.put(ComBase.changeIntToByte(this.dataType[i]));
        }
        bf.put(databuf);
        //System.out.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
        ////System.out.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
        bf.flip();
        CRC16 = ComBase.changeShortToInt(bf.getShort(4));
        bf.putShort(4, ComBase.changeIntToShort(0));
        int crc1 = RES_Crc16.CalCRC16(bf, bf.limit());
        if(CRC16 != crc1) {
            System.err.println(CRC16 +"!="+ crc1);
            //System.err.println(CRC16 +"!="+ crc1);
            return false;
        }
        bf.position(6);
src/main/java/com/whyc/service/BtsChargeDataService.java
New file
@@ -0,0 +1,17 @@
package com.whyc.service;
import com.whyc.bts.BTS_ChargeData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BtsChargeDataService {
    @Autowired
    private BTS_ChargeData data;
    //获取充电数据
    public BTS_ChargeData getChrData(String filePath) {
        data.readChrFile(filePath);
        return data;
    }
}
src/main/java/com/whyc/service/BtsDisChargeService.java
New file
@@ -0,0 +1,17 @@
package com.whyc.service;
import com.whyc.bts.BTS_DisChargeData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BtsDisChargeService {
    @Autowired
    private BTS_DisChargeData data;
    //获取放电数据
    public BTS_DisChargeData getDisData(String filePath){
        data.readDisFile(filePath);
        return data;
    }
}
src/main/java/com/whyc/service/FboDataInfService.java
@@ -17,7 +17,7 @@
        try {
            File f = new File(filePath);
            if(!f.exists()) {
                System.out.println("文件不存在..........");
                //System.out.println("文件不存在..........");
            }
            fis = new FileInputStream(f);
            byte[] buf = new byte[256];