Browse Source

1、新增尿液分析仪设备对节目

guanxinyi 1 year ago
parent
commit
a3ed3bd280

+ 1 - 0
app/build.gradle

@@ -75,6 +75,7 @@ android {
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     implementation(name: 'ecgsdk_library', ext: 'aar')
+//    implementation(name: 'empble', ext: 'aar')
 //    implementation fileTree(dir: 'libs', include: ['*.aar'])
 
     //noinspection GradleCompatible

+ 2 - 1
app/src/main/java/vinno/sportinspect/config/DevicesConstant.java

@@ -38,7 +38,8 @@ public class DevicesConstant {
             add(new Device(8, EnumDeviceTypes.WAIST.typeName(), "waist", "腰围尺", "腰围尺", "", "", "WaistToHipDialog", true, "腰臀比", "yaotunbi", true, EnumDevicesType.manual.value()));
             add(new Device(9, EnumDeviceTypes.LUNG.typeName(), "SP80B", "肺活仪", "肺活仪(SP80B)", "00:00:00:00:00:00", "PULMO80B", "LungByContec", true, "肺活仪", "lung", false, EnumDevicesType.BLE.value()));
             //add(new Device(EnumDeviceLungKey.PROJECT_MODEL_VALUE,"A31-W","肺活仪","VINNO肺活仪(A31-W)","00:00:00:00:00:00","A322","LungA31WDialog|fragment_lung", true,"肺活仪","lung", false, EnumDevicesType.BLE.value()));
-            add(new Device(10, EnumDeviceTypes.URINE.typeName(), "Ui-1", "尿液分析仪", "尿液分析(Ui-1)", "00:00:00:00:00:00", "BLE-EMP-Ui", "UrineByUi1", true, "尿液分析", "urine", false, EnumDevicesType.BLE.value()));
+            add(new Device(10, EnumDeviceTypes.URINE.typeName(), "Ui-10C", "尿液分析仪", "尿液分析(Ui-10C)", "00:00:00:00:00:00", "BLE-EMP-Ui", "UrineByUi", true, "尿液分析", "urine", false, EnumDevicesType.BLE.value()));// 因为蓝牙名称相同
+            add(new Device(10, EnumDeviceTypes.URINE.typeName(), "Ui-1", "尿液分析仪", "尿液分析(Ui-1)", "00:00:00:00:00:00", "BLE-EMP-Ui", "UrineByUi", true, "尿液分析", "urine", false, EnumDevicesType.BLE.value()));
             add(new Device(10, EnumDeviceTypes.URINE.typeName(), "BC401BT", "尿液分析仪", "尿液分析(BT401)", "00:00:00:00:00:00", "BC01", "UrineByBC401BT", true, "尿液分析", "urine", false, EnumDevicesType.BLE.value()));
             add(new Device(11, EnumDeviceTypes.TWELVEHEART.typeName(), "pe1204", "十二导心电", "十二导心电(华清心仪)", "", "", "UrineBC401BTDialog", true, "十二导心电", "heart", false, EnumDevicesType.jump.value())); //跳转到其他app
             add(new Device(11, EnumDeviceTypes.TWELVEHEART.typeName(), "ECGWS12", "十二导心电", "十二导心电(康泰)", "00:00:00:00:00:00", "ECGWS12", "HeartByECGWS12", true, "十二导心电", "heart", false, EnumDevicesType.BT.value()));

+ 3 - 2
app/src/main/java/vinno/sportinspect/config/RequestConstant.java

@@ -9,7 +9,6 @@ package vinno.sportinspect.config;
  */
 public class RequestConstant {
     public final  static  String SEARCH_START = "SEARCH_START";
-
     public final  static  String SEARCH_START_BT = "SEARCH_START_BT";
     public final  static  String SEARCH_STOP = "SEARCH_STOP";
 
@@ -17,9 +16,11 @@ public class RequestConstant {
     public final  static  String BLE_DISCONNECT = "BLE_DISCONNECT";
     public final  static  String BLE_IS_CONNECTED = "BLE_IS_CONNECTED";
 
-
     public final  static  String BT_DISCONNECT = "BT_DISCONNECT";
     public final  static  String BT_IS_CONNECTED = "BT_IS_CONNECTED";
+
+    /// 自动检测
+    public final  static  String  AUTO_TEST  = "AUTO_TEST";
     //血压模块
     public final  static  String START_NIBP = "START_NIBP";
     public final  static  String STOP_NIBP = "STOP_NIBP";

+ 5 - 0
app/src/main/java/vinno/sportinspect/devices/BaseDevices.java

@@ -171,6 +171,11 @@ abstract public class BaseDevices {
         }
         return false;
     }
+
+    public  void autoTest() {
+        LogUtil.d("自动测试开始");
+    };
+
     //解析数据
     public abstract void parseData(byte[] data);
     //操作分发

+ 347 - 0
app/src/main/java/vinno/sportinspect/devices/UrineByUi.java

@@ -0,0 +1,347 @@
+package vinno.sportinspect.devices;
+
+import androidx.annotation.Keep;
+
+import com.clj.fastble.BleManager;
+import com.clj.fastble.callback.BleNotifyCallback;
+import com.clj.fastble.callback.BleWriteCallback;
+import com.clj.fastble.data.BleDevice;
+import com.clj.fastble.exception.BleException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.json.JSONObject;
+
+import java.util.Arrays;
+
+import vinno.sportinspect.bean.EMPReportValueBean;
+import vinno.sportinspect.bean.UrineMeasureResult;
+import vinno.sportinspect.config.Constant;
+import vinno.sportinspect.config.StatusConstant;
+import vinno.sportinspect.minterface.OnBleConnectSuccessListener;
+import vinno.sportinspect.utils.log.LogUtil;
+
+/**
+ * @name: SportInspect
+ * @author: Baka
+ * @time: 2024/1/18 16:13
+ * @version: 1.0
+ * @description:恩普生尿常规
+ */
+@Keep
+public class UrineByUi extends BaseDevices{
+    /// 接收的快速测试
+    private  byte[] quickCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x04, (byte) 0x00, (byte) 0x08,(byte) 0xED,(byte) 0xF9};
+    private  byte[] sendQuickCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x05, (byte) 0x00, (byte) 0x08,(byte) 0xED,(byte) 0x00,(byte) 0xFA};
+    /// 接收和发送的的自动测试
+    private  byte[] autoCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x05, (byte) 0x00, (byte) 0x08,(byte) 0x0B,(byte) 0x00,(byte) 0x18};
+
+    private byte[] deviceVer = {(byte) 0x93, (byte) 0x8e, (byte) 0x08, (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x43, (byte) 0x4F, (byte) 0x4E, (byte) 0x54, (byte) 0x45};
+
+
+    private  byte[] testArray;
+    @Override
+    public void BLUETOOTH_CONNECT(JSONObject params ) {
+        super.BLUETOOTH_CONNECT(params);
+        connect(mac, new OnBleConnectSuccessListener() {
+            @Override
+            public void onBleConnectSuccess(BleDevice bleDevice, int isFirst) {
+                if( isFirst == 0 ) notifyDataChange(bleDevice);
+                else if( isFirst > 0 ) registerRead();
+
+            }
+        });
+    }
+    void notifyDataChange(BleDevice bleDevice){
+        BleManager.getInstance().notify(bleDevice, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, new BleNotifyCallback() {
+            @Override
+            public void onNotifySuccess() {
+                LogUtil.d( "bleManager--->onNotifySuccess" );
+                deviceVerification();
+                //直接同步数据
+//                autoTest();
+            }
+            @Override
+            public void onNotifyFailure(BleException exception) {
+                LogUtil.d( "bleManager--->onNotifyFailure"+exception );
+                BleManager.getInstance().stopNotify(bleDevice, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID);
+                disConnectDevice();
+                callBack(StatusConstant.BLE_REGISTER_NOTIFY_FAIL);
+            }
+            @Override
+            public void onCharacteristicChanged(byte[] data) {
+               parseData( data );
+            }
+        });
+    }
+
+    /**
+     * 主动获取最后一条数据
+     */
+    void registerRead(){
+        byte[] dataArray = new byte[7];
+        dataArray[0] = (byte) 0x93;
+        dataArray[1] = (byte) 0x8e;
+        dataArray[2] = (byte) 0x04;
+        dataArray[3] = (byte) 0x00;
+        dataArray[4] = (byte) 0x08;
+        dataArray[5] = (byte) 0x04;
+        dataArray[6] = (byte) 0x10;
+        BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, dataArray, new BleWriteCallback() {
+            @Override
+            public void onWriteSuccess(int current, int total, byte[] justWrite) {
+                LogUtil.d( "bleManager--->onWriteSuccess" );
+            }
+            @Override
+            public void onWriteFailure(BleException exception) {
+                LogUtil.d( "bleManager--->onWriteFailure"+exception );
+                callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
+            }
+        });
+    }
+    /**
+     *  设备确认
+     */
+    public void deviceVerification() {
+        byte[] dataArray = new byte[11];
+        dataArray[0] = (byte) 0x93;
+        dataArray[1] = (byte) 0x8e;
+        dataArray[2] = (byte) 0x08;
+        dataArray[3] = (byte) 0x00;
+        dataArray[4] = (byte) 0x08;
+        dataArray[5] = (byte) 0x01;
+        dataArray[6] = (byte) 0x43;
+        dataArray[7] = (byte) 0x4F;
+        dataArray[8] = (byte) 0x4E;
+        dataArray[9] = (byte) 0x54;
+        dataArray[10] = (byte) 0x45;
+        BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, dataArray, new BleWriteCallback() {
+            @Override
+            public void onWriteSuccess(int current, int total, byte[] justWrite) {
+                LogUtil.d( "bleManager--->onWriteSuccess" );
+            }
+            @Override
+            public void onWriteFailure(BleException exception) {
+                LogUtil.d( "bleManager--->onWriteFailure"+exception );
+                callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
+            }
+        });
+    }
+
+
+    /**
+     * 自动检测
+     */
+    @Override
+    public void autoTest(){
+        super.autoTest();
+        LogUtil.d("开始尿液测试");
+
+        BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, testArray, new BleWriteCallback() {
+            @Override
+            public void onWriteSuccess(int current, int total, byte[] justWrite) {
+                LogUtil.d( "bleManager--->onWriteSuccess" );
+            }
+            @Override
+            public void onWriteFailure(BleException exception) {
+                LogUtil.d( "bleManager--->onWriteFailure"+exception );
+                callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
+            }
+        });
+    }
+    @Override
+    public void parseData(byte[] data) {
+        boolean isEqual = Arrays.equals(data, quickCheck) ||  Arrays.equals(data, autoCheck)  ||Arrays.equals(data, deviceVer);
+        if(Arrays.equals(data, deviceVer)) {
+            testArray = autoCheck;
+        }
+        if(isEqual) {
+            return;
+        }
+        /// 确认设备 || 出结果
+        if(data.length == 20 || data.length == 7) {
+            testArray = sendQuickCheck;
+            return;
+        }
+
+        UrineMeasureResult res = EMPDataAnalysis(data);
+        if(res == null ||  StringUtils.isEmpty( res.LEU ) ||  StringUtils.isEmpty( res.BLD ) ){
+            callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
+            return;
+        }
+        callBack(StatusConstant.BLE_MEASURE_URINE_SUCCESS,res);
+    }
+
+
+    //解析结果
+    public static UrineMeasureResult EMPDataAnalysis(byte[] bVal ){
+        UrineMeasureResult res = new UrineMeasureResult();
+
+        boolean empty = true;
+        for (byte b : bVal) {
+            if (b != 0xff) {
+                empty = false;
+                break;
+            }
+        }
+        if (empty) return null;
+        if (bVal.length == 19) {
+            int SN = ((bVal[7] << 8) | (bVal[6] & 0xff));
+            int effective = ((bVal[9] << 8) | (bVal[8] & 0xff));
+            int TmYear = ((bVal[10] << 8) | (bVal[11] & 0xff)) & 0x7f;
+            int TmMon = (((bVal[10] << 8) | (bVal[11] & 0xff)) >> 7) & 0x0f;
+            int TmDay = (((bVal[10] << 8) | (bVal[11] & 0xff)) >> 11) & 0x1f;
+            int TmHour = ((bVal[12] << 8) | (bVal[13] & 0xff)) & 0x1f;
+            int TmMinute = (((bVal[12] << 8) | (bVal[13] & 0xff)) >> 5) & 0x3f;
+            int LEU = (((bVal[12] << 8) | (bVal[13] & 0xff)) >> 11) & 0x07;
+            int NIT = ((bVal[14] << 8) | (bVal[15] & 0xff)) & 0x07;
+            int UBG = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 3) & 0x07;
+            int PRO = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 6) & 0x07;
+            int PH = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 9) & 0x07;
+            int BLD = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 12) & 0x07;//
+            int SG = ((bVal[16] << 8) | (bVal[17] & 0xff)) & 0x07;
+            int KET = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 3) & 0x07;
+            int BIL = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 6) & 0x07;
+            int GLU = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 9) & 0x07;//
+            int VC = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 12) & 0x07;//
+            int PF = (bVal[16] >> 7) & 0x01;
+            LogUtil.d("bleManager--->SN:"+SN+";effective:"+effective+";LEU:"+LEU+";"+"NIT:"+NIT+";"+"UBG:"+UBG+";"
+                    +"PRO:"+PRO+";"+"PH:"+PH+";"+"BLD:"+BLD+";"+"SG:"+SG+";"
+                    +"KET:"+KET+";"+"BIL:"+BIL+";"+"GLU:"+GLU+";"+"VC:"+VC+";TmYear:"+TmYear+";TmMon:"+TmMon+";TmDay:"+TmDay+";TmHour:"+TmHour+";TmMinute:"+TmMinute);
+            //解析为界面显示的字符串
+            //LEU:2;NIT:0;UBG:3;PRO:0;PH:0;BLD:0;SG:5;KET:1;BIL:0;GLU:3;VC:0;
+            res.LEU= getReportValue( LEU ).LEU ;
+            res.NIT= getReportValue( NIT ).NIT ;
+            res.UBG= getReportValue( UBG ).UBG ;
+            res.PRO= getReportValue( PRO ).PRO ;
+            res.PH=  getReportValue( PH ).PH ;
+            res.BLD=  getReportValue( BLD ).BLD ;
+            res.SG=  getReportValue( SG ).SG ;
+            res.KET=  getReportValue( KET ).KET ;
+            res.BIL=  getReportValue( BIL ).BIL ;
+            res.GLU=  getReportValue( GLU ).GLU ;
+            res.VC=  getReportValue( VC ).VC ;
+
+            res.SN= String.valueOf( SN ) ;
+            res.effective=  String.valueOf( effective ) ;
+            res.TmYear=   String.valueOf( TmYear ) ;
+            res.TmMon=   String.valueOf( TmMon ) ;
+            res.TmDay=   String.valueOf( TmDay ) ;
+            res.TmHour=   String.valueOf( TmHour ) ;
+            res.TmMinute=   String.valueOf( TmMinute ) ;
+
+            return res;
+        } else {
+            return null;
+        }
+    }
+    public static EMPReportValueBean getReportValue(int project) {
+        EMPReportValueBean value = new EMPReportValueBean();
+        switch (project) {
+            case 0:
+                value.LEU = "-";
+                value.NIT = "-";
+                value.UBG = "-";
+                value.PRO = "-";
+                value.PH = "5.0";
+                value.BLD = "-";
+                value.SG = "1.000";
+                value.KET = "-";
+                value.BIL = "-";
+                value.GLU = "-";
+                value.VC = "-";
+                break;
+            case 1:
+                value.LEU = "+-";
+                value.NIT = "+";
+                value.UBG = "+1";
+                value.PRO = "+-";
+                value.PH = "6.0";
+                value.BLD = "+-";
+                value.SG = "1.005";
+                value.KET = "+-";
+                value.BIL = "+1";
+                value.GLU = "+-";
+                value.VC = "+-";
+                break;
+            case 2:
+                value.LEU = "+1";
+                value.NIT = null;
+                value.UBG = "+2";
+                value.PRO = "+1";
+                value.PH = "6.5";
+                value.BLD = "+1";
+                value.SG = "1.010";
+                value.KET = "+1";
+                value.BIL = "+2";
+                value.GLU = "+1";
+                value.VC = "+1";
+                break;
+            case 3:
+                value.LEU = "+2";
+                value.NIT = null;
+                value.UBG = "+3";
+                value.PRO = "+2";
+                value.PH = "7.0";
+                value.BLD = "+2";
+                value.SG = "1.015";
+                value.KET = "+2";
+                value.BIL = "+3";
+                value.GLU = "+2";
+                value.VC = "+2";
+                break;
+            case 4:
+                value.LEU = "+3";
+                value.NIT = null;
+                value.UBG = null;
+                value.PRO = "+3";
+                value.PH = "7.5";
+                value.BLD = "+3";
+                value.SG = "1.020";
+                value.KET = "+3";
+                value.BIL = null;
+                value.GLU = "+3";
+                value.VC = "+3";
+                break;
+            case 5:
+                value.LEU = null;
+                value.NIT = null;
+                value.UBG = null;
+                value.PRO = "+4";
+                value.PH = "8.0";
+                value.BLD = null;
+                value.SG = "1.025";
+                value.KET = "+4";
+                value.BIL = null;
+                value.GLU = "+4";
+                value.VC = null;
+                break;
+            case 6:
+                value.LEU = null;
+                value.NIT = null;
+                value.UBG = null;
+                value.PRO = null;
+                value.PH = "8.5";
+                value.BLD = null;
+                value.SG = "1.030";
+                value.KET = null;
+                value.BIL = null;
+                value.GLU = null;
+                value.VC = null;
+                break;
+            case 7:
+                value.LEU = null;
+                value.NIT = null;
+                value.UBG = null;
+                value.PRO = null;
+                value.PH = null;
+                value.BLD = null;
+                value.SG = null;
+                value.KET = null;
+                value.BIL = null;
+                value.GLU = null;
+                value.VC = null;
+                break;
+        }
+        return value;
+    }
+}

