|
@@ -128,14 +128,61 @@ Error_manager Dispatch_device_base::check_task_level(Dispatch_task_level dispatc
|
|
|
{
|
|
|
case DISPATCH_TASK_ONE_LEVEL:
|
|
|
{
|
|
|
- if ( ( m_dispatch_device_status == DISPATCH_DEVICE_READY ) && mp_device_one_level_task.get() == NULL)
|
|
|
+ if ( mp_device_one_level_task.get() == NULL )
|
|
|
{
|
|
|
- return Error_code::SUCCESS;
|
|
|
+ //一级任务直接插入
|
|
|
+ if ( m_dispatch_device_status == DISPATCH_DEVICE_READY ||
|
|
|
+ m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_OVER ||
|
|
|
+ m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_WORK ||
|
|
|
+ m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_OVER ||
|
|
|
+ m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_WORK )
|
|
|
+ {
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_DEVICE_TASK_LEVEL_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " Dispatch_device_base::check_task_level error ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_DEVICE_TASK_REPEAT, Error_level::MINOR_ERROR,
|
|
|
+ " Dispatch_device_base::check_task_level error ");
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case DISPATCH_TASK_TWO_LEVEL:
|
|
|
{
|
|
|
+ if ( mp_device_two_level_task.get() == NULL )
|
|
|
+ {
|
|
|
+ //二级任务如果打断了一级任务, 那么要通知一级任务暂停, 后续一级任务会重新执行
|
|
|
+ if ( m_dispatch_device_status == DISPATCH_DEVICE_READY )
|
|
|
+ {
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else if ( ( m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_WORK ||
|
|
|
+ m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER ) && mp_device_one_level_task.get() == NULL)
|
|
|
+ {
|
|
|
+ mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_STOP);
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_DEVICE_TASK_LEVEL_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " Dispatch_device_base::check_task_level error ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_DEVICE_TASK_REPEAT, Error_level::MINOR_ERROR,
|
|
|
+ " Dispatch_device_base::check_task_level error ");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
if ( ( m_dispatch_device_status == DISPATCH_DEVICE_READY ||
|
|
|
m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_WORK ||
|
|
|
m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER ) && mp_device_two_level_task.get() == NULL)
|
|
@@ -240,7 +287,6 @@ bool Dispatch_device_base::is_ready()
|
|
|
Error_manager Dispatch_device_base::end_task(std::shared_ptr<Task_Base> p_task)
|
|
|
{
|
|
|
LOG(INFO) << " ---Dispatch_device_base::end_task ---"<< this;
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
//注:这里只修改任务单的状态, 搬运器的状态不管
|
|
|
//在结束任务单时,将雷达任务状态改为 TASK_OVER 已结束
|
|
|
//判断任务单的错误等级,
|
|
@@ -260,89 +306,24 @@ Error_manager Dispatch_device_base::end_task(std::shared_ptr<Task_Base> p_task)
|
|
|
//取消任务单,由发送方提前取消任务单
|
|
|
Error_manager Dispatch_device_base::cancel_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level)
|
|
|
{
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
+ cancel_command();
|
|
|
//找到对应的任务单
|
|
|
switch ( dispatch_task_level )
|
|
|
{
|
|
|
case DISPATCH_TASK_ONE_LEVEL:
|
|
|
{
|
|
|
- if ( m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER )
|
|
|
- {
|
|
|
- //如果正在执行一级任务, 那么取消当前指令, 然后降级
|
|
|
- m_execute_condition.notify_all(false);
|
|
|
- //确保内部线程已经停下
|
|
|
- while (m_execute_condition.is_working())
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- cancel_command();
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- mp_device_one_level_task.reset();
|
|
|
- m_dispatch_device_status = DISPATCH_DEVICE_READY;
|
|
|
- }
|
|
|
-
|
|
|
- m_execute_condition.notify_all(true);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- //否则直接销毁任务单
|
|
|
- mp_device_one_level_task.reset();
|
|
|
- }
|
|
|
+ mp_device_one_level_task.reset();
|
|
|
break;
|
|
|
}
|
|
|
case DISPATCH_TASK_TWO_LEVEL:
|
|
|
{
|
|
|
- if ( m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_OVER )
|
|
|
- {
|
|
|
- //如果正在执行一级任务, 那么取消当前指令, 然后降级
|
|
|
- m_execute_condition.notify_all(false);
|
|
|
- //确保内部线程已经停下
|
|
|
- while (m_execute_condition.is_working())
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- cancel_command();
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- mp_device_two_level_task.reset();
|
|
|
- m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
|
|
|
- }
|
|
|
- m_execute_condition.notify_all(true);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- //否则直接销毁任务单
|
|
|
- mp_device_one_level_task.reset();
|
|
|
- }
|
|
|
+ mp_device_two_level_task.reset();
|
|
|
break;
|
|
|
}
|
|
|
case DISPATCH_TASK_THREE_LEVEL:
|
|
|
{
|
|
|
- if ( m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_OVER )
|
|
|
- {
|
|
|
- //如果正在执行一级任务, 那么取消当前指令, 然后降级
|
|
|
- m_execute_condition.notify_all(false);
|
|
|
- //确保内部线程已经停下
|
|
|
- while (m_execute_condition.is_working())
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- cancel_command();
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- mp_device_three_level_task.reset();
|
|
|
- m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
|
|
|
- }
|
|
|
- m_execute_condition.notify_all(true);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
- //否则直接销毁任务单
|
|
|
- mp_device_one_level_task.reset();
|
|
|
- }
|
|
|
+ mp_device_three_level_task.reset();
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
@@ -379,7 +360,6 @@ int Dispatch_device_base::get_device_id()
|
|
|
void Dispatch_device_base::execute_thread_fun()
|
|
|
{
|
|
|
LOG(INFO) << " Dispatch_device_base::execute_thread_fun() start " << this;
|
|
|
-
|
|
|
Error_manager t_error;
|
|
|
|
|
|
while (m_execute_condition.is_alive())
|
|
@@ -392,7 +372,7 @@ void Dispatch_device_base::execute_thread_fun()
|
|
|
// std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
|
|
|
|
std::this_thread::yield();
|
|
|
-
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
// std::cout << " huli test :::: " << " m_device_id = " << m_device_id << std::endl;
|
|
|
// std::cout << " huli test :::: " << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa m_dispatch_device_status = " << m_dispatch_device_status << std::endl;
|
|
|
|
|
@@ -535,35 +515,43 @@ void Dispatch_device_base::execute_thread_fun()
|
|
|
{
|
|
|
if ( mp_device_one_level_task.get() != NULL )
|
|
|
{
|
|
|
- mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_WORKING);
|
|
|
- //执行一级任务,
|
|
|
- write_task_to_memory(mp_device_one_level_task);
|
|
|
- //更新通信
|
|
|
- update_device_communication();
|
|
|
- //从内存中读数据到任务单
|
|
|
- t_error = check_and_read_memory_to_task(mp_device_one_level_task);
|
|
|
-
|
|
|
-// std::cout << " huli test :::: " << " 1111111111111111111111111111111111111111 = " << 111 << std::endl;
|
|
|
-// std::cout << " huli test :::: " << " 12312312313131 = " << 123 << std::endl;
|
|
|
-// std::cout << " huli test :::: " << " t_error = " << t_error.to_string() << std::endl;
|
|
|
-// std::cout << " huli test :::: " << " 2222222222222222222222222222222222222222 = " << 222 << std::endl;
|
|
|
-
|
|
|
-
|
|
|
- if ( t_error == NODATA )
|
|
|
+ if ( mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_WITHDRAW )
|
|
|
{
|
|
|
- //设备正常运行
|
|
|
- //延时1ms, snap7的通信效率偏慢, 不需要高频率检查
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
+ //这里会通知任务已经释放, 然后销毁任务单, 并降级
|
|
|
+ mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_FREE);
|
|
|
+ mp_device_one_level_task.reset();
|
|
|
+ m_dispatch_device_status = DISPATCH_DEVICE_READY;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ else if (mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED ||
|
|
|
+ mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_SIGNED ||
|
|
|
+ mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_WORKING )
|
|
|
{
|
|
|
- if ( t_error != SUCCESS )
|
|
|
+ mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_WORKING);
|
|
|
+ //执行一级任务,
|
|
|
+ write_task_to_memory(mp_device_one_level_task);
|
|
|
+ //更新通信
|
|
|
+ update_device_communication();
|
|
|
+ //从内存中读数据到任务单
|
|
|
+ t_error = check_and_read_memory_to_task(mp_device_one_level_task);
|
|
|
+
|
|
|
+ if ( t_error == NODATA )
|
|
|
+ {
|
|
|
+ //设备正常运行
|
|
|
+ //延时1ms, snap7的通信效率偏慢, 不需要高频率检查
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- mp_device_one_level_task->set_task_error_manager(t_error);
|
|
|
+ if ( t_error != SUCCESS )
|
|
|
+ {
|
|
|
+ mp_device_one_level_task->set_task_error_manager(t_error);
|
|
|
+ }
|
|
|
+ end_task(mp_device_one_level_task);
|
|
|
+ m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_OVER;
|
|
|
}
|
|
|
- end_task(mp_device_one_level_task);
|
|
|
- m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_OVER;
|
|
|
}
|
|
|
+ //else等待发送方给新的指令. TASK_STOP 之后 不执行.
|
|
|
}
|
|
|
else
|
|
|
{
|