mirror of
https://gitee.com/nikolan/keil_development_assistant.git
synced 2025-01-16 07:52:51 +08:00
825 lines
24 KiB
C++
825 lines
24 KiB
C++
#include "mainwindow.h"
|
||
#include "ui_mainwindow.h"
|
||
|
||
#include <QFileDialog>
|
||
#include "use_percentage_bar.h"
|
||
|
||
#include <Qdebug>
|
||
#include "flatui.h"
|
||
#include <QDebug>
|
||
#include <QDesktopServices>
|
||
|
||
#pragma execution_character_set("utf-8")
|
||
void MainWindow::winow_on_top(bool is_top)
|
||
{
|
||
if(is_top)
|
||
setWindowFlags(windowFlags()|Qt::WindowStaysOnTopHint);
|
||
else
|
||
setWindowFlags(windowFlags()&(~Qt::WindowStaysOnTopHint));
|
||
}
|
||
|
||
|
||
|
||
MainWindow::MainWindow(QWidget *parent) : FramelessMainWindow(parent), ui(new Ui::MainWindow)
|
||
{
|
||
ui->setupUi(this);
|
||
this->initForm();
|
||
winow_on_top(true);
|
||
// winow_on_top(false);
|
||
}
|
||
|
||
MainWindow::~MainWindow()
|
||
{
|
||
delete cpu;
|
||
delete map;
|
||
delete ram_chart;
|
||
delete flash_chart;
|
||
delete ui;
|
||
}
|
||
|
||
void MainWindow::initForm()
|
||
{
|
||
//设置标题栏控件
|
||
ui->labTitle->setText("一个极客开源::keil开发助手");
|
||
this->setWindowTitle(ui->labTitle->text());
|
||
this->setTitleBar(ui->labTitle);
|
||
|
||
//关联信号
|
||
connect(this, SIGNAL(titleDblClick()), this, SLOT(titleDblClick()));
|
||
connect(this, SIGNAL(windowStateChange(bool)), this, SLOT(windowStateChange(bool)));
|
||
|
||
//设置样式表
|
||
QStringList list;
|
||
list << "#titleBar{background:#BBBBBB;}";
|
||
list << "#titleBar{border-top-left-radius:8px;border-top-right-radius:8px;}";
|
||
list << "#widgetMain{border:2px solid #BBBBBB;background:#FFFFFF;}";
|
||
list << "#widgetMain{border-bottom-left-radius:8px;border-bottom-right-radius:8px;}";
|
||
this->setStyleSheet(list.join(""));
|
||
FlatUI::setScrollBarQss(ui->ram_scrollArea->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
FlatUI::setScrollBarQss(ui->flash_scrollArea->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
|
||
FlatUI::setScrollBarQss(ui->ram_table->horizontalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
FlatUI::setScrollBarQss(ui->ram_table->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
FlatUI::setScrollBarQss(ui->flash_table->horizontalScrollBar(), 8, 120, 20, "#E5E5E5","#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
FlatUI::setScrollBarQss(ui->flash_table->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
|
||
FlatUI::setProgressQss(ui->ram_used_bar, 20,12,16, "#747976", "#1ABC9C");//#FAEC9C",#FFF5E7
|
||
FlatUI::setProgressQss(ui->flash_used_bar, 20,12,16, "#747976", "#1ABC9C");
|
||
|
||
main_window=this;
|
||
|
||
|
||
//map_path="./";
|
||
//project_path="./";
|
||
|
||
ui->map_path->setText(map_path);
|
||
ui->project_path->setText(project_path);
|
||
|
||
ram_pieseries=new QPieSeries();
|
||
flash_pieseries=new QPieSeries();
|
||
|
||
|
||
|
||
ram_chart=new QChart();
|
||
flash_chart=new QChart();
|
||
|
||
|
||
|
||
|
||
|
||
//QChartView
|
||
|
||
|
||
ram_chart->addSeries(ram_pieseries);
|
||
ram_chart->setTitle("文件内存分布饼图");
|
||
ram_chart->legend()->hide();
|
||
// Set the theme to one of the predefined themes
|
||
ram_chart->setTheme(QChart::ChartThemeQt);
|
||
ram_chart->setBackgroundBrush(QBrush(Qt::gray));
|
||
|
||
ram_chart->setTitleBrush(Qt::white);; // 数据集分类标题文字颜色
|
||
flash_chart->addSeries(flash_pieseries);
|
||
flash_chart->setTitle("文件flash分布饼图");
|
||
flash_chart->legend()->hide();
|
||
// Set the theme to one of the predefined themes
|
||
flash_chart->setTheme(QChart::ChartThemeQt);
|
||
flash_chart->setBackgroundBrush(QBrush(Qt::gray));
|
||
flash_chart->setTitleBrush(Qt::white);
|
||
|
||
ui->ram_chart_view->setChart(ram_chart);
|
||
ui->ram_chart_view->setRubberBand(QChartView::RectangleRubberBand);
|
||
|
||
ui->flash_chart_view->setChart(flash_chart);
|
||
ui->flash_chart_view->setRubberBand(QChartView::RectangleRubberBand);
|
||
|
||
|
||
if(map_path.length()>1&&project_path.length()>1)
|
||
{
|
||
cpu= new parse_keil_project(ui->project_path->text());
|
||
if(cpu->to_parse_keil_project(ui->project_path->text()))
|
||
{
|
||
update_cpu_info();
|
||
|
||
|
||
|
||
|
||
|
||
if(cpu->getCpu_core_name()!="8051")
|
||
{
|
||
|
||
}else {
|
||
|
||
}
|
||
|
||
}
|
||
if(cpu->getCpu_core_name()!="8051")
|
||
{
|
||
map= new parse_map_from_keil( ui->map_path->text(),cpu->IRAM.getBase_addr(),cpu->IRAM.getMax_size(),cpu->IROM.getBase_addr(),cpu->IROM.getMax_size());
|
||
if(map->to_parse_map_from_keil(ui->map_path->text()))
|
||
{
|
||
map_calculate_size_by_address(map);
|
||
update_map_info();
|
||
}
|
||
}else {
|
||
|
||
m51 =new parse_m51_from_keil(ui->map_path->text(),cpu->IRAM.getMax_size(),cpu->XRAM.getMax_size(),cpu->IROM.getMax_size());
|
||
if(m51->to_parse_m51_from_keil(ui->map_path->text()))
|
||
{
|
||
update_m51_info();
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
fflush(stdout);
|
||
|
||
}
|
||
|
||
|
||
|
||
void MainWindow::map_calculate_size_by_address(parse_map_from_keil* map)
|
||
{
|
||
|
||
|
||
for(auto ram:map->ram_list)
|
||
{
|
||
if(ram->getMax_size()>100*1024*1024)
|
||
{
|
||
|
||
uint64_t recent_base=cpu->IRAM.getBase_addr()+cpu->IRAM.getMax_size();
|
||
|
||
for(auto recent_ram :map->ram_list)
|
||
{
|
||
if(recent_ram->getBase_addr()>ram->getBase_addr())
|
||
{
|
||
if(recent_ram->getBase_addr()-ram->getBase_addr()<recent_base-ram->getBase_addr())
|
||
recent_base=recent_ram->getBase_addr();
|
||
}
|
||
|
||
}
|
||
|
||
ram->setMax_size(recent_base-ram->getBase_addr());
|
||
}
|
||
}
|
||
for(auto flash:map->flash_list)
|
||
{
|
||
if(flash->getMax_size()>100*1024*1024)
|
||
{
|
||
|
||
uint64_t recent_base=cpu->IROM.getBase_addr()+cpu->IROM.getMax_size();
|
||
for(auto recent_flash :map->flash_list)
|
||
{
|
||
|
||
if(recent_flash->getBase_addr()>flash->getBase_addr())
|
||
{
|
||
|
||
if(recent_flash->getBase_addr()-flash->getBase_addr()<recent_base-flash->getBase_addr())
|
||
recent_base=recent_flash->getBase_addr();
|
||
|
||
}
|
||
}
|
||
flash->setMax_size(recent_base-flash->getBase_addr());
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
void MainWindow::on_btn_set_project_path_clicked()
|
||
{
|
||
//获取选择的目录路径
|
||
QString selectedDir=QFileDialog::getExistingDirectory(this,"选择一个目录","./",QFileDialog::ShowDirsOnly);
|
||
//若目录路径不为空
|
||
if (!selectedDir.isEmpty())
|
||
{
|
||
//将路径中的斜杠替换为反斜杠
|
||
selectedDir = selectedDir.replace(QRegExp("\\"), "/");
|
||
//显示选择的目录路径
|
||
ui->project_path->setText(selectedDir);
|
||
ui->map_path->setText(selectedDir);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void MainWindow::set_bar_style(QProgressBar *bar,float per)
|
||
{
|
||
if( per/1.0>0.85)
|
||
{
|
||
FlatUI::setProgressQss(bar, 20,12,16, "#747976", "#E74C3C");
|
||
|
||
}else if( per>0.75)
|
||
{
|
||
FlatUI::setProgressQss(bar, 20,12,16, "#747976", "#F9D927");
|
||
|
||
}
|
||
else
|
||
{
|
||
FlatUI::setProgressQss(bar, 20,12,16, "#747976", "#1ABC9C");
|
||
}
|
||
|
||
}
|
||
|
||
void MainWindow::on_btn_set_map_path_clicked()
|
||
{
|
||
//获取选择的目录路径
|
||
QString selectedDir=QFileDialog::getExistingDirectory(this,"选择一个目录","./",QFileDialog::ShowDirsOnly);
|
||
//若目录路径不为空
|
||
if (!selectedDir.isEmpty())
|
||
{
|
||
//将路径中的斜杠替换为反斜杠
|
||
selectedDir = selectedDir.replace(QRegExp("\\"), "/");
|
||
//显示选择的目录路径
|
||
ui->map_path->setText(selectedDir);
|
||
}
|
||
}
|
||
|
||
void MainWindow::on_update_info_clicked()
|
||
{
|
||
|
||
|
||
if(cpu!=nullptr)
|
||
{
|
||
delete cpu;
|
||
cpu=nullptr;
|
||
}
|
||
cpu= new parse_keil_project(ui->project_path->text());
|
||
if(cpu->to_parse_keil_project(ui->project_path->text()))
|
||
update_cpu_info();
|
||
|
||
if(cpu->getCpu_core_name()!="8051")
|
||
{
|
||
|
||
if(map!=nullptr)
|
||
{
|
||
delete map;
|
||
map=nullptr;
|
||
}
|
||
map= new parse_map_from_keil(ui->map_path->text(),cpu->IRAM.getBase_addr(),cpu->IRAM.getMax_size(),cpu->IROM.getBase_addr(),cpu->IROM.getMax_size());
|
||
if(map->to_parse_map_from_keil(ui->map_path->text()))
|
||
{
|
||
map_calculate_size_by_address(map);
|
||
|
||
update_map_info();
|
||
}
|
||
}else {
|
||
|
||
|
||
|
||
if(m51!=nullptr)
|
||
{
|
||
delete m51;
|
||
m51=nullptr;
|
||
}
|
||
m51 =new parse_m51_from_keil(ui->map_path->text(),cpu->IRAM.getMax_size(),cpu->XRAM.getMax_size(),cpu->IROM.getMax_size());
|
||
|
||
if(m51->to_parse_m51_from_keil(ui->map_path->text()))
|
||
update_m51_info();
|
||
|
||
}
|
||
|
||
fflush(stdout);
|
||
|
||
|
||
}
|
||
|
||
void MainWindow::on_ram_table_itemSelectionChanged()
|
||
{
|
||
QList<QTableWidgetItem*> selectedItems = ui->ram_table->selectedItems();
|
||
|
||
|
||
// Reset all pie slices to not exploded (not highlighted)
|
||
foreach (QPieSlice* slice, ram_pieseries->slices()) {
|
||
slice->setExploded(false);
|
||
slice->setLabelVisible(false);
|
||
|
||
}
|
||
foreach (QTableWidgetItem* item, selectedItems) {
|
||
int row = item->row();
|
||
// qDebug() << row;
|
||
|
||
QPieSlice *slice = ram_pieseries->slices().at(row);
|
||
slice->setExploded();//突出这一块
|
||
slice->setLabelVisible();//设置这一块可见数据
|
||
slice->setLabelBrush(Qt::white);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void MainWindow::on_flash_table_itemSelectionChanged()
|
||
{
|
||
QList<QTableWidgetItem*> selectedItems = ui->flash_table->selectedItems();
|
||
|
||
|
||
// Reset all pie slices to not exploded (not highlighted)
|
||
foreach (QPieSlice* slice, flash_pieseries->slices()) {
|
||
slice->setExploded(false);
|
||
slice->setLabelVisible(false);
|
||
|
||
}
|
||
foreach (QTableWidgetItem* item, selectedItems) {
|
||
int row = item->row();
|
||
// qDebug() << row;
|
||
|
||
QPieSlice *slice = flash_pieseries->slices().at(row);
|
||
slice->setExploded();//突出这一块
|
||
slice->setLabelVisible();//设置这一块可见数据
|
||
slice->setLabelBrush(Qt::white);
|
||
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void MainWindow::update_cpu_info(void)
|
||
{
|
||
ui->cpu_name->setTitle(cpu->getCpu_name());
|
||
ui->cpu_core->setText("单片机核心:"+cpu->getCpu_core_name());
|
||
ui->cpu_colck->setText(QString().sprintf("最高主频:%.2f MHz",cpu->getCpu_max_clock()/1000000.0));
|
||
ui->iram->setText(QString().sprintf("内部ram 地址:%#x 容量:%.2f KB",cpu->IRAM.getBase_addr(),cpu->IRAM.getMax_size()/1024.0));
|
||
ui->flash->setText(QString().sprintf("内部flash 地址:%#x 容量:%.2f KB",cpu->IROM.getBase_addr(),cpu->IROM.getMax_size()/1024.0));
|
||
|
||
}
|
||
|
||
|
||
|
||
void MainWindow::clearLayout(QLayout* layout) {
|
||
QLayoutItem* item;
|
||
while ((item = layout->takeAt(0))) {
|
||
QWidget* widget = item->widget();
|
||
if (widget) {
|
||
layout->removeWidget(widget); // 将小部件从布局中移除
|
||
widget->setParent(nullptr); // 设置父对象为nullptr,避免悬挂指针问题
|
||
delete widget; // 删除小部件并释放内存
|
||
}
|
||
delete item; // 删除布局项
|
||
}
|
||
}
|
||
|
||
|
||
void MainWindow::update_m51_info(void)
|
||
{
|
||
uint64_t ram_all_max_size=0;
|
||
uint64_t ram_all_used_size=0;
|
||
uint64_t ram_min_base_addr=m51->ram_list.at(0)->getBase_addr();
|
||
|
||
uint64_t flash_all_max_size=0;
|
||
uint64_t flash_all_used_size=0;
|
||
uint64_t flash_min_base_addr=m51->flash_list.at(0)->getBase_addr();
|
||
uint16_t i;
|
||
|
||
|
||
clearLayout(ui->ram_scrollAreaWidgetContents->layout());
|
||
|
||
// 移除并释放布局中的所有小部件
|
||
|
||
clearLayout(ui->flash_scrollAreaWidgetContents->layout());
|
||
|
||
// 移除并释放布局中的所有小部件
|
||
for(uint64_t row_cnt=0;row_cnt<ui->ram_table->rowCount();row_cnt++)
|
||
{
|
||
|
||
ui->ram_table->removeRow(row_cnt);
|
||
}
|
||
ui->ram_table->clear();
|
||
|
||
ram_pieseries->clear();
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->flash_table->rowCount();row_cnt++)
|
||
{
|
||
ui->flash_table->removeRow(row_cnt);
|
||
}
|
||
ui->flash_table->clear();
|
||
flash_pieseries->clear();
|
||
|
||
for(i=0;i<m51->ram_list.size();i++)
|
||
{
|
||
|
||
ram_all_used_size+=m51->ram_list.at(i)->getUsed_size();
|
||
ram_all_max_size+=m51->ram_list.at(i)->getMax_size();
|
||
if(ram_min_base_addr>m51->ram_list.at(0)->getBase_addr())
|
||
ram_min_base_addr=m51->ram_list.at(i)->getBase_addr();
|
||
ui->ram_scrollAreaWidgetContents->layout()->addWidget(m51->ram_list.at(i));
|
||
}
|
||
|
||
|
||
|
||
ui->ram_addr->setText(QString().sprintf("地址:%#x",ram_min_base_addr));
|
||
ui->ram_used_bar->setRange(0,ram_all_max_size);
|
||
ui->ram_used_bar->setValue(ram_all_used_size);
|
||
ui->ram_remain->setText(QString().sprintf("剩余:%.2f B",ram_all_max_size/10.0-ram_all_used_size/10.0));
|
||
if(ram_all_max_size/10.0<=1024)
|
||
{
|
||
ui->ram_used->setText(QString().sprintf("占用:%.2f B / (%.2f B)",ram_all_used_size/10.0,ram_all_max_size/10.0));
|
||
}else
|
||
{
|
||
ui->ram_used->setText(QString().sprintf("占用:%.2f B / (%.2f KB)",ram_all_used_size/1024.0,ram_all_max_size/10.0/1024.0));
|
||
}
|
||
|
||
set_bar_style(ui->ram_used_bar,ram_all_used_size/1.0/ram_all_max_size/1.0);
|
||
|
||
for(i=0;i<m51->flash_list.size();i++)
|
||
{
|
||
flash_all_used_size+=m51->flash_list.at(i)->getUsed_size();
|
||
flash_all_max_size+=m51->flash_list.at(i)->getMax_size();
|
||
if(flash_min_base_addr>m51->flash_list.at(0)->getBase_addr())
|
||
flash_min_base_addr=m51->flash_list.at(i)->getBase_addr();
|
||
ui->flash_scrollAreaWidgetContents->layout()->addWidget(m51->flash_list.at(i));
|
||
}
|
||
|
||
ui->flash_addr->setText(QString().sprintf("地址:%#x",flash_min_base_addr));
|
||
ui->flash_used_bar->setRange(0,flash_all_max_size);
|
||
ui->flash_used_bar->setValue(flash_all_used_size);
|
||
ui->flash_remain->setText(QString().sprintf("剩余:%.2f B",flash_all_max_size/10.0-flash_all_used_size/10.0));
|
||
if(flash_all_max_size/10.0<=1024)
|
||
{
|
||
ui->flash_used->setText(QString().sprintf("占用:%.2f B / (%.2f B)",flash_all_used_size/10.0,flash_all_max_size/10.0));
|
||
}else
|
||
{
|
||
ui->flash_used->setText(QString().sprintf("占用:%.2f B / (%.2f KB)",flash_all_used_size/1024.0,flash_all_max_size/10.0/1024.0));
|
||
}
|
||
set_bar_style(ui->flash_used_bar,ram_all_used_size/1.0/ram_all_max_size/1.0);
|
||
|
||
if(ui->ram_scrollArea->verticalScrollBar()!=nullptr)
|
||
FlatUI::setScrollBarQss(ui->ram_scrollArea->verticalScrollBar(), 8, 120, 20, "##E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
if(ui->ram_scrollArea->verticalScrollBar()!=nullptr)
|
||
FlatUI::setScrollBarQss(ui->flash_scrollArea->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
|
||
|
||
}
|
||
|
||
void MainWindow::setPieSliceStyle(QPieSlice* slice, qreal percentage, qreal maxPercentage)
|
||
{
|
||
|
||
// Define an array of custom green colors to represent different percentage ranges
|
||
QColor colors[] = {
|
||
QColor("#D1FF4D"), // Light Green Yellow
|
||
QColor("#C0FF3E"), // Greenish Yellow
|
||
QColor("#ADFF2F"), // Green Yellow
|
||
QColor("#7CFC00"), // Lawn Green
|
||
QColor("#00FF00"), // Lime Green
|
||
QColor("#008000"), // Green
|
||
QColor("#006400"), // Dark Green
|
||
};
|
||
|
||
// Calculate the relative percentage compared to the maxPercentage
|
||
qreal relativePercentage = (percentage / maxPercentage) * 100.0;
|
||
|
||
// Determine the index of the color based on relative percentage
|
||
int colorIndex = qMin(int(relativePercentage) / (100 / (sizeof(colors) / sizeof(colors[0]))), sizeof(colors) / sizeof(colors[0]) - 1);
|
||
|
||
// Set the color of the slice based on the color index
|
||
slice->setColor(colors[colorIndex]);
|
||
|
||
|
||
}
|
||
|
||
void MainWindow::update_map_info(void)
|
||
{
|
||
|
||
if(map->ram_list.length()==0)
|
||
return;
|
||
|
||
if(map->flash_list.length()==0)
|
||
return;
|
||
|
||
uint64_t ram_all_max_size=0;
|
||
uint64_t ram_all_used_size=0;
|
||
uint64_t ram_min_base_addr=map->ram_list.at(0)->getBase_addr();
|
||
|
||
uint64_t flash_all_max_size=0;
|
||
uint64_t flash_all_used_size=0;
|
||
uint64_t flash_min_base_addr=map->flash_list.at(0)->getBase_addr();
|
||
uint16_t i;
|
||
|
||
|
||
clearLayout(ui->ram_scrollAreaWidgetContents->layout());
|
||
// // 移除并释放布局中的所有小部件
|
||
clearLayout(ui->flash_scrollAreaWidgetContents->layout());
|
||
// // 移除并释放布局中的所有小部件
|
||
for(uint64_t row_cnt=0;row_cnt<ui->ram_table->rowCount();row_cnt++)
|
||
{
|
||
|
||
ui->ram_table->removeRow(row_cnt);
|
||
}
|
||
ui->ram_table->clear();
|
||
ram_pieseries->clear();
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->flash_table->rowCount();row_cnt++)
|
||
{
|
||
ui->flash_table->removeRow(row_cnt);
|
||
}
|
||
ui->flash_table->clear();
|
||
flash_pieseries->clear();
|
||
|
||
|
||
|
||
for(i=0;i<map->ram_list.size();i++)
|
||
{
|
||
|
||
ram_all_used_size+=map->ram_list.at(i)->getUsed_size();
|
||
ram_all_max_size+=map->ram_list.at(i)->getMax_size();
|
||
if(ram_min_base_addr>map->ram_list.at(0)->getBase_addr())
|
||
ram_min_base_addr=map->ram_list.at(i)->getBase_addr();
|
||
ui->ram_scrollAreaWidgetContents->layout()->addWidget(map->ram_list.at(i));
|
||
}
|
||
|
||
|
||
|
||
ui->ram_addr->setText(QString().sprintf("地址:%#x",ram_min_base_addr));
|
||
ui->ram_used_bar->setRange(0,ram_all_max_size);
|
||
ui->ram_used_bar->setValue(ram_all_used_size);
|
||
ui->ram_remain->setText(QString().sprintf("剩余:%llu B",ram_all_max_size-ram_all_used_size));
|
||
if(ram_all_max_size<=1024*1024)
|
||
{
|
||
ui->ram_used->setText(QString().sprintf("占用:%.2f KB / (%.2f KB)",ram_all_used_size/1024.0,ram_all_max_size/1024.0));
|
||
}else
|
||
{
|
||
ui->ram_used->setText(QString().sprintf("占用:%.4f MB / (%.4f MB)",ram_all_used_size/1024.0/1024.0,ram_all_max_size/1024.0/1024.0));
|
||
}
|
||
|
||
set_bar_style(ui->ram_used_bar,ram_all_used_size/1.0/ram_all_max_size/1.0);
|
||
|
||
|
||
for(i=0;i<map->flash_list.size();i++)
|
||
{
|
||
flash_all_used_size+=map->flash_list.at(i)->getUsed_size();
|
||
flash_all_max_size+=map->flash_list.at(i)->getMax_size();
|
||
if(flash_min_base_addr>map->flash_list.at(0)->getBase_addr())
|
||
flash_min_base_addr=map->flash_list.at(i)->getBase_addr();
|
||
ui->flash_scrollAreaWidgetContents->layout()->addWidget(map->flash_list.at(i));
|
||
}
|
||
|
||
ui->flash_addr->setText(QString().sprintf("地址:%#x",flash_min_base_addr));
|
||
ui->flash_used_bar->setRange(0,flash_all_max_size);
|
||
ui->flash_used_bar->setValue(flash_all_used_size);
|
||
ui->flash_remain->setText(QString().sprintf("剩余:%llu B",flash_all_max_size-flash_all_used_size));
|
||
if(flash_all_max_size<=1024*1024)
|
||
{
|
||
ui->flash_used->setText(QString().sprintf("占用:%.2f KB / (%.2f KB)",flash_all_used_size/1024.0,flash_all_max_size/1024.0));
|
||
}else
|
||
{
|
||
ui->flash_used->setText(QString().sprintf("占用:%.4f MB / (%.4f MB)",flash_all_used_size/1024.0/1024.0,flash_all_max_size/1024.0/1024.0));
|
||
}
|
||
|
||
set_bar_style(ui->flash_used_bar,flash_all_used_size/1.0/flash_all_max_size/1.0);
|
||
|
||
|
||
|
||
|
||
QList <image_item_t*> info_lsit= map->getInfo_list();
|
||
uint64_t all_ram_size = map->getAll_ram_size();
|
||
uint64_t all_flash_size =map->getAll_flash_size();
|
||
uint64_t ram_row=0;
|
||
uint64_t flash_row=0;
|
||
for(auto item:info_lsit)
|
||
{
|
||
if(item->RW_Data.toUInt()+item->ZI_Data.toUInt()!=0)
|
||
{
|
||
writeTableData(ram_table,ram_row,0,item->Object_Name);
|
||
writeTableData(ram_table,ram_row,1,QString::number(item->RW_Data.toUInt()+item->ZI_Data.toUInt()));
|
||
writeTableData(ram_table,ram_row,3,item->RW_Data);
|
||
writeTableData(ram_table,ram_row,4,item->ZI_Data);
|
||
all_ram_size+=item->RW_Data.toUInt()+item->ZI_Data.toUInt();
|
||
ram_row++;
|
||
}
|
||
|
||
if(item->Code.toUInt()+item->RO_Data.toUInt()+item->RW_Data.toUInt()!=0)
|
||
{
|
||
|
||
|
||
writeTableData(flash_table,flash_row,0,item->Object_Name);
|
||
writeTableData(flash_table,flash_row,1,QString::number(item->Code.toUInt()+item->RO_Data.toUInt()+item->RW_Data.toUInt()));
|
||
writeTableData(flash_table,flash_row,3,item->Code);
|
||
writeTableData(flash_table,flash_row,4,item->RO_Data);
|
||
writeTableData(flash_table,flash_row,5,item->RW_Data);
|
||
all_flash_size+=item->Code.toUInt()+item->RO_Data.toUInt()+item->RW_Data.toUInt();
|
||
flash_row++;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
ui->ram_per->setTitle(QString().sprintf("used_ram=RW+ZI=%llu",all_ram_size));
|
||
ui->flash_per->setTitle(QString().sprintf("used_flash=RW+Code+RO=%llu",all_flash_size));
|
||
|
||
|
||
|
||
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->ram_table->rowCount();row_cnt++)
|
||
{
|
||
writeTableData(ram_table,row_cnt,2,QString().sprintf("%05.2f%%",ui->ram_table->item(row_cnt,1)->text().toUInt()*100.0/all_ram_size/1.0));
|
||
}
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->flash_table->rowCount();row_cnt++)
|
||
{
|
||
writeTableData(flash_table,row_cnt,2,QString().sprintf("%05.2f%%",ui->flash_table->item(row_cnt,1)->text().toUInt()*100.0/all_flash_size/1.0));
|
||
}
|
||
|
||
ui->ram_table->sortByColumn(2,Qt::SortOrder::DescendingOrder);
|
||
ui->flash_table->sortByColumn(2,Qt::SortOrder::DescendingOrder);
|
||
|
||
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->ram_table->rowCount();row_cnt++)
|
||
{
|
||
|
||
|
||
|
||
|
||
QPieSlice *slice =ram_pieseries->append(ui->ram_table->item(row_cnt,0)->text()+":"+ui->ram_table->item(row_cnt,2)->text(),ui->ram_table->item(row_cnt,1)->text().toUInt());
|
||
|
||
setPieSliceStyle(slice,ui->ram_table->item(row_cnt,2)->text().split("%")[0].toFloat(),ui->ram_table->item(0,2)->text().split("%")[0].toFloat());
|
||
|
||
|
||
|
||
}
|
||
|
||
for(uint64_t row_cnt=0;row_cnt<ui->flash_table->rowCount();row_cnt++)
|
||
{
|
||
QPieSlice *slice =flash_pieseries->append(ui->flash_table->item(row_cnt,0)->text()+":"+ui->flash_table->item(row_cnt,2)->text(),ui->flash_table->item(row_cnt,1)->text().toUInt());
|
||
setPieSliceStyle(slice,ui->flash_table->item(row_cnt,2)->text().split("%")[0].toFloat(),ui->flash_table->item(0,2)->text().split("%")[0].toFloat());
|
||
|
||
}
|
||
|
||
|
||
if(ui->ram_scrollArea->verticalScrollBar()!=nullptr)
|
||
FlatUI::setScrollBarQss(ui->ram_scrollArea->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
if(ui->ram_scrollArea->verticalScrollBar()!=nullptr)
|
||
FlatUI::setScrollBarQss(ui->flash_scrollArea->verticalScrollBar(), 8, 120, 20, "#E5E5E5", "#D0D0D0", "#1ABC9C", "#E74C3C");
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
QString MainWindow::readTableData(ui_table_t table,int row, int column)
|
||
{
|
||
QString data;
|
||
QTableWidget* tableWidget ;
|
||
if( table==ram_table)tableWidget=ui->ram_table;
|
||
else tableWidget=ui->flash_table;
|
||
|
||
if (row < tableWidget->rowCount() && column <tableWidget->columnCount()) {
|
||
QTableWidgetItem *item =tableWidget->item(row, column);
|
||
if (item) {
|
||
data = item->text();
|
||
// qDebug() << "Data at (" << row << ", " << column << "): " << data;
|
||
}
|
||
}
|
||
return data;
|
||
}
|
||
|
||
|
||
void MainWindow::writeTableData(ui_table_t table,int row, int column, const QString &data)
|
||
{
|
||
|
||
|
||
QTableWidget* tableWidget=nullptr;
|
||
if (table == ram_table)
|
||
{
|
||
|
||
tableWidget=ui->ram_table;
|
||
|
||
}
|
||
else if (table == flash_table)
|
||
{
|
||
tableWidget = ui->flash_table;
|
||
|
||
}
|
||
else
|
||
{
|
||
qDebug() << "Invalid table specified.";
|
||
return;
|
||
}
|
||
|
||
|
||
if (row >= tableWidget->rowCount())
|
||
{
|
||
tableWidget->setRowCount(row + 1);
|
||
}
|
||
if (column >= tableWidget->columnCount())
|
||
{
|
||
tableWidget->setColumnCount(column + 1);
|
||
}
|
||
|
||
if (!tableWidget->item(row, column))
|
||
{
|
||
QTableWidgetItem *newItem = new QTableWidgetItem(data);
|
||
tableWidget->setItem(row, column, newItem);
|
||
}
|
||
else
|
||
{
|
||
tableWidget->item(row, column)->setText(data);
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
void MainWindow::titleDblClick()
|
||
{
|
||
on_btnMenu_Max_clicked();
|
||
}
|
||
|
||
void MainWindow::windowStateChange(bool max)
|
||
{
|
||
ui->btnMenu_Max->setText(max ? "还原" : "最大");
|
||
}
|
||
|
||
void MainWindow::on_btnMenu_Min_clicked()
|
||
{
|
||
#ifdef Q_OS_MACOS
|
||
this->setWindowFlags(this->windowFlags() & ~Qt::FramelessWindowHint);
|
||
#endif
|
||
this->showMinimized();
|
||
}
|
||
|
||
void MainWindow::on_btnMenu_Max_clicked()
|
||
{
|
||
if (this->isMaximized()) {
|
||
this->showNormal();
|
||
ui->btnMenu_Max->setText("最大");
|
||
} else {
|
||
this->showMaximized();
|
||
ui->btnMenu_Max->setText("还原");
|
||
}
|
||
}
|
||
|
||
void MainWindow::on_btnMenu_Close_clicked()
|
||
{
|
||
this->close();
|
||
}
|
||
|
||
void MainWindow::on_gitee_index_clicked()
|
||
{
|
||
QDesktopServices::openUrl(QUrl("https://gitee.com/nikolan"));
|
||
|
||
}
|
||
|
||
void MainWindow::on_icon_clicked()
|
||
{
|
||
QDesktopServices::openUrl(QUrl("https://gitee.com/nikolan/keil_development_assistant"));
|
||
}
|