解决秤地址10开始无法清零的问题
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package com.shuwei.dish.match.utils;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.wabon.wbintelligenthardwaresdk.api.SensorScale;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* 修复 SensorScale 地址编码 bug 的子类。
|
||||
*
|
||||
* 问题根因:SensorScale.zeroTwo / tareTwo 内部使用
|
||||
* String command = address + "630603";
|
||||
* 将 int 地址直接拼接为十进制字符串,再整体按十六进制解析成字节。
|
||||
* 对于地址 1-9,十进制 == 十六进制,偶然正确;
|
||||
* 对于地址 10+,十进制 "10" 被解析为 0x10(=16),命中错误的物理秤。
|
||||
*
|
||||
* 修复方式:重写这两个方法,将地址先格式化为两位十六进制字符串(如 10 → "0A"),
|
||||
* 再拼接命令码,通过反射调用父类私有方法 suspendSendThread 和 sumHex 发送。
|
||||
*/
|
||||
public class FixedSensorScale extends SensorScale {
|
||||
|
||||
private static final String TAG = "FixedSensorScale";
|
||||
|
||||
public FixedSensorScale(OnScaleResult result) {
|
||||
super(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重写清零命令,修复地址编码:十进制地址 → 两位十六进制字符串。
|
||||
* 例:address=10 → "0A630603",发送字节 0x0A(正确),而非原来的 0x10(错误)。
|
||||
*
|
||||
* @param listener 操作成功回调
|
||||
* @param address 秤地址(来自 onGetWeight 回调的十进制值)
|
||||
*/
|
||||
@Override
|
||||
public void zeroTwo(OperateSuccessListener listener, int address) {
|
||||
sendFixedCommand(listener, address, "630603", "zeroTwo");
|
||||
}
|
||||
|
||||
/**
|
||||
* 重写去皮命令,修复地址编码,逻辑同 zeroTwo。
|
||||
*
|
||||
* @param listener 操作成功回调
|
||||
* @param address 秤地址
|
||||
*/
|
||||
@Override
|
||||
public void tareTwo(OperateSuccessListener listener, int address) {
|
||||
sendFixedCommand(listener, address, "630601", "tareTwo");
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用发送逻辑:将地址格式化为两位十六进制后拼接命令码,
|
||||
* 通过反射调用父类私有方法 sumHex 计算校验和,再调用 suspendSendThread 发送。
|
||||
*
|
||||
* @param listener 操作成功回调
|
||||
* @param address 秤地址(十进制)
|
||||
* @param commandCode 命令码(十六进制字符串,如 "630603")
|
||||
* @param methodName 调用方名称,仅用于日志
|
||||
*/
|
||||
private void sendFixedCommand(OperateSuccessListener listener, int address,
|
||||
String commandCode, String methodName) {
|
||||
try {
|
||||
// 将十进制地址转为两位十六进制字符串:10 → "0A",1 → "01"
|
||||
String hexAddress = String.format("%02X", address);
|
||||
String command = hexAddress + commandCode;
|
||||
Log.d(TAG, methodName + ", address=" + address
|
||||
+ ", hexAddress=" + hexAddress + ", command=" + command);
|
||||
|
||||
// 反射调用 sumHex(String) 计算校验和
|
||||
Method sumHexMethod = SensorScale.class.getDeclaredMethod("sumHex", String.class);
|
||||
sumHexMethod.setAccessible(true);
|
||||
String checksum = (String) sumHexMethod.invoke(this, command);
|
||||
|
||||
// 反射调用 suspendSendThread(String) 发送完整命令帧
|
||||
Method suspendMethod = SensorScale.class.getDeclaredMethod(
|
||||
"suspendSendThread", String.class);
|
||||
suspendMethod.setAccessible(true);
|
||||
suspendMethod.invoke(this, command + checksum);
|
||||
|
||||
// 保存回调(通过反射写入父类私有字段 mOperateSuccessListener)
|
||||
java.lang.reflect.Field listenerField = SensorScale.class
|
||||
.getDeclaredField("mOperateSuccessListener");
|
||||
listenerField.setAccessible(true);
|
||||
listenerField.set(this, listener);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, methodName + " 反射调用失败: address=" + address, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,8 +8,6 @@ package com.shuwei.dish.match.utils;
|
||||
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import com.aithings.Weigher;
|
||||
import com.blankj.utilcode.util.Utils;
|
||||
import com.t507.System;
|
||||
import com.wabon.wbintelligenthardwaresdk.api.SensorScale;
|
||||
@@ -25,14 +23,25 @@ public class Weigher2 {
|
||||
public static final int ERR_003 = 1003;
|
||||
public static final int ERR_004 = 1004;
|
||||
public static final int ERR_PCB_NOT_SUPPORT = 2000;
|
||||
private static SensorScale mSensorScale;
|
||||
private static String mDevicePort = "/dev/ttyS4";
|
||||
private static FixedSensorScale mSensorScale;
|
||||
private static String mDevicePort = "/dev/ttyS4";
|
||||
// private static String mDevicePort = "/dev/ttyS7";
|
||||
private static boolean mConnect = false;
|
||||
private static Listener mListener;
|
||||
|
||||
/** 允许外部在 init() 前设置串口路径,用于不同硬件型号的子设备 */
|
||||
public static void setDevicePort(String port) {
|
||||
mDevicePort = port;
|
||||
Log.d(TAG, "串口已设置为: " + port);
|
||||
}
|
||||
|
||||
public static String getDevicePort() {
|
||||
return mDevicePort;
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
String var0;
|
||||
if ((var0 = Build.MODEL) == "pcb_941") {
|
||||
String var0 = Build.MODEL;
|
||||
if ("pcb_941".equals(var0)) {
|
||||
Log.w(TAG, "pcb not support, " + var0);
|
||||
Listener var1;
|
||||
if ((var1 = mListener) != null) {
|
||||
@@ -42,8 +51,9 @@ public class Weigher2 {
|
||||
} else {
|
||||
System.init();
|
||||
initScale();
|
||||
if (var0 == "pcb_908") {
|
||||
mDevicePort = "/dev/ttyS4";
|
||||
if ("pcb_908".equals(var0)) {
|
||||
// mDevicePort = "/dev/ttyS4";
|
||||
mDevicePort = "/dev/ttyS7";
|
||||
}
|
||||
|
||||
mSensorScale.openScale(mDevicePort, 115200, (open) -> {
|
||||
@@ -63,12 +73,11 @@ public class Weigher2 {
|
||||
|
||||
public static void unInit() {
|
||||
// $FF: Couldn't be decompiled
|
||||
Weigher.unInit();
|
||||
}
|
||||
|
||||
public static void config() {
|
||||
String var0;
|
||||
if ((var0 = Build.MODEL) == "pcb_941") {
|
||||
String var0 = Build.MODEL;
|
||||
if ("pcb_941".equals(var0)) {
|
||||
Log.w(TAG, "pcb not support, " + var0);
|
||||
Listener var2;
|
||||
if ((var2 = mListener) != null) {
|
||||
@@ -393,7 +402,8 @@ public class Weigher2 {
|
||||
}
|
||||
};
|
||||
//.<init>();
|
||||
mSensorScale = new SensorScale(var0);
|
||||
// 使用修复版子类,解决地址 ≥ 10 时 zeroTwo/tareTwo 编码错误的问题
|
||||
mSensorScale = new FixedSensorScale(var0);
|
||||
}
|
||||
|
||||
public static void setNoPull485Pin(boolean noPull) {
|
||||
@@ -409,7 +419,7 @@ public class Weigher2 {
|
||||
|
||||
void onSetIdentify();
|
||||
|
||||
// void onGetWeight(int var1, int var2, int var3);
|
||||
// void onGetWeight(int var1, int var2, int var3);
|
||||
void onGetWeight(int var1, int var2, double var3);
|
||||
|
||||
void onReadIdentify(int var1);
|
||||
|
||||
@@ -99,6 +99,7 @@ object WeightUtil {
|
||||
Log.d(TAG, "tareTwo,执行清零操作: address=$address")
|
||||
// SDK 内部自动管理总线,直接发送清零命令
|
||||
Weigher2.zeroTwo(address)
|
||||
// Weigher2.tareTwo(address)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
Log.e(TAG, "tareTwo,执行清零异常: address=$address, error=${e.message}")
|
||||
|
||||
Reference in New Issue
Block a user