在我们编程写代码过程中,不免遇到Switch,case语句,针对短小精悍的处理,毫无问题,直接用就是了,但是遇到每个case都需要处理大量操作,那所在函数将会被塞的又臭又长,极其不利于阅读与维护,就像下面的例子:
void Inspection_Task_Manager::inspection_task_handler(void)
{
switch (m_curr_task_node->state)
{
case Inspection_Task_Node_t::Init:
{
m_mach->m_led.led_set_state(LED_STATE_INSPECT, 1);
if (m_curr_task_node == m_head)
{
//m_mach->push_ptz_status();
m_mach->m_ptz.focus_auto(true);
std::this_thread::sleep_for(std::chrono::milliseconds(30));
set_light(default_light_mode);
}
LOG_INFO("Inspection Task [task_id:%d,point_id:%d] \r\n", m_task_id,
m_curr_task_node->point_id);
if ((fabs(m_curr_task_node->position_x - m_mach->m_robot_position_x) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_y - m_mach->m_robot_position_y) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_theta - m_mach->m_robot_position_theta) <
POSITION_MAX_DIFF))
{
m_curr_task_node->state = Inspection_Task_Node_t::PtzAction;
}
else
{
m_curr_task_node->state = Inspection_Task_Node_t::PtzReset;
}
m_curr_task_node->collect_seq = 1;
m_curr_task_node->_time = std::chrono::steady_clock::now();
m_curr_task_node->is_continue_inspect = false;
}
break;
case Inspection_Task_Node_t::PtzReset:
LOG_INFO("Inspection Task : ptz reset \r\n");
m_mach->m_ptz.setPosition(m_default_hori_angle, m_default_vert_angle, m_default_zoom,
m_default_focal);
m_curr_task_node->state = Inspection_Task_Node_t::WaitPtzReset;
LOG_INFO("Inspection Task : wait ptz reset finish \r\n");
m_ptz_action_time = std::chrono::steady_clock::now();
break;
case Inspection_Task_Node_t::WaitPtzReset:
{
float horiz_angle = m_mach->m_ptz.getHorizAngle();
float vert_angle = m_mach->m_ptz.getVertAngle();
int zoom = m_mach->m_ptz.getCameraZoom();
if (PtzDeamon::angle_diff(horiz_angle, m_default_hori_angle) < 0.5f &&
PtzDeamon::angle_diff(vert_angle, m_default_vert_angle) < 0.5f &&
abs(zoom - m_default_zoom) < 10)
{
m_curr_task_node->state = Inspection_Task_Node_t::Move;
LOG_INFO("Inspection Task : ptz reset finish , ready to move \r\n");
}
{
std::chrono::steady_clock::time_point curr_time = std::chrono::steady_clock::now();
auto diff =
std::chrono::duration_cast<std::chrono::seconds>(curr_time - m_ptz_action_time)
.count();
if (diff > 30) //���������������Ȼû����������·���ָ��
{
m_curr_task_node->state = Inspection_Task_Node_t::PtzReset;
LOG_INFO("Inspection Task : ptz reset action timeout , redo \r\n");
}
}
}
break;
case Inspection_Task_Node_t::Move:
{
if ((fabs(m_curr_task_node->position_x - m_mach->m_robot_position_x) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_y - m_mach->m_robot_position_y) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_theta - m_mach->m_robot_position_theta) <
POSITION_MAX_DIFF))
{
m_curr_task_node->state = Inspection_Task_Node_t::WaitArrive;
}
else
{
LOG_INFO("Inspection Task : move to position (%.3f,%.3f,%.3f), speed : %f \r\n",
m_curr_task_node->position_x, m_curr_task_node->position_y,
m_curr_task_node->position_theta, m_robot_speed);
m_mach->slam_move_to_position(
m_curr_task_node->point_id, m_curr_task_node->floor_location,
m_curr_task_node->position_x, m_curr_task_node->position_y,
m_curr_task_node->position_theta);
//std::this_thread::sleep_for(std::chrono::milliseconds(200));
m_curr_task_node->state = Inspection_Task_Node_t::WaitMove;
log_timer = 0;
LOG_INFO("Inspection Task : wait robot moving ,lifter status:%d\r\n", m_lifter_status);
}
}
break;
case Inspection_Task_Node_t::WaitMove:
if (m_mach->m_slam_staus == NAVIGATE_TO_POSITION)
{
LOG_INFO("Inspection Task : robot moving,slam switch status to NAVIGATE_TO_POSITION, "
"wait arrive.\r\n");
m_curr_task_node->state = Inspection_Task_Node_t::WaitArrive;
}
if ((fabs(m_curr_task_node->position_x - m_mach->m_robot_position_x) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_y - m_mach->m_robot_position_y) < POSITION_MAX_DIFF) &&
(fabs(m_curr_task_node->position_theta - m_mach->m_robot_position_theta) <
POSITION_MAX_DIFF))
{
m_curr_task_node->state = Inspection_Task_Node_t::WaitArrive;
}
if (log_timer > 50)
{
log_timer = 0;
LOG_INFO("Inspection Task : wait robot moving time out,now wait robot arrive.\r\n");
m_curr_task_node->state = Inspection_Task_Node_t::WaitArrive;
}
break;
case Inspection_Task_Node_t::WaitArrive:
{
if (m_mach->m_slam_staus == ARRIVED_POSITION)
{
#if 0
if((fabs(m_curr_task_node->position_x - m_mach->m_robot_position_x) > POSITION_MAX_DIFF) ||
(fabs(m_curr_task_node->position_y - m_mach->m_robot_position_y) > POSITION_MAX_DIFF) ||
(fabs(m_curr_task_node->position_theta - m_mach->m_robot_position_theta) > POSITION_MAX_DIFF)
)
{
LOG_INFO("Inspection Task : robot has not arrived ,move again! diff: x_diff = %.3f, y_diff = %.3f, theta_diff = %.3f \r\n",
m_mach->m_robot_position_x - m_curr_task_node->position_x,
m_mach->m_robot_position_y - m_curr_task_node->position_y,
m_mach->m_robot_position_theta - m_curr_task_node->position_theta);
m_curr_task_node->state = Inspection_Task_Node_t::WaitMove;
m_mach->slam_move_to_position(m_curr_task_node->point_id,m_curr_task_node->position_x,m_curr_task_node->position_y,m_curr_task_node->position_theta);
}
else
#endif
{
LOG_INFO("Inspection Task : robot arrived,current position : x = %.3f,y = "
"%.3f,theta = "
"%.3f point set position: x = %.3f,y = %.3f,theta = %.3f\r\n",
m_mach->m_robot_position_x, m_mach->m_robot_position_y,
m_mach->m_robot_position_theta, m_curr_task_node->position_x,
m_curr_task_node->position_y, m_curr_task_node->position_theta);
LOG_INFO("Inspection Task : robot position diff: x_diff = %.3f, y_diff = %.3f, "
"theta_diff = %.3f \r\n",
m_mach->m_robot_position_x - m_curr_task_node->position_x,
m_mach->m_robot_position_y - m_curr_task_node->position_y,
m_mach->m_robot_position_theta - m_curr_task_node->position_theta);
m_curr_task_node->state = Inspection_Task_Node_t::Arrived;
}
}
}
brea