+ 12 - 0
app/src/main/java/vinno/sportinspect/sdk/BaseSdk.java

@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import vinno.sportinspect.bean.Device;
 import vinno.sportinspect.bean.SearchBleDevice;
 import vinno.sportinspect.config.DevicesConstant;
+import vinno.sportinspect.config.RequestConstant;
 import vinno.sportinspect.config.StatusConstant;
 import vinno.sportinspect.devices.BaseDevices;
 import vinno.sportinspect.minterface.OnBleMeasureResultListener;
@@ -89,6 +90,7 @@ class BaseSdk {
                         searchBleDevice.setTYPE(device.PROJECT_MODEL_VALUE);
                         searchBleDevice.setMODEL(device.model);
                         searchBleDevice.setBLE_PRODUCT_NAME(device.bleProductName);
+
                         //发现设备
                         onBTSearchResultListener.onSearchResult(new SearchResultUtils(StatusConstant.BLE_Discovery, searchBleDevice).toJSONObject());
                         return;
@@ -235,6 +237,8 @@ class BaseSdk {
                     for (Device device : finalDevices) {
                         if (StringUtils.isEmpty(device.bleName)) continue;
                         String name = bleDevice.getName();
+
+
                         if (bleDevice.getName().contains(device.bleName)) {
                             SearchBleDevice searchBleDevice = new SearchBleDevice();
                             searchBleDevice.setBLE_NAME(bleDevice.getName());
@@ -399,6 +403,14 @@ class BaseSdk {
         return false;
     }
 
+    /// 新增自动测试
+    public  void autoTest(String model) {
+        BaseDevices instanceDevice = instanceDevices.get(model);
+        if (instanceDevice != null) {
+             instanceDevice.autoTest();
+        }
+    }
+
     /**
      * 断开设备
      *

+ 9 - 1
app/src/main/java/vinno/sportinspect/sdk/VinnnoVnoteSdk.java

@@ -10,6 +10,7 @@ import vinno.sportinspect.config.RequestConstant;
 import vinno.sportinspect.config.StatusConstant;
 import vinno.sportinspect.minterface.OnGlobalResultListener;
 import vinno.sportinspect.utils.SearchResultUtils;
+import vinno.sportinspect.utils.log.LogUtil;
 
 /**
  * @name: SportInspect
@@ -111,7 +112,14 @@ public class VinnnoVnoteSdk extends BaseSdk{
                     return;
                 }
                 isConnected( model );
-            }else{
+            } else if(action.equals(RequestConstant.AUTO_TEST)) {
+                if( StringUtils.isEmpty( model )) {
+                    onGlobalResultListener.onResult( new SearchResultUtils(StatusConstant.PARAMS_ERROR).toJSONObject() );
+                    return;
+                }
+                autoTest(model);
+            }
+            else{
                 if( StringUtils.isEmpty( model )  ){
                     onGlobalResultListener.onResult( new SearchResultUtils(StatusConstant.PARAMS_ERROR).toJSONObject() );
                     return;

+ 5 - 2
demo/src/main/java/com/vinno/sdk/demo/SplashScreenActivity.java

@@ -194,6 +194,10 @@ public class SplashScreenActivity extends AppCompatActivity {
         findViewById(R.id.bt_disconnect_urine).setOnClickListener(v -> {
             request("BLE_DISCONNECT");
         });
+        //尿液自动检测
+        findViewById(R.id.urine_auto_test).setOnClickListener(v -> {
+            request("AUTO_TEST");
+        });
         //连接血氧仪
         findViewById(R.id.bt_connect_spo2).setOnClickListener(v -> {
             request("BLUETOOTH_CONNECT");
@@ -276,7 +280,7 @@ public class SplashScreenActivity extends AppCompatActivity {
             request("BLE_DISCONNECT");
 //            request("SAVE_TWELVE_ECG_RESULT");
         });
-        // 保存十二导心电
+        // 保存十二导心电 (弃用)
         findViewById(R.id.bt_save_twelvehear).setOnClickListener(v -> {
             request("SAVE_TWELVE_ECG_RESULT");
         });
@@ -288,7 +292,6 @@ public class SplashScreenActivity extends AppCompatActivity {
 
     void request(String action) {
         String[] res = getSpinnerData();
-
         if (res == null) {
             Toast.makeText(this, "请选择设备型号", Toast.LENGTH_SHORT).show();
             return;

+ 7 - 0
demo/src/main/res/layout/activity_splash_screen.xml

@@ -202,6 +202,13 @@
                 android:layout_width="150dp"
                 android:layout_height="wrap_content"
                 android:text="断开尿液分析" />
+
+            <Button
+                android:id="@+id/urine_auto_test"
+                android:layout_width="150dp"
+                android:layout_height="wrap_content"
+                android:text="尿液自动检测" />
+
         </LinearLayout>
 
         <LinearLayout