13#include <sys/syscall.h>
16#include <vmxpi_ros/TitanInfo.h>
17#include <vmxpi_ros/UniqueID.h>
18#include <vmxpi_ros/LimitSwitch.h>
19#include <std_msgs/Int16.h>
20#include <std_msgs/Int32.h>
21#include <std_msgs/UInt16.h>
22#include <std_msgs/Float32.h>
25class TitanDriver :
public Utils {
28 VMXCANReceiveStreamHandle canrxhandles[1];
29 double m_speed[4] = {0,0,0,0};
32 int frequency = 15600;
34 int autoRepeatPeriodInMilliseconds = 10;
37 double ENCODER_0_DISTANCE_PER_TICK = 0, ENCODER_1_DISTANCE_PER_TICK = 0,
38 ENCODER_2_DISTANCE_PER_TICK = 0, ENCODER_3_DISTANCE_PER_TICK = 0;
39 int32_t enc_count[4], rpm[4];
42 TitanDriver(
int deviceID,
int frequency_set, VMXCAN *can_);
44 TitanDriver(
int deviceID, VMXCAN *can);
52 void ConfigureMotor(uint8_t motor);
55 void SetMotorSpeed(
double speed_set,
int motor);
58 void StopMotor(uint8_t motor);
64 void ResetEncoder(uint8_t motor);
67 void ResetAllEncoders();
71 void SetMotorStopMode(uint8_t motor, int8_t mode);
74 void GetUniqueID(vmxpi_ros::UniqueID *res_msg);
77 void GetInfo(vmxpi_ros::TitanInfo *res_msg);
80 void GetMotorFreq(std_msgs::UInt16 res_msg[]);
82 void GetCountRPM(int8_t motor);
86 void GetEncoderCount(std_msgs::Int32 *res_msg, int8_t encoder);
92 void ConfigureEncoder(int8_t encoder,
double radius,
double encoderPPR,
double gearRatio);
95 void GetEncoderDist(std_msgs::Float32 *res_msg, int8_t encoder);
98 void GetRPM(std_msgs::Int16 *res_msg, uint8_t motor);
103 void GetLimitSwitch(vmxpi_ros::LimitSwitch *res_msg);
106 void GetMCUTemp(std_msgs::Float32 *res_msg);
109 void GetSpeed(std_msgs::Float32 *res_msg, uint8_t motor);
118 bool CheckCANStatus(VMXErrorCode vmxerr) {
119 VMXCANBusStatus can_bus_status;
120 if (!can->GetCANBUSStatus(can_bus_status, &vmxerr)) {
121 ROS_INFO(
"Error getting CAN BUS Status.");
125 if(can_bus_status.busWarning)
126 ROS_INFO(
"CAN Bus Warning.\n");
127 if(can_bus_status.busPassiveError)
128 ROS_INFO(
"CAN Bus in Passive mode due to errors.");
129 if(can_bus_status.busOffError)
130 ROS_INFO(
"CAN Bus Transmitter Off due to errors.");
131 if(can_bus_status.transmitErrorCount > 0)
132 ROS_INFO(
"CAN Bus Tx Error Count: %d", can_bus_status.transmitErrorCount);
133 if(can_bus_status.receiveErrorCount > 0)
134 ROS_INFO(
"CAN Bus Rx Error Count: %d", can_bus_status.receiveErrorCount);
135 if(can_bus_status.busOffCount > 0)
136 ROS_INFO(
"CAN Bus Tx Off Count: %d", can_bus_status.busOffCount);
137 if(can_bus_status.txFullCount > 0)
138 ROS_INFO(
"CAN Bus Tx Full Count: %d", can_bus_status.txFullCount);
139 if(can_bus_status.hwRxOverflow)
140 ROS_INFO(
"CAN HW Receive Overflow detected.");
141 if(can_bus_status.swRxOverflow)
142 ROS_INFO(
"CAN SW Receive Overflow detected.");
143 if(can_bus_status.busError)
144 ROS_INFO(
"CAN Bus Error detected.");
145 if(can_bus_status.wake)
146 ROS_INFO(
"CAN Bus Wake occured.");
147 if(can_bus_status.messageError)
148 ROS_INFO(
"CAN Message Error detected.");
158 void ReadCANBlackboard(VMXCANReceiveStreamHandle handle,
int msgID, VMXCANTimestampedMessage* data, uint32_t length, uint64_t timestamp, VMXErrorCode vmxerr);
Definition: vmxpi_utils.h:5
void DisplayVMXError(VMXErrorCode vmxerr)
Displays the VMXError.
Definition: vmxpi_utils.h:14