process_task.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // Created by zx on 2020/8/26.
  3. //
  4. #ifndef NNXX_TESTS_PROCESS_TASK_H
  5. #define NNXX_TESTS_PROCESS_TASK_H
  6. #include <error_code.h>
  7. #include <iostream>
  8. #include "thread_condition.h"
  9. #include "TaskQueue/BaseTask.h"
  10. #include "process_message.pb.h"
  11. #include "log_process.pb.h"
  12. #include <glog/logging.h>
  13. /*
  14. * 停取车流程基类, 包括任务创建, 状态消息发布线程启动, 任务取消等公共功能
  15. * 该类继承自tq::BaseTask类, 可放入 tq 线程池, 执行虚函数 Main
  16. * 派生出 停车任务类(StoreProcessTask)与取车任务类(PickupProcessTask)
  17. */
  18. class Process_task : public tq::BaseTask{
  19. public:
  20. Process_task(unsigned int command_id,message::Car_info car_info);
  21. virtual Error_manager init_task(const ::google::protobuf::Message& parameter);
  22. virtual ~Process_task();
  23. /*
  24. * 获取当前任务相关属性
  25. */
  26. unsigned int terminal_id(){return m_terminor_id;}
  27. std::string license(){ return m_car_info.license();}
  28. message::Step_type current_step_type(){return m_current_step_type;}
  29. message::Step_statu current_step_statu(){return m_current_step_statu;}
  30. // 获取任务类型
  31. virtual message::Process_type get_process_type() const=0;
  32. /*
  33. * 取消任务
  34. */
  35. virtual void Cancel();
  36. /*
  37. * 任务是否取消
  38. */
  39. virtual bool is_canceled();
  40. /*
  41. * 控制流程到下一步
  42. */
  43. virtual Error_manager next_step(){
  44. LOG(ERROR)<<"process base virtual called";
  45. return ERROR;};
  46. virtual void updata_step_statu(message::Step_statu statu)=0;
  47. /*
  48. * 记录流程信息
  49. */
  50. virtual void to_proto(std::string proto_file);
  51. protected:
  52. virtual void Main();
  53. /*
  54. * 发布进度消息
  55. */
  56. static void publish_thread_func(Process_task* ptask);
  57. virtual void publish_step_status()=0;
  58. /*
  59. * 添加日志相关
  60. */
  61. class Log_container
  62. {
  63. public:
  64. Log_container(int severity,Process_task* process,bool condition=true){
  65. m_str="";
  66. m_process=process;
  67. m_severity=severity;
  68. m_condition=condition;
  69. }
  70. virtual ~Log_container()
  71. {
  72. if(m_process&& m_str.length()>0)
  73. {
  74. m_process->add_log(m_severity,m_str);
  75. }
  76. }
  77. Log_container& operator<<(const std::string& data) {
  78. m_str+=data;
  79. return *this;
  80. }
  81. Log_container& operator<<(int data) {
  82. char buf[64]={0};
  83. sprintf(buf,"%d",data);
  84. m_str+=buf;
  85. return *this;
  86. }
  87. Log_container& operator<<(const message::Node_log& data) {
  88. if(m_process)
  89. m_process->add_log(m_severity,data);
  90. return *this;
  91. }
  92. Log_container& operator<<(const message::Manual_operation_log& data) {
  93. if(m_process)
  94. m_process->add_log(m_severity,data);
  95. return *this;
  96. }
  97. protected:
  98. Log_container(){}
  99. bool m_condition;
  100. Process_task* m_process;
  101. int m_severity;
  102. std::string m_str;
  103. };
  104. class Log_container_INFO :public Log_container
  105. {
  106. public:
  107. Log_container_INFO(Process_task* process,bool condition=true){
  108. m_process=process;
  109. m_severity=message::Log_data_Severity_INFO;
  110. m_condition=condition;
  111. }
  112. virtual ~Log_container_INFO(){}
  113. };
  114. class Log_container_WARNING :public Log_container
  115. {
  116. public:
  117. Log_container_WARNING(Process_task* process,bool condition=true){
  118. m_process=process;
  119. m_severity=message::Log_data_Severity_WARNING;
  120. m_condition=condition;
  121. }
  122. virtual ~Log_container_WARNING(){}
  123. };
  124. class Log_container_ERROR :public Log_container
  125. {
  126. public:
  127. Log_container_ERROR(Process_task* process,bool condition=true){
  128. m_process=process;
  129. m_severity=message::Log_data_Severity_ERROR;
  130. m_condition=condition;
  131. }
  132. virtual ~Log_container_ERROR(){}
  133. };
  134. //普通日志
  135. void add_log(int severity,std::string log);
  136. //以下是节点日志
  137. void add_log(int severity,const message::Node_log& data);
  138. void add_log(int severity,const message::Manual_operation_log& data);
  139. #define ALOG(severity) Log_container_##severity(this)
  140. #define ALOG_IF(severity,condition) Log_container_##severity(this,condition)
  141. protected:
  142. unsigned int m_terminor_id;
  143. message::Car_info m_car_info; //当前流程的车辆信息
  144. message::Step_type m_current_step_type; //当前流程正在哪一步
  145. message::Step_statu m_current_step_statu; //当前步骤所处的状态
  146. std::thread* m_publish_statu_thread; //广播状态线程
  147. Thread_condition m_publish_exit_condition; //发送的条件变量
  148. Thread_condition m_cancel_condition; //取消任务标志位
  149. std::mutex m_process_msg_lock; //状态消息锁
  150. message::Process_log m_process_log; //流程日志数据
  151. int m_step_index; //记录当前步骤的序号
  152. };
  153. #endif //NNXX_TESTS_PROCESS_TASK_H