From 3244dbd998aaed5ba13db688a5c0b85eb88e75a6 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 26 十二月 2025 11:00:12 +0800
Subject: [PATCH] 可升级200万摄像头,兼容旧摄像头,多个摄像头都可升级

---
 app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java |  283 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 144 insertions(+), 139 deletions(-)

diff --git a/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
index e45618b..c2f0e7b 100644
--- a/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
+++ b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
@@ -16,15 +16,18 @@
 
 import android.widget.Toast;
 
+import com.fwupgrade.saymanss.deviceplug.CameraControlTransfer;
 import com.fwupgrade.saymanss.deviceplug.IUsbDevicePlugDelegate;
 import com.fwupgrade.saymanss.deviceplug.UstorageDeviceInstance;
 import com.fwupgrade.saymanss.utils.AppPathInfo;
 import com.fwupgrade.saymanss.utils.UtilTools;
 import com.fwupgrade.saymanss.view.GeneralDialog;
+import com.jni.NativeMethods;
 import com.jni.UStorageTestModule;
-import com.spca.usb.CUSBListener;
+
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
@@ -83,20 +86,21 @@
     public void onCreate() {
         super.onCreate();
         Log.i(TAG,"onCreate");
-        initTarget();
 
         initData();
+        acceptFwList();
         initDeviceSDK();
-        UStorageTestModule.getInstance().initUStorageDeviceModuleWithVirtualDisk(AppPathInfo.getLogPath());
-
 
     }
 
 
     private File[] mFileList;
+    private ArrayList<CameraControlTransfer> upgradeList = new ArrayList<>();
+    private volatile boolean upgrading = false;
 
-    private HashMap<String, Integer> tty = new HashMap<>();
-
+    private int mUpgradeSuccessNum = 0;
+    private int mUpgradeFailNum = 0;
+    private int mDevicesNum = 0;
 
     private final Handler mHander = new Handler(Looper.getMainLooper()) {
         @Override
@@ -119,18 +123,16 @@
 
                 case USB_DEVICE_DETACHED:
 
-                    int count = (int) msg.obj;
-                    Log.i(TAG,"count="+count);
-                    if (count<2) {
-                        tty.clear();
-                        initTarget();
-                        int ret = UstorageDeviceInstance.getInstance().tryAgain(FwUpgradeService.this);
-                        if (ret==1){
-                            Log.i(TAG,"鍙戦�佸け璐ョ粨鏋滃箍鎾粰椹惧煿");
-                            sendToDriveTrainByBroadCast(0,1);
-                            sendToNewDriveTrainByBroadCast(0,1);
-                        }
-                    }
+//                    int count = (int) msg.obj;
+//                    Log.i(TAG,"count="+count);
+//                    if (count<2) {
+//                        int ret = UstorageDeviceInstance.getInstance().tryAgain(FwUpgradeService.this);
+//                        if (ret==1){
+//                            Log.i(TAG,"鍙戦�佸け璐ョ粨鏋滃箍鎾粰椹惧煿");
+//                            sendToDriveTrainByBroadCast(0,1);
+//                            sendToNewDriveTrainByBroadCast(0,1);
+//                        }
+//                    }
 
                     break;
 
@@ -152,33 +154,13 @@
 
                 case USB_DEVICE_UPGRADE:
 
-                    String devName = (String) msg.obj;
-                    int errCode = msg.arg1;
-                    int succ_num = 0, fail_num = 0;
+                    Log.d(TAG, "devicesNum:" + mDevicesNum + " mUpgradeSuccessNum:" + mUpgradeSuccessNum + " mUpgradeFailNum:" + mUpgradeFailNum);
 
-                    Log.d("fwup","Upgrade result:" + devName + ", errCode: " + errCode+".ttySize="+tty.size());
-
-                    if (tty.containsKey(devName)) {
-                        tty.put(devName, errCode == 0? UPGRADE_SUCCESS:UPGRADE_FAIL);
-                    }
-
-                    for (Map.Entry<String, Integer> entry : tty.entrySet()) {
-                        if (entry.getValue() == UPGRADE_SUCCESS) {
-                            succ_num++;
-                        } else if (entry.getValue() == UPGRADE_FAIL) {
-                            fail_num++;
-                        }
-                    }
-
-                    if (succ_num + fail_num == tty.size()) {
+                    if (mUpgradeFailNum + mUpgradeSuccessNum == mDevicesNum) {
                         Log.d(TAG, "Upgrade Finish!");
 
-
-                        sendToNewDriveTrainByBroadCast(succ_num,tty.size());
-                        sendToDriveTrainByBroadCast(succ_num,tty.size());
-
-
-
+                        sendToNewDriveTrainByBroadCast(mUpgradeSuccessNum,mDevicesNum);
+                        sendToDriveTrainByBroadCast(mUpgradeSuccessNum,mDevicesNum);
 //                        System.exit(0);
                     }
                     break;
@@ -206,19 +188,7 @@
     }
 
     // 姣忔鍗囩骇璺緞鍊兼渶灏忕殑
-    private void initTarget() {
-        ArrayList<UsbDevice> targets = UstorageDeviceInstance.getInstance().acceptOTGDeviceInfo((UsbManager) getSystemService(USB_SERVICE));
-        String min = "Z";
 
-        for (UsbDevice usbDevice: targets) {
-            if (usbDevice.getDeviceName().compareTo(min) < 0) {
-                min = usbDevice.getDeviceName();
-
-            }
-        }
-        Log.i(TAG,"min="+min);
-        tty.put(min, UPGRADE_PRESET);
-    }
 
     /**
      * 鑾峰彇fw鍒楄〃
@@ -252,19 +222,8 @@
      * UstorageDeviceSDK鍒濆鍖�.
      */
     private void initDeviceSDK() {
-        int count = 0 ;
-        int ret = UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(FwUpgradeService.this, FwUpgradeService.this);
-        Log.i(TAG,"initDeviceSDk,ret="+ret);
-        if (ret==1){
-
-            ++count;
-            Log.i(TAG,"鍐嶆鐨勫垵濮嬪寲");
-            Message message = Message.obtain();
-            message.obj = count;
-            message.what = USB_DEVICE_DETACHED;
-            mHander.sendMessageDelayed(message,1000);
-        }
-
+        Log.i(TAG,"initDeviceSDk");
+        UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(FwUpgradeService.this, FwUpgradeService.this);
     }
 
     @Override
@@ -272,86 +231,132 @@
         Log.d(TAG,"usbDeviceInsert");
     }
 
