CommunicationHelper.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. package com.bgy.autosale.helpers;
  2. import android.os.Handler;
  3. import android.os.Message;
  4. import android.util.Log;
  5. import com.bgy.autosale.App;
  6. import com.bgy.autosale.Constant;
  7. import com.bgy.autosale.IceCreamDeviceConstants;
  8. import com.bgy.autosale.R;
  9. import com.bgy.autosale.entitys.MakeIceCreamBean;
  10. import com.bgy.autosale.entitys.Result;
  11. import com.bgy.autosale.interfaces.Callback;
  12. import com.bgy.autosale.interfaces.FlavorUiCallback;
  13. import com.bgy.autosale.interfaces.OnCheckListener;
  14. import com.bgy.autosale.interfaces.OnCleanListener;
  15. import com.bgy.autosale.interfaces.OnTemperatureListener;
  16. import com.bgy.autosale.interfaces.RadarCallback;
  17. import com.bgy.autosale.interfaces.SendCallback;
  18. import com.bgy.autosale.plc.BasePlcAgreement;
  19. import com.bgy.autosale.plc.IceCreamAgreement;
  20. import com.bgy.autosale.utils.IceCreamErrorUtils;
  21. import com.bgy.autosale.utils.PlcLog;
  22. import com.bgy.autosale.utils.SPUtils;
  23. import com.hboxs.base_library.constant.Name;
  24. import com.hboxs.base_library.event.ApiMessageEvent;
  25. import com.hboxs.base_library.event.ErrorApiMessageEvent;
  26. import com.hboxs.base_library.util.LogUtils;
  27. import com.hboxs.base_library.util.SharedPreferencesUtils;
  28. import com.orhanobut.hawk.Hawk;
  29. import org.greenrobot.eventbus.EventBus;
  30. import java.util.ArrayList;
  31. import java.util.Arrays;
  32. import java.util.HashSet;
  33. import java.util.LinkedList;
  34. import java.util.List;
  35. import java.util.concurrent.TimeUnit;
  36. import io.reactivex.android.schedulers.AndroidSchedulers;
  37. /**
  38. * Created by cjx on 2020-08-19
  39. * 说明:
  40. */
  41. public class CommunicationHelper {
  42. private volatile static CommunicationHelper helper;
  43. private final String TAG = "COMMUNICATION";
  44. private IceCreamAgreement agreement;
  45. private Callback<Result<Boolean>> statusCallback;
  46. private Callback<Result> orderStatusCallback;
  47. private HashSet<FlavorUiCallback> uiCallbacks = new HashSet<>();
  48. private Callback<Integer> deviceMessageCallback = null;
  49. private RadarCallback radarCallback = null;
  50. private OnTemperatureListener temperatureListener = null;
  51. private OnCleanListener cleanListener = null;
  52. private OnCheckListener checkListener = null;
  53. private LinkedList<MakeIceCreamBean> iceCreamOrders;
  54. private MakeIceCreamBean makingIceCream;
  55. private volatile boolean temperatureLock = false;
  56. private int manualAction = 0;
  57. private boolean isFirstConnect = true;
  58. // private boolean deviceError = false;
  59. private boolean deviceConnect = false;
  60. private int[] deviceStatus = null;
  61. private int currentTemperature = -1000;
  62. private int prevControlCode = 0; // 控制模式, 1=自动,2=手动
  63. private int prevWorkCode = 0; // 工作状态, 0001:待机, 0002:运行中
  64. private int prevDeviceCode = 0; // 设备状态, 1=正常,2=异常
  65. private int prevErrorCode1 = -1; // 设备状态详情
  66. private int prevErrorCode2 = -1; // 设备状态详情
  67. private String detailMessage = null;
  68. private int makeProcess = 0;
  69. private int[] stockUpdateState = new int[]{-1, -1, -1, -1, -1, -1, -1, -1};
  70. private Handler timeOutHandler = new Handler(new Handler.Callback() {
  71. @Override
  72. public boolean handleMessage(Message msg) {
  73. if (makingIceCream != null) {
  74. // TODO 用户取餐超时,可以在云端通知商家提醒用户取餐
  75. }
  76. return false;
  77. }
  78. });
  79. private Handler heartHandler = new Handler(new Handler.Callback() {
  80. @Override
  81. public boolean handleMessage(Message msg) {
  82. // 设备的心跳
  83. heartHandler.sendEmptyMessageDelayed(0, 3550000);
  84. // TODO 这里可以同步设备的状态到云端
  85. return false;
  86. }
  87. });
  88. public static CommunicationHelper getInstance() {
  89. if (helper == null) {
  90. synchronized (CommunicationHelper.class) {
  91. if (helper == null) {
  92. helper = new CommunicationHelper();
  93. }
  94. }
  95. }
  96. return helper;
  97. }
  98. private CommunicationHelper() {
  99. agreement = IceCreamAgreement.getInstance();
  100. // TODO 此处处理雪糕的制作状态过程,可以同步信息到云端,监听设备的实时状态
  101. agreement.setOrderCallback(new Callback<Result<IceCreamAgreement.Order>>() {
  102. @Override
  103. public void onResult(Result<IceCreamAgreement.Order> result) {
  104. if (makingIceCream == null) {
  105. return;
  106. }
  107. int size = iceCreamOrders == null ? 0 : iceCreamOrders.size();
  108. boolean canCallBack = true;
  109. switch (result.code) {
  110. case BasePlcAgreement.RESULT_CODE_ORDER_ERROR: // 下单失败
  111. makingIceCream.orderStatus = MakeIceCreamBean.STATUS_ERROR;
  112. log(App.app.getString(R.string.making_error));
  113. refundOrder();
  114. break;
  115. case BasePlcAgreement.RESULT_CODE_ORDER_CHILD_PREPARE: // 出餐中
  116. if (size > 0) {
  117. iceCreamOrders.poll();
  118. }
  119. log(App.app.getString(R.string.making_ing));
  120. makingIceCream.orderStatus = MakeIceCreamBean.STATUS_MAKING;
  121. break;
  122. case BasePlcAgreement.RESULT_CODE_ORDER_CHILD_OUT: // 待取餐
  123. log(App.app.getString(R.string.making_taking));
  124. makingIceCream.orderStatus = MakeIceCreamBean.STATUS_TAKING;
  125. timeOutHandler.sendEmptyMessageDelayed(0, 60000);
  126. break;
  127. case BasePlcAgreement.RESULT_CODE_ORDER_CHILD_FINISH: // 已取餐
  128. log(App.app.getString(R.string.making_taked));
  129. makingIceCream.orderStatus = MakeIceCreamBean.STATUS_TAKED;
  130. break;
  131. case BasePlcAgreement.RESULT_CODE_ORDER_COMPLETE: // 订单完成
  132. makingIceCream = null;
  133. if (iceCreamOrders != null) {
  134. if (iceCreamOrders.isEmpty()) {
  135. iceCreamOrders = null;
  136. log(App.app.getString(R.string.making_finish));
  137. } else {
  138. log(String.format(App.app.getString(R.string.making_next), size));
  139. canCallBack = false;
  140. startIceCreamOrder();
  141. }
  142. }
  143. break;
  144. }
  145. if (orderStatusCallback != null && canCallBack) {
  146. orderStatusCallback.onResult(new Result<>(result.code, null, result.message));
  147. }
  148. }
  149. });
  150. // 设置设备状态监听
  151. agreement.setStatusListener(new Callback<Result<int[]>>() {
  152. @Override
  153. public void onResult(Result<int[]> result) {
  154. if (result == null) {
  155. return;
  156. }
  157. switch (result.code) {
  158. case BasePlcAgreement.PLC_HEART_CONNECT:
  159. log(App.app.getString(R.string.mcu_connect));
  160. deviceConnect = true;
  161. if (statusCallback != null) {
  162. statusCallback.onResult(new Result<>(BasePlcAgreement.PLC_HEART_CONNECT, false, null));
  163. }
  164. for (FlavorUiCallback uiCallback : uiCallbacks) {
  165. if (uiCallback != null) {
  166. uiCallback.deviceStatusChangeCallback(true, result.data, detailMessage);
  167. }
  168. }
  169. if (isFirstConnect) {
  170. isFirstConnect = false;
  171. // 获取MCU功能版本,低版本设备不支持
  172. agreement.sendControl(IceCreamDeviceConstants.ORDER_MCU_VERSION, new SendCallback() {
  173. @Override
  174. public void callBack(boolean ok, int[] result) {
  175. if (ok && result.length > 1) {
  176. App.app.mcuVersion = result[1];
  177. }
  178. }
  179. });
  180. }
  181. break;
  182. case BasePlcAgreement.PLC_HEART_DISCONNECT:
  183. log(App.app.getString(R.string.mcu_disconnect));
  184. agreement.disConnect(new Exception("disconnect..."));
  185. deviceConnect = false;
  186. if (statusCallback != null) {
  187. statusCallback.onResult(new Result<>(BasePlcAgreement.PLC_HEART_DISCONNECT, false, null));
  188. }
  189. for (FlavorUiCallback uiCallback : uiCallbacks) {
  190. if (uiCallback != null) {
  191. uiCallback.deviceStatusChangeCallback(false, result.data, null);
  192. }
  193. }
  194. break;
  195. case BasePlcAgreement.PLC_HEART_REPORT:
  196. if (result.data != null) {
  197. deviceStatus = result.data;
  198. if (App.app.unCheckStatus) {
  199. deviceStatus[2] = 1;
  200. }
  201. IceCreamErrorUtils.getInstance().bindStatus(deviceStatus);
  202. if (deviceStatus[0] == 1 && deviceStatus[2] == 1) {
  203. SharedPreferencesUtils.setParam("open", 1);
  204. } else {
  205. SharedPreferencesUtils.setParam("open", 0);
  206. }
  207. parserDeviceStatus();
  208. if (IceCreamErrorUtils.getInstance().getErrorMessage() != null) {
  209. LogUtils.logWrite("机器报警了:"+IceCreamErrorUtils.getInstance().getErrorMessage());
  210. String[] parts = IceCreamErrorUtils.getInstance().getErrorMessage().split(",");
  211. HashSet<String> tempSet = new HashSet<>();
  212. for (String part : parts) {
  213. String[] subparts = part.split("-"); // 对每个部分再根据破折号分隔
  214. String item = subparts[0]; // 分隔后的第一部分
  215. String number = subparts[1]; // 分隔后的第二部分
  216. Log.d(TAG, "onResultsubparts: Item: " + item + ", Number: " + number);
  217. if (itemSet.add(item)){
  218. // EventBus.getDefault().post(new ErrorApiMessageEvent(Name.WARNING_ALARM, item, number));//这里上传报警
  219. Log.d("上传报警", "onResult: 上传报警111:"+item);
  220. shouldClearItemSet = false;
  221. }else {
  222. shouldClearItemSet=true;
  223. }
  224. tempSet.add(item);
  225. }
  226. Log.d("上传报警", "onResult: 上传报警112: "+itemSet+shouldClearItemSet);
  227. if (shouldClearItemSet) {
  228. itemSet.clear(); // 如果所有的item都已经存在,清空itemSet
  229. itemSet.addAll(tempSet); // 更新itemSet为tempSet的值
  230. Log.d(TAG, "上传报警111: 清除");
  231. }
  232. } else {
  233. EventBus.getDefault().post(new ApiMessageEvent("eliminate", null));
  234. }
  235. }
  236. break;
  237. }
  238. }
  239. });
  240. // 监听即使状态改变
  241. agreement.setImmediateCallbak(new Callback<int[]>() {
  242. @Override
  243. public void onResult(int[] content) {
  244. parserImmediateStatus(content);
  245. }
  246. });
  247. agreement.connect(0, 9527);
  248. }
  249. private static final HashSet<String> itemSet = new HashSet<>();
  250. // private static final
  251. boolean shouldClearItemSet = true;
  252. // 退款
  253. private void refundOrder() {
  254. synchronized (CommunicationHelper.class) {
  255. // 制作中的雪糕或者当前待制作的雪糕为空
  256. if (makingIceCream == null || iceCreamOrders == null) {
  257. return;
  258. }
  259. if (!iceCreamOrders.contains(makingIceCream)) {
  260. // 当前待制作雪糕已经移除了当前制作中的雪糕, 则需要加回去
  261. if (makingIceCream.orderStatus != MakeIceCreamBean.STATUS_TAKING && makingIceCream.orderStatus != MakeIceCreamBean.STATUS_TAKED) {
  262. iceCreamOrders.add(0, makingIceCream);
  263. }
  264. }
  265. // TODO 这里处理退款逻辑,需要退款的雪糕在 iceCreamOrders 内
  266. makingIceCream = null;
  267. iceCreamOrders = null;
  268. }
  269. }
  270. public void changeTestMode() {
  271. App.app.unCheckStatus = true;
  272. agreement.setTestMode();
  273. if (deviceStatus != null) {
  274. deviceStatus[2] = 1;
  275. parserDeviceStatus();
  276. }
  277. }
  278. // 开始出雪糕
  279. private void startIceCreamOrder() {
  280. MakeIceCreamBean detail = iceCreamOrders == null || iceCreamOrders.isEmpty() ? null : iceCreamOrders.peek();
  281. if (detail != null) {
  282. Log.d(TAG, "setDishStatusListener4: ");
  283. makingIceCream = detail;
  284. try {
  285. Log.d(TAG, "setDishStatusListener5: ");
  286. IceCreamAgreement.Order iceCream = new IceCreamAgreement.Order(detail,
  287. detail.makeCodes[0],
  288. detail.makeCodes[1],
  289. detail.makeCodes[2]);
  290. Log.d(TAG, "setDishStatusListener6: "+iceCream);
  291. if (manualAction > 0) {
  292. Log.d(TAG, "setDishStatusListener7: ");
  293. agreement.setMakeOrderByManual(iceCream);
  294. sendControl(manualAction, detail.makeCodes[0], detail.makeCodes[1], detail.makeCodes[2], new SendCallback() {
  295. @Override
  296. public void callBack(boolean ok, int[] result) {
  297. }
  298. });
  299. } else {
  300. Log.d(TAG, "setDishStatusListener8: ");
  301. agreement.setMakeOrderByManual(null);
  302. agreement.sendOrder(iceCream);
  303. }
  304. log(App.app.getString(R.string.making_out_flavor) + " > " + iceCream);
  305. } catch (Exception e) {
  306. Log.d(TAG, "setDishStatusListener9: "+e.getMessage());
  307. e.printStackTrace();
  308. PlcLog.getInstance().e_s(TAG, e);
  309. refundOrder();
  310. }
  311. } else {
  312. Log.d(TAG, "setDishStatusListener10: ");
  313. makingIceCream = null;
  314. iceCreamOrders = null;
  315. }
  316. }
  317. public void destroy() {
  318. agreement.disConnect(new Exception("finish"));
  319. }
  320. // 首次加载商品信息 更新库存
  321. public void setDataReally() {
  322. synchronized (CommunicationHelper.class) {
  323. for (int i = 0; i < 8; i++) {
  324. stockUpdateState[i] = -1;
  325. }
  326. if (deviceStatus != null) {
  327. parserDeviceStatusDetail();
  328. }
  329. }
  330. }
  331. public void setMakingIceCreams(LinkedList<MakeIceCreamBean> iceCreamOrders) {
  332. this.iceCreamOrders = iceCreamOrders;
  333. }
  334. public void setDeviceStatusListener(Callback<Result<Boolean>> statusCallback) {
  335. this.statusCallback = statusCallback;
  336. if (statusCallback == null) {
  337. return;
  338. }
  339. if (!deviceConnect) {
  340. statusCallback.onResult(new Result<>(BasePlcAgreement.PLC_HEART_DISCONNECT, false, null));
  341. }
  342. if (deviceStatus != null) {
  343. parserDeviceStatus();
  344. }
  345. }
  346. public void setDishStatusListener(Callback<Result> orderStatusCallback, int manualAction) {
  347. this.orderStatusCallback = orderStatusCallback;
  348. this.manualAction = manualAction;
  349. Log.d(TAG, "setDishStatusListener0: ");
  350. if (orderStatusCallback == null) {
  351. Log.d(TAG, "setDishStatusListener1: ");
  352. if (manualAction == -1) {
  353. refundOrder();
  354. Log.d(TAG, "setDishStatusListener2: ");
  355. }
  356. return;
  357. }
  358. Log.d(TAG, "setDishStatusListener3: ");
  359. startIceCreamOrder();
  360. }
  361. public void setDeviceMessageCallback(Callback<Integer> messageCallback) {
  362. this.deviceMessageCallback = messageCallback;
  363. }
  364. public MakeIceCreamBean getMakingIceCream() {
  365. return makingIceCream;
  366. }
  367. public LinkedList<MakeIceCreamBean> getMakingIceCreams() {
  368. if (iceCreamOrders == null) {
  369. iceCreamOrders = new LinkedList<>();
  370. }
  371. return iceCreamOrders;
  372. }
  373. public void addFlavorUiCallback(FlavorUiCallback uiCallback) {
  374. this.uiCallbacks.add(uiCallback);
  375. if (deviceStatus == null) {
  376. uiCallback.deviceStatusChangeCallback(false, null, null);
  377. return;
  378. }
  379. detailMessage = IceCreamErrorUtils.getInstance().getErrorMessage();
  380. uiCallback.deviceStatusChangeCallback(deviceConnect, deviceStatus, detailMessage);
  381. }
  382. public void removeFlavorUiCallback(FlavorUiCallback uiCallback) {
  383. this.uiCallbacks.remove(uiCallback);
  384. }
  385. public void setRadarCallback(RadarCallback callback) {
  386. this.radarCallback = callback;
  387. }
  388. public void setOnTemperatureListener(OnTemperatureListener listener) {
  389. this.temperatureListener = listener;
  390. if (temperatureListener != null && currentTemperature != -1000) {
  391. temperatureListener.onTemperatureChange(currentTemperature);
  392. }
  393. }
  394. public void setOnCheckListener(OnCheckListener listener) {
  395. this.checkListener = listener;
  396. }
  397. public void setOnCleanListener(OnCleanListener listener) {
  398. this.cleanListener = listener;
  399. }
  400. // 发送控制指令
  401. public void sendControl(int order, SendCallback callback) {
  402. sendControl(order, 0, 0, 0, callback);
  403. }
  404. public void sendControl(int order, int p1, int p2, int p3, SendCallback callback) {
  405. agreement.sendControl(order, p1, p2, p3, callback);
  406. }
  407. // 修改参数
  408. public void sendModifyParams(int order, int param, SendCallback callback) {
  409. agreement.modifyParams(order, param, callback);
  410. }
  411. // 设备是否正常
  412. public boolean canGenerateOrder() {
  413. return agreement != null && agreement.isNormal() && agreement.isFree();
  414. }
  415. public boolean isDeviceNormal() {
  416. return agreement != null && agreement.isNormal();
  417. }
  418. public String getWhyCanOrderText() {
  419. StringBuilder stringBuilder = new StringBuilder();
  420. if (!agreement.isAuto()) {
  421. stringBuilder.append(App.app.getString(R.string.plc_errTip1));
  422. }
  423. if (!agreement.isDeviceNoErr()) {
  424. if (stringBuilder.toString().length() > 1) {
  425. stringBuilder.append(",");
  426. }
  427. stringBuilder.append(App.app.getString(R.string.plc_errTip2));
  428. }
  429. if (!agreement.isDeviceFree()) {
  430. if (stringBuilder.toString().length() > 1) {
  431. stringBuilder.append(",");
  432. }
  433. stringBuilder.append(App.app.getString(R.string.plc_errTip3));
  434. }
  435. if (!agreement.isDeviceDoorNoWarn()) {
  436. if (stringBuilder.toString().length() > 1) {
  437. stringBuilder.append(",");
  438. }
  439. stringBuilder.append(App.app.getString(R.string.plc_errTip4));
  440. }
  441. return stringBuilder.toString();
  442. }
  443. // 解析设备状态
  444. private void parserDeviceStatus() {
  445. if (deviceStatus[3] == BasePlcAgreement.PLC_DOOR_EMPTY) {
  446. timeOutHandler.removeMessages(0);
  447. }
  448. boolean deviceNormal;
  449. int controlCode = deviceStatus[0]; // 控制模式, 1=自动,2=手动
  450. int workCode = deviceStatus[1]; // 工作状态, 0001:待机, 0002:运行中
  451. int deviceCode = deviceStatus[2]; // 设备状态, 1=正常,2=异常
  452. int errorCode1 = deviceStatus[4]; // 设备状态详情
  453. int errorCode2 = deviceStatus[5]; // 设备状态详情
  454. int process = deviceStatus[6]; // 当前制作流程
  455. if (deviceStatus.length > 7) {
  456. int deviceMessage = deviceStatus[7];
  457. if (deviceMessageCallback != null) {
  458. deviceMessageCallback.onResult(deviceMessage);
  459. }
  460. }
  461. deviceNormal = controlCode == BasePlcAgreement.PLC_CONTROL_AUTO && deviceCode == BasePlcAgreement.PLC_DEVICE_NORMAL;
  462. String errorMessage = parserDeviceStatusDetail();
  463. if (errorMessage != null) {
  464. errorMessage = String.format(App.app.getString(R.string.error_contact_format), errorMessage, controlCode + "." + deviceCode + "." + errorCode1 + "." + errorCode2);
  465. } else if (!deviceNormal) {
  466. errorMessage = String.format(App.app.getString(R.string.error_contact_format), App.app.getString(R.string.error_wait), controlCode + "." + deviceCode + "." + errorCode1 + "." + errorCode2);
  467. }
  468. if (IceCreamErrorUtils.getInstance().isGaoya()) {
  469. deviceNormal = false;
  470. }
  471. if (statusCallback != null) {
  472. statusCallback.onResult(new Result<>(BasePlcAgreement.PLC_HEART_REPORT, deviceNormal, errorMessage));
  473. }
  474. if (errorCode1 != prevErrorCode1 || errorCode2 != prevErrorCode2) {
  475. detailMessage = IceCreamErrorUtils.getInstance().getErrorMessage();
  476. log(String.format(App.app.getString(R.string.mcu_waring_message), detailMessage, errorMessage));
  477. }
  478. for (FlavorUiCallback uiCallback : uiCallbacks) {
  479. if (uiCallback != null) {
  480. uiCallback.deviceStatusChangeCallback(true, deviceStatus, detailMessage);
  481. }
  482. }
  483. // 处理制作流程
  484. if (makeProcess != process) {
  485. if (makeProcess == 2 && process == 3) {
  486. // 出杯
  487. StockHelper.getInstance().outCup();
  488. log(App.app.getString(R.string.making_out_cup));
  489. } else if (makeProcess == 3 && process > 3 && process != 9) {
  490. // 出雪糕
  491. StockHelper.getInstance().outFlavor();
  492. log(App.app.getString(R.string.making_out_flavor));
  493. }
  494. makeProcess = process;
  495. }
  496. if (prevControlCode == controlCode
  497. && prevDeviceCode == deviceCode
  498. && prevWorkCode == workCode
  499. && prevErrorCode1 == errorCode1
  500. && prevErrorCode2 == errorCode2) {
  501. return;
  502. }
  503. prevControlCode = controlCode;
  504. prevDeviceCode = deviceCode;
  505. prevWorkCode = workCode;
  506. prevErrorCode1 = errorCode1;
  507. prevErrorCode2 = errorCode2;
  508. heartHandler.removeMessages(0);
  509. heartHandler.sendEmptyMessageDelayed(0, 8000);
  510. }
  511. public int getDeviceStatus(int position) {
  512. if (!deviceConnect || deviceStatus == null) {
  513. return 0;
  514. }
  515. return deviceStatus[position];
  516. }
  517. // 即时状态改变监听
  518. private void parserImmediateStatus(int[] content) {
  519. if (content == null || content.length < 2) {
  520. return;
  521. }
  522. switch (content[0]) {
  523. case 1: // 雷达
  524. // 播放揽客语音
  525. if (radarCallback != null) {
  526. radarCallback.isCheck(content[1] == 1);
  527. }
  528. break;
  529. case 2: // 温度
  530. currentTemperature = content[1];
  531. if (currentTemperature > 43 || currentTemperature < 10) {
  532. if (!temperatureLock) {
  533. temperatureLock = true;
  534. AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  535. @Override
  536. public void run() {
  537. temperatureLock = false;
  538. }
  539. }, 1800, TimeUnit.SECONDS);
  540. }
  541. }
  542. if (temperatureListener != null) {
  543. temperatureListener.onTemperatureChange(currentTemperature);
  544. }
  545. break;
  546. case 3: // 点检结果 1 = 点检中 2 = 点检成功, 3 = 点检失败
  547. if (checkListener != null) {
  548. checkListener.onCheck(content[1]);
  549. }
  550. break;
  551. case 4: // 清洗状态 1 = 已清洗
  552. if (cleanListener != null) {
  553. cleanListener.cleanStatus(content[1]);
  554. }
  555. break;
  556. }
  557. }
  558. // 解析设备状态明细
  559. private String parserDeviceStatusDetail() {
  560. String errMessage = null;
  561. boolean milkEmpty = false;
  562. boolean cupEmpty = false;
  563. if (IceCreamErrorUtils.getInstance().isMilkEmpty()) {
  564. errMessage = App.app.getString(R.string.error_milk_slurry_empty);
  565. milkEmpty = true;
  566. } else if (IceCreamErrorUtils.getInstance().isCupStockEmpty()) {
  567. errMessage = App.app.getString(R.string.error_cup_empty);
  568. cupEmpty = true;
  569. } else if (IceCreamErrorUtils.getInstance().isDoorOpen()) {
  570. errMessage = App.app.getString(R.string.error_door_un_close);
  571. } else if (IceCreamErrorUtils.getInstance().isSleep()) {
  572. errMessage = App.app.getString(R.string.error_power_saving);
  573. }
  574. if (IceCreamErrorUtils.getInstance().isGaoya()) {
  575. errMessage = App.app.getString(R.string.error_high_pressure);
  576. }
  577. // 更新各类库存
  578. updateFlavorStock(milkEmpty);
  579. updateCupStock(cupEmpty);
  580. return errMessage;
  581. }
  582. // 更新奶浆的库存
  583. private void updateFlavorStock(boolean empty) {
  584. boolean stockWarning = IceCreamErrorUtils.getInstance().isMilkStockWarning();
  585. if (!stockWarning && !empty) {
  586. // 开始清洗倒计时功能
  587. CleanScheduleHelper.getInstance().startCleanSchedule();
  588. }
  589. int stock;
  590. final String KEY_FLAVOR_STOCK_WARNING = "KEY_FLAVOR_STOCK_WARNING_2008";
  591. if (empty) {
  592. if (stockUpdateState[0] == 0) {
  593. return;
  594. }
  595. stockUpdateState[0] = 0;
  596. stock = 0;
  597. } else if (stockWarning) {
  598. if (stockUpdateState[0] == 2) {
  599. return;
  600. }
  601. stockUpdateState[0] = 2;
  602. if (!SPUtils.getInstance(App.app).getBoolean(KEY_FLAVOR_STOCK_WARNING, false)) {
  603. SPUtils.getInstance(App.app).putBoolean(KEY_FLAVOR_STOCK_WARNING, true);
  604. // TODO 库存告警, 更新当前库存为告警时默认库存
  605. stock = Constant.STOCK_FLAVOR_WARING_MAX_COUNT;
  606. } else {
  607. return;
  608. }
  609. } else {
  610. if (stockUpdateState[0] == 1) {
  611. return;
  612. }
  613. stockUpdateState[0] = 1;
  614. // 解除库存告警, 默认当前为最大库存
  615. stock = 99999;
  616. SPUtils.getInstance(App.app).putBoolean(KEY_FLAVOR_STOCK_WARNING, false);
  617. }
  618. StockHelper.getInstance().saveStock(2, 1, stock);
  619. }
  620. // 更新杯子的库存
  621. private void updateCupStock(boolean empty) {
  622. boolean stockWarning = IceCreamErrorUtils.getInstance().isCupStockWarning();
  623. final String KEY_CUP_STOCK_WARNING = "KEY_CUP_STOCK_WARNING_2008";
  624. int stock;
  625. if (empty) {
  626. if (stockUpdateState[1] == 0) {
  627. return;
  628. }
  629. stockUpdateState[1] = 0;
  630. stock = 0;
  631. } else if (stockWarning) {
  632. if (stockUpdateState[1] == 2) {
  633. return;
  634. }
  635. stockUpdateState[1] = 2;
  636. if (!SPUtils.getInstance(App.app).getBoolean(KEY_CUP_STOCK_WARNING, false)) {
  637. SPUtils.getInstance(App.app).putBoolean(KEY_CUP_STOCK_WARNING, true);
  638. stock = Constant.STOCK_WARING_MAX_COUNT + 1;
  639. // TODO 是否要提示库存报警信息,可以上传到云端
  640. } else {
  641. return;
  642. }
  643. } else {
  644. if (stockUpdateState[1] == 1) {
  645. return;
  646. }
  647. stockUpdateState[1] = 1;
  648. stock = 99999;
  649. SPUtils.getInstance(App.app).putBoolean(KEY_CUP_STOCK_WARNING, false);
  650. }
  651. StockHelper.getInstance().saveStock(1, 1, stock);
  652. }
  653. private void log(String msg) {
  654. PlcLog.getInstance().e_s(TAG, msg);
  655. }
  656. }