删除了冗长的公交车控制类
设计了单独的公交车类
This commit is contained in:
		@@ -14,137 +14,39 @@
 | 
				
			|||||||
#include "sstream"
 | 
					#include "sstream"
 | 
				
			||||||
#include "QObject"
 | 
					#include "QObject"
 | 
				
			||||||
#include "QDebug"
 | 
					#include "QDebug"
 | 
				
			||||||
 | 
					#include "QTimer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 控制公交车的类,继承了QObject
 | 
					 * 公交车模型类
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class BusControllerModel : public QObject
 | 
					class BusModel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 指向公交车所在站点的指针
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    rail_node_t *rail_pos;
 | 
					    rail_node_t *rail_pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 当前行进的距离
 | 
					     * 公交车前进的速度
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int distance;
 | 
					    const int velocity = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 当前前进的方向
 | 
					     * 当前前进的方向
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int direction;
 | 
					    int direction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    QTimer *bus_timer;
 | 
				
			||||||
     * 公交车的计时时刻
 | 
					
 | 
				
			||||||
     */
 | 
					    explicit BusModel();
 | 
				
			||||||
    int bus_time;
 | 
					
 | 
				
			||||||
 | 
					    ~BusModel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 轨道对象
 | 
					     * 重置公交车
 | 
				
			||||||
 | 
					     * @param head 轨道的头节点位置
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    RailsModel *rail_manager;
 | 
					    void ResetBus(rail_node_t *head);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    double GetBusPosition();
 | 
				
			||||||
     * 请求控制对象
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    QueryModel *query_manager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 选定的策略
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    int chosen_strategy = -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 构造函数
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    BusControllerModel();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 析构函数
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    ~BusControllerModel();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 打印当前状态
 | 
					 | 
				
			||||||
     * @return 状态的字符串
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    std::string PrintState();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 判断公交车是否到站
 | 
					 | 
				
			||||||
     * @return
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool JudgeOnStation();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public slots:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 处理打开配置文件信号的槽函数
 | 
					 | 
				
			||||||
     * @param file_name 配置文件名称
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void ReadConfigFileSlot(const QString& file_name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 创建上下车请求的槽函数
 | 
					 | 
				
			||||||
     * @param query_type 请求的类型
 | 
					 | 
				
			||||||
     * @param node_id 请求站点的id
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void AddQuerySlot(int query_type, int node_id) const;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 删除上下车请求的槽函数
 | 
					 | 
				
			||||||
     * @param query
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void DeleteQuerySlot(bus_query_t *query) const;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获得公交车应该前进方向的槽函数
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void GetBusDirectionSlot();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 处理公交车可以处理请求的槽函数
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void HandleQuerySlot();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 创建轨道链表完成的信号
 | 
					 | 
				
			||||||
     * @param node_num 轨道上节点的个数
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void RailsCreated(int node_num);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 删除指定请求的信号
 | 
					 | 
				
			||||||
     * @param query 需要删除的请求
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void DeleteQuerySignal(bus_query_t *query);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 轨道的总长度
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    int total_distance = 10;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bus_query_t *target_query;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void SetConnection() const;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获得公交车当前所在的位置
 | 
					 | 
				
			||||||
     * @return 公交车当前所在的位置
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    int GetBusPosition() const;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 读取指定的配置文件
 | 
					 | 
				
			||||||
     * @param file_name 提供的配置文件路径
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void ReadConfigFile(const std::string& file_name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 给出在指定的方向下,指定的请求于公交车当前位置的距离
 | 
					     * 给出在指定的方向下,指定的请求于公交车当前位置的距离
 | 
				
			||||||
@@ -154,56 +56,16 @@ private:
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    int GetQueryDistance(bus_query_t *query, int orientation) const;
 | 
					    int GetQueryDistance(bus_query_t *query, int orientation) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 在先来先服务策略下应该前进的方向
 | 
					     * 轨道的头节点
 | 
				
			||||||
     * @return 前进的方向
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int FCFSDirection() const;
 | 
					    rail_node_t *rail_head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 在先来先服务策略下给出处理的请求
 | 
					     * 当前指定处理的请求
 | 
				
			||||||
     * @return 需要处理的请求
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    bus_query_t *FCFSQuery() const;
 | 
					    bus_query_t *target_query;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获得在SSTF策略下应该处理的请求
 | 
					 | 
				
			||||||
     * @return 指向需要处理的请求的指针
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bus_query_t *SSTFGetQuery();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 根据指定的请求获得前进的方向,也就是前往指定的请求最近的方向
 | 
					 | 
				
			||||||
     * 在SSTF策略中使用
 | 
					 | 
				
			||||||
     * @return 前进的方向
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    int SSTFDirection();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 在当前站上可以顺便服务的请求
 | 
					 | 
				
			||||||
     * @return 服务的请求指针
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bus_query_t *SSTFBTWQuery() const;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获得在SCAN策略下应该处理的请求
 | 
					 | 
				
			||||||
     * @return 指向需要处理的请求的指针
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bus_query_t *SCANGetQuery();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 根据指定的请求获得前进的方向
 | 
					 | 
				
			||||||
     * 在SCAN策略中使用
 | 
					 | 
				
			||||||
     * @param query 指定完成的请求
 | 
					 | 
				
			||||||
     * @return 前进的方向
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    int SCANDirection();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 在当前站上可以顺便服务的请求
 | 
					 | 
				
			||||||
     * @return 服务的请求指针
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bus_query_t *SCANBTWQuery() const;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //AUTO_BUS_GUI_BUS_MODEL_H
 | 
					#endif //AUTO_BUS_GUI_BUS_MODEL_H
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										667
									
								
								src/busModel.cpp
									
									
									
									
									
								
							
							
						
						
									
										667
									
								
								src/busModel.cpp
									
									
									
									
									
								
							@@ -2,154 +2,37 @@
 | 
				
			|||||||
// Created by ricardo on 2022/6/10.
 | 
					// Created by ricardo on 2022/6/10.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "moc_busModel.cpp"
 | 
					#include "busModel.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BusControllerModel::BusControllerModel()
 | 
					BusModel::BusModel()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rail_manager = new RailsModel;
 | 
					    rail_pos = nullptr;
 | 
				
			||||||
    query_manager = new QueryModel;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 设置公交车的初始状态
 | 
					 | 
				
			||||||
    rail_pos = rail_manager->rails;
 | 
					 | 
				
			||||||
    distance = 0;
 | 
					 | 
				
			||||||
    direction = BUS_STOP;
 | 
					    direction = BUS_STOP;
 | 
				
			||||||
    target_query = nullptr;
 | 
					    target_query = nullptr;
 | 
				
			||||||
 | 
					    rail_head = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 设置初始时间
 | 
					    bus_timer = new QTimer;
 | 
				
			||||||
    bus_time = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SetConnection();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BusControllerModel::~BusControllerModel()
 | 
					BusModel::~BusModel()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    delete(rail_manager);
 | 
					    delete bus_timer;
 | 
				
			||||||
    delete(query_manager);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BusControllerModel::SetConnection() const
 | 
					void BusModel::ResetBus(rail_node_t *head)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QObject::connect(this, &BusControllerModel::DeleteQuerySignal,
 | 
					    rail_head = head;
 | 
				
			||||||
                     this, &BusControllerModel::DeleteQuerySlot);
 | 
					
 | 
				
			||||||
 | 
					    direction = BUS_STOP;
 | 
				
			||||||
 | 
					    target_query = nullptr;
 | 
				
			||||||
 | 
					    rail_pos = rail_head;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BusControllerModel::ReadConfigFileSlot(const QString& file_name)
 | 
					double BusModel::GetBusPosition()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ReadConfigFile(file_name.toStdString());
 | 
					    double result = 0;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BusControllerModel::AddQuerySlot(int query_type, int node_id) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    rail_node_t *node_pos = rail_manager->FindNode(node_id);
 | 
					 | 
				
			||||||
    query_manager->CreateQuery(query_type, node_pos);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BusControllerModel::DeleteQuerySlot(bus_query_t *query) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    query_manager->DeleteQuery(query);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BusControllerModel::GetBusDirectionSlot()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    switch (chosen_strategy)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        case BUS_FCFS:
 | 
					 | 
				
			||||||
            direction = FCFSDirection();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case BUS_SSTF:
 | 
					 | 
				
			||||||
            if(target_query == nullptr)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                target_query = SSTFGetQuery();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            direction = SSTFDirection();
 | 
					 | 
				
			||||||
        case BUS_SCAN:
 | 
					 | 
				
			||||||
            if(target_query == nullptr)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                target_query = SCANGetQuery();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            direction = SCANDirection();
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BusControllerModel::HandleQuerySlot()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    bus_query_t *finished_query;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (chosen_strategy)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        case BUS_FCFS:
 | 
					 | 
				
			||||||
            finished_query = FCFSQuery();
 | 
					 | 
				
			||||||
            while (finished_query != nullptr)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                emit DeleteQuerySignal(finished_query);
 | 
					 | 
				
			||||||
                finished_query = FCFSQuery();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case BUS_SSTF:
 | 
					 | 
				
			||||||
            if(target_query == nullptr)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 这里可能需要处理一下新生成的请求可以处理的情况
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else if(target_query->node == rail_pos)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 到达目标站点
 | 
					 | 
				
			||||||
                while (target_query != nullptr and target_query->node == rail_pos)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    emit DeleteQuerySignal(target_query);
 | 
					 | 
				
			||||||
                    target_query = SSTFGetQuery();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 顺便处理请求
 | 
					 | 
				
			||||||
                finished_query = SSTFBTWQuery();
 | 
					 | 
				
			||||||
                while (finished_query != nullptr)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    emit DeleteQuerySignal(finished_query);
 | 
					 | 
				
			||||||
                    finished_query = SSTFBTWQuery();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case BUS_SCAN:
 | 
					 | 
				
			||||||
            if(target_query == nullptr)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 这里可能需要处理一下新生成的请求可以处理的情况
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else if(target_query->node == rail_pos)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 到达目标站点
 | 
					 | 
				
			||||||
                while (target_query != nullptr and target_query->node == rail_pos)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    emit DeleteQuerySignal(target_query);
 | 
					 | 
				
			||||||
                    target_query = SCANGetQuery();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // 顺便处理
 | 
					 | 
				
			||||||
                finished_query = SCANBTWQuery();
 | 
					 | 
				
			||||||
                while (finished_query != nullptr)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    emit DeleteQuerySignal(finished_query);
 | 
					 | 
				
			||||||
                    finished_query = SCANBTWQuery();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * 以下函数的实现移植自auto_pilot_bus
 | 
					 | 
				
			||||||
 * 源程序采用C写成
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int BusControllerModel::GetBusPosition() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int result = 0;
 | 
					 | 
				
			||||||
    rail_node_t *now_pos = rail_pos;
 | 
					    rail_node_t *now_pos = rail_pos;
 | 
				
			||||||
    rail_node_t *node = rail_manager->rails;
 | 
					    rail_node_t *node = rail_head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 先求一下当前所在位置离起始点的距离
 | 
					    // 先求一下当前所在位置离起始点的距离
 | 
				
			||||||
    do
 | 
					    do
 | 
				
			||||||
@@ -158,61 +41,27 @@ int BusControllerModel::GetBusPosition() const
 | 
				
			|||||||
        node = node->next_node;
 | 
					        node = node->next_node;
 | 
				
			||||||
    } while (node != now_pos);
 | 
					    } while (node != now_pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (now_pos == rail_manager->rails)
 | 
					    int remaining_time = bus_timer->remainingTime();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(remaining_time > 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        int length = distance;
 | 
					        if(direction == BUS_CLOCK_WISE)
 | 
				
			||||||
        if(length >= 0)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return length;
 | 
					            double length = now_pos->next_node_distance - (double)remaining_time / 1000.0 * velocity;
 | 
				
			||||||
 | 
					            result = result + length;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else if(direction == BUS_COUNTER_CLOCK_WISE)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return result + length;
 | 
					            double length = now_pos->last_node_distance - (double)remaining_time / 1000.0 * velocity;
 | 
				
			||||||
 | 
					            result = result - length;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (now_pos == rail_manager->rails->last_node)
 | 
					
 | 
				
			||||||
    {
 | 
					    return result;
 | 
				
			||||||
        int length = distance;
 | 
					 | 
				
			||||||
        if (length == now_pos->next_node_distance)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return distance + length;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return result + distance;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool BusControllerModel::JudgeOnStation()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if(distance == - rail_pos->last_node_distance)//表示逆时针
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        distance = 0;
 | 
					 | 
				
			||||||
        rail_pos = rail_pos->last_node;//逆时针往上一个
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if(distance == rail_pos->next_node_distance)//表示顺时针
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        distance = 0;
 | 
					 | 
				
			||||||
        rail_pos = rail_pos->next_node;//顺时针往下一个
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if(distance  == 0)//在站点上原地不动
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int BusControllerModel::GetQueryDistance(bus_query_t *query, int orientation) const
 | 
					int BusModel::GetQueryDistance(bus_query_t *query, int orientation) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rail_node_t *target_node = query->node;
 | 
					    rail_node_t *target_node = query->node;
 | 
				
			||||||
    rail_node_t *now_node = rail_pos;
 | 
					    rail_node_t *now_node = rail_pos;
 | 
				
			||||||
@@ -237,463 +86,3 @@ int BusControllerModel::GetQueryDistance(bus_query_t *query, int orientation) co
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
std::string BusControllerModel::PrintState()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int count, flag = 1;
 | 
					 | 
				
			||||||
    rail_node_t *node;
 | 
					 | 
				
			||||||
    char target[25], clockwise[25], counterclockwise[25];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //遍历轨道链表,将所有站点初始化为0,即:无任何请求;
 | 
					 | 
				
			||||||
    for (count = 0, node = rail_manager->rails; flag == 1 || node != rail_manager->rails;
 | 
					 | 
				
			||||||
        node = node->next_node, count++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        flag=0;
 | 
					 | 
				
			||||||
        target[count] = '0';
 | 
					 | 
				
			||||||
        clockwise[count] = '0';
 | 
					 | 
				
			||||||
        counterclockwise[count] = '0';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 在字符串的末尾填0
 | 
					 | 
				
			||||||
    target[count] = '\0';
 | 
					 | 
				
			||||||
    clockwise[count] = '\0';
 | 
					 | 
				
			||||||
    counterclockwise[count] = '\0';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bus_query_t *query = query_manager->queries;
 | 
					 | 
				
			||||||
    int pos;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (query != nullptr)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        pos = query->node->id - 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if(query->type == BUS_CLOCK_WISE)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            clockwise[pos] = '1';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else if (query->type == BUS_COUNTER_CLOCK_WISE)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            counterclockwise[pos] = '1';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            target[pos] = '1';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        query = query->next_node;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    std::stringstream format;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 格式化输出字符串
 | 
					 | 
				
			||||||
    format << "Time:" << std::endl
 | 
					 | 
				
			||||||
           << "BUS:" << std::endl
 | 
					 | 
				
			||||||
           << "position:" << GetBusPosition() << std::endl
 | 
					 | 
				
			||||||
           << "target:" << target << std::endl
 | 
					 | 
				
			||||||
           << "STATION:" << std::endl
 | 
					 | 
				
			||||||
           << "clockwise:" << clockwise << std::endl
 | 
					 | 
				
			||||||
           << "counterclockwise:" << counterclockwise << std::endl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return format.str();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BusControllerModel::ReadConfigFile(const std::string& file_name)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    FILE *config_file = nullptr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char buffer[30];
 | 
					 | 
				
			||||||
    int total_station = 0;
 | 
					 | 
				
			||||||
    int node_space_length = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fopen_s(&config_file, file_name.c_str(), "r");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 循环读取文件的每一行
 | 
					 | 
				
			||||||
    while (fgets(buffer, sizeof buffer, config_file) != nullptr)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        char first_char = buffer[0];
 | 
					 | 
				
			||||||
        char *p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        switch (first_char)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            case '#':
 | 
					 | 
				
			||||||
                // 如果读取到#什么都不做
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case 'T':
 | 
					 | 
				
			||||||
                // TOTAL_STATION
 | 
					 | 
				
			||||||
                p = buffer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 把数字前面的所有字符全部干掉
 | 
					 | 
				
			||||||
                while (*p < '0' || *p > '9')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    p++;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 讲道理,应该只有两位数,所以就这样处理了
 | 
					 | 
				
			||||||
                if (*(p + 1) == '\n' || *(p + 1) == '\0')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    total_station = *p - 48;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    total_station = (*p - 48) * 10 + *(p + 1) - 48;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case 'S':
 | 
					 | 
				
			||||||
                // STRATEGY
 | 
					 | 
				
			||||||
                p = buffer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 将=前的字符全部略去
 | 
					 | 
				
			||||||
                while (*p != '=')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    p++;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                // =也去掉
 | 
					 | 
				
			||||||
                p++;
 | 
					 | 
				
			||||||
                // =和策略之间的空格也去掉
 | 
					 | 
				
			||||||
                while (*p == ' ')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    p++;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (*p == 'F' && *(p + 1) == 'C') //FCFS
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    chosen_strategy = BUS_FCFS;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else if (*p == 'S' && *(p + 1) == 'S') //SSTF
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    chosen_strategy = BUS_SSTF;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else if (*p == 'S' && *(p + 1) == 'C') //SCAN
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    chosen_strategy = BUS_SCAN;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    // 读取失败
 | 
					 | 
				
			||||||
                    chosen_strategy = -1;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case 'D':
 | 
					 | 
				
			||||||
                // DISTANCE
 | 
					 | 
				
			||||||
                p = buffer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 把数字前面的所有字符全部干掉
 | 
					 | 
				
			||||||
                while (*p < '0' || *p > '9')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    p++;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (*(p + 1) == '\n' || *(p + 1) == '\0')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    node_space_length = *p - 48;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            default:
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 处理参数去缺省值的情况
 | 
					 | 
				
			||||||
    if (node_space_length == 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        node_space_length = 2;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (total_station == 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        total_station = 5;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if(chosen_strategy == -1)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        chosen_strategy = BUS_FCFS;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 得到轨道的总长度
 | 
					 | 
				
			||||||
    total_distance = node_space_length * total_station;
 | 
					 | 
				
			||||||
    rail_manager->CreateRails(node_space_length, total_station);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 发射信号说明创建完毕
 | 
					 | 
				
			||||||
    emit RailsCreated(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()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (target_query == nullptr)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return BUS_STOP;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int length = GetQueryDistance(target_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()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if(target_query == nullptr)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return BUS_STOP;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(direction == BUS_STOP)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int length = GetQueryDistance(target_query, BUS_CLOCK_WISE);
 | 
					 | 
				
			||||||
        if(length > total_distance / 2)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return BUS_COUNTER_CLOCK_WISE;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return BUS_CLOCK_WISE;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int length = GetQueryDistance(target_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;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,15 +8,13 @@
 | 
				
			|||||||
#include "form/ui_CentralWidget.h"
 | 
					#include "form/ui_CentralWidget.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CentralWidget::CentralWidget(QWidget *parent, BusControllerModel *bus_controller) : QWidget(parent), ui(new Ui::CentralWidget)
 | 
					CentralWidget::CentralWidget(QWidget *parent) : QWidget(parent), ui(new Ui::CentralWidget)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ui->setupUi(this);
 | 
					    ui->setupUi(this);
 | 
				
			||||||
    scene_manager = new SceneManager;
 | 
					    scene_manager = new SceneManager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ui->main_canva->setScene(scene_manager->scene);
 | 
					    ui->main_canva->setScene(scene_manager->scene);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    controller = bus_controller;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SetControlConnection();
 | 
					    SetControlConnection();
 | 
				
			||||||
    SetWidgetConnection();
 | 
					    SetWidgetConnection();
 | 
				
			||||||
    SetupQueryList();
 | 
					    SetupQueryList();
 | 
				
			||||||
@@ -32,16 +30,7 @@ CentralWidget::~CentralWidget()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void CentralWidget::SetControlConnection()
 | 
					void CentralWidget::SetControlConnection()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // 处理轨道重新设置事件
 | 
					 | 
				
			||||||
    QObject::connect(controller, &BusControllerModel::RailsCreated,
 | 
					 | 
				
			||||||
                     this, &CentralWidget::SetRailsScene);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 处理添加请求事件
 | 
					 | 
				
			||||||
    QObject::connect(this, &CentralWidget::AppendQuerySignal,
 | 
					 | 
				
			||||||
                     controller, &BusControllerModel::AddQuerySlot);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QObject::connect(controller, &BusControllerModel::DeleteQuerySignal,
 | 
					 | 
				
			||||||
                     this, &CentralWidget::DeleteQueryItemSlot);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CentralWidget::SetWidgetConnection()
 | 
					void CentralWidget::SetWidgetConnection()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ class CentralWidget : public QWidget
 | 
				
			|||||||
Q_OBJECT
 | 
					Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit CentralWidget(QWidget *parent = nullptr, BusControllerModel *bus_controller = nullptr);
 | 
					    explicit CentralWidget(QWidget *parent = nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ~CentralWidget() override;
 | 
					    ~CentralWidget() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -75,11 +75,6 @@ private:
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    SceneManager *scene_manager;
 | 
					    SceneManager *scene_manager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 公交车控制器
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    BusControllerModel *controller;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 请求列表中的对象
 | 
					     * 请求列表中的对象
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,10 +82,6 @@ private:
 | 
				
			|||||||
     * 中间的显示框架
 | 
					     * 中间的显示框架
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    CentralWidget *central_widget;
 | 
					    CentralWidget *central_widget;
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 控制类
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    BusControllerModel *controller;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QThread *worker_thread;
 | 
					    QThread *worker_thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,14 +11,12 @@
 | 
				
			|||||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
 | 
					MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ui = new Ui::MainWindow;
 | 
					    ui = new Ui::MainWindow;
 | 
				
			||||||
    controller = new BusControllerModel;
 | 
					 | 
				
			||||||
    worker_thread = new QThread;
 | 
					    worker_thread = new QThread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 开始多线程
 | 
					    // 开始多线程
 | 
				
			||||||
    controller->moveToThread(worker_thread);
 | 
					 | 
				
			||||||
    worker_thread->start();
 | 
					    worker_thread->start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    central_widget = new CentralWidget(nullptr, controller);
 | 
					    central_widget = new CentralWidget(nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ui->setupUi(this);
 | 
					    ui->setupUi(this);
 | 
				
			||||||
    this->setCentralWidget(central_widget);
 | 
					    this->setCentralWidget(central_widget);
 | 
				
			||||||
@@ -32,7 +30,6 @@ MainWindow::~MainWindow()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    delete ui;
 | 
					    delete ui;
 | 
				
			||||||
    delete central_widget;
 | 
					    delete central_widget;
 | 
				
			||||||
    delete controller;
 | 
					 | 
				
			||||||
    delete worker_thread;
 | 
					    delete worker_thread;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -57,8 +54,7 @@ void MainWindow::SetMenuBarConnection()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void MainWindow::SetControlConnection()
 | 
					void MainWindow::SetControlConnection()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QObject::connect(this, &MainWindow::OpenConfigFileSignal,
 | 
					
 | 
				
			||||||
                     controller, &BusControllerModel::ReadConfigFileSlot);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWindow::ReadConfigFileButtonClicked()
 | 
					void MainWindow::ReadConfigFileButtonClicked()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user