diff --git a/include/BusStrategyBase.h b/include/BusStrategyBase.h
index 63dd903..0f1c347 100644
--- a/include/BusStrategyBase.h
+++ b/include/BusStrategyBase.h
@@ -19,8 +19,6 @@ public:
RailsModel *rails_model;
QueryModel *query_model;
BusModel *bus_model;
- QTimer *tick_timer;
-
int bus_tick;
@@ -28,6 +26,7 @@ public:
virtual ~BusStrategyBase();
+
/**
* 获得当前公交车应该前进的方向
* @return 公交车前进的方向
@@ -47,14 +46,50 @@ public:
virtual bus_query_t *HandleQuery() = 0;
signals:
+ /**
+ * 删除请求信号
+ * @param query 需要删除请求的指针
+ */
void DeleteQuerySignal(bus_query_t *query);
+ /**
+ * 打印状态信号
+ * @param string 状态字符串
+ */
+ void PrintStateSignal(QString string);
+
public slots:
void AppendQuerySlot(int query_type, int node_id) const;
+ /**
+ * 处理开始事件的槽函数
+ */
+ void BusBeginSlot();
+
+ /**
+ * 处理结束事件的槽函数
+ */
+ void BusEndSlot();
+
+ /**
+ * 处理tick事件的槽函数
+ */
+ void OneTickSlot(int remaining_time);
private:
- QString PrintState() const;
+ /**
+ * 储存当前的状态
+ */
+ int status = BUS_END;
+
+ /**
+ * 打印当前状态
+ * @return 表示当前状态的字符串
+ */
+ QString PrintState(int remaining_time) const;
+
+
+ void SetConnection() const;
};
diff --git a/include/busModel.h b/include/busModel.h
index 68bcd74..a44c93f 100644
--- a/include/busModel.h
+++ b/include/busModel.h
@@ -36,8 +36,6 @@ public:
*/
bus_query_t *target_query;
- QTimer *bus_timer;
-
explicit BusModel();
~BusModel();
@@ -48,7 +46,7 @@ public:
*/
void ResetBus(rail_node_t *head);
- double GetBusPosition();
+ double GetBusPosition(int remaining_time);
/**
* 给出在指定的方向下,指定的请求于公交车当前位置的距离
diff --git a/include/define.h b/include/define.h
index f202102..ab1b319 100644
--- a/include/define.h
+++ b/include/define.h
@@ -9,11 +9,11 @@
#define BUS_COUNTER_CLOCK_WISE 1 // 逆时针
#define BUS_TARGET 2 // 目标
#define BUS_STOP 2 // 停止
-#define IO_CLOCK 0 // 读取时钟指令
-#define IO_READING 1 // 读取请求指令
-#define IO_END 2 // 读取结束指令
#define BUS_FCFS 0 // 先来先服务
#define BUS_SSTF 1 // 最短寻找时间优先
#define BUS_SCAN 2 // 顺便服务
+#define BUS_RUNNING 0
+#define BUS_PAUSING 1
+#define BUS_END 2
#endif //AUTO_BUS_GUI_DEFINE_H
diff --git a/include/mainScene.h b/include/mainScene.h
index 0cf1599..c9f5bd8 100644
--- a/include/mainScene.h
+++ b/include/mainScene.h
@@ -29,6 +29,13 @@ public:
*/
void SetStopScene(int node_number);
+ /**
+ * 开始公交车动画
+ * @param direction 公交车前进的方向
+ * @param duration 前进持续的时间
+ */
+ void BeginBusAnimation(int direction, int duration);
+
private:
/**
* 显示站点的像素图对象
diff --git a/include/railsModel.h b/include/railsModel.h
index 0b8d110..839d98c 100644
--- a/include/railsModel.h
+++ b/include/railsModel.h
@@ -57,7 +57,7 @@ public:
* @param id 需要查找的站点编号
* @return 需要查找站点指针
*/
- rail_node_t *FindNode(int node_num) const;
+ rail_node_t *FindNode(int node_id) const;
/**
* 创建轨道链表
diff --git a/src/BusStrategyBase.cpp b/src/BusStrategyBase.cpp
index 20eaa3d..3d21d54 100644
--- a/src/BusStrategyBase.cpp
+++ b/src/BusStrategyBase.cpp
@@ -8,8 +8,7 @@ BusStrategyBase::BusStrategyBase()
{
rails_model = new RailsModel;
query_model = new QueryModel;
- bus_model = new BusModel();
- tick_timer = new QTimer;
+ bus_model = new BusModel;
bus_tick = 0;
}
@@ -19,7 +18,11 @@ BusStrategyBase::~BusStrategyBase()
delete rails_model;
delete query_model;
delete bus_model;
- delete tick_timer;
+}
+
+void BusStrategyBase::SetConnection() const
+{
+
}
void BusStrategyBase::AppendQuerySlot(int query_type, int node_id) const
@@ -28,7 +31,34 @@ void BusStrategyBase::AppendQuerySlot(int query_type, int node_id) const
query_model->CreateQuery(query_type, node);
}
-QString BusStrategyBase::PrintState() const
+void BusStrategyBase::OneTickSlot(int remaining_time)
+{
+ // 时间流动
+ bus_tick++;
+
+ // 打印状态
+ QString str = PrintState(remaining_time);
+ emit PrintStateSignal(str);
+}
+
+void BusStrategyBase::BusBeginSlot()
+{
+ status = BUS_RUNNING;
+
+ // 在一开始先打印一下状态
+ QString str = PrintState(0);
+ emit PrintStateSignal(str);
+}
+
+void BusStrategyBase::BusEndSlot()
+{
+ status = BUS_END;
+ bus_tick = 0;
+
+ bus_model->ResetBus(rails_model->rails);
+}
+
+QString BusStrategyBase::PrintState(int remaining_time) const
{
int count = 0;
rail_node_t *node = rails_model->rails;
@@ -78,7 +108,7 @@ QString BusStrategyBase::PrintState() const
QString str = QString::asprintf("Time:%d\n", bus_tick);
str += "BUS:\n";
- str += QString::asprintf("position:%lf\n", bus_model->GetBusPosition());
+ str += QString::asprintf("position:%lf\n", bus_model->GetBusPosition(remaining_time));
str = str + "target:" + target + "\n";
str += "STATION:\n";
str = str + "clockwise" + clockwise + "\n";
diff --git a/src/busModel.cpp b/src/busModel.cpp
index 24e020b..ce8e109 100644
--- a/src/busModel.cpp
+++ b/src/busModel.cpp
@@ -10,13 +10,11 @@ BusModel::BusModel()
direction = BUS_STOP;
target_query = nullptr;
rail_head = nullptr;
-
- bus_timer = new QTimer;
}
BusModel::~BusModel()
{
- delete bus_timer;
+
}
void BusModel::ResetBus(rail_node_t *head)
@@ -28,7 +26,7 @@ void BusModel::ResetBus(rail_node_t *head)
rail_pos = rail_head;
}
-double BusModel::GetBusPosition()
+double BusModel::GetBusPosition(int remaining_time)
{
double result = 0;
rail_node_t *now_pos = rail_pos;
@@ -41,7 +39,11 @@ double BusModel::GetBusPosition()
node = node->next_node;
} while (node != now_pos);
- int remaining_time = bus_timer->remainingTime();
+ // 如果就在起始点,距离为0
+ if(now_pos == rail_head)
+ {
+ result = 0;
+ }
if(remaining_time > 0)
{
diff --git a/src/centralwidget.cpp b/src/centralwidget.cpp
index 5562474..3c03e60 100644
--- a/src/centralwidget.cpp
+++ b/src/centralwidget.cpp
@@ -43,6 +43,9 @@ void CentralWidget::SetControlConnection()
// 设置删除请求事件的连接
QObject::connect(controller, &BusStrategyBase::DeleteQuerySignal,
this, &CentralWidget::DeleteQueryItemSlot);
+
+ QObject::connect(controller, &BusStrategyBase::PrintStateSignal,
+ this, &CentralWidget::PrintStateSlot);
}
void CentralWidget::SetWidgetConnection()
@@ -119,6 +122,16 @@ void CentralWidget::DeleteQueryItemSlot(bus_query_t *query)
delete *pos;
}
+void CentralWidget::PrintStateSlot(const QString& string)
+{
+ ui->text_output->insertPlainText(string);
+
+ // 设置光标在最后一行
+ QTextCursor cursor = ui->text_output->textCursor();
+ cursor.movePosition(QTextCursor::End);
+ ui->text_output->setTextCursor(cursor);
+}
+
void CentralWidget::AddQueryButtonClicked()
{
int query_type = ui->query_type_combo->currentIndex();
diff --git a/src/form/mainwindow.ui b/src/form/mainwindow.ui
index fc8dd00..f2f195c 100644
--- a/src/form/mainwindow.ui
+++ b/src/form/mainwindow.ui
@@ -46,7 +46,6 @@
Run
-
diff --git a/src/header/centralwidget.h b/src/header/centralwidget.h
index e2ed606..3b15801 100644
--- a/src/header/centralwidget.h
+++ b/src/header/centralwidget.h
@@ -10,6 +10,7 @@
#include "string"
#include "list"
#include "QMessageBox"
+#include "QTextCursor"
#include "mainScene.h"
#include "queryListItem.h"
@@ -62,6 +63,12 @@ public slots:
*/
void AddQueryButtonClicked();
+ /**
+ * 处理打印状态事件的槽函数
+ * @param string 状态字符串
+ */
+ void PrintStateSlot(const QString& string);
+
private:
/**
* UI控件
diff --git a/src/header/mainwindow.h b/src/header/mainwindow.h
index e0d4788..7a4f9de 100644
--- a/src/header/mainwindow.h
+++ b/src/header/mainwindow.h
@@ -32,22 +32,22 @@ public:
~MainWindow() override;
signals:
-
/**
* 开始运行公交车的信号
*/
void RunBusSignal();
- /**
- * 暂停运行公交车的信号
- */
- void PauseBusSignal();
-
/**
* 停止运行公交车的信号
*/
void StopBusSignal();
+ /**
+ * 时钟信号
+ * @param remain_time bus_timer计时器剩余的时间
+ */
+ void BusTickSignal(int remain_time);
+
public slots:
/**
* 点击打开配置文件按钮的槽函数
@@ -59,21 +59,37 @@ public slots:
*/
void RunBusClicked();
- /**
- * 处理点击暂停公交车按钮的槽函数
- */
- void PauseBusClicked();
-
/**
* 处理点击停止公交车按钮的槽函数
*/
void StopBusClicked();
+ /**
+ * 开始全局计时器的槽函数
+ */
+ void BeginTickTimerSlot();
+
+ /**
+ * 结束全局计时器的槽函数
+ */
+ void EndTickTimerSlot();
+
+ /**
+ * 每一tick的槽函数
+ */
+ void OneTickSlot();
+
private:
+ /**
+ * 设置一时刻的长度,单位毫秒
+ */
+ const int tick = 1000;
+
/**
* UI控件
*/
Ui::MainWindow *ui;
+
/**
* 中间的显示框架
*/
@@ -83,10 +99,15 @@ private:
BusStrategyBase *controller;
+ QTimer *tick_timer;
+
+ QTimer *bus_timer;
+
+
/**
* 设置菜单栏的相关连接
*/
- void SetMenuBarConnection();
+ void SetWidgetConnection();
/**
* 设置控制器的相关连接
diff --git a/src/mainScene.cpp b/src/mainScene.cpp
index a93ea27..fd3a484 100644
--- a/src/mainScene.cpp
+++ b/src/mainScene.cpp
@@ -81,3 +81,8 @@ void SceneManager::ClearStopScene()
delete []pixmap_items;
delete []stop_pos_pairs;
}
+
+void SceneManager::BeginBusAnimation(int direction, int duration)
+{
+ bus->StartAnimation(direction, duration);
+}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index d5ca3d7..a880831 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -12,6 +12,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
ui = new Ui::MainWindow;
worker_thread = new QThread;
+ tick_timer = new QTimer;
+ bus_timer = new QTimer;
controller = nullptr;
central_widget = new CentralWidget(nullptr);
@@ -19,7 +21,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
ui->setupUi(this);
this->setCentralWidget(central_widget);
- SetMenuBarConnection();
+ SetWidgetConnection();
//开始多线程事件循环
worker_thread->start();
@@ -33,9 +35,11 @@ MainWindow::~MainWindow()
delete ui;
delete central_widget;
delete worker_thread;
+ delete tick_timer;
+ delete bus_timer;
}
-void MainWindow::SetMenuBarConnection()
+void MainWindow::SetWidgetConnection()
{
// 连接退出按钮
QObject::connect(ui->actionExit, SIGNAL(triggered()),
@@ -46,17 +50,36 @@ void MainWindow::SetMenuBarConnection()
// 连接运行公交车按钮
QObject::connect(ui->actionRun_Bus, &QAction::triggered,
this, &MainWindow::RunBusClicked);
- // 连接暂停公交车按钮
- QObject::connect(ui->actionPause_Bus, &QAction::triggered,
- this, &MainWindow::PauseBusClicked);
+
// 连接停止公交车按钮
QObject::connect(ui->actionStop_Bus, &QAction::triggered,
this, &MainWindow::StopBusClicked);
+
+ // 开始全局计时器连接
+ QObject::connect(this, &MainWindow::RunBusSignal,
+ this, &MainWindow::BeginTickTimerSlot);
+
+ // 结束全局计时器连接
+ QObject::connect(this, &MainWindow::StopBusSignal,
+ this, &MainWindow::EndTickTimerSlot);
+
+ // 处理计时器tick连接
+ QObject::connect(tick_timer, &QTimer::timeout,
+ this, &MainWindow::OneTickSlot);
}
void MainWindow::SetControlConnection()
{
+ // 开始运行连接
+ QObject::connect(this, &MainWindow::RunBusSignal,
+ controller, &BusStrategyBase::BusBeginSlot);
+ QObject::connect(this, &MainWindow::StopBusSignal,
+ controller, &BusStrategyBase::BusEndSlot);
+
+ // 每一tick连接
+ QObject::connect(this, &MainWindow::BusTickSignal,
+ controller, &BusStrategyBase::OneTickSlot);
}
void MainWindow::ReadConfigFileButtonClicked()
@@ -81,9 +104,13 @@ void MainWindow::ReadConfigFileButtonClicked()
}
controller = StrategyFactory::GetStrategy(file_name);
+ // 开始多线程
BeginThread();
+ // 设置controller相关连接
SetControlConnection();
central_widget->SetController(controller);
+ // 重设公交车的状态
+ controller->bus_model->ResetBus(controller->rails_model->rails);
}
}
@@ -92,11 +119,6 @@ void MainWindow::RunBusClicked()
emit RunBusSignal();
}
-void MainWindow::PauseBusClicked()
-{
- emit PauseBusSignal();
-}
-
void MainWindow::StopBusClicked()
{
emit StopBusSignal();
@@ -108,4 +130,23 @@ void MainWindow::BeginThread()
{
controller->moveToThread(worker_thread);
}
+}
+
+void MainWindow::BeginTickTimerSlot()
+{
+ tick_timer->setInterval(tick);
+
+ tick_timer->start();
+}
+
+void MainWindow::OneTickSlot()
+{
+ int time = bus_timer->remainingTime();
+
+ emit BusTickSignal(time);
+}
+
+void MainWindow::EndTickTimerSlot()
+{
+ tick_timer->stop();
}
\ No newline at end of file
diff --git a/src/railsModel.cpp b/src/railsModel.cpp
index f257a9d..cfb0487 100644
--- a/src/railsModel.cpp
+++ b/src/railsModel.cpp
@@ -19,7 +19,7 @@ RailsModel::~RailsModel()
}
}
-rail_node_t *RailsModel::FindNode(int node_num) const
+rail_node_t *RailsModel::FindNode(int node_id) const
{
if (rails == nullptr)
{
@@ -31,7 +31,7 @@ rail_node_t *RailsModel::FindNode(int node_num) const
do
{
- if(node->id == node_num)
+ if(node->id == node_id)
{
result = node;
break;