error_code.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. //Error_code是错误码的底层通用模块,
  2. //功能:用作故障分析和处理。
  3. //用法:所有的功能接口函数return错误管理类,
  4. //然后上层判断分析错误码,并进行故障处理。
  5. #ifndef TEST_ERROR_ERROR_CODE_H
  6. #define TEST_ERROR_ERROR_CODE_H
  7. #include <string>
  8. #include <string.h>
  9. //错误管理类转化为字符串 的前缀,固定长度为58
  10. //这个是由显示格式来确定的,如果要修改格式或者 Error_code长度超过8位,Error_level长度超过2位,折需要重新计算
  11. #define ERROR_NAMAGER_TO_STRING_FRONT_LENGTH 58
  12. //进程加锁的状态,
  13. enum Lock_status
  14. {
  15. UNLOCK = 0,
  16. LOCK = 1,
  17. };
  18. //设备使能状态,
  19. enum Able_status
  20. {
  21. UNABLE = 0,
  22. ENABLE = 1,
  23. };
  24. //数据是否为空
  25. enum Empty_status
  26. {
  27. NON_EMPTY = 0,
  28. EMPTY = 1,
  29. };
  30. //错误码的枚举,用来做故障分析
  31. enum Error_code
  32. {
  33. //成功,没有错误,默认值0
  34. SUCCESS = 0x00000000,
  35. //基本错误码,
  36. ERROR = 0x00000001,//错误
  37. PARTIAL_SUCCESS = 0x00000002,//部分成功
  38. WARNING = 0x00000003,//警告
  39. FAILED = 0x00000004,//失败
  40. NODATA = 0x00000010,//没有数据,传入参数容器内部没有数据时,
  41. POINTER_IS_NULL = 0x00000101,//空指针
  42. PARAMETER_ERROR = 0x00000102,//参数错误,传入参数不符合规范时,
  43. POINTER_MALLOC_FAIL = 0x00000103,//手动分配内存失败
  44. // 错误码的规范,
  45. // 错误码是int型,32位,十六进制。
  46. // 例如0x12345678
  47. // 12表示功能模块,例如:laser雷达模块 框架制定
  48. // 34表示文件名称,例如:laser_livox.cpp 框架制定
  49. // 56表示具体的类,例如:class laser_livox 个人制定
  50. // 78表示类的函数,例如:laser_livox::start(); 个人制定
  51. // 注:错误码的制定从1开始,不要从0开始,
  52. // 0用作错误码的基数,用来位运算,来判断错误码的范围。
  53. // laser模块
  54. LASER_ERROR_BASE = 0x01000000,
  55. // laser.cpp文件
  56. LASER_TASK_PARAMETER_ERROR = 0x01010001, //雷达任务输入参数错误
  57. LASER_TASK_TYPE_ERROR,
  58. LASER_CONNECT_FAILED,
  59. LASER_LIVOX_SKD_INIT_FAILED,
  60. // laser_livox.cpp的错误码
  61. LIVOX_ERROR_BASE = 0x01020000,
  62. LIVOX_START_FAILE = 0x01020101,
  63. //PLC error code ...
  64. PLC_ERROR_BASE = 0x02010000,
  65. PLC_UNKNOWN_ERROR,
  66. PLC_EMPTY_TASK,
  67. PLC_IP_PORT_ERROR,
  68. PLC_SLAVE_ID_ERROR,
  69. PLC_CONNECTION_FAILED,
  70. PLC_READ_FAILED,
  71. PLC_WRITE_FAILED,
  72. PLC_NOT_ENOUGH_DATA_ERROR,
  73. //Locater.cpp error from 0x0301000-0x030100FF
  74. LOCATER_TASK_INIT_CLOUD_EMPTY=0x03010000,
  75. LOCATER_TASK_ERROR,
  76. LOCATER_TASK_INPUT_CLOUD_UNINIT,
  77. LOCATER_INPUT_CLOUD_EMPTY,
  78. LOCATER_YOLO_UNINIT,
  79. LOCATER_POINTSIFT_UNINIT,
  80. LOCATER_3DCNN_UNINIT,
  81. LOCATER_INPUT_YOLO_CLOUD_EMPTY,
  82. LOCATER_Y_OUT_RANGE_BY_PLC,
  83. LOCATER_MEASURE_HEIGHT_CLOUD_UNINIT,
  84. LOCATER_MEASURE_HEIGHT_CLOUD_EMPTY,
  85. LOCATER_HEIGHT_OUT_RANGE,
  86. LOCATER_ANGLE_OUT_RANGE,
  87. LOCATER_INPUT_CLOUD_UNINIT,
  88. //point sift from 0x03010100-0x030101FF
  89. LOCATER_SIFT_INIT_FAILED=0x03010100,
  90. LOCATER_SIFT_INPUT_CLOUD_UNINIT,
  91. LOCATER_SIFT_PREDICT_FAILED,
  92. LOCATER_SIFT_CREATE_INPUT_DATA_FAILED,
  93. LOCATER_SIFT_FILTE_OBS_FAILED,
  94. LOCATER_SIFT_INPUT_BOX_PARAMETER_FAILED,
  95. LOCATER_SIFT_INPUT_CLOUD_EMPTY,
  96. LOCATER_SIFT_PREDICT_NO_CAR_POINT,
  97. //yolo from 0x03010200-0x030102FF
  98. LOCATER_YOLO_DETECT_FAILED=0x03010200,
  99. LOCATER_YOLO_DETECT_NO_TARGET,
  100. LOCATER_YOLO_PARAMETER_INVALID,
  101. LOCATER_YOLO_INPUT_CLOUD_UNINIT,
  102. //3dcnn from 0x03010300-0x030103FF
  103. LOCATER_3DCNN_INIT_FAILED=0x03010300,
  104. LOCATER_3DCNN_INPUT_CLOUD_UNINIT,
  105. LOCATER_3DCNN_PREDICT_FAILED,
  106. LOCATER_3DCNN_VERIFY_RECT_FAILED_3,
  107. LOCATER_3DCNN_VERIFY_RECT_FAILED_4,
  108. LOCATER_3DCNN_KMEANS_FAILED,
  109. LOCATER_3DCNN_IIU_FAILED,
  110. LOCATER_3DCNN_INPUT_CLOUD_EMPTY,
  111. //System_manager error from 0x04010000-0x0401FFFF
  112. SYSTEM_READ_PARAMETER_ERROR=0x04010100,
  113. SYSTEM_PARAMETER_ERROR,
  114. SYSTEM_INPUT_TERMINOR_NO_LASERS,
  115. //terminor_command_executor.cpp from 0x04010200-0x040102FF
  116. TERMINOR_NOT_READY=0x04010200,
  117. TERMINOR_INPUT_LASER_NULL,
  118. TERMINOR_INPUT_PLC_NULL,
  119. TERMINOR_INPUT_LOCATER_NULL,
  120. TERMINOR_CREATE_WORKING_THREAD_FAILED,
  121. TERMINOR_FORCE_QUIT,
  122. TERMINOR_LASER_TIMEOUT,
  123. TERMINOR_POST_PLC_TIMEOUT,
  124. };
  125. //错误等级,用来做故障处理
  126. enum Error_level
  127. {
  128. // 正常,没有错误,默认值0
  129. NORMAL = 0,
  130. // 可忽略的故障,NEGLIGIBLE_ERROR
  131. // 提示作用,不做任何处理,不影响代码的流程,
  132. // 用作一些不重要的事件,一半出错也不会影响到系统功能,
  133. // 例如:文件保存错误,等
  134. NEGLIGIBLE_ERROR = 1,
  135. // 一般故障,MINOR_ERROR
  136. // 用作底层功能函数的错误返回,表示该功能函数执行失败,
  137. // 返回给应用层之后,需要做故障分析和处理,
  138. // 例如:雷达数据传输失败,应用层进行重新扫描,或者重连,或者重置参数等。
  139. MINOR_ERROR = 2,
  140. // 严重故障,MAJOR_ERROR
  141. // 用作应用层的任务事件的结果,表示该功能模块失败。
  142. // 通常是底层函数返回一般故障之后,应用层无法处理并解决故障,此时就要进行故障升级,
  143. // 从一般故障升级为严重故障,然后进行回退流程,回退已经执行的操作,最终回到故障待机状态。
  144. // 需要外部清除故障,并复位至正常待机状态,才能恢复功能的使用。
  145. // 例如:雷达扫描任务失败,且无法自动恢复。
  146. MAJOR_ERROR = 3,
  147. // 致命故障,CRITICAL_ERROR
  148. // 系统出现致命错误。导致系统无法正常运行,
  149. // 此时系统应该紧急停机,执行紧急流程,快速停机。
  150. // 此时不允许再执行任何函数和任务指令,防止系统故障更加严重。
  151. // 也不需要做任何错误处理了,快速执行紧急流程。
  152. // 例如:内存错误,进程挂死,关键设备失控,监控设备报警,等
  153. CRITICAL_ERROR = 4,
  154. };
  155. class Error_manager
  156. {
  157. public://外部接口函数
  158. //构造函数
  159. Error_manager();
  160. //拷贝构造
  161. Error_manager(const Error_manager & error_manager);
  162. //赋值构造
  163. Error_manager(Error_code error_code, Error_level error_level = NORMAL,
  164. char* p_error_description = NULL, int description_length = 0);
  165. //赋值构造
  166. Error_manager(Error_code error_code, Error_level error_level , std::string & error_aggregate_string);
  167. //析构函数
  168. ~Error_manager();
  169. //初始化
  170. void error_manager_init();
  171. //初始化
  172. void error_manager_init(Error_code error_code, Error_level error_level = NORMAL,
  173. char* p_error_description = NULL, int description_length = 0);
  174. //初始化
  175. void error_manager_init(Error_code error_code, Error_level error_level , std::string & error_aggregate_string);
  176. //重置
  177. void error_manager_reset(Error_code error_code, Error_level error_level = NORMAL,
  178. char* p_error_description = NULL, int description_length = 0);
  179. //重置
  180. void error_manager_reset(Error_code error_code, Error_level error_level , std::string & error_aggregate_string);
  181. //重置
  182. void error_manager_reset(const Error_manager & error_manager);
  183. //清除所有内容
  184. void error_manager_clear_all();
  185. //重载=
  186. Error_manager& operator=(const Error_manager & error_manager);
  187. //重载=,支持Error_manager和Error_code的直接转化,会清空错误等级和描述
  188. Error_manager& operator=(Error_code error_code);
  189. //重载==
  190. bool operator==(const Error_manager & error_manager);
  191. //重载==,支持Error_manager和Error_code的直接比较
  192. bool operator==(Error_code error_code);
  193. //重载!=
  194. bool operator!=(const Error_manager & error_manager);
  195. //重载!=,支持Error_manager和Error_code的直接比较
  196. bool operator!=(Error_code error_code);
  197. //获取错误码
  198. Error_code get_error_code();
  199. //获取错误等级
  200. Error_level get_error_level();
  201. //获取错误描述的指针,(浅拷贝)
  202. char* get_error_description();
  203. //复制错误描述,(深拷贝)
  204. //output:p_error_description 错误描述的字符串指针,不可以为NULL,必须要有实际的内存
  205. //output:description_length 错误描述的字符串长度,不可以为0,长度最好足够大,一般256即可。
  206. void copy_error_description(char* p_error_description, int description_length);
  207. //复制错误描述,(深拷贝)
  208. //output:error_description_string 错误描述的string
  209. void copy_error_description(std::string & error_description_string);
  210. //设置错误码
  211. void set_error_code(Error_code error_code);
  212. //比较错误等级并升级,取高等级的结果
  213. void set_error_level_up(Error_level error_level);
  214. //比较错误等级并降级,取低等级的结果
  215. void set_error_level_down(Error_level error_level);
  216. //错误等级,设定到固定值
  217. void set_error_level_location(Error_level error_level);
  218. //设置错误描述
  219. void set_error_description(char* p_error_description, int description_length = 0);
  220. //设置错误描述
  221. void set_error_description(std::string & error_description_string);
  222. //尾部追加错误描述
  223. void add_error_description(char* p_error_description, int description_length = 0);
  224. //尾部追加错误描述
  225. void add_error_description(std::string & error_description_string);
  226. //比较错误是否相同,
  227. // 注:只比较错误码和等级
  228. bool is_equal_error_manager(const Error_manager & error_manager);
  229. //比较并覆盖错误,讲低级错误转为字符串存放于描述中,
  230. //如果错误相同,则保留this的,将输入参数转入描述。
  231. void compare_and_cover_error( Error_manager & error_manager);
  232. //将所有的错误信息,格式化为字符串,用作日志打印。
  233. //output:p_error_description 错误汇总的字符串指针,不可以为NULL,必须要有实际的内存
  234. //output:description_length 错误汇总的字符串长度,不可以为0,长度最好足够大,一般256即可。
  235. void translate_error_to_string(char* p_error_aggregate, int aggregate_length);
  236. //output:error_description_string 错误汇总的string
  237. void translate_error_to_string(std::string & error_aggregate_string);
  238. //错误码转字符串的简易版,可支持cout<<
  239. //return 错误汇总的string
  240. std::string to_string();
  241. protected:
  242. Error_code m_error_code; //错误码
  243. Error_level m_error_level; //错误等级
  244. char* pm_error_description; //错误描述
  245. int m_description_length; //错误描述的字符长度
  246. protected://内部功能函数
  247. public:
  248. //释放错误描述的内存,
  249. void free_description();
  250. //重新分配错误描述的内存,并从外部拷贝新的(深拷贝)
  251. //input:p_error_description 错误描述的字符串指针,可以为NULL,
  252. //input:description_length 错误描述的字符串长度,如果为0,则从p_error_description里面获取有效的长度
  253. void reallocate_memory_and_copy_string(char* p_error_description, int description_length = 0);
  254. //重新分配错误描述的内存,并从外部拷贝新的(深拷贝)
  255. //input:error_aggregate_string 错误描述的string
  256. void reallocate_memory_and_copy_string(std::string & error_aggregate_string);
  257. };
  258. #endif //TEST_ERROR_ERROR_CODE_H