process_task.h 6.1 KB

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