-    @Override
-    public void permissionFinish(boolean isSuccessful, CUSBListener.UsbControlBlock ctrlBlock) {
-        synchronized (this) {
-            Message msg = Message.obtain();
-            msg.obj = isSuccessful;
-            msg.what = USB_DEVICE_PERRMISSION;
-            mHander.sendMessage(msg);
-            Log.d(TAG,"permissionFinish:" + isSuccessful);
-            if (isSuccessful && ctrlBlock != null) {
-                initFwUpgrade(ctrlBlock);
-            }else{
-                sendToDriveTrainByBroadCast(0,1);
-                sendToNewDriveTrainByBroadCast(0,1);
-            }
+    public void onProgress(float progress) {
+
+    }
+
+    private void upgradeNext() {
+        if (upgradeList.isEmpty()) {
+            Log.d(TAG, "upgrade complete!");
+            mHander.sendEmptyMessage(USB_DEVICE_UPGRADE);
+        }
+
+        if (!upgrading && upgradeList.size() > 0) {
+            upgrading = true;
+            CameraControlTransfer cct = upgradeList.get(0);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if (!cct.bPermission) {
+                        return;
+                    }
+                    Log.d(TAG,"UpdateCameraInfo->dev" + cct.dev.getDeviceName());
+                    boolean bClaim = cct.connection.claimInterface(cct.dev.getInterface(0), true);
+                    //devInfo.connection.releaseInterface(devInfo.dev.getInterface(0));
+                    Log.d(TAG,"UpdateCameraInfo->bClaim" + String.valueOf(bClaim));
+
+                    Log.d(TAG, "Start init");
+                    boolean r = NativeMethods.getInstance().Initialize(cct);
+                    if (r) {
+                        Log.d(TAG, "Initialise success!");
+                        byte data[] = new byte[100];
+                        java.util.Arrays.fill(data, (byte) 0);
+                        if (NativeMethods.getInstance().GetProduct(data, 100)) {
+                            if (data[0] != 0xFF) {
+                                String devName = new String(data).trim();
+                            }
+                        }
+
+                        java.util.Arrays.fill(data, (byte) 0);
+
+                        if (NativeMethods.getInstance().GetFwVersion(data, 100, true)) {
+                            if (data[0] != 0xFF) {
+                                String fwVersion = new String(data).trim();
+                            }
+                        }
+
+                        final NativeMethods.SERIAL_FLASH_TYPE sft = NativeMethods.SERIAL_FLASH_TYPE.SFT_UNKNOW;
+                        if(!NativeMethods.getInstance().GetSerialFlashType(sft, true)){
+                            Log.i("test", "GetSerialFlashType failed");
+                        }
+                        sft.setValue(NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.ordinal());
+                        Log.i("test", "sft= " + sft.getValue());
+
+                        if(sft.getValue() == 0){
+                            //return;
+                            Log.i("test", "set sft= " + NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.toString());
+                            sft.setValue(NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.ordinal());
+                        }
+
+                        if (mFileList != null && mFileList.length > 0) {
+                            try {
+                                String path = mFileList[0].getAbsolutePath();
+
+                                NativeMethods.ASIC_ROM_TYPE romType = NativeMethods.ASIC_ROM_TYPE.ART_Unknow;
+                                int chipID[] = new int[1];
+                                if (!NativeMethods.getInstance().GetAsicRomType(romType, chipID)) {
+                                    throw new Exception("get chip rom type failed!");
+                                }
+                                Log.d("RomType", String.valueOf(chipID[0]));
+                                FileInputStream fis = new FileInputStream(path);
+                                fis.available();
+                                byte[] buffer = new byte[7];
+
+                                if (fis.read(buffer, 0, 7) != -1) {
+                                    if (buffer[5] < 48 || buffer[5] >= 65 || buffer[6] < 48 || buffer[6] >= 65) {
+                                        throw new Exception("The selected firmware and device do not match!");
+                                    }
+                                    int id = (buffer[5] - 48) * 16 + (buffer[6] - 48);
+                                    if (id != chipID[0]) {
+                                        throw new Exception("The selected firmware and device do not match!");
+                                    }
+                                }
+
+                                Log.d(TAG, "BurnFw start...");
+                                if (!NativeMethods.getInstance().BurnerFW(FwUpgradeService.this, path, sft, true)) {
+                                    mUpgradeFailNum++;
+                                    Log.d(TAG, "BurnFw fail!!!");
+                                } else {
+                                    mUpgradeSuccessNum++;
+                                    Log.d(TAG, "BurnFw success!!!");
+                                }
+
+                                fis.close();
+                                SystemClock.sleep(500);
+                                NativeMethods.getInstance().RestartDevice();
+                            } catch (Exception ex) {
+                                Log.e(TAG, "upgrade fail: " + ex.getMessage());
+                            }
+                        }
+                        NativeMethods.getInstance().UnInitialize();
+                    }
+                    upgradeList.remove(cct);
+                    upgrading = false;
+
+                    SystemClock.sleep(1000);
+
+                    upgradeNext();
+                }
+            }).start();
         }
     }
