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/HomePageActivity.java |  288 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 157 insertions(+), 131 deletions(-)

diff --git a/app/src/main/java/com/fwupgrade/saymanss/HomePageActivity.java b/app/src/main/java/com/fwupgrade/saymanss/HomePageActivity.java
index dc5c3fa..55417d6 100644
--- a/app/src/main/java/com/fwupgrade/saymanss/HomePageActivity.java
+++ b/app/src/main/java/com/fwupgrade/saymanss/HomePageActivity.java
@@ -26,14 +26,16 @@
 import android.widget.Toast;
 
 import com.fwupgrade.saymanss.adapter.FwFileListAdapter;
+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.SystemUtil;
 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.BufferedReader;
 import java.io.File;
@@ -43,7 +45,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import app.dinus.com.loadingdrawable.LoadingView;
 
 public class HomePageActivity extends AppCompatActivity implements IUsbDevicePlugDelegate, AdapterView.OnItemClickListener {
     static final String TAG = "fwup";
@@ -81,8 +82,7 @@
     protected TextView mTitle;
     /** 杩斿洖 */
     protected TextView mAppVersion;
-    /** LoadingView */
-    private LoadingView loadingView;
+
     /** 鍗囩骇 */
     private TextView mFwUpDataBtn;
     /** 鎻愮ず */
@@ -90,9 +90,17 @@
     /** fw list */
     protected ListView mListView;
 
+    private TextView mDeviceFwVersion;
+    private TextView mFileFwVersion;
+
     private File[] mFileList;
 
-    private HashMap<String, Integer> tty = new HashMap<>();
+    private ArrayList<CameraControlTransfer> upgradeList = new ArrayList<>();
+    private volatile boolean upgrading = false;
+
+    private int mUpgradeSuccessNum = 0;
+    private int mUpgradeFailNum = 0;
+    private int mDevicesNum = 0;
 
     private Handler mHander = new Handler() {
         @Override
@@ -159,35 +167,19 @@
                             mFwUpDataBtn.setText("鍗囩骇澶辫触");
                         }
                     }*/
-                    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);
-
-                    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!");
 
                         Intent intent = new Intent();
-                        intent.putExtra("result", succ_num == tty.size()? 0 : 1);
+                        intent.putExtra("result", mUpgradeSuccessNum == mDevicesNum? 0 : 1);
                         intent.setAction("com.fwupgrade.saymanss.UPGRADE_COMPLETE");
                         intent.setPackage("safeluck.drive.training");
                         sendBroadcast(intent);
 
                         intent = new Intent();
-                        intent.putExtra("result", succ_num == tty.size()? 0 : 1);
+                        intent.putExtra("result", mUpgradeSuccessNum == mDevicesNum? 0 : 1);
                         intent.setAction("com.fwupgrade.saymanss.UPGRADE_COMPLETE");
                         intent.setPackage("demo1.tech.anyun.com.myapplication");
                         sendBroadcast(intent);
@@ -212,11 +204,10 @@
 
         initView();
         checkPermission();
-        initTarget();
         initData();
+        acceptFwList();
         initListener();
         initDeviceSDK();
-        UStorageTestModule.getInstance().initUStorageDeviceModuleWithVirtualDisk(AppPathInfo.getLogPath());
     }
 
 
@@ -266,25 +257,15 @@
         //椤堕儴鏉�
         mTitle = (TextView) findViewById(R.id.app_topbar_center_text);
         mAppVersion = (TextView) findViewById(R.id.app_topbar_left_text);
-        loadingView = (LoadingView) findViewById(R.id.progress_loading);
-        loadingView.setColorFilter(getResources().getColor(R.color.apptakeaction));
 
         mFwUpDataBtn = (TextView) findViewById(R.id.app_fwupdata_btn);
         mFwUpNo = (TextView) findViewById(R.id.app_topbar_no);
         mListView = (ListView) findViewById(R.id.app_fw_list);
-    }
-    // 姣忔鍗囩骇璺緞鍊兼渶灏忕殑
-    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();
-            }
-        }
-        tty.put(min, UPGRADE_PRESET);
+        mDeviceFwVersion = (TextView) findViewById(R.id.device_fw_version);
+        mFileFwVersion = (TextView) findViewById(R.id.file_fw_version);
     }
