添加了打开配置文件的功能

This commit is contained in:
jackfiled 2022-06-25 16:35:07 +08:00
parent d67c91f4c8
commit ac6a9c9a68
6 changed files with 347 additions and 288 deletions

View File

@ -12,9 +12,14 @@
#include "cstdio" #include "cstdio"
#include "string" #include "string"
#include "sstream" #include "sstream"
#include "QObject"
class BusControllerModel /**
* QObject
*/
class BusControllerModel : public QObject
{ {
Q_OBJECT
public: public:
/** /**
* *
@ -32,7 +37,7 @@ public:
int direction; int direction;
/** /**
* *
*/ */
int bus_time; int bus_time;
@ -65,6 +70,15 @@ public:
std::string PrintState(); std::string PrintState();
bool JudgeOnStation(); bool JudgeOnStation();
public slots:
/**
*
* @param file_name
*/
void ReadConfigFileSlot(const QString& file_name);
private: private:
/** /**
* *

View File

@ -1,284 +0,0 @@
//
// Created by ricardo on 2022/6/17.
//
#include "busModel.h"
int BusControllerModel::FCFSDirection() const
{
bus_query_t *p = query_manager->queries;
if(p == nullptr)
{
return BUS_STOP;
} //如果没有请求,公交车停止
else
{
int clockwise = 0;
int counterclockwise = 0; //用于顺,逆时针方向所经站台计数
/**
*
*/
rail_node_t *now_position = rail_pos;
/**
*
*/
rail_node_t *target_position = p->node;
rail_node_t *pos = now_position;
while (pos != target_position) //顺时针计数
{
clockwise++;
pos = pos->next_node;
}
pos = now_position;
while (pos != target_position) //逆时针计数
{
counterclockwise++;
pos = pos->last_node;
}
if(clockwise <= counterclockwise)
{
return BUS_CLOCK_WISE;
}//若顺时针距离短(或顺逆相等),公交车顺时针运行
else
{
return BUS_COUNTER_CLOCK_WISE;
}//若逆时针距离短,公交车逆时针运行
}
}
bus_query_t *BusControllerModel::FCFSQuery() const
{
bus_query_t *result = nullptr;
if(query_manager->queries != nullptr)
{
if(rail_pos == query_manager->queries->node)
{
result = query_manager->queries;
}
}
return result;
}
bus_query_t *BusControllerModel::SSTFGetQuery()
{
// 当前没有请求
if(query_manager->queries == nullptr)
{
return nullptr;
}
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
// 遍历顺时针方向
// 在两个方向路程相同时选择顺时针方向
// 所以先遍历顺时针方向
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
// 遍历逆时针方向
p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_COUNTER_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
return query;
}
int BusControllerModel::SSTFDirection(bus_query_t *query)
{
if (query == nullptr)
{
return BUS_STOP;
}
int length = GetQueryDistance(query, BUS_CLOCK_WISE);
if(length > total_distance / 2)
{
return BUS_COUNTER_CLOCK_WISE;
}
else if(length == 0)
{
return BUS_STOP;
}
else
{
return BUS_CLOCK_WISE;
}
}
bus_query_t *BusControllerModel::SSTFBTWQuery() const
{
bus_query_t *query = query_manager->queries;
bus_query_t *allow_query = nullptr;
rail_node_t *now_node = rail_pos;
while (query != nullptr)
{
if(query->node == now_node)
{
// 这里是设计上的缺陷在bus_time显示时间的前一秒公交车就实际上到达站台了
if(query->time < bus_time - 1)
{
if(query->type == direction || query->type == BUS_TARGET)
{
allow_query = query;
break;
}
}
}
query = query->next_node;
}
return allow_query;
}
bus_query_t *BusControllerModel::SCANGetQuery()
{
// 当前没有请求
if(query_manager->queries == nullptr)
{
return nullptr;
}
if(direction == BUS_STOP)
{
// 在停止的状态下第一次开始选择方向
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
// 遍历顺时针方向
// 在两个方向路程相同时选择顺时针方向
// 所以先遍历顺时针方向
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
// 遍历逆时针方向
p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_COUNTER_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
return query;
}
else
{
// 在已经有方向的情况下处理方向
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, direction);
if(temp < length)
{
query = p;
length = temp;
}
p = p->next_node;
}
return query;
}
}
int BusControllerModel::SCANDirection(bus_query_t *query)
{
if(query == nullptr)
{
return BUS_STOP;
}
if(direction == BUS_STOP)
{
int length = GetQueryDistance(query, BUS_CLOCK_WISE);
if(length > total_distance / 2)
{
return BUS_COUNTER_CLOCK_WISE;
}
else
{
return BUS_CLOCK_WISE;
}
}
else
{
int length = GetQueryDistance(query, direction);
if(length > total_distance / 2)
{
if(direction == BUS_CLOCK_WISE)
{
return BUS_COUNTER_CLOCK_WISE;
}
else
{
return BUS_CLOCK_WISE;
}
}
else
{
return direction;
}
}
}
bus_query_t *BusControllerModel::SCANBTWQuery() const
{
rail_node_t *now_position = rail_pos;
//获取公交车当前所在站点
bus_query_t *p = query_manager->queries;
while(p != nullptr)
{
if(p->node == now_position)
{
if(p->time < bus_time - 1)
{
return p;
}
}
p = p->next_node;
}//遍历请求链表,判断是否有可以顺便处理的请求
return nullptr;
}

