DELL
2024-09-24 a01db2b59f0de8dfa4fb029d86d45924f4534abc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package com.whyc.res;
 
import com.whyc.util.ComBase;
import com.whyc.util.ComFn;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
 
 
public class RESData {
    public static final int MONOMER_NUM_MAX                     =   300;
    
    public static final int BYTE_LEN = 1812;
    public static final int DATABYTE_LEN = 1808;
 
    public static final int DATA_CHECK_BYTE_LEN = 6;
 
    private int[] dataType = new int[4];                         //固定值0xAA 0xAA 0xAA 0xAA
 
    private Date data_Time;                                       //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/
    private long dateTime;                                        //时间毫秒数
 
    private int battSum;                                        //固定值300
    private float[] MonomerVol = new float[MONOMER_NUM_MAX];    //单体电压,分辨率0.001V
    private float[] MonomerTemp = new float[MONOMER_NUM_MAX];    //温度,偏移100,分辨率0.1℃
    private float[]  MonomerRes = new float[MONOMER_NUM_MAX];    //内阻,分辨率0.001mΩ
    private int CRC16;
    
    public boolean setData(byte[] databuf) {
        int Data_Len = 3 * battSum * 2 + 12;
 
        ByteBuffer bf = ByteBuffer.allocate(Data_Len);
        bf.order(ByteOrder.LITTLE_ENDIAN);
        for(int i=0;i<dataType.length;i++) {
            bf.put((byte)0xAA);
        }
        //System.out.println(databuf.length);
        bf.putInt((int)dateTime);
        bf.putShort((short) battSum);
 
        bf.put(databuf);
        bf.flip();
        bf.position(0);
        if(databuf.length < (3 * battSum * 2 + 2)) {
            //System.out.println("长度错误");
            return false;
        }
//        System.err.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
//        int crc0 = bf.getShort(Data_Len-2) & 0xFFFF;
//        bf.position(Data_Len-2);
//        bf.putShort(ComBase.changeIntToShort(0));
//        int crc1 = RES_Crc16.CalCRC16(bf, bf.limit());
//        if(crc0 != crc1) {
//            System.err.println(crc0+"==="+crc1);
//            return false;
//        }
        
        bf.position(0);
        for(int i=0;i<dataType.length;i++) {
            dataType[i] = ComBase.changeByteToInt(bf.get());                         //固定值0xAA 0xAA 0xAA 0xAA
        }
        long dateTime = bf.getInt();
        //System.out.println(dateTime);
        //System.out.println(new Date().getTime());
        data_Time = new Date(dateTime*1000);                                               //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/
 
        //System.out.println(Com.getDateTimeFormat(data_Time, Com.DTF_YMDhms));        
        
        battSum = ComBase.changeShortToInt(bf.getShort());                            //固定值300 电操-500
        if(battSum != MONOMER_NUM_MAX){
            this.MonomerVol = new float[battSum];    //单体电压,分辨率0.001V
            this.MonomerTemp = new float[battSum];    //温度,偏移100,分辨率0.1℃
            this.MonomerRes = new float[battSum];    //内阻,分辨率0.001mΩ
        }
 
        for(int i=0;i<MonomerVol.length;i++) {            
            MonomerVol[i] = ComBase.changeShortToFloat(bf.getShort())*0.001f;        //单体电压,分辨率0.001V
        }
        for(int i=0;i<MonomerTemp.length;i++) {
            MonomerTemp[i] = ComBase.changeShortToFloat(bf.getShort())*0.1f - 10;    //温度,偏移100,分辨率0.1℃
        }
        for(int i=0;i<MonomerRes.length;i++) {
            MonomerRes[i]  = ComBase.changeShortToFloat(bf.getShort())*0.001f;        //内阻,分辨率0.001mΩ
        }    
        return true;
    }
 
    public boolean readResMonCount(byte[] databuf) {
        ByteBuffer bf = ByteBuffer.allocate(10);            //读取时间以及单体数量,只能先读取单体数量才能确定后面读取结构体长度
        bf.order(ByteOrder.LITTLE_ENDIAN);
        for(int i=0;i<dataType.length;i++) {
            bf.put((byte)0xAA);
        }
        //System.out.println(databuf.length);
        bf.put(databuf);
        bf.position(0);
        if(databuf.length < 6) {
            //System.out.println("长度错误");
            return false;
        }
 
        bf.position(0);
        for(int i=0;i<dataType.length;i++) {
            dataType[i] = ComBase.changeByteToInt(bf.get());                         //固定值0xAA 0xAA 0xAA 0xAA
        }
        dateTime = bf.getInt();
        //System.out.println(dateTime);
        //System.out.println(new Date().getTime());
        data_Time = new Date(dateTime*1000);                                               //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/
 
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        //System.out.println("记录时间" + sdf.format(data_Time));
 
        battSum = ComBase.changeShortToInt(bf.getShort());                            //固定值300 电操-500
        //System.out.println("battSum:"+battSum);
        return true;
    }
    
    public static int getMonomerNumMax() {
        return MONOMER_NUM_MAX;
    }
    public int[] getDataType() {
        return dataType;
    }
    public Date getData_Time() {
        return data_Time;
    }
    public int getBattSum() {
        return battSum;
    }
    public float[] getMonomerVol() {
        return MonomerVol;
    }
    public float[] getMonomerTemp() {
        return MonomerTemp;
    }
    public float[] getMonomerRes() {
        return MonomerRes;
    }
    public int getCRC16() {
        return CRC16;
    }
    public void setDataType(int[] dataType) {
        this.dataType = dataType;
    }
    public void setData_Time(Date data_Time) {
        this.data_Time = data_Time;
    }
    public void setBattSum(int battSum) {
        this.battSum = battSum;
    }
    public void setMonomerVol(float[] monomerVol) {
        MonomerVol = monomerVol;
    }
    public void setMonomerTemp(float[] monomerTemp) {
        MonomerTemp = monomerTemp;
    }
    public void setMonomerRes(float[] monomerRes) {
        MonomerRes = monomerRes;
    }
    public void setCRC16(int cRC16) {
        CRC16 = cRC16;
    }
 
    @Override
    public String toString() {
        return "RESData [data_Time=" + data_Time + ", battSum=" + battSum + ", MonomerVol="
                + Arrays.toString(MonomerVol) + ", MonomerTemp=" + Arrays.toString(MonomerTemp) + ", MonomerRes="
                + Arrays.toString(MonomerRes) + "]";
    }
    
    
}