+
 
     /**
      * 鍒濆鍖栨暟鎹�
@@ -318,13 +299,6 @@
      */
     private void initDeviceSDK() {
         UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(HomePageActivity.this, HomePageActivity.this);
-//        Thread thread = new Thread() {
-//            @Override
-//            public void run() {
-//                UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(HomePageActivity.this, HomePageActivity.this);
-//            }
-//        };
-//        thread.start();
     }
 
     /**
@@ -336,14 +310,7 @@
 
     @Override
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
-        int visibility = loadingView.getVisibility();
-        if (mFileList != null && visibility != View.VISIBLE) {
-            File file = mFileList[position];
-            String point = "纭畾鍗囩骇姝ゅ浐浠跺悧?";
-            GeneralDialog generalDialog = new GeneralDialog(this, R.style.wdDialog, mHander, point, file);
-            generalDialog.setCanceledOnTouchOutside(false);
-            generalDialog.show();
-        }
+
     }
 
 
@@ -352,7 +319,7 @@
      */
     private void acceptFwList() {
         Log.d("fwup","acceptFwList: ");
-        loadingView.setVisibility(View.GONE);
+
         File file = new File(AppPathInfo.getFwSavePath());
         File[] files = file.listFiles();
         if (files != null && files.length > 0) {
@@ -375,16 +342,11 @@
     }
 
     @Override
-    public void permissionFinish(boolean isSuccessful, CUSBListener.UsbControlBlock ctrlBlock) {
+    public void permissionFinish(boolean isSuccessful, com.fwupgrade.saymanss.deviceplug.CUSBListener.UsbControlBlock ctrlBlock, CameraControlTransfer cct) {
         synchronized (this) {
-            Message msg = Message.obtain();
-            msg.obj = isSuccessful;
-            msg.what = USB_DEVICE_PERRMISSION;
-            mHander.sendMessage(msg);
-            Log.d("fwup","permissionFinish:" + isSuccessful);
-            if (isSuccessful && ctrlBlock != null) {
-                initFwUpgrade(ctrlBlock);
-            }
+            mDevicesNum++;
+            upgradeList.add(cct);
+            upgradeNext();
         }
     }
 
@@ -430,78 +392,13 @@
         }
     }
 
-    /**
-     * 鍒濆鍖栧崌绾х幆澧�
-     */
-    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("fwup","sonixCamInit " + String.format("vendorId:%d productId:%d fileDescriptor:%d busNum:%d devNum:%d usbfsName:%s devName:%s serial:%s", vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName, serial));
-
-        //final int errCode = UStorageTestModule.getInstance().sonixCamInit(vendorId, productId, fileDescriptor, busNum, devNum, usbfsName);
-        //Log.d("fwup","sonixCamInit errCode:" + errCode);
-
-        /*runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                UtilTools.showToast(HomePageActivity.this, "vid: " + vendorId + " pid: " + productId + " err: " + errCode);
-            }
-        });*/
-
-        if (tty.containsKey(devName) && tty.get(devName) == 0) {
-            isTarget = true;
-            tty.put(devName, 1);
-        }
-
-        if (!isTarget) {
-            Log.d("fwup","Not sonixCam, close");
-            ctrlBlock.close();
-            return;
-        }
-
-        Log.d("fwup","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;
-    }
-
 
     /**
      * 鍗囩骇
      * @param file
      */
     private void startFwUpdata(final File file) {
-        loadingView.setVisibility(View.VISIBLE);
+
         mFwUpDataBtn.setText("姝e湪鍗囩骇锛岃鍕挎柇寮�杩炴帴");
         Thread thread = new Thread() {
             @Override
@@ -567,6 +464,135 @@
         return errCode;
     }
 
+    public void onProgress(float progress) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mFwUpDataBtn.setText(String.format("Progress: %.4f%%", progress * 100));
+            }
+        });
+    }
+
+    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();
+
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mFileFwVersion.setText("Device Name: " + devName + ", " + cct.dev.getDeviceName());
+                                    }
+                                });
+                            }
+                        }
+
+                        java.util.Arrays.fill(data, (byte) 0);
+
+                        if (NativeMethods.getInstance().GetFwVersion(data, 100, true)) {
+                            if (data[0] != 0xFF) {
+                                String fwVersion = new String(data).trim();
+
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mDeviceFwVersion.setText("Fireware Name: " + fwVersion);
+                                    }
+                                });
+                            }
+                        }
+
+                        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(HomePageActivity.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());
+                            }
+                        } else {
+                            Log.d(TAG, "upgrade file is empty!");
+                        }
+                        NativeMethods.getInstance().UnInitialize();
+                    }
+                    upgradeList.remove(cct);
+                    upgrading = false;
+
+                    SystemClock.sleep(1000);
+
+                    upgradeNext();
+                }
+            }).start();
+        }
+    }
 
     // -----------------------------------------------鏉冮檺鐢宠 鐩稿叧------------------------------------------
     /**

--
Gitblit v1.8.0