process_task.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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
  32. {
  33. LOG(ERROR) << "xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxprocess base virtual called:get_process_type";
  34. exit(0);
  35. };
  36. /*
  37. * 取消任务
  38. */
  39. virtual void Cancel();
  40. /*
  41. * 任务是否取消
  42. */
  43. virtual bool is_canceled();
  44. /*
  45. * 控制流程到下一步
  46. */
  47. virtual Error_manager next_step(){
  48. LOG(ERROR)<<"process base virtual called";
  49. return ERROR;};
  50. virtual void updata_step_statu(message::Step_statu statu)
  51. {
  52. LOG(ERROR)<<"xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxprocess base virtual called:updata_step_statu";
  53. exit(0);
  54. };
  55. /*
  56. * 记录流程信息
  57. */
  58. virtual void to_proto(std::string proto_file);
  59. protected:
  60. virtual void Main();
  61. /*
  62. * 发布进度消息
  63. */
  64. static void publish_thread_func(Process_task* ptask);
  65. virtual void publish_step_status()
  66. {
  67. LOG(ERROR)<<" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxprocess base virtual called:publish_step_status";
  68. exit(0);
  69. };
  70. /*
  71. * 添加日志相关
  72. */
  73. class Log_container
  74. {
  75. public:
  76. Log_container(int severity,Process_task* process,bool condition=true){
  77. m_str="";
  78. m_process=process;
  79. m_severity=severity;
  80. m_condition=condition;
  81. }
  82. virtual ~Log_container()
  83. {
  84. if(m_process&& m_str.length()>0)
  85. {
  86. m_process->add_log(m_severity,m_str);
  87. }
  88. }
  89. Log_container& operator<<(const std::string& data) {
  90. m_str+=data;
  91. return *this;
  92. }
  93. Log_container& operator<<(int data) {
  94. char buf[64]={0};
  95. sprintf(buf,"%d",data);
  96. m_str+=buf;
  97. return *this;
  98. }
  99. Log_container& operator<<(const message::Node_log& data) {
  100. if(m_process)
  101. m_process->add_log(m_severity,data);
  102. return *this;
  103. }
  104. Log_container& operator<<(const message::Manual_operation_log& data) {
  105. if(m_process)
  106. m_process->add_log(m_severity,data);
  107. return *this;
  108. }
  109. protected:
  110. Log_container(){}
  111. bool m_condition;
  112. Process_task* m_process;
  113. int m_severity;
  114. std::string m_str;
  115. };
  116. class Log_container_INFO :public Log_container
  117. {
  118. public:
  119. Log_container_INFO(Process_task* process,bool condition=true){
  120. m_process=process;
  121. m_severity=message::Log_data_Severity_INFO;
  122. m_condition=condition;
  123. }
  124. virtual ~Log_container_INFO(){}
  125. };
  126. class Log_container_WARNING :public Log_container
  127. {
  128. public:
  129. Log_container_WARNING(Process_task* process,bool condition=true){
  130. m_process=process;
  131. m_severity=message::Log_data_Severity_WARNING;
  132. m_condition=condition;
  133. }
  134. virtual ~Log_container_WARNING(){}
  135. };
  136. class Log_container_ERROR :public Log_container
  137. {
  138. public:
  139. Log_container_ERROR(Process_task* process,bool condition=true){
  140. m_process=process;
  141. m_severity=message::Log_data_Severity_ERROR;
  142. m_condition=condition;
  143. }
  144. virtual ~Log_container_ERROR(){}
  145. };
  146. //普通日志
  147. void add_log(int severity,std::string log);
  148. //以下是节点日志
  149. void add_log(int severity,const message::Node_log& data);
  150. void add_log(int severity,const message::Manual_operation_log& data);
  151. #define ALOG(severity) Log_container_##severity(this)
  152. #define ALOG_IF(severity,condition) Log_container_##severity(this,condition)
  153. protected:
  154. unsigned int m_terminor_id;
  155. message::Car_info m_car_info; //当前流程的车辆信息
  156. message::Step_type m_current_step_type; //当前流程正在哪一步
  157. message::Step_statu m_current_step_statu; //当前步骤所处的状态
  158. std::thread* m_publish_statu_thread; //广播状态线程
  159. Thread_condition m_publish_exit_condition; //发送的条件变量
  160. Thread_condition m_cancel_condition; //取消任务标志位
  161. std::mutex m_process_msg_lock; //状态消息锁
  162. message::Process_log m_process_log; //流程日志数据
  163. int m_step_index; //记录当前步骤的序号
  164. };
  165. #endif //NNXX_TESTS_PROCESS_TASK_H