View File

@ -2,7 +2,7 @@
// Created by ricardo on 2022/6/10. // Created by ricardo on 2022/6/10.
// //
#include "busModel.h" #include "moc_busModel.cpp"
BusControllerModel::BusControllerModel() BusControllerModel::BusControllerModel()
{ {
@ -13,6 +13,9 @@ BusControllerModel::BusControllerModel()
rail_pos = rail_manager->rails; rail_pos = rail_manager->rails;
distance = 0; distance = 0;
direction = BUS_STOP; direction = BUS_STOP;
// 设置初始时间
bus_time = 0;
} }
BusControllerModel::~BusControllerModel() BusControllerModel::~BusControllerModel()
@ -21,6 +24,11 @@ BusControllerModel::~BusControllerModel()
delete(query_manager); delete(query_manager);
} }
void BusControllerModel::ReadConfigFileSlot(const QString& file_name)
{
ReadConfigFile(file_name.toStdString());
}
int BusControllerModel::GetBusPosition() const int BusControllerModel::GetBusPosition() const
{ {
int result = 0; int result = 0;
@ -291,3 +299,284 @@ void BusControllerModel::ReadConfigFile(const std::string& file_name)
delete rail_manager; delete rail_manager;
rail_manager = new RailsModel(node_space_length, total_station); rail_manager = new RailsModel(node_space_length, total_station);
} }
int BusControllerModel::FCFSDirection() const
{
bus_query_t *p = query_manager->queries;
if(p == nullptr)
{
return BUS_STOP;
} //如果没有请求,公交车停止
else
{
int clockwise = 0;
int counterclockwise = 0; //用于顺,逆时针方向所经站台计数
/**
*
*/
rail_node_t *now_position = rail_pos;
/**
*
*/
rail_node_t *target_position = p->node;
rail_node_t *pos = now_position;
while (pos != target_position) //顺时针计数
{
clockwise++;
pos = pos->next_node;
}
pos = now_position;
while (pos != target_position) //逆时针计数
{
counterclockwise++;
pos = pos->last_node;
}
if(clockwise <= counterclockwise)
{
return BUS_CLOCK_WISE;
}//若顺时针距离短(或顺逆相等),公交车顺时针运行
else
{
return BUS_COUNTER_CLOCK_WISE;
}//若逆时针距离短,公交车逆时针运行
}
}
bus_query_t *BusControllerModel::FCFSQuery() const
{
bus_query_t *result = nullptr;
if(query_manager->queries != nullptr)
{
if(rail_pos == query_manager->queries->node)
{
result = query_manager->queries;
}
}
return result;
}
bus_query_t *BusControllerModel::SSTFGetQuery()
{
// 当前没有请求
if(query_manager->queries == nullptr)
{
return nullptr;
}
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
// 遍历顺时针方向
// 在两个方向路程相同时选择顺时针方向
// 所以先遍历顺时针方向
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
// 遍历逆时针方向
p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_COUNTER_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
return query;
}
int BusControllerModel::SSTFDirection(bus_query_t *query)
{
if (query == nullptr)
{
return BUS_STOP;
}
int length = GetQueryDistance(query, BUS_CLOCK_WISE);
if(length > total_distance / 2)
{
return BUS_COUNTER_CLOCK_WISE;
}
else if(length == 0)
{
return BUS_STOP;
}
else
{
return BUS_CLOCK_WISE;
}
}
bus_query_t *BusControllerModel::SSTFBTWQuery() const
{
bus_query_t *query = query_manager->queries;
bus_query_t *allow_query = nullptr;
rail_node_t *now_node = rail_pos;
while (query != nullptr)
{
if(query->node == now_node)
{
// 这里是设计上的缺陷在bus_time显示时间的前一秒公交车就实际上到达站台了
if(query->time < bus_time - 1)
{
if(query->type == direction || query->type == BUS_TARGET)
{
allow_query = query;
break;
}
}
}
query = query->next_node;
}
return allow_query;
}
bus_query_t *BusControllerModel::SCANGetQuery()
{
// 当前没有请求
if(query_manager->queries == nullptr)
{
return nullptr;
}
if(direction == BUS_STOP)
{
// 在停止的状态下第一次开始选择方向
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
// 遍历顺时针方向
// 在两个方向路程相同时选择顺时针方向
// 所以先遍历顺时针方向
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
// 遍历逆时针方向
p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, BUS_COUNTER_CLOCK_WISE);
if(temp < length)
{
length = temp;
query = p;
}
p = p->next_node;
}
return query;
}
else
{
// 在已经有方向的情况下处理方向
int length = 9999;
bus_query_t *query = nullptr;
bus_query_t *p = query_manager->queries;
while (p != nullptr)
{
int temp = GetQueryDistance(p, direction);
if(temp < length)
{
query = p;
length = temp;
}
p = p->next_node;
}
return query;
}
}
int BusControllerModel::SCANDirection(bus_query_t *query)
{
if(query == nullptr)
{
return BUS_STOP;
}
if(direction == BUS_STOP)
{
int length = GetQueryDistance(query, BUS_CLOCK_WISE);
if(length > total_distance / 2)
{
return BUS_COUNTER_CLOCK_WISE;
}
else
{
return BUS_CLOCK_WISE;
}
}
else
{
int length = GetQueryDistance(query, direction);
if(length > total_distance / 2)
{
if(direction == BUS_CLOCK_WISE)
{
return BUS_COUNTER_CLOCK_WISE;
}
else
{
return BUS_CLOCK_WISE;
}
}
else
{
return direction;
}
}
}
bus_query_t *BusControllerModel::SCANBTWQuery() const
{
rail_node_t *now_position = rail_pos;
//获取公交车当前所在站点
bus_query_t *p = query_manager->queries;
while(p != nullptr)
{
if(p->node == now_position)
{
if(p->time < bus_time - 1)
{
return p;
}
}
p = p->next_node;
}//遍历请求链表,判断是否有可以顺便处理的请求
return nullptr;
}