+
+    @Override
+    public void permissionFinish(boolean isSuccessful, com.fwupgrade.saymanss.deviceplug.CUSBListener.UsbControlBlock ctrlBlock, CameraControlTransfer cct) {
+        synchronized (this) {
+            mDevicesNum++;
+            upgradeList.add(cct);
+            upgradeNext();
+        }
+    }
+
 
     @Override
     public void usbDeviceDetached() {
         Log.d(TAG,"usbDeviceDetached");
     }
 
-    /**
-     * 鍒濆鍖栧崌绾х幆澧�
-     */
-    private void initFwUpgrade(CUSBListener.UsbControlBlock ctrlBlock) {
-        final int vendorId = ctrlBlock.getVenderId();
-        final int productId = ctrlBlock.getProductId();
-        int fileDescriptor = ctrlBlock.getFileDescriptor();
-        int busNum = ctrlBlock.getBusNum();
-        int devNum = ctrlBlock.getDevNum();
-        boolean isTarget = false;
-        String usbfsName = getUSBFSName(ctrlBlock);
-        String devName = ctrlBlock.getDeviceName();
-
-        String serial = ctrlBlock.getSerial();
-
-        Log.d(TAG,"sonixCamInit " + String.format("vendorId:%d productId:%d fileDescriptor:%d busNum:%d devNum:%d usbfsName:%s devName:%s serial:%s,tty.size=%d", vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName, serial,tty.size()));
-
-
-        if (tty.containsKey(devName) && tty.get(devName) == 0) {
-            isTarget = true;
-            tty.put(devName, 1);
-        }
-
-
-
-        if (!isTarget) {
-
-            Log.d(TAG,"Not sonixCam, close");
-            ctrlBlock.close();
-
-            return;
-        }
-
-        Log.d(TAG,"Is sonixCam, upgrade!");
-        Message msg = Message.obtain();
-        //msg.obj = errCode == 0;
-        msg.obj = new CameraInfo(vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName);
-        msg.what = USB_DEVICE_OPEN;
-        mHander.sendMessage(msg);
-    }
-
-
-    private final String getUSBFSName(final CUSBListener.UsbControlBlock ctrlBlock) {
-        String result = null;
-        final String name = ctrlBlock.getDeviceName();
-        final String[] v = !TextUtils.isEmpty(name) ? name.split("/") : null;
-        if ((v != null) && (v.length > 2)) {
-            final StringBuilder sb = new StringBuilder(v[0]);
-            for (int i = 1; i < v.length - 2; i++)
-                sb.append("/").append(v[i]);
-            result = sb.toString();
-        }
-        if (TextUtils.isEmpty(result)) {
-//            Log.w(TAG, "failed to get USBFS path, try to use default path:" + name);
-            result = "/dev/bus/usb";
-        }
-        return result;
-    }
 
     class Update implements Runnable {
         CameraInfo cam;

--
Gitblit v1.8.0