error_code.hpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. //Error_code是错误码的底层通用模块,
  2. //功能:用作故障分析和处理。
  3. //用法:所有的功能接口函数return错误管理类,
  4. //然后上层判断分析错误码,并进行故障处理。
  5. #pragma once
  6. #include <string>
  7. #include <string.h>
  8. #include<iostream>
  9. #include <stdio.h> /* vsnprintf与vsprintf */
  10. #include <stdarg.h> /* va... */
  11. #define MAIN_TEST 1
  12. //#define PROCESS_TEST 1
  13. //#define TIME_TEST 1
  14. #define PLC_S7_COMMUNICATION 1 //是否开启plc的通信
  15. #define WAIT_PLC_RESPONSE 1 //是否等待plc的答复
  16. #define MEASURE_TO_PLC_CORRECTION 1 //修正感测数据
  17. //错误管理类转化为字符串 的前缀,固定长度为58
  18. //这个是由显示格式来确定的,如果要修改格式或者 Error_code长度超过8位,Error_level长度超过2位,折需要重新计算
  19. #define ERROR_NAMAGER_TO_STRING_FRONT_LENGTH 58
  20. #define DESCRIPTION_BUF_SIZE 1024
  21. //进程加锁的状态,
  22. enum Lock_status {
  23. UNLOCK = 0,
  24. LOCK = 1,
  25. };
  26. //设备使能状态,
  27. enum Able_status {
  28. UNABLE = 0,
  29. ENABLE = 1,
  30. };
  31. //数据是否为空
  32. enum Empty_status {
  33. NON_EMPTY = 0,
  34. EMPTY = 1,
  35. };
  36. //错误码的枚举,用来做故障分析
  37. enum Error_code {
  38. //成功,没有错误,默认值0
  39. SUCCESS = 0x00000000,
  40. //基本错误码,
  41. ERROR = 0x00000001,//错误
  42. PARTIAL_SUCCESS = 0x00000002,//部分成功
  43. WARNING = 0x00000003,//警告
  44. FAILED = 0x00000004,//失败
  45. NODATA = 0x00000010,//没有数据,传入参数容器内部没有数据时,
  46. INVALID_MESSAGE = 0x00000011, //无效的消息,
  47. PARSE_FAILED = 0x00000012,//解析失败
  48. PAUSE = 0x00000013, //急停
  49. TASK_CANCEL = 0x00000014, //任务取消
  50. DISCONNECT = 0x00000020, //通讯中断/断开连接
  51. UNKNOW_STATU = 0x00000021, //未知状态
  52. TASK_TIMEOVER = 0x00000020,//任务超时
  53. RESPONSE_TIMEOUT = 0x00000021,//答复超时
  54. POINTER_IS_NULL = 0x00000101,//空指针
  55. PARAMETER_ERROR = 0x00000102,//参数错误,传入参数不符合规范时,
  56. POINTER_MALLOC_FAIL = 0x00000103,//手动分配内存失败
  57. CLASS_BASE_FUNCTION_CANNOT_USE = 0x00000201,//基类函数不允许使用,必须使用子类的
  58. CONTAINER_IS_TERMINATE = 0x00000301,//容器被终止
  59. // 错误码的规范,
  60. // 错误码是int型,32位,十六进制。
  61. // 例如0x12345678
  62. // 12表示功能模块,例如:laser雷达模块 框架制定
  63. // 34表示文件名称,例如:laser_livox.cpp 框架制定
  64. // 56表示具体的类,例如:class laser_livox 个人制定
  65. // 78表示类的函数,例如:laser_livox::start(); 个人制定
  66. // 注:错误码的制定从1开始,不要从0开始,
  67. // 0用作错误码的基数,用来位运算,来判断错误码的范围。
  68. // laser扫描模块
  69. LASER_ERROR_BASE = 0x01000000,
  70. // laser_base基类
  71. LASER_BASE_ERROR_BASE = 0x01010000,
  72. LASER_TASK_PARAMETER_ERROR = 0x01010001, //雷达基类模块, 任务输入参数错误
  73. LASER_CONNECT_FAILED, //雷达基类模块, 连接失败
  74. LASER_START_FAILED, //雷达基类模块, 开始扫描失败
  75. LASER_CHECK_FAILED, //雷达基类模块, 检查失败
  76. LASER_STATUS_BUSY, //雷达基类模块, 状态正忙
  77. LASER_STATUS_ERROR, //雷达基类模块, 状态错误
  78. LASER_TASK_OVER_TIME, //雷达基类模块, 任务超时
  79. LASER_QUEUE_ERROR, //雷达基类模块, 数据缓存错误
  80. // livox 大疆雷达
  81. LIVOX_ERROR_BASE = 0x01020000,
  82. LIVOX_START_FAILE, //livox模块,开始扫描失败
  83. LIVOX_TASK_TYPE_ERROR, //livox模块,任务类型错误
  84. lIVOX_CANNOT_PUSH_DATA, //livox模块,不能添加扫描的数据
  85. lIVOX_CHECK_FAILED, //livox模块,检查失败
  86. lIVOX_STATUS_BUSY, //livox模块,状态正忙
  87. lIVOX_STATUS_ERROR, //livox模块,状态错误
  88. //laser_manager 雷达管理模块
  89. LASER_MANAGER_ERROR_BASE = 0x01030000,
  90. LASER_MANAGER_READ_PROTOBUF_ERROR, //雷达管理模块,读取参数错误
  91. LASER_MANAGER_STATUS_BUSY, //雷达管理模块,状态正忙
  92. LASER_MANAGER_STATUS_ERROR, //雷达管理模块,状态错误
  93. LASER_MANAGER_TASK_TYPE_ERROR, //雷达管理模块,任务类型错误
  94. LASER_MANAGER_IS_NOT_READY, //雷达管理模块,不在准备状态
  95. LASER_MANAGER_TASK_OVER_TIME, //雷达管理模块,任务超时
  96. LASER_MANAGER_LASER_INDEX_ERRPR, //雷达管理模块,雷达索引错误,编号错误。
  97. LASER_MANAGER_LASER_INDEX_REPEAT, //雷达管理模块,需要扫描的雷达索引重复,可忽略的错误,提示作用
  98. //livox_driver 雷达livox驱动模块
  99. LIVOX_DRIVER_ERROR_BASE = 0x01040000,
  100. LIVOX_DRIVER_SN_REPEAT, //livox驱动模块, 雷达广播码重复
  101. LIVOX_DRIVER_SN_ERROR, //livox驱动模块, 雷达广播码错误
  102. LIVOX_SKD_INIT_FAILED, //livox驱动模块, livox_sdk初始化失败
  103. LIVOX_DRIVER_NOT_READY, //livox驱动模块, livox没有准备好.
  104. //PLC error code ...
  105. PLC_ERROR_BASE = 0x02010000,
  106. PLC_UNKNOWN_ERROR, //plc未知错误
  107. PLC_EMPTY_TASK, //plc任务为空
  108. PLC_IP_PORT_ERROR, //plc的ip端口错误
  109. PLC_SLAVE_ID_ERROR, //plc的身份id错误
  110. PLC_CONNECTION_FAILED, //PLC连接失败
  111. PLC_READ_FAILED, //plc读取失败
  112. PLC_WRITE_FAILED, //plc写入失败
  113. PLC_NOT_ENOUGH_DATA_ERROR, //PLC没有足够的数据错误
  114. //locate 定位模块,
  115. LOCATER_ERROR_BASE = 0x03000000,
  116. //LASER_MANAGER 定位管理模块
  117. LOCATER_MANAGER_ERROR_BASE = 0x03010000,
  118. LOCATER_MANAGER_READ_PROTOBUF_ERROR, //定位管理模块,读取参数错误
  119. LOCATER_MANAGER_STATUS_BUSY, //定位管理模块,状态正忙
  120. LOCATER_MANAGER_STATUS_ERROR, //定位管理模块,状态错误
  121. LOCATER_MANAGER_TASK_TYPE_ERROR, //定位管理模块,任务类型错误
  122. LOCATER_MANAGER_IS_NOT_READY, //定位管理模块,不在准备状态
  123. LOCATER_MANAGER_CLOUD_MAP_ERROR, //定位管理模块,任务输入点云map的error
  124. LOCATER_MANAGER_TASK_OVER_TIME, //定位管理模块,任务超时
  125. //Locater 算法模块
  126. LOCATER_ALGORITHM_ERROR_BASE = 0x03020000,
  127. LOCATER_TASK_INIT_CLOUD_EMPTY, //定位任务初始化点云为空
  128. LOCATER_TASK_ERROR, //定位任务错误
  129. LOCATER_TASK_INPUT_CLOUD_UNINIT, //定位任务输入点云为空
  130. LOCATER_INPUT_CLOUD_EMPTY, //定位输入点云为空
  131. LOCATER_YOLO_UNINIT, //定位yolo未初始化
  132. LOCATER_POINTSIFT_UNINIT, //定位POINTSIFT未初始化
  133. LOCATER_3DCNN_UNINIT, //定位3DCNN未初始化
  134. LOCATER_INPUT_YOLO_CLOUD_EMPTY, //定位输入yolo点云为空
  135. LOCATER_Y_OUT_RANGE_BY_PLC, //定位超出plc的限制范围
  136. LOCATER_MEASURE_HEIGHT_CLOUD_UNINIT, //定位测量高点云未初始化
  137. LOCATER_MEASURE_HEIGHT_CLOUD_EMPTY, //定位测量高点云为空
  138. LOCATER_INPUT_CLOUD_UNINIT, //定位输入点云未初始化
  139. //point sift from 0x03010100-0x030101FF
  140. LOCATER_SIFT_ERROR_BASE = 0x03020100,
  141. LOCATER_SIFT_INIT_FAILED, //定位过滤模块,初始化失败
  142. LOCATER_SIFT_INPUT_CLOUD_UNINIT, //定位过滤模块,输入点云未初始化
  143. LOCATER_SIFT_INPUT_CLOUD_EMPTY, //定位过滤模块,输入点云为空
  144. LOCATER_SIFT_GRID_ERROR, //定位过滤模块,筛选网格错误
  145. LOCATER_SIFT_SELECT_ERROR, //定位过滤模块,筛选选择错误
  146. LOCATER_SIFT_CLOUD_VERY_LITTLE, //定位过滤模块,筛选点云很少
  147. LOCATER_SIFT_CREATE_INPUT_DATA_FAILED, //定位过滤模块,筛选创建输入数据失败
  148. LOCATER_SIFT_PREDICT_FAILED, //定位过滤模块,预测失败
  149. LOCATER_SIFT_PREDICT_TIMEOUT, //定位过滤模块,预测超时
  150. LOCATER_SIFT_PREDICT_NO_WHEEL_POINT, //定位过滤模块,预测结果没有车轮点云
  151. LOCATER_SIFT_PREDICT_NO_CAR_POINT, //定位过滤模块,预测结果没有车身点云
  152. LOCATER_SIFT_FILTE_OBS_FAILED, //定位过滤模块,过滤OBS失败
  153. LOCATER_SIFT_INPUT_BOX_PARAMETER_FAILED, //定位过滤模块,输入范围参数错误
  154. // //yolo
  155. // LOCATER_YOLO_ERROR_BASE =0x03020200,
  156. // LOCATER_YOLO_DETECT_FAILED,
  157. // LOCATER_YOLO_DETECT_NO_TARGET,
  158. // LOCATER_YOLO_PARAMETER_INVALID,
  159. // LOCATER_YOLO_INPUT_CLOUD_UNINIT,
  160. //3dcnn from 0x03010300-0x030103FF
  161. LOCATER_3DCNN_ERROR_BASE = 0x03020300,
  162. LOCATER_3DCNN_INIT_FAILED, //定位3DCNN模块,初始化失败
  163. LOCATER_3DCNN_INPUT_CLOUD_UNINIT, //定位3DCNN模块,输入点云未初始化
  164. LOCATER_3DCNN_INPUT_CLOUD_EMPTY, //定位3DCNN模块,输入点云为空
  165. LOCATER_3DCNN_INPUT_CLOUD_MAP_ERROR, //定位3DCNN模块,输入点云的map错误
  166. LOCATER_3DCNN_PCA_OUT_ERROR, //定位3DCNN模块,pca错误
  167. LOCATER_3DCNN_EXTRACT_RECT_ERROR, //定位3DCNN模块,提取矩形错误
  168. LOCATER_3DCNN_RECT_SIZE_ERROR, //定位3DCNN模块,矩形范围错误
  169. LOCATER_3DCNN_PREDICT_FAILED, //定位3DCNN模块,预测失败
  170. LOCATER_3DCNN_VERIFY_RECT_FAILED_3, //定位3DCNN模块,验证矩形失败3
  171. LOCATER_3DCNN_VERIFY_RECT_FAILED_4, //定位3DCNN模块,验证矩形失败4
  172. LOCATER_3DCNN_KMEANS_FAILED, //定位3DCNN模块,k均值失败
  173. LOCATER_3DCNN_IIU_FAILED, //定位3DCNN模块,IIU失败
  174. LOCATER_3DCNN_PCA_OUT_CLOUD_EMPTY, //定位3DCNN模块,pca输出点云为空
  175. //感测和主控通信
  176. LOCATER_MSG_TABLE_NOT_EXIST = 0x03030100,
  177. LOCATER_MSG_RESPONSE_TYPE_ERROR, //测量反馈消息类型错误(致命)
  178. LOCATER_MSG_RESPONSE_INFO_ERROR,
  179. LOCATER_MSG_REQUEST_CANCELED,
  180. LOCATER_MSG_REQUEST_INVALID,
  181. LOCATER_MSG_RESPONSE_HAS_NO_REQUEST,
  182. LOCATER_MSG_REQUEST_REPEATED,
  183. //System_manager error from 0x04010000-0x0401FFFF
  184. SYSTEM_READ_PARAMETER_ERROR = 0x04010100,
  185. SYSTEM_PARAMETER_ERROR,
  186. SYSTEM_INPUT_TERMINOR_NO_LASERS,
  187. //terminor_command_executor.cpp from 0x04010200-0x040102FF
  188. TERMINOR_NOT_READY = 0x04010200,
  189. TERMINOR_INPUT_LASER_NULL,
  190. TERMINOR_NOT_CONTAINS_LASER,
  191. TERMINOR_INPUT_PLC_NULL,
  192. TERMINOR_INPUT_LOCATER_NULL,
  193. TERMINOR_CREATE_WORKING_THREAD_FAILED,
  194. TERMINOR_FORCE_QUIT,
  195. TERMINOR_LASER_TIMEOUT,
  196. TERMINOR_POST_PLC_TIMEOUT,
  197. TERMINOR_CHECK_RESULTS_ERROR,
  198. ////Hardware limit from 0x05010000 - 0x0501ffff
  199. ///railing.cpp from 0x05010100-0x050101ff
  200. HARDWARE_LIMIT_LEFT_RAILING = 0x05010100, //左栏杆限制
  201. HARDWARE_LIMIT_RAILING_PARAMETER_ERROR,
  202. HARDWARE_LIMIT_RAILING_ERROR,
  203. HARDWARE_LIMIT_CENTER_X_LEFT,
  204. HARDWARE_LIMIT_CENTER_X_RIGHT,
  205. HARDWARE_LIMIT_CENTER_Y_TOP,
  206. HARDWARE_LIMIT_CENTER_Y_BOTTOM,
  207. HARDWARE_LIMIT_HEIGHT_OUT_RANGE,
  208. HARDWARE_LIMIT_ANGLE_OUT_RANGE,
  209. //termonal_limit from 0x05010200-0x050102ff
  210. HARDWARE_LIMIT_TERMINAL_LEFT_ERROR,
  211. HARDWARE_LIMIT_TERMINAL_RIGHT_ERROR,
  212. HARDWARE_LIMIT_TERMINAL_LR_ERROR,
  213. //万集设备模块,
  214. WANJI_LIDAR_DEVICE_ERROR_BASE = 0x06080000,//万集设备模块,错误基类
  215. WANJI_LIDAR_DEVICE_STATUS_BUSY, //万集设备模块,状态正忙
  216. WANJI_LIDAR_DEVICE_STATUS_ERROR, //万集设备模块,状态错误
  217. WANJI_LIDAR_DEVICE_TASK_TYPE_ERROR, //万集设备模块,任务类型错误
  218. WANJI_LIDAR_DEVICE_TASK_OVER_TIME, //万集设备模块,任务超时
  219. WANJI_LIDAR_DEVICE_NO_CLOUD, //万集设备模块,没有点云
  220. // velodyne设备模块
  221. VELODYNE_LIDAR_DEVICE_ERROR_BASE, //velodyne设备模块,错误基类
  222. VELODYNE_LIDAR_DEVICE_STATUS_BUSY, //velodyne设备模块,状态正忙
  223. VELODYNE_LIDAR_DEVICE_STATUS_ERROR, //velodyne设备模块,状态错误
  224. VELODYNE_LIDAR_DEVICE_TASK_TYPE_ERROR, //velodyne设备模块,任务类型错误
  225. VELODYNE_LIDAR_DEVICE_TASK_OVER_TIME, //velodyne设备模块,任务超时
  226. VELODYNE_LIDAR_DEVICE_NO_CLOUD, //velodyne设备模块,没有点云
  227. //万集通信wj_lidar error from 0x06010000-0x0601FFFF
  228. WJ_LIDAR_COMMUNICATION_ERROR_BASE = 0x06010000,
  229. WJ_LIDAR_COMMUNICATION_UNINITIALIZED, //万集通信,未初始化
  230. WJ_LIDAR_COMMUNICATION_DISCONNECT, //万集通信,断连
  231. WJ_LIDAR_COMMUNICATION_FAULT, //万集通信,故障
  232. WJ_LIDAR_CONNECT_FAILED, //万集通信,连接失败
  233. WJ_LIDAR_UNINITIALIZED, //万集通信,未初始化
  234. WJ_LIDAR_READ_FAILED, //万集通信,读取失败
  235. WJ_LIDAR_WRITE_FAILED, //万集通信,写入失败
  236. WJ_LIDAR_GET_CLOUD_TIMEOUT, //万集通信,获取点云超时
  237. // velodyne通信
  238. VELODYNE_LIDAR_COMMUNICATION_UNINITIALIZED, //velodyne通信,未初始化
  239. VELODYNE_LIDAR_COMMUNICATION_DISCONNECT, //velodyne通信,断连
  240. VELODYNE_LIDAR_COMMUNICATION_FAULT, //velodyne通信,故障
  241. VELODYNE_LIDAR_CONNECT_FAILED, //velodyne通信,连接失败
  242. VELODYNE_LIDAR_UNINITIALIZED, //velodyne通信,未初始化
  243. VELODYNE_LIDAR_READ_FAILED, //velodyne通信,读取失败
  244. VELODYNE_LIDAR_WRITE_FAILED, //velodyne通信,写入失败
  245. VELODYNE_LIDAR_GET_CLOUD_TIMEOUT, //velodyne通信,获取点云超时
  246. //万集解析 wj lidar protocol error from 0x06020000-0x0602FFFF
  247. WJ_PROTOCOL_ERROR_BASE = 0x06020000,
  248. WJ_PROTOCOL_STATUS_BUSY, //万集解析, 状态正忙
  249. WJ_PROTOCOL_STATUS_ERROR, //万集解析, 状态错误
  250. WJ_PROTOCOL_INTEGRITY_ERROR, //万集解析, 完整性错误
  251. WJ_PROTOCOL_PARSE_FAILED, //万集解析, 解析失败
  252. WJ_PROTOCOL_EMPTY_PACKAGE, //万集解析, 空包
  253. WJ_PROTOCOL_EXCEED_MAX_SIZE, //万集解析, 超出最大范围
  254. //万集测量范围 wj region detect error from 0x06030000-0x0603FFFF
  255. WJ_REGION_ERROR_BASE = 0x06030000,
  256. WJ_REGION_EMPTY_CLOUD, //万集测量,空点云
  257. WJ_REGION_EMPTY_NO_WHEEL_INFORMATION, //万集测量,没有车轮信息
  258. WJ_REGION_RECTANGLE_ANGLE_ERROR, //万集测量,矩形旋转角错误
  259. WJ_REGION_RECTANGLE_SIZE_ERROR, //万集测量,矩形大小错误
  260. WJ_REGION_RECTANGLE_SYMMETRY_ERROR, //万集测量,矩形对称错误
  261. WJ_REGION_CLUSTER_SIZE_ERROR, //万集测量,簇大小错误
  262. WJ_REGION_CERES_SOLVE_ERROR, //万集测量,优化失败
  263. //velodyne测量范围
  264. VELODYNE_REGION_ERROR_BASE,
  265. VELODYNE_REGION_EMPTY_CLOUD, //velodyne测量,空点云
  266. VELODYNE_REGION_EMPTY_NO_WHEEL_INFORMATION, //velodyne测量,没有车轮信息
  267. VELODYNE_REGION_RECTANGLE_ANGLE_ERROR, //velodyne测量,矩形旋转角错误
  268. VELODYNE_REGION_RECTANGLE_SIZE_ERROR, //velodyne测量,矩形大小错误
  269. VELODYNE_REGION_RECTANGLE_SYMMETRY_ERROR, //velodyne测量,矩形对称错误
  270. VELODYNE_REGION_CLUSTER_SIZE_ERROR, //velodyne测量,簇大小错误
  271. VELODYNE_REGION_CERES_SOLVE_ERROR, //velodyne测量,优化失败
  272. VELODYNE_REGION_ANGLE_PRECHECK_FAILED, //velodyne测量,rough angle check failed
  273. //万集管理模块 wj manager error from 0x06040000-0x0604FFFF
  274. WJ_MANAGER_ERROR_BASE = 0x06040000,
  275. WJ_MANAGER_UNINITIALIZED, //万集管理模块,未初始化
  276. WJ_MANAGER_LIDAR_DISCONNECTED, //万集管理模块,雷达断链
  277. WJ_MANAGER_PLC_DISCONNECTED, //万集管理模块,plc断链
  278. WJ_MANAGER_EMPTY_CLOUD, //万集管理模块,空点云
  279. WJ_MANAGER_READ_PROTOBUF_ERROR, //万集管理模块,读取参数错误
  280. WJ_MANAGER_INIT_ERROR, //万集管理模块,初始化error
  281. WJ_MANAGER_TASK_TYPE_ERROR, //万集管理模块,任务类型错误
  282. WJ_MANAGER_STATUS_BUSY, //万集管理模块,状态正忙
  283. WJ_MANAGER_STATUS_ERROR, //万集管理模块,状态错误
  284. WJ_MANAGER_LASER_INDEX_ERRPR, //万集管理模块,雷达索引错误,编号错误。
  285. WJ_MANAGER_LASER_INDEX_REPEAT, //万集管理模块,需要扫描的雷达索引重复,可忽略的错误,提示作用
  286. WJ_MANAGER_TASK_OVER_TIME, //万集管理模块,任务超时
  287. VELODYNE_MANAGER_ERROR_BASE,
  288. VELODYNE_MANAGER_UNINITIALIZED, //velodyne管理模块,未初始化
  289. VELODYNE_MANAGER_LIDAR_DISCONNECTED, //velodyne管理模块,雷达断链
  290. VELODYNE_MANAGER_EMPTY_CLOUD, //velodyne管理模块,空点云
  291. VELODYNE_MANAGER_READ_PROTOBUF_ERROR, //velodyne管理模块,读取参数错误
  292. VELODYNE_MANAGER_INIT_ERROR, //velodyne管理模块,初始化error
  293. VELODYNE_MANAGER_TASK_TYPE_ERROR, //velodyne管理模块,任务类型错误
  294. VELODYNE_MANAGER_STATUS_BUSY, //velodyne管理模块,状态正忙
  295. VELODYNE_MANAGER_STATUS_ERROR, //velodyne管理模块,状态错误
  296. VELODYNE_MANAGER_LASER_INDEX_ERRPR, //velodyne管理模块,雷达索引错误,编号错误。
  297. VELODYNE_MANAGER_LASER_INDEX_REPEAT, //velodyne管理模块,需要扫描的雷达索引重复,可忽略的错误,提示作用
  298. VELODYNE_MANAGER_TASK_OVER_TIME, //velodyne管理模块,任务超时
  299. //万集任务模块
  300. WJ_LIDAR_TASK_ERROR_BASE = 0x06050000,
  301. WJ_LIDAR_TASK_EMPTY_RESULT, //万集任务模块,空结果
  302. WJ_LIDAR_TASK_EMPTY_TASK, //万集任务模块,空任务
  303. WJ_LIDAR_TASK_WRONG_TYPE, //万集任务模块,错误类型
  304. WJ_LIDAR_TASK_INVALID_TASK, //万集任务模块,无效任务
  305. WJ_LIDAR_TASK_MEASURE_FAILED, //万集任务模块,测量失败
  306. // 万集滤波
  307. WJ_FILTER_ERROR_BASE = 0x06060000,
  308. WJ_FILTER_LACK_OF_RESULT, //万集滤波,结果不足以进行滤波
  309. WJ_FILTER_FLUCTUATING, //万集滤波,结果波动过大
  310. //task module, 任务模块 error from 0x10010000-0x1001FFFF
  311. TASK_MODULE_ERROR_BASE = 0x10010000,
  312. TASK_TYPE_IS_UNKNOW,
  313. TASK_NO_RECEIVER,
  314. //Communication module, 通信模块
  315. COMMUNICATION_BASE_ERROR_BASE = 0x11010000,
  316. COMMUNICATION_READ_PROTOBUF_ERROR, //模块,读取参数错误
  317. COMMUNICATION_BIND_ERROR,
  318. COMMUNICATION_CONNECT_ERROR,
  319. COMMUNICATION_ANALYSIS_TIME_OUT, //解析超时,
  320. COMMUNICATION_EXCUTER_IS_BUSY, //处理器正忙, 请稍等
  321. //system module, 系统模块
  322. SYSTEM_EXECUTOR_ERROR_BASE = 0x12010000, //系统执行模块,
  323. SYSTEM_EXECUTOR_PARSE_ERROR, //系统执行模块, 解析消息错误
  324. SYSTEM_EXECUTOR_STATUS_BUSY, //系统执行模块, 状态正忙
  325. SYSTEM_EXECUTOR_STATUS_ERROR, //系统执行模块, 状态错误
  326. SYSTEM_EXECUTOR_CHECK_ERROR, //系统执行模块, 检查错误
  327. //Dispatch 调度 模块 错误码
  328. DISPATCH_ERROR_BASE = 0x13000000,
  329. //Dispatch_manager 调度管理模块 错误码
  330. DISPATCH_MANAGER_ERROR_BASE = 0x13010000,
  331. DISPATCH_MANAGER_READ_PROTOBUF_ERROR, //调度管理模块,读取参数错误
  332. DISPATCH_MANAGER_STATUS_BUSY, //调度管理模块,状态正忙
  333. DISPATCH_MANAGER_STATUS_ERROR, //调度管理模块,状态错误
  334. DISPATCH_MANAGER_TASK_TYPE_ERROR, //调度管理模块,任务类型错误
  335. DISPATCH_MANAGER_IS_NOT_READY, //调度管理模块,不在准备状态
  336. DISPATCH_MANAGER_SPACE_LOCK_ERROR, //调度管理模块,空间锁错误
  337. DISPATCH_PROCESS_ERROR_BASE = 0x13020000,
  338. DISPATCH_PROCESS_IS_NOT_READY, //调度流程, 不在准备状态
  339. DISPATCH_PROCESS_DEVICE_TYPE_ERROR, //调度流程, 设备类型错误
  340. DISPATCH_PROCESS_DEVICE_STATUS_ERROR, //调度流程, 设备状态错误
  341. DISPATCH_PROCESS_TASK_STATUS_ERROR, //调度流程, 任务类型错误
  342. DISPATCH_PROCESS_COMMAND_KEY_REPEAT, //调度流程, 唯一码错误
  343. DISPATCH_PROCESS_INIT_ERROR, //调度流程, 初始化错误
  344. DISPATCH_DEVICE_ERROR_BASE = 0x13030000,
  345. DISPATCH_DEVICE_READ_PROTOBUF_ERROR, //调度设备模块,读取参数错误
  346. DISPATCH_DEVICE_STATUS_BUSY, //调度设备模块,状态正忙
  347. DISPATCH_DEVICE_STATUS_ERROR, //调度设备模块,状态错误
  348. DISPATCH_DEVICE_STATUS_DISCONNECT, //调度设备模块,状态断连
  349. DISPATCH_DEVICE_TASK_TYPE_ERROR, //调度设备模块,任务类型错误
  350. DISPATCH_DEVICE_TASK_OVER_TIME, //调度设备模块,任务超时
  351. DISPATCH_DEVICE_TASK_REPEAT, //调度设备模块,任务重复, 任务已经存在
  352. DISPATCH_DEVICE_IS_NOT_READY, //调度设备模块,不在准备状态
  353. DISPATCH_DEVICE_RESPONS_ERROR, //调度设备模块,指令的执行失败
  354. DISPATCH_DEVICE_TASK_NOTHINGNESS, //调度设备模块,任务不存在
  355. DISPATCH_DEVICE_TASK_LEVEL_ERROR, //调度设备模块,任务等级错误
  356. CARRIER_ERROR_BASE = 0x13040000,
  357. CARRIER_READ_PROTOBUF_ERROR, //搬运器模块,读取参数错误
  358. CARRIER_STATUS_BUSY, //搬运器模块,状态正忙
  359. CARRIER_STATUS_ERROR, //搬运器模块,状态错误
  360. CARRIER_STATUS_DISCONNECT, //搬运器模块,状态断连
  361. CARRIER_TASK_TYPE_ERROR, //搬运器模块,任务类型错误
  362. CARRIER_TASK_OVER_TIME, //搬运器模块,任务超时
  363. CARRIER_IS_NOT_READY, //搬运器模块,不在准备状态
  364. CARRIER_RESPONS_ERROR, //搬运器模块,指令的执行失败
  365. CARRIER_TASK_NOTHINGNESS, //搬运器模块,任务不存在
  366. CARRIER_POSE_ERROR, //搬运器模块,姿态错误
  367. CARRIER_CONRTOL_PARAMETER_ERROR, //搬运器模块,控制参数错误
  368. CATCHER_ERROR_BASE = 0x13050000,
  369. CATCHER_READ_PROTOBUF_ERROR, //抓取器模块,读取参数错误
  370. CATCHER_STATUS_BUSY, //抓取器模块,状态正忙
  371. CATCHER_STATUS_ERROR, //抓取器模块,状态错误
  372. CATCHER_STATUS_DISCONNECT, //抓取器模块,状态断连
  373. CATCHER_TASK_TYPE_ERROR, //抓取器模块,任务类型错误
  374. CATCHER_TASK_OVER_TIME, //抓取器模块,任务超时
  375. CATCHER_IS_NOT_READY, //抓取器模块,不在准备状态
  376. CATCHER_RESPONS_ERROR, //抓取器模块,指令的执行失败
  377. CATCHER_TASK_NOTHINGNESS, //抓取器模块,任务不存在
  378. CATCHER_POSE_ERROR, //抓取器模块,姿态错误
  379. CATCHER_CONRTOL_PARAMETER_ERROR, //抓取器模块,控制参数错误
  380. PASSAGEWAY_ERROR_BASE = 0x13060000,
  381. PASSAGEWAY_READ_PROTOBUF_ERROR, //通道口模块,读取参数错误
  382. PASSAGEWAY_STATUS_BUSY, //通道口模块,状态正忙
  383. PASSAGEWAY_STATUS_ERROR, //通道口模块,状态错误
  384. PASSAGEWAY_STATUS_DISCONNECT, //通道口模块,状态断连
  385. PASSAGEWAY_TASK_TYPE_ERROR, //通道口模块,任务类型错误
  386. PASSAGEWAY_TASK_OVER_TIME, //通道口模块,任务超时
  387. PASSAGEWAY_IS_NOT_READY, //通道口模块,不在准备状态
  388. PASSAGEWAY_RESPONS_ERROR, //通道口模块,指令的执行失败
  389. PASSAGEWAY_TASK_NOTHINGNESS, //通道口模块,任务不存在
  390. //DISPATCH_COORDINATES module, 通信模块
  391. DISPATCH_COORDINATES_ERROR_BASE = 0x13060000,
  392. DISPATCH_COORDINATES_READ_PROTOBUF_ERROR, //调度坐标模块,读取参数错误
  393. DISPATCH_COORDINATES_ID_ERROR, //调度坐标模块,坐标id错误
  394. DISPATCH_COORDINATES_PATH_ERROR, //调度坐标模块,路径方向错误
  395. DISPATCH_COORDINATES_CAN_NOT_LOCK, //调度坐标模块,不能加锁
  396. //Dispatch_plc 调度plc模块
  397. DISPATCH_PLC_ERROR_BASE = 0x13070000,
  398. DISPATCH_PLC_REQUEST_ERROR, //调度plc模块,请求错误
  399. DISPATCH_PLC_RESPONS_ERROR, //调度plc模块,指令的执行失败
  400. DISPATCH_PLC_STATUS_ERROR, //调度plc模块,状态错误
  401. DISPATCH_PLC_TIME_OUT, //调度plc模块,超时
  402. //snap7 通信模块 错误码
  403. SNAP7_ERROR_BASE = 0x1401000,
  404. SNAP7_READ_PROTOBUF_ERROR, //snap7通信模块,读取参数错误
  405. SNAP7_CONNECT_ERROR, //snap7通信模块,连接错误
  406. SNAP7_DISCONNECT_ERROR, //snap7通信模块,断连错误
  407. SNAP7_READ_ERROR, //snap7通信模块,读取错误
  408. SNAP7_WRITE_ERROR, //snap7通信模块,写入错误
  409. SNAP7_ANALYSIS_TIME_OUT, //解析超时,
  410. SNAP7_EXCUTER_IS_BUSY, //处理器正忙, 请稍等
  411. TOF3D_VZENSE_DEVICE_INIT_SUCCESS = 0x1501000,
  412. TOF3D_VZENSE_DEVICE_INIT_FAILED,
  413. //parkspace allocator,车位分配模块
  414. PARKSPACE_ALLOCATOR_ERROR_BASE = 0x20010000,
  415. PARKSPACE_ALLOCATOR_MSG_REQUEST_TYPE_ERROR, //反馈车位消息类型错误
  416. PARKSPACE_ALLOCATOR_MSG_RESPONSE_TYPE_ERROR, //反馈车位消息类型错误
  417. PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, //请求消息解析错误
  418. PARKSPACE_ALLOCATOR_SPACE_EMPTY, //空车位异常,车库无车位。或许由模块初始化异常产生
  419. PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, //无合适车位,分配失败
  420. PARKSPACE_ALLOCATOR_SEARCH_FAILED, //未找到车辆对应车位
  421. PARKSPACE_ALLOCATOR_RELEASE_FAILED, //未找到匹配的车位,车位未释放
  422. PARKSPACE_ALLOCATOR_FORCE_UPDATE_FAILED, //手动更新失败,未找到匹配车位
  423. PARKSPACE_ALLOCATOR_PARAM_ERROR, //传入参数错误
  424. PARKSPACE_ALLOCATOR_CONFIRM_ALLOC_ERROR, //确认分配车位错误
  425. PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST, //车辆已存在
  426. // 数据库操作
  427. DB_ERROR_BASE = 0x20020000,
  428. DB_INIT_FAILED, //数据库初始化失败
  429. DB_CONNECT_FAILED, //数据库连接失败
  430. DB_STATUS_ERROR, //数据库状态错误
  431. DB_MANAGER_STATUS_ERROR, //数据库管理状态错误
  432. DB_INSERT_FAILED, //数据库插入失败
  433. DB_DELETE_FAILED, //数据库删除失败
  434. DB_UPDATE_FAILED, //数据库更新失败
  435. DB_QUERY_FAILED, //数据库查询失败
  436. DB_UNINITIALIZED, //数据库外层未初始化
  437. DB_DISCONNECTED, //数据库外层连接失去
  438. DB_RESULT_SET_EMPTY, //数据库外层查询返回结果空指针
  439. DB_RESULT_SET_PARSE_ERROR, //数据库外层查询结果解析失败
  440. DB_CONNECT_CHANNEL_NOT_FOUND, //数据库连接通道未找到
  441. DB_CONNECT_CHANNEL_NUMBER_ERROR, //数据库连接通道数量错误
  442. DB_QUERY_DATA_REPEAT, //数据库查询数据重复
  443. DB_QUERY_NOT_DATA, //数据库未查询到数据
  444. DB_QUERY_DATA_FAILED, //数据库查询数据错误
  445. DB_NOT_QUERY_EMPTY_PARKSPACE, //数据库未查询到空车位
  446. DB_PROTOBUF_ERROR, //数据库配置参数读取错误
  447. //parkspace error code
  448. PARKSPACE_REQUEST_MSG_TYPE_ERROR = 0x20030000,
  449. PARKSPACE_ALLOCMSG_RESPONSE_HAS_NO_REQUEST,
  450. PARKSPACE_SEARCHMSG_RESPONSE_HAS_NO_REQUEST,
  451. PARKSPACE_RELEASEMSG_RESPONSE_HAS_NO_REQUEST,
  452. PARKSPACE_ALLOC_REQUEST_INVALID,
  453. PARKSPACE_SEARCH_REQUEST_INVALID,
  454. PARKSPACE_RELEASE_REQUEST_INVALID,
  455. PARKSPACE_ALLOC_REQUEST_REPEATED,
  456. PARKSPACE_SEARCH_REQUEST_REPEATED,
  457. PARKSPACE_RELEASE_REQUEST_REPEATED,
  458. PARKSPACE_ALLOC_RESPONSE_TYPE_ERROR,
  459. PARKSPACE_SEARCH_RESPONSE_TYPE_ERROR,
  460. PARKSPACE_RELEASE_RESPONSE_TYPE_ERROR,
  461. PARKSPACE_ALLOC_RESPONSE_INFO_ERROR,
  462. PARKSPACE_SEARCH_RESPONSE_INFO_ERROR,
  463. PARKSPACE_RELEASE_RESPONSE_INFO_ERROR,
  464. PARKSPACE_ALLOC_REQUEST_CANCELED,
  465. PARKSPACE_SEARCH_REQUEST_CANCELED,
  466. PARKSPACE_RELEASE_REQUEST_CANCELED,
  467. //rabbitmq module, 通信模块 新版通信
  468. RABBITMQ_BASE_ERROR_BASE = 0x31010000,
  469. RABBITMQ_READ_PROTOBUF_ERROR, //rabbitmq模块,读取PROTO参数错误
  470. RABBITMQ_AMQP_NEW_CONNECTION_ERROR, //rabbitmq模块,新建连接状态错误
  471. RABBITMQ_AMQP_TCP_SOCKET_NEW_ERROR, //rabbitmq模块,新建socket错误
  472. RABBITMQ_PROTOBUF_LOSS_ERROR, //rabbitmq模块,PROTO缺少数据
  473. RABBITMQ_AMQP_SOCKET_OPEN_ERROR, //rabbitmq模块,打开socket错误
  474. RABBITMQ_AMQP_LOGIN_ERROR, //rabbitmq模块,登录服务器错误
  475. RABBITMQ_AMQP_CHANNEL_OPEN_ERROR, //rabbitmq模块,打开通道错误
  476. RABBITMQ_AMQP_QUEUE_BIND_ERROR, //rabbitmq模块,绑定队列错误
  477. RABBITMQ_AMQP_NEW_CONSUME_ERROR, //rabbitmq模块,新建消费者错误
  478. RABBITMQ_AMQP_CONSUME_MESSAGE_ERROR, //rabbitmq模块,接受消息错误
  479. RABBITMQ_AMQP_BASIC_PUBLISH_ERROR, //rabbitmq模块,发送消息错误
  480. RABBITMQ_AMQP_BASIC_ACK_ERROR, //rabbitmq模块,确认消息错误
  481. RABBITMQ_BIND_ERROR,
  482. RABBITMQ_CONNECT_ERROR,
  483. RABBITMQ_ANALYSIS_TIME_OUT, //解析超时,
  484. RABBITMQ_EXCUTER_IS_BUSY, //处理器正忙, 请稍等
  485. };
  486. //错误等级,用来做故障处理
  487. enum Error_level {
  488. // 正常,没有错误,默认值0
  489. NORMAL = 0,
  490. // 轻微故障,可忽略的故障,NEGLIGIBLE_ERROR
  491. // 提示作用,不做任何处理,不影响代码的流程,
  492. // 用作一些不重要的事件,即使出错也不会影响到系统功能,
  493. // 例如:文件保存错误,等
  494. NEGLIGIBLE_ERROR = 1,
  495. // 一般故障,MINOR_ERROR
  496. // 用作底层功能函数的错误返回,表示该功能函数执行失败,
  497. // 返回给应用层之后,需要做故障分析和处理,
  498. // 例如:雷达数据传输失败,应用层就需要进行重新扫描,或者重连,或者重置参数等。
  499. MINOR_ERROR = 2,
  500. // 严重故障,MAJOR_ERROR
  501. // 用作应用层的任务事件的结果,表示该功能模块失败。
  502. // 通常是底层函数返回一般故障之后,应用层无法处理并解决故障,此时就要进行故障升级,
  503. // 从一般故障升级为严重故障,然后进行回退流程,回退已经执行的操作,最终回到故障待机状态。
  504. // 需要外部清除故障,并复位至正常待机状态,才能恢复功能的使用。
  505. // 例如:雷达扫描任务失败,且无法自动恢复。
  506. MAJOR_ERROR = 3,
  507. // 致命故障,CRITICAL_ERROR
  508. // 系统出现致命错误。导致系统无法正常运行,
  509. // 此时系统应该紧急停机,执行紧急流程,快速停机。
  510. // 此时不允许再执行任何函数和任务指令,防止系统故障更加严重。
  511. // 也不需要做任何错误处理了,快速执行紧急流程。
  512. // 例如:内存错误,进程挂死,关键设备失控,监控设备报警,等
  513. CRITICAL_ERROR = 4,
  514. };
  515. class Error_manager {
  516. public://外部接口函数
  517. //构造函数
  518. Error_manager() {
  519. m_error_code = SUCCESS;
  520. m_error_level = NORMAL;
  521. }
  522. //拷贝构造
  523. Error_manager(const Error_manager &error_manager) {
  524. this->m_error_code = error_manager.m_error_code;
  525. this->m_error_level = error_manager.m_error_level;
  526. this->m_error_description = error_manager.m_error_description;
  527. }
  528. //赋值构造
  529. Error_manager(Error_code error_code, Error_level error_level = NORMAL,
  530. const char *f = nullptr, ...) {
  531. va_list arg_ptr;
  532. char buf[DESCRIPTION_BUF_SIZE];
  533. va_start(arg_ptr, f);
  534. vsnprintf(buf, DESCRIPTION_BUF_SIZE, f, arg_ptr);
  535. va_end(arg_ptr);
  536. m_error_code = error_code;
  537. m_error_level = error_level;
  538. m_error_description = std::string(buf);
  539. }
  540. //赋值构造
  541. Error_manager(Error_code error_code, Error_level error_level, std::string error_aggregate_string) {
  542. m_error_code = error_code;
  543. m_error_level = error_level;
  544. m_error_description = error_aggregate_string;
  545. }
  546. //析构函数
  547. ~Error_manager() = default;
  548. //初始化
  549. void error_manager_init() {
  550. error_manager_clear_all();
  551. }
  552. //初始化
  553. void error_manager_init(Error_code error_code, Error_level error_level = NORMAL,
  554. const char *f = nullptr, ...) {
  555. va_list arg_ptr;
  556. char buf[DESCRIPTION_BUF_SIZE];
  557. va_start(arg_ptr, f);
  558. vsnprintf(buf, DESCRIPTION_BUF_SIZE, f, arg_ptr);
  559. va_end(arg_ptr);
  560. m_error_code = error_code;
  561. m_error_level = error_level;
  562. m_error_description = std::string(buf);
  563. }
  564. //初始化
  565. void error_manager_init(Error_code error_code, Error_level error_level, std::string error_aggregate_string) {
  566. m_error_code = error_code;
  567. m_error_level = error_level;
  568. m_error_description = error_aggregate_string;
  569. }
  570. //重置
  571. void error_manager_reset(Error_code error_code, Error_level error_level = NORMAL,
  572. const char *f = nullptr, ...) {
  573. va_list arg_ptr;
  574. char buf[DESCRIPTION_BUF_SIZE];
  575. va_start(arg_ptr, f);
  576. vsnprintf(buf, DESCRIPTION_BUF_SIZE, f, arg_ptr);
  577. va_end(arg_ptr);
  578. m_error_code = error_code;
  579. m_error_level = error_level;
  580. m_error_description = std::string(buf);
  581. }
  582. //重置
  583. void error_manager_reset(Error_code error_code, Error_level error_level, std::string error_aggregate_string) {
  584. m_error_code = error_code;
  585. m_error_level = error_level;
  586. m_error_description = error_aggregate_string;
  587. }
  588. //重置
  589. void error_manager_reset(const Error_manager &error_manager) {
  590. this->m_error_code = error_manager.m_error_code;
  591. this->m_error_level = error_manager.m_error_level;
  592. this->m_error_description = error_manager.m_error_description;
  593. }
  594. //清除所有内容
  595. void error_manager_clear_all() {
  596. m_error_code = SUCCESS;
  597. m_error_level = NORMAL;
  598. m_error_description.clear();
  599. }
  600. //重载=
  601. Error_manager &operator=(const Error_manager &error_manager) {
  602. error_manager_reset(error_manager);
  603. return *this;
  604. }
  605. //重载=,支持Error_manager和Error_code的直接转化,会清空错误等级和描述
  606. Error_manager &operator=(Error_code error_code) {
  607. error_manager_clear_all();
  608. set_error_code(error_code);
  609. return *this;
  610. }
  611. //重载==
  612. bool operator==(const Error_manager &error_manager) {
  613. return is_equal_error_manager(error_manager);
  614. }
  615. //重载==,支持Error_manager和Error_code的直接比较
  616. bool operator==(Error_code error_code) {
  617. if (m_error_code == error_code) {
  618. return true;
  619. } else {
  620. return false;
  621. }
  622. }
  623. //重载!=
  624. bool operator!=(const Error_manager &error_manager) {
  625. return (!is_equal_error_manager(error_manager));
  626. }
  627. //重载!=,支持Error_manager和Error_code的直接比较
  628. bool operator!=(Error_code error_code) {
  629. if (m_error_code != error_code) {
  630. return true;
  631. } else {
  632. return false;
  633. }
  634. }
  635. //重载<<,支持cout<<
  636. friend std::ostream &operator<<(std::ostream &out, Error_manager &error_manager) {
  637. out << error_manager.to_string();
  638. return out;
  639. }
  640. //获取错误码
  641. Error_code get_error_code() {
  642. return m_error_code;
  643. }
  644. //获取错误等级
  645. Error_level get_error_level() {
  646. return m_error_level;
  647. }
  648. //获取错误描述的指针,(浅拷贝)
  649. std::string get_error_description() {
  650. return m_error_description;
  651. }
  652. //复制错误描述,(深拷贝)
  653. //output:p_error_description 错误描述的字符串指针,不可以为NULL,必须要有实际的内存
  654. //output:description_length 错误描述的字符串长度,不可以为0,长度最好足够大,一般256即可。
  655. void copy_error_description(const char *p_error_description) {
  656. if (p_error_description != nullptr) {
  657. m_error_description = std::string(p_error_description);
  658. }
  659. }
  660. //复制错误描述,(深拷贝)
  661. //output:error_description_string 错误描述的string
  662. void copy_error_description(std::string error_description_string) {
  663. m_error_description = error_description_string;
  664. }
  665. //设置错误码
  666. void set_error_code(Error_code error_code) {
  667. m_error_code = error_code;
  668. }
  669. //比较错误等级并升级,取高等级的结果
  670. void set_error_level_up(Error_level error_level) {
  671. if (m_error_level < error_level) {
  672. m_error_level = error_level;
  673. }
  674. }
  675. //比较错误等级并降级,取低等级的结果
  676. void set_error_level_down(Error_level error_level) {
  677. if (m_error_level > error_level) {
  678. m_error_level = error_level;
  679. }
  680. }
  681. //错误等级,设定到固定值
  682. void set_error_level_location(Error_level error_level) {
  683. m_error_level = error_level;
  684. }
  685. //设置错误描述
  686. void set_error_description(const char *f, ...) {
  687. va_list arg_ptr;
  688. char buf[DESCRIPTION_BUF_SIZE];
  689. va_start(arg_ptr, f);
  690. vsnprintf(buf, DESCRIPTION_BUF_SIZE, f, arg_ptr);
  691. va_end(arg_ptr);
  692. m_error_description = std::string(buf);
  693. }
  694. //设置错误描述
  695. void set_error_description(std::string error_description_string) {
  696. m_error_description = error_description_string;
  697. }
  698. //尾部追加错误描述
  699. void add_error_description(const char *f, ...) {
  700. va_list arg_ptr;
  701. char buf[DESCRIPTION_BUF_SIZE];
  702. va_start(arg_ptr, f);
  703. vsnprintf(buf, DESCRIPTION_BUF_SIZE, f, arg_ptr);
  704. va_end(arg_ptr);
  705. m_error_description += std::string(buf);
  706. }
  707. //尾部追加错误描述
  708. void add_error_description(std::string error_description_string) {
  709. m_error_description += error_description_string;
  710. }
  711. //比较错误是否相同,
  712. // 注:只比较错误码和等级
  713. bool is_equal_error_manager(const Error_manager &error_manager) {
  714. if (this->m_error_code == error_manager.m_error_code
  715. && this->m_error_level == error_manager.m_error_level) {
  716. return true;
  717. } else {
  718. return false;
  719. }
  720. }
  721. //比较并覆盖错误,讲低级错误转为字符串存放于描述中,
  722. //如果错误相同,则保留this的,将输入参数转入描述。
  723. void compare_and_cover_error(const Error_manager &error_manager) {
  724. if (this->m_error_code == SUCCESS) {
  725. error_manager_reset(error_manager);
  726. } else if (error_manager.m_error_code == SUCCESS) {
  727. return;
  728. } else {
  729. Error_manager t_error_manager_new;
  730. std::string pt_string_inside;
  731. if (this->m_error_level < error_manager.m_error_level) {
  732. translate_error_to_string(pt_string_inside);
  733. error_manager_reset(error_manager);
  734. add_error_description(pt_string_inside);
  735. } else {
  736. ((Error_manager &) error_manager).translate_error_to_string(pt_string_inside);
  737. add_error_description(pt_string_inside);
  738. }
  739. }
  740. }
  741. //比较并覆盖错误,讲低级错误转为字符串存放于描述中,
  742. //如果错误相同,则保留this的,将输入参数转入描述。
  743. void compare_and_cover_error(Error_manager *p_error_manager) {
  744. if (this->m_error_code == SUCCESS) {
  745. error_manager_reset(*p_error_manager);
  746. } else if (p_error_manager->m_error_code == SUCCESS) {
  747. return;
  748. } else {
  749. Error_manager t_error_manager_new;
  750. std::string pt_string_inside;
  751. if (this->m_error_level < p_error_manager->m_error_level) {
  752. translate_error_to_string(pt_string_inside);
  753. error_manager_reset(*p_error_manager);
  754. add_error_description(pt_string_inside);
  755. } else {
  756. p_error_manager->translate_error_to_string(pt_string_inside);
  757. add_error_description(pt_string_inside);
  758. }
  759. }
  760. }
  761. void compare_and_merge_up(const Error_manager &error) {
  762. if (error.m_error_level > this->m_error_level) {
  763. this->m_error_level = error.m_error_level;
  764. this->m_error_code = error.m_error_code;
  765. this->m_error_description += error.m_error_description;
  766. }
  767. }
  768. void compare_and_merge_down(const Error_manager &error) {
  769. if (error.m_error_level < this->m_error_level) {
  770. this->m_error_level = error.m_error_level;
  771. this->m_error_code = error.m_error_code;
  772. this->m_error_description += error.m_error_description;
  773. }
  774. }
  775. //output:error_description_string 错误汇总的string
  776. void translate_error_to_string(std::string error_aggregate_string) {
  777. char t_string_array[255] = {0};
  778. sprintf(t_string_array, "error_code:0x%08x, error_level:%02d, error_description:",
  779. m_error_code, m_error_level);
  780. error_aggregate_string = t_string_array;
  781. error_aggregate_string += m_error_description;
  782. }
  783. //错误码转字符串的简易版,可支持cout<<
  784. //return 错误汇总的string
  785. std::string to_string() {
  786. char t_string_array[255] = {0};
  787. sprintf(t_string_array, "error_code:0x%08x, error_level:%02d, error_description:",
  788. m_error_code, m_error_level);
  789. std::string error_aggregate_string = t_string_array;
  790. error_aggregate_string += m_error_description;
  791. return error_aggregate_string;
  792. }
  793. protected:
  794. Error_code m_error_code; //错误码
  795. Error_level m_error_level; //错误等级
  796. std::string m_error_description; // 错误描述
  797. protected://内部功能函数
  798. public:
  799. //释放错误描述的内存,
  800. void free_description() {};
  801. //重新分配错误描述的内存,并从外部拷贝新的(深拷贝)
  802. //input:p_error_description 错误描述的字符串指针,可以为NULL,
  803. //input:description_length 错误描述的字符串长度,如果为0,则从p_error_description里面获取有效的长度
  804. void reallocate_memory_and_copy_string(const char *p_error_description, int description_length = 0) {
  805. }
  806. //重新分配错误描述的内存,并从外部拷贝新的(深拷贝)
  807. //input:error_aggregate_string 错误描述的string
  808. void reallocate_memory_and_copy_string(std::string error_aggregate_string) {
  809. }
  810. };