lxw
2023-05-25 7b7e2cb0a59221fd0e7f77a471bd22e42ece4911
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package com.whyc.service;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.whyc.dto.FBS9100_ComBase;
import com.whyc.dto.Response;
import com.whyc.factory.ThreadPoolExecutorFactory;
import com.whyc.mapper.Fbs9149SetparamMapper;
import com.whyc.pojo.Fbs9149Setparam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
 
import static java.lang.Thread.sleep;
 
@Service
public class Fbs9149SetparamService {
    @Autowired(required = false)
    private Fbs9149SetparamMapper mapper;
 
    //并联电源的cmd和ack校验  test_type  -->默认启动测试的类型(控制)
    public boolean sendCmdToFBS9149DevCon(int cmd, int testCmd, int dev_id, int battGroupNum) {
        int m_cmd = cmd;
        int m_cmd_ack = cmd;
        switch (m_cmd) {
            case FBS9100_ComBase.CMD_Start:
                m_cmd_ack = FBS9100_ComBase.CMD_StartAck;
                break;
            case FBS9100_ComBase.CMD_Stop:
                m_cmd_ack = FBS9100_ComBase.CMD_StopAck;
                break;
            default:
                return false;
        }
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.set("op_cmd", m_cmd);
        updateWrapper.set("test_cmd", testCmd);
        updateWrapper.eq("groupnum", battGroupNum);
        updateWrapper.eq("dev_id", dev_id);
        int flag = mapper.update(null, updateWrapper);
        boolean res_exe = false;
        if (flag > 0) {
            PageHelper.startPage(1, 1);
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("dev_id", dev_id);
            queryWrapper.eq("groupnum", battGroupNum);
            for (int n = 0; n < 40; n++) {
 
                Fbs9149Setparam fbs9149Setparam = mapper.selectOne(queryWrapper);
                if (fbs9149Setparam != null) {
                    if (fbs9149Setparam.getOpCmd() == m_cmd_ack) {
                        res_exe = true;
                        break;
                    }
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
        return res_exe;
    }
 
    //并联电源的cmd和ack校验  test_type  -->默认启动测试的类型(读取和设置参数)
    public boolean sendCmdToFBS9149DevRed(int cmd, int testType, int dev_id) {
        int m_cmd = cmd;
        int m_cmd_ack = cmd;
        switch (m_cmd) {
            case FBS9100_ComBase.CMD_GetMutilMode_Param:
                m_cmd_ack = FBS9100_ComBase.CMD_GetMutilMode_Param_Ack;
                break;
            case FBS9100_ComBase.CMD_SetMutilMode_Param:
                m_cmd_ack = FBS9100_ComBase.CMD_SetMutilMode_Param_Ack;
                break;
            default:
                return false;
        }
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.set("op_cmd", m_cmd);
        //读取时加参数在testcmd中参数类型,0-实时核容参数 1-计划核容参数 2-活化参数 3-充电参数 HV_mon_uppernum1
        updateWrapper.set("paramtype", testType);
        updateWrapper.eq("dev_id", dev_id);
        int flag = mapper.update(null, updateWrapper);
        boolean res_exe = false;
        if (flag > 0) {
            PageHelper.startPage(1, 1);
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("dev_id", dev_id);
            //默认取第一个ack判断
            queryWrapper.eq("groupnum", 0);
            for (int n = 0; n < 40; n++) {
 
                Fbs9149Setparam fbs9149Setparam = mapper.selectOne(queryWrapper);
                if (fbs9149Setparam != null) {
                    if (fbs9149Setparam.getOpCmd() == m_cmd_ack) {
                        res_exe = true;
                        break;
                    }
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
        return res_exe;
    }
 
    //在线监测-实时监控-读取并联电源9149放电参数
    public Response searchParalleParam9149(int opCmd, int paramtype, int devId) {
        try {
            //读取时命令同步所以只监测第一组的返回ack
            //读取时加参数在testcmd中参数类型,0-实时核容参数 1-计划核容参数 2-活化参数 3-充电参数 paramtype
            boolean bl = sendCmdToFBS9149DevRed(opCmd, paramtype, devId);
            QueryWrapper wrapper = new QueryWrapper();
            wrapper.eq("dev_id", devId);
            wrapper.orderByAsc("groupnum");
            List<Fbs9149Setparam> fbs9149Setparams = mapper.selectList(wrapper);
            return new Response().setII(1, bl, fbs9149Setparams, bl == true ? "读取电源9149参数成功!" : "读取并联电源9149参数失败,请检查网络!");
        } catch (Exception e) {
            return new Response().set(1, false, "出现异常" + e);
        }
    }
 
    //在线监测-实时监控-设置并联电源9149放电参数
    public Response updateParalleParam9149(List<Fbs9149Setparam> list) {
        try {
            int opCmd = 0;
            int paramtype = 0;
            int devId = 0;
            if (list != null && list.size() > 0) {
                Fbs9149Setparam setparam = list.get(0);
                opCmd = setparam.getOpCmd();
                paramtype = setparam.getParamtype();
                devId = setparam.getDevId();
            }
            boolean b = mapper.updateList(list);
            boolean bl = false;
            if (b) {
                //设置时命令同步所以只监测第一组的返回ack
                //设置时加参数在testcmd中参数类型,0-实时核容参数 1-计划核容参数 2-活化参数 3-充电参数 HV_mon_uppernum1
                bl = sendCmdToFBS9149DevRed(opCmd, paramtype, devId);
            }
            return new Response().set(1, bl, bl == true ? "修改参数成功!" : "设置并联电源参数失败,请检查网络!");
        } catch (Exception e) {
            return new Response().set(1, false, "出现异常" + e);
        }
    }
 
    //在线监测-实时监控-控制并联电源9149充放电停止
    public Response controllerParalle9149(int opCmd, int testCmd, String battGroupNums, int devId) {
        try {
            //读取时加参数在testcmd中参数类型,0-实时核容参数 1-计划核容参数 2-活化参数 3-充电参数 HV_mon_uppernum1
            List<String> battGroupNumList = Arrays.asList(battGroupNums.split(","));
            //多线程
            ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
            CountDownLatch latch = new CountDownLatch(battGroupNumList.size());
            Map<Integer, Boolean> resMap = new HashMap<>();
            for (int i = 0; i < battGroupNumList.size(); i++) {
                int finalI = i;
                pool.execute(() -> {
                    int finalII = finalI;
                    int battGroupNum = Integer.parseInt(battGroupNumList.get(finalII));
                    boolean bl = sendCmdToFBS9149DevCon(opCmd, testCmd, devId, battGroupNum);
                    resMap.put(battGroupNum, bl);
                    latch.countDown();
                });
                sleep(200);
            }
            latch.await(10, TimeUnit.MINUTES);
            return new Response().set(1, resMap);
        } catch (Exception e) {
            return new Response().set(1, false, "出现异常" + e);
        }
    }
}