View File

@ -6,7 +6,10 @@
#define AUTO_BUS_GUI_MAIN_WINDOW_H #define AUTO_BUS_GUI_MAIN_WINDOW_H
#include <QMainWindow> #include <QMainWindow>
#include "QFileDialog"
#include "centralwidget.h" #include "centralwidget.h"
#include "busModel.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -25,9 +28,23 @@ public:
~MainWindow() override; ~MainWindow() override;
signals:
/**
*
* @param file_name
*/
void OpenConfigFileSignal(QString file_name);
public slots:
/**
*
*/
void ReadConfigFileButtonClicked();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
CentralWidget *central_widget; CentralWidget *central_widget;
BusControllerModel *controller;
void SetMenuBarConnection(); void SetMenuBarConnection();
}; };

View File

@ -35,7 +35,6 @@ SceneManager::SceneManager(int stop_node_number)
stop_pos_pairs[j].AddLength(stop_space_length); stop_pos_pairs[j].AddLength(stop_space_length);
} }
pixmap_items[i].setPos(stop_pos_pairs[i].pos_x, stop_pos_pairs[i].pos_y); pixmap_items[i].setPos(stop_pos_pairs[i].pos_x, stop_pos_pairs[i].pos_y);
qDebug() << i << " " << stop_pos_pairs[i].pos_x << " " << stop_pos_pairs[i].pos_y;
} }
// 画一个描边的矩形框 // 画一个描边的矩形框

View File

@ -6,12 +6,14 @@
#include "header/moc_mainwindow.cpp" #include "header/moc_mainwindow.cpp"
#include "form/ui_MainWindow.h" #include "form/ui_MainWindow.h"
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{ {
ui = new Ui::MainWindow; ui = new Ui::MainWindow;
central_widget = new CentralWidget; central_widget = new CentralWidget;
controller = new BusControllerModel;
ui->setupUi(this); ui->setupUi(this);
this->setCentralWidget(central_widget); this->setCentralWidget(central_widget);
@ -23,9 +25,31 @@ MainWindow::~MainWindow()
{ {
delete ui; delete ui;
delete central_widget; delete central_widget;
delete controller;
} }
void MainWindow::SetMenuBarConnection() void MainWindow::SetMenuBarConnection()
{ {
QObject::connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(close())); QObject::connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(close()));
QObject::connect(ui->actionRead_ConfigFile, &QAction::triggered, this, &MainWindow::ReadConfigFileButtonClicked);
}
void MainWindow::ReadConfigFileButtonClicked()
{
QString file_name = QFileDialog::getOpenFileName(
this,
"打开配置文件",
"C:/",
"Config Files(*.dic)"
);
if(file_name.isEmpty())
{
qDebug() << "文件名为空";
}
else
{
qDebug() << file_name;
emit OpenConfigFileSignal(file_name);
}
} }