• <rt id="2awkm"><noscript id="2awkm"></noscript></rt>
      <rt id="2awkm"><noscript id="2awkm"></noscript></rt>
    • <dfn id="2awkm"></dfn>
      <menu id="2awkm"><acronym id="2awkm"></acronym></menu>
      
      
      <rt id="2awkm"></rt><dfn id="2awkm"><code id="2awkm"></code></dfn>
    • <dd id="2awkm"><s id="2awkm"></s></dd>
      <tbody id="2awkm"></tbody>
    • <dfn id="2awkm"></dfn>
      <menu id="2awkm"><noscript id="2awkm"></noscript></menu>

      C++ 固件更新示例代碼-Firmware Update

      # 固件升級示例-FirmwareUpgrade

      功能描述:本示例演示如何用固件文件給設備升級。

      > 本示例基于C++ Low Level API進行演示

       

      main函數接口通過命令參數獲取固件文件

      // checkFirmwareFilePath()函數用于檢查文件是否存在,實際代碼中最好檢查后綴是否為bin或者img, 以及固件文件是否與目標設備相匹配
      std::string checkFirmwareFilePath(int argc, char **argv) {
          if(argc < 2) {
              std::cout << "Please input firmware path." << std::endl;
              return "";
          }

          std::string   filePath = std::string(*(argv + 1));
          std::ifstream fs(filePath);
          if(!fs.is_open()) {
              std::cout << "Open Firmware file failed. filePath: " << filePath << std::endl;
              return "";
          }

          fs.close();
          return filePath;
      }

      int main(int argc, char **argv) try {
          std::string firmwareFilePath = checkFirmwareFilePath(argc, argv);
          if(firmwareFilePath.empty()) {
              std::cout << "command: " << std::endl << "$ ./FirmwareUpgrade[.exe] firmwareFile.bin" << std::endl;
              return 0;
          }

          // 接下來的業(yè)務代碼

          return 0;
      }
      catch(ob::Error &e) {
          // 處理OrbbecSDK接口調用異常,示例為了簡潔連續(xù)幾個接口一起try-catch,實際業(yè)務中推薦單獨一個接口一個try-catch
          std::cerr << "function:" << e.getName() << "\nargs:" << e.getArgs() << "\nmessage:" << e.getMessage() << "\ntype:" << e.getExceptionType() << std::endl;
          exit(EXIT_FAILURE);
      }

       

      創(chuàng)建ob::Context并通過ob::Context獲取設備,本示例假設運行FirmwareUpgrade[.exe]之前上位機(Windows、Ubuntu、Android平臺)已經插入設備。ob::DeviceChangedCallback用于固件升級后監(jiān)聽device重啟后獲取被升級設備的業(yè)務處理

      // 構建ob::Context對象
      ob::Context ctx;
      // 設置設備變化監(jiān)聽器,device_changed_callback是管理device聲明周期的關鍵函數,開發(fā)者必須關注該回調
      ctx.setDeviceChangedCallback([](std::shared_ptr<ob::DeviceList> removedList, std::shared_ptr<ob::DeviceList> addedList) {
          if(isWaitRebootComplete_) {
              if(addedList && addedList->deviceCount() > 0) {
                  auto device = addedList->getDevice(0);
                  if(isDeviceRemoved_ && deviceSN_ == std::string(device->getDeviceInfo()->serialNumber())) {
                      rebootedDevice_       = device;
                      isWaitRebootComplete_ = false;

                      std::unique_lock<std::mutex> lk(waitRebootMutex_);
                      waitRebootCondition_.notify_all();
                  }
              }

              if(removedList && removedList->deviceCount() > 0) {
                  if(deviceUid_ == std::string(removedList->uid(0))) {
                      isDeviceRemoved_ = true;
                  }
              }
          }  // if isWaitRebootComplete_
      });

      // 查詢當前已經接入的設備
      auto devList = ctx.queryDeviceList();

      // 從ob::DeviceList中獲取當前接入設備的數量
      if(devList->deviceCount() == 0) {
           // 固件升級示例默認設備已經接入到上位機(Windows、Ubuntu、Android平臺)
          std::cerr << "Device not found!" << std::endl;
          return -1;
      }

      // 獲取第一個設備,index=0
      auto dev = devList->getDevice(0);
      // 打印設備信息
      dumpDeviceInfo(dev);

       

      獲取設備當前的固件版本信息

      // 打印設備名稱,SN,VID,PID以及固件版本
      void dumpDeviceInfo(std::shared_ptr<ob::Device> device) {
          // 獲取ob::DeviceInfo對象,通過ob::DeviceInfo可以獲取目標設備的基本信息
          auto devInfo = device->getDeviceInfo();

          // 設備名稱
          std::cout << "Device name: " << devInfo->name() << std::endl;

          // 設備VID,PID,UID
          std::cout << "Device pid: " << devInfo->pid() << " vid: " << devInfo->vid() << " uid: " << devInfo->uid() << std::endl;

          // 設備當前的固件版本號
          auto fwVer = devInfo->firmwareVersion();
          std::cout << "Firmware version: " << fwVer << std::endl;

          // 設備SN
          auto sn = devInfo->serialNumber();
          std::cout << "Serial number: " << sn << std::endl;

          // devInfo資源會自動釋放

       

       

      給目標設備升級固件

      a. 實現C API的固件升級回調接口;

      b. 調用固件升級接口進行升級;

      // 對目標設備進行固件升級
      bool upgradeFirmware(std::shared_ptr<ob::Device> device, std::string firmwarePath) {
          auto index     = firmwarePath.find_last_of(".img");
          bool isImgFile = index != std::string::npos;
          index          = firmwarePath.find_last_of(".bin");
          bool isBinFile = index != std::string::npos;
          if(!(isImgFile || isBinFile)) {
              // 固件升級文件一般為bin或者img,實際業(yè)務中最好通過文件名稱、文件MD5等信息做防呆
              std::cout << "Upgrade Fimware failed. invalid firmware file: " << firmwarePath << std::endl;
              return false;
          }

          bool isUpgradeSuccess = false;
          try {
              // 調用固件升級接口進行升級;
              device->deviceUpgrade(
                  firmwarePath.c_str(),
                  [=, &isUpgradeSuccess](OBUpgradeState state, const char *message, uint8_t percent) {
                      if(state == STAT_START) {
                          std::cout << "Upgrade Firmware start" << std::endl;
                      }
                      else if(state == STAT_FILE_TRANSFER) {
                          std::cout << "Upgrade Firmware file transfer, percent: " << (uint32_t)percent << std::endl;
                      }
                      else if(state == STAT_IN_PROGRESS) {
                          std::cout << "Upgrade Firmware in progress, percent: " << (uint32_t)percent << std::endl;
                      }
                      else if(state == STAT_DONE) {
                          // 固件升級成功
                          std::cout << "Upgrade Firmware done, percent: " << (uint32_t)percent << std::endl;
                          isUpgradeSuccess = true;
                      }
                      else if(state == STAT_VERIFY_IMAGE) {
                          std::cout << "Upgrade Firmware verify image" << std::endl;
                      }
                      else {
                          // 固件升級失敗
                          std::string errMsg = (nullptr != message ? std::string(message) : "");
                          std::cout << "Upgrade Firmware failed. state: " << std::to_string(state) << ", errMsg: " << errMsg << ", percent: " << (uint32_t)percent
                                    << std::endl;
                      }
                  },
                  false);
          }
          catch(ob::Error &e) {
              std::cerr << "Upgrade Firmware ob error. function:" << e.getName() << "\nargs:" << e.getArgs() << "\nmessage:" << e.getMessage()
                        << "\ntype:" << e.getExceptionType() << std::endl;
          }
          catch(std::exception &e) {
              if(e.what()) {
                  std::cout << "Upgrade Firmware Exception. what: " << std::string(e.what()) << std::endl;
              }
          }

          return isUpgradeSuccess;
      }

       

      固件升級成功后,需要重啟設備。重啟設備有兩種方式,一種是拔插設備(或者操作系統(tǒng)重啟),另一種是調用OrbbecSDK的reboot接口。等設備上線后,通過本示例的dump_device_info()函數可以查詢當前設備固件版本信息

       

      以下示例演示通過固件reboot接口重啟設備

      // 重啟設備
      std::cout << "Reboot device" << std::endl;
      isDeviceRemoved_      = false;
      isWaitRebootComplete_ = true;
      dev->reboot();
      // 釋放資源,設備重啟后ob::Device對象就不能用了
      dev     = nullptr;

       

      程序正常退出之后資源將會自動釋放

       

      預期輸出:

      image.png 


      • <rt id="2awkm"><noscript id="2awkm"></noscript></rt>
        <rt id="2awkm"><noscript id="2awkm"></noscript></rt>
      • <dfn id="2awkm"></dfn>
        <menu id="2awkm"><acronym id="2awkm"></acronym></menu>
        
        
        <rt id="2awkm"></rt><dfn id="2awkm"><code id="2awkm"></code></dfn>
      • <dd id="2awkm"><s id="2awkm"></s></dd>
        <tbody id="2awkm"></tbody>
      • <dfn id="2awkm"></dfn>
        <menu id="2awkm"><noscript id="2awkm"></noscript></menu>
        黄色99视频 | 欧美在线A片 | 蝌蚪PORNY中文自拍 | 香蕉久久a毛片 | 91午夜伦伦电影理论片 |