22#include "esd_can/include/ntcan.h"
32DEFINE_string(esdcan_monitor_name,
"EsdCanMonitor",
"Name of the CAN monitor.");
33DEFINE_double(esdcan_monitor_interval, 3,
"CAN status checking interval (s).");
35 "Name of the ESD CAN component in SystemStatus.");
42std::string StatusString(
const NTCAN_RESULT ntstatus) {
45 return "NTCAN_SUCCESS";
46 case NTCAN_RX_TIMEOUT:
47 return "NTCAN_RX_TIMEOUT";
48 case NTCAN_TX_TIMEOUT:
49 return "NTCAN_TX_TIMEOUT";
51 return "NTCAN_TX_ERROR";
52 case NTCAN_CONTR_OFF_BUS:
53 return "NTCAN_CONTR_OFF_BUS";
54 case NTCAN_CONTR_BUSY:
55 return "NTCAN_CONTR_BUSY";
56 case NTCAN_CONTR_WARN:
57 return "NTCAN_CONTR_WARN";
58 case NTCAN_NO_ID_ENABLED:
59 return "NTCAN_NO_ID_ENABLED";
60 case NTCAN_ID_ALREADY_ENABLED:
61 return "NTCAN_ID_ALREADY_ENABLED";
62 case NTCAN_ID_NOT_ENABLED:
63 return "NTCAN_ID_NOT_ENABLED";
64 case NTCAN_INVALID_FIRMWARE:
65 return "NTCAN_INVALID_FIRMWARE";
66 case NTCAN_MESSAGE_LOST:
67 return "NTCAN_MESSAGE_LOST";
68 case NTCAN_INVALID_PARAMETER:
69 return "NTCAN_INVALID_PARAMETER";
70 case NTCAN_INVALID_HANDLE:
71 return "NTCAN_INVALID_HANDLE";
72 case NTCAN_NET_NOT_FOUND:
73 return "NTCAN_NET_NOT_FOUND";
74 case NTCAN_INSUFFICIENT_RESOURCES:
75 return "NTCAN_INSUFFICIENT_RESOURCES";
76#ifdef NTCAN_IO_INCOMPLETE
77 case NTCAN_IO_INCOMPLETE:
78 return "NTCAN_IO_INCOMPLETE";
80#ifdef NTCAN_IO_PENDING
81 case NTCAN_IO_PENDING:
82 return "NTCAN_IO_PENDING";
84#ifdef NTCAN_INVALID_HARDWARE
85 case NTCAN_INVALID_HARDWARE:
86 return "NTCAN_INVALID_HARDWARE";
88#ifdef NTCAN_PENDING_WRITE
89 case NTCAN_PENDING_WRITE:
90 return "NTCAN_PENDING_WRITE";
92#ifdef NTCAN_PENDING_READ
93 case NTCAN_PENDING_READ:
94 return "NTCAN_PENDING_READ";
96#ifdef NTCAN_INVALID_DRIVER
97 case NTCAN_INVALID_DRIVER:
98 return "NTCAN_INVALID_DRIVER";
100#ifdef NTCAN_OPERATION_ABORTED
101 case NTCAN_OPERATION_ABORTED:
102 return "NTCAN_OPERATION_ABORTED";
104#ifdef NTCAN_WRONG_DEVICE_STATE
105 case NTCAN_WRONG_DEVICE_STATE:
106 return "NTCAN_WRONG_DEVICE_STATE";
108#ifdef NTCAN_HANDLE_FORCED_CLOSE
109 case NTCAN_HANDLE_FORCED_CLOSE:
110 return "NTCAN_HANDLE_FORCED_CLOSE";
112#ifdef NTCAN_NOT_IMPLEMENTED
113 case NTCAN_NOT_IMPLEMENTED:
114 return "NTCAN_NOT_IMPLEMENTED";
116#ifdef NTCAN_NOT_SUPPORTED
117 case NTCAN_NOT_SUPPORTED:
118 return "NTCAN_NOT_SUPPORTED";
120#ifdef NTCAN_SOCK_CONN_TIMEOUT
121 case NTCAN_SOCK_CONN_TIMEOUT:
122 return "NTCAN_SOCK_CONN_TIMEOUT";
124#ifdef NTCAN_SOCK_CMD_TIMEOUT
125 case NTCAN_SOCK_CMD_TIMEOUT:
126 return "NTCAN_SOCK_CMD_TIMEOUT";
128#ifdef NTCAN_SOCK_HOST_NOT_FOUND
129 case NTCAN_SOCK_HOST_NOT_FOUND:
130 return "NTCAN_SOCK_HOST_NOT_FOUND";
132#ifdef NTCAN_CONTR_ERR_PASSIVE
133 case NTCAN_CONTR_ERR_PASSIVE:
134 return "NTCAN_CONTR_ERR_PASSIVE";
136#ifdef NTCAN_ERROR_NO_BAUDRATE
137 case NTCAN_ERROR_NO_BAUDRATE:
138 return "NTCAN_ERROR_NO_BAUDRATE";
140#ifdef NTCAN_ERROR_LOM
141 case NTCAN_ERROR_LOM:
142 return "NTCAN_ERROR_LOM";
147 return "NTCAN_UNKNOWN";
150NTCAN_RESULT EsdCanTest(
const int can_id, NTCAN_HANDLE* handle) {
151 NTCAN_RESULT ret = canOpen(can_id, 0, 1, 1, 0, 0, handle);
152 if (ret == NTCAN_SUCCESS) {
153 AINFO <<
"Successfully opened ESD-CAN device " << can_id;
155 AERROR <<
"Failed to open ESD-CAN device " << can_id <<
", error: " << ret
156 <<
" (" << StatusString(ret) <<
")";
160 CAN_IF_STATUS if_status;
161 ret = canStatus(*handle, &if_status);
162 if (ret != NTCAN_SUCCESS) {
163 AERROR <<
"Cannot get status of ESD-CAN, ret=" << ret <<
" ("
164 << StatusString(ret) <<
")";
168 NTCAN_BUS_STATISTIC stats;
169 ret = canIoctl(*handle, NTCAN_IOCTL_GET_BUS_STATISTIC, &stats);
170 if (ret != NTCAN_SUCCESS) {
171 AERROR <<
"NTCAN_IOCTL_GET_BUS_STATISTIC failed for device with error: "
172 << ret <<
" (" << StatusString(ret) <<
")";
176 NTCAN_CTRL_STATE ctrl_state;
177 ret = canIoctl(*handle, NTCAN_IOCTL_GET_CTRL_STATUS, &ctrl_state);
178 if (ret != NTCAN_SUCCESS) {
179 AERROR <<
"NTCAN_IOCTL_GET_CTRL_STATUS failed for device with error: "
180 << ret <<
" (" << StatusString(ret) <<
")";
184 NTCAN_BITRATE bitrate;
185 ret = canIoctl(*handle, NTCAN_IOCTL_GET_BITRATE_DETAILS, &bitrate);
186 if (ret != NTCAN_SUCCESS) {
187 AERROR <<
"NTCAN_IOCTL_GET_BITRATE_ for device with error: " << ret <<
" ("
188 << StatusString(ret) <<
")";
194void EsdCanTest(
const int can_id, ComponentStatus* status) {
196 const NTCAN_RESULT ret = EsdCanTest(can_id, &handle);
200 ret == NTCAN_SUCCESS ? ComponentStatus::OK : ComponentStatus::
ERROR,
201 StatusString(ret), status);
205void EsdCanTest(
const int can_id, ComponentStatus* status) {
207 "USE_ESD_CAN is not defined during compiling",
216 FLAGS_esdcan_monitor_interval) {}
219 Component* component = apollo::common::util::FindOrNull(
220 *MonitorManager::Instance()->GetStatus()->mutable_components(),
221 FLAGS_esdcan_component_name);
222 if (component ==
nullptr) {
227 auto* status = component->mutable_other_status();
228 status->clear_status();
229 EsdCanTest(FLAGS_esdcan_id, status);
void RunOnce(const double current_time) override
static void EscalateStatus(const ComponentStatus::Status new_status, const std::string &message, ComponentStatus *current_status)
DEFINE_int32(esdcan_id, 0, "ESD CAN id.")
DEFINE_double(esdcan_monitor_interval, 3, "CAN status checking interval (s).")
DEFINE_string(esdcan_monitor_name, "EsdCanMonitor", "Name of the CAN monitor.")