#include "TjdUiAppOtaView.h" #include "TjdUiImageIds.h" #include "TjdUiMultiLanguageExt.h" //字库 #include "common/image_cache_manager.h" #include "graphic_service.h" #include #ifdef __cplusplus extern "C" { #endif #include "ble_api.h" #include "ble_protocol_ota_service.h" #include "upg_porting.h" #include "power_display_service.h" #include "service_ancillary.h" #include "rtc_api.h" #ifdef __cplusplus } #endif namespace TJD { using namespace OHOS; #define OTA_IMAGE_BIN_PATH TJD_IMAGE_PATH "img_ota.bin" enum OtaImageInfoIndex { OTA_INFO_UPGRADE, OTA_INFO_INTERRUPT, OTA_INFO_FAIL, OTA_INFO_ENTER, OTA_INFO_KNOB, OTA_INFO_COUNT }; static TjdUiAppOtaView *g_pv_AppOtaView = nullptr; static OHOS::ImageInfo *g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_COUNT]{nullptr}; // static void TjdUiAppIntoOtaView(void) // { // OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_OTA); // } // static void TjdUiAppOTAInterruptView(void) // { // TjdUiAppOtaView::GetInstance().ShowView(OtaViewIndex::OTA_INTERRUPT_VIEW); // } void TjdUiAppGetOtaSchedule(uint32_t ota_file_offset, uint32_t ota_file_size) { GraphicService::GetInstance()->PostGraphicEvent([&]() { uint64_t product = static_cast(ota_file_offset) * 100; uint32_t schedule = static_cast(product / ota_file_size); // printf("ota_file_offset = %d, ota_file_size = %d, schedule:%d\n",ota_file_offset,ota_file_size,schedule); TjdUiAppOtaView::GetInstance()->SetOtaSchedule(ota_file_offset); TjdUiAppOtaView::GetInstance()->SetOtaVal(schedule); }); } TjdUiAppOtaView::TjdUiAppOtaView() { g_pv_AppOtaView = this; register_ota_schedule_callback(TjdUiAppGetOtaSchedule); otaSchedul = 0; } TjdUiAppOtaView::~TjdUiAppOtaView() { g_pv_AppOtaView = nullptr; unregister_ota_schedule_callback(); } TjdUiAppOtaView *TjdUiAppOtaView::GetInstance(void) { return g_pv_AppOtaView; } void TjdUiAppOtaView::OnStart() { View::OnStart(); InitImage(); if (containerAll_ == nullptr) { containerAll_= new UIViewGroup(); } containerAll_->SetPosition(0, 0, OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION); otaView[OtaViewIndex::OTA_UPGRADE_VIEW] = InitOtaUpgradeView(); otaView[OtaViewIndex::OTA_INTERRUPT_VIEW] = InitOtaInterruptView(); otaView[OtaViewIndex::OTA_FAIL_VIEW] = InitOtaFailView(); containerAll_->Add(otaView[OtaViewIndex::OTA_UPGRADE_VIEW]); containerAll_->Add(otaView[OtaViewIndex::OTA_INTERRUPT_VIEW]); containerAll_->Add(otaView[OtaViewIndex::OTA_FAIL_VIEW]); // timer_->Start(); // RootView::GetInstance()->Add(containerAll_); AddViewToRootContainer(containerAll_); timer_->Start(); } void TjdUiAppOtaView::OnStop() { if (timer_ != nullptr) { timer_->Stop(); delete timer_; timer_ = nullptr; } ImageCacheManager::GetInstance().UnloadAllInMultiRes(OTA_IMAGE_BIN_PATH); TjdUiMemManage::DeleteChildren(containerAll_); } void TjdUiAppOtaView::ShowView(OtaViewIndex hideView, OtaViewIndex showView) { if (otaView[hideView] != nullptr) { otaView[hideView]->SetVisible(false); } if (otaView[showView] != nullptr) { otaView[showView]->SetVisible(true); currentView_ = showView; } } void TjdUiAppOtaView::SetOtaVal(int val) { if (sldotaupg_ == nullptr && lblUpgNum_ == nullptr) { return; } std::string text = std::to_string(val)+ "%"; lblUpgNum_->SetText(text.c_str()); int val_=val*0.92; sldotaupg_->SetValue(val_ + 4); sldotaupg_->Invalidate(); } // static upg_prepare_info_t prepare_info = {0}; void TjdUiAppOtaView::SetUpgrate(void) { uint32_t packsize_= tjd_ota_get_fimrware_size(); upg_prepare_info_t prepare_info = { .package_len = packsize_ }; // prepare_info.package_len = packsize_; printf("%s , line is %d ,prepare_info.package_len = %d , packsize_ = %d\n", __FUNCTION__, __LINE__, prepare_info.package_len,packsize_); if(prepare_info.package_len != 0){ errcode_t ret = uapi_upg_prepare(&prepare_info); if(ret != ERRCODE_SUCC){ printf("uapi_upg_prepare fail! ret = %d\n",ret); } ret = uapi_upg_request_upgrade(false); if(ret != ERRCODE_SUCC){ printf("uapi_upg_request_upgrade fail! ret = %d\n",ret); } ret = uapi_upg_start(); if(ret != ERRCODE_SUCC){ printf("uapi_upg_start fail! ret = %d\n",ret); } upg_reboot(); }else{ std::thread resetThread([]() { printf("ResetSystem thread run\n"); const power_display_svr_api_t *displayApi = power_display_svr_get_api(); uint32_t ret = displayApi->turn_off_screen(); if (ret != ERRCODE_SUCC) { printf("turn_off_screen failed %x\n", ret); } osDelay(1000); OHOS::NativeAbility::GetInstance().StopAbility(); tjd_driver_rtc_save_time(); tjd_service_ancillary_device_restart(); }); resetThread.detach(); } } void TjdUiAppOtaView::InitImage() { g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_UPGRADE] = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_OTA_OTA, OTA_IMAGE_BIN_PATH); g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_INTERRUPT] = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_OTA_OTA_INTERRUPT, OTA_IMAGE_BIN_PATH); g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_ENTER] = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_OTA_ICON_ENTER, OTA_IMAGE_BIN_PATH); g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_FAIL] = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_OTA_OTA_NO_MATCH, OTA_IMAGE_BIN_PATH); g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_KNOB] = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_OTA_KONB, OTA_IMAGE_BIN_PATH); } void TimerCallback(void *param) { //定时器每30秒读一次GetOtaSchedule()的值,如果这次读值 == 上次读值,则显示升级中断页面 static uint32_t value = 0; uint32_t curValue = TjdUiAppOtaView::GetInstance()->GetOtaSchedule(); if (curValue == value && curValue != 0) { TjdUiAppOtaView::GetInstance()->ShowView(OTA_UPGRADE_VIEW,OTA_INTERRUPT_VIEW); }else{ value = curValue; } // else{ // value = curValue; // TjdUiAppOtaView::GetInstance()->GetOtaSchedultimer()->SetPeriod(3000); // TjdUiAppOtaView::GetInstance()->ShowView(OTA_INTERRUPT_VIEW,OTA_UPGRADE_VIEW); // } // uint32_t * ota_val = (uint32_t *)param; // if (value <= 5) { // TjdUiAppOtaView::GetInstance()->SetOtaVal(value); // } // if (value > 100) { // value = 0; // } } OHOS::UIViewGroup *TjdUiAppOtaView::InitOtaUpgradeView() { OHOS::UIViewGroup *otaUpgradeView = new OHOS::UIViewGroup(); otaUpgradeView->SetPosition(0, 0, 466, 466); if (otaUpg_ == nullptr) { otaUpg_ = new OHOS::UIImageView(); } otaUpg_->SetPosition(164, 64, 139, 172); otaUpg_->SetViewId(BTN_OTA_UPGRADE_ID); otaUpg_->SetTouchable(true); otaUpg_->SetOnClickListener(TjdUiAppOtaPresenter::GetInstance()); if (g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_UPGRADE] != nullptr) { otaUpg_->SetSrc(g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_UPGRADE]); } if (lblUpgrade_ == nullptr) { lblUpgrade_ = new UILabel(); } lblUpgrade_->SetFont(TJD_VECTOR_FONT_FILENAME, 34); lblUpgrade_->SetText("升级中..."); lblUpgrade_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblUpgrade_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblUpgrade_->SetPosition(170, 262); if (lblUpgNum_ == nullptr) { lblUpgNum_ = new UILabel(); } lblUpgNum_->SetFont(TJD_VECTOR_FONT_FILENAME, 34); lblUpgNum_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblUpgNum_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblUpgNum_->SetText("0%"); lblUpgNum_->SetPosition(202, 389); if (lblUpgPercent_ == nullptr) { lblUpgPercent_ = new UILabel(); } lblUpgPercent_->SetFont(TJD_VECTOR_FONT_FILENAME, 34); lblUpgPercent_->SetText("%"); lblUpgPercent_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblUpgPercent_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblUpgPercent_->SetPosition(222, 389); if (sldotaupg_ == nullptr) { sldotaupg_ = new UISlider(); } sldotaupg_->SetPosition(71, 345); sldotaupg_->Resize(324, 24); sldotaupg_->SetViewId("slider_ota"); sldotaupg_->SetStyle(STYLE_BACKGROUND_OPA, 0xff); sldotaupg_->SetStyle(STYLE_BORDER_RADIUS, 6); sldotaupg_->SetValidWidth(324); sldotaupg_->SetValidHeight(12); sldotaupg_->SetSliderColor(Color::GetColorFromRGBA(0x74, 0x6c, 0x6c, 0xff), Color::GetColorFromRGBA(0x32, 0x99, 0xFE, 0xff)); sldotaupg_->SetKnobWidth(25); sldotaupg_->SetKnobStyle(STYLE_BACKGROUND_COLOR, 0xff3299FE); sldotaupg_->SetKnobRadius(12); sldotaupg_->SetValue(4); sldotaupg_->SetTouchable(false); if (g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_KNOB] != nullptr) { sldotaupg_->SetKnobImage(g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_KNOB]); } else { sldotaupg_->SetKnobStyle(STYLE_BACKGROUND_COLOR, 0xffe30d0d); } sldotaupg_->SetForegroundStyle(STYLE_BACKGROUND_OPA, 0xff); sldotaupg_->SetSliderRadius(6, 6); if (timer_ == nullptr) { timer_ = new OHOS::GraphicTimer(30000, TimerCallback, nullptr, true);//1000ms 1次TimerCallback 继而1次SetOtaVal } otaUpgradeView->Add(otaUpg_); otaUpgradeView->Add(lblUpgNum_); otaUpgradeView->Add(lblUpgrade_); otaUpgradeView->Add(sldotaupg_); return otaUpgradeView; } OHOS::UIViewGroup *TjdUiAppOtaView::InitOtaInterruptView() { OHOS::UIViewGroup *otaInterruptView = new OHOS::UIViewGroup(); otaInterruptView->SetPosition(0, 0, 466, 466); if (otaInterrupt_ == nullptr) { otaInterrupt_ = new OHOS::UIImageView(); } otaInterrupt_->SetPosition(165, 64, 156, 172); otaInterrupt_->SetViewId(BTN_OTA_INTERRUPT_ID); otaInterrupt_->SetTouchable(true); otaInterrupt_->SetOnClickListener(TjdUiAppOtaPresenter::GetInstance()); if (g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_INTERRUPT] != nullptr) { otaInterrupt_->SetSrc(g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_INTERRUPT]);//pic } if (lblInterrupt_ == nullptr) { lblInterrupt_ = new UILabel(); } lblInterrupt_->SetFont(TJD_VECTOR_FONT_FILENAME,32); lblInterrupt_->SetText("升级中断\n请连接后再次升级!"); lblInterrupt_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblInterrupt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblInterrupt_->SetPosition(83, 261); if (otaEnter_ == nullptr) { otaEnter_ = new OHOS::UIImageView(); } otaEnter_->SetPosition(183, 376, 100, 50); otaEnter_->SetViewId(BTN_OTA_ENTER_ID); otaEnter_->SetTouchable(true); otaEnter_->SetOnClickListener(TjdUiAppOtaPresenter::GetInstance()); if (g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_ENTER] != nullptr) { otaEnter_->SetSrc(g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_ENTER]); } otaInterruptView->Add(otaInterrupt_); otaInterruptView->Add(otaEnter_); otaInterruptView->Add(lblInterrupt_); otaInterruptView->SetVisible(false); return otaInterruptView; } OHOS::UIViewGroup *TjdUiAppOtaView::InitOtaFailView() { OHOS::UIViewGroup *otaFailView = new OHOS::UIViewGroup(); otaFailView->SetPosition(0, 0, 466, 466); if (otaFail_ == nullptr) { otaFail_ = new OHOS::UIImageView(); } otaFail_->SetPosition(165, 64, 156, 172); otaFail_->SetViewId(BTN_OTA_FAIL_ID); otaFail_->SetTouchable(true); otaFail_->SetOnClickListener(TjdUiAppOtaPresenter::GetInstance()); if (g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_FAIL] != nullptr) { otaFail_->SetSrc(g_pv_otaimageInfo[OtaImageInfoIndex::OTA_INFO_FAIL]); } if (lblFail_ == nullptr) { lblFail_ = new UILabel(); } lblFail_->SetFont(TJD_VECTOR_FONT_FILENAME, 30); lblFail_->SetText("监测到资源不匹配,无法正常\n使用!请重新连接升级"); lblFail_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblFail_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblFail_->SetPosition(44, 261); if (lblFailMac_ == nullptr) { lblFailMac_ = new UILabel(); } lblFailMac_->SetFont(TJD_VECTOR_FONT_FILENAME, 26); lblFailMac_->SetText("MAC:"); lblFailMac_->SetTextColor(Color::GetColorFromRGBA(0x6B, 0x6B, 0x6B, 0xff)); lblFailMac_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblFailMac_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblFailMac_->SetPosition(201, 364); if (lblFailNum_ == nullptr) { lblFailNum_ = new UILabel(); } lblFailNum_->SetFont(TJD_VECTOR_FONT_FILENAME, 26); lblFailNum_->SetText("12::34:56:78:90:12"); lblFailNum_->SetTextColor(Color::GetColorFromRGBA(0x6B, 0x6B, 0x6B, 0xff)); lblFailNum_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); lblFailNum_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); lblFailNum_->SetPosition(122, 398); otaFailView->Add(otaFail_); otaFailView->Add(lblFail_); otaFailView->Add(lblFailMac_); otaFailView->Add(lblFailNum_); otaFailView->SetVisible(false); return otaFailView; } }//TJD