diff --git a/vesc_driver/CMakeLists.txt b/vesc_driver/CMakeLists.txt
index be20368..d0786ab 100644
--- a/vesc_driver/CMakeLists.txt
+++ b/vesc_driver/CMakeLists.txt
@@ -5,12 +5,14 @@ find_package(catkin REQUIRED COMPONENTS
nodelet
pluginlib
roscpp
+ std_msgs
vesc_msgs
+ serial
)
catkin_package(
-# INCLUDE_DIRS include
- CATKIN_DEPENDS nodelet pluginlib roscpp vesc_msgs
+ INCLUDE_DIRS include
+ CATKIN_DEPENDS nodelet pluginlib roscpp std_msgs vesc_msgs serial
)
###########
@@ -18,18 +20,27 @@ catkin_package(
###########
include_directories(
+ include
${Boost_INCLUDE_DIR}
${catkin_INCLUDE_DIRS}
)
# node executable
-add_executable(vesc_driver_node src/vesc_driver_node.cpp src/vesc_driver.cpp)
+add_executable(vesc_driver_node src/vesc_driver_node.cpp
+ src/vesc_driver.cpp
+ src/vesc_interface.cpp
+ src/vesc_packet.cpp
+ src/vesc_packet_factory.cpp)
target_link_libraries(vesc_driver_node
${catkin_LIBRARIES}
)
# nodelet library
-add_library(vesc_driver_nodelet src/vesc_driver_nodelet.cpp src/vesc_driver.cpp)
+add_library(vesc_driver_nodelet src/vesc_driver_nodelet.cpp
+ src/vesc_driver.cpp
+ src/vesc_interface.cpp
+ src/vesc_packet.cpp
+ src/vesc_packet_factory.cpp)
target_link_libraries(vesc_driver_nodelet
${catkin_LIBRARIES}
)
diff --git a/vesc_driver/include/vesc_driver/datatypes.h b/vesc_driver/include/vesc_driver/datatypes.h
new file mode 100644
index 0000000..d71df93
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/datatypes.h
@@ -0,0 +1,371 @@
+/*
+ Copyright 2012-2014 Benjamin Vedder benjamin@vedder.se
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ */
+
+/*
+ * datatypes.h
+ *
+ * Created on: 14 sep 2014
+ * Author: benjamin
+ */
+
+#ifndef DATATYPES_H_
+#define DATATYPES_H_
+
+#include
+#include
+//#include "ch.h"
+typedef uint32_t systime_t; // defined in ch.h
+
+// Data types
+typedef enum {
+ MC_STATE_OFF = 0,
+ MC_STATE_DETECTING,
+ MC_STATE_RUNNING,
+ MC_STATE_FULL_BRAKE,
+} mc_state;
+
+typedef enum {
+ PWM_MODE_NONSYNCHRONOUS_HISW = 0, // This mode is not recommended
+ PWM_MODE_SYNCHRONOUS, // The recommended and most tested mode
+ PWM_MODE_BIPOLAR // Some glitches occasionally, can kill MOSFETs
+} mc_pwm_mode;
+
+typedef enum {
+ COMM_MODE_INTEGRATE = 0,
+ COMM_MODE_DELAY
+} mc_comm_mode;
+
+typedef enum {
+ SENSOR_MODE_SENSORLESS = 0,
+ SENSOR_MODE_SENSORED,
+ SENSOR_MODE_HYBRID
+} mc_sensor_mode;
+
+typedef enum {
+ MOTOR_TYPE_BLDC = 0,
+ MOTOR_TYPE_DC,
+} mc_motor_type;
+
+typedef enum {
+ FAULT_CODE_NONE = 0,
+ FAULT_CODE_OVER_VOLTAGE,
+ FAULT_CODE_UNDER_VOLTAGE,
+ FAULT_CODE_DRV8302,
+ FAULT_CODE_ABS_OVER_CURRENT,
+ FAULT_CODE_OVER_TEMP_FET,
+ FAULT_CODE_OVER_TEMP_MOTOR
+} mc_fault_code;
+
+typedef enum {
+ CONTROL_MODE_DUTY = 0,
+ CONTROL_MODE_SPEED,
+ CONTROL_MODE_CURRENT,
+ CONTROL_MODE_CURRENT_BRAKE,
+ CONTROL_MODE_POS,
+ CONTROL_MODE_NONE
+} mc_control_mode;
+
+typedef struct {
+ float cycle_int_limit;
+ float cycle_int_limit_running;
+ float cycle_int_limit_max;
+ float comm_time_sum;
+ float comm_time_sum_min_rpm;
+ int32_t comms;
+ uint32_t time_at_comm;
+} mc_rpm_dep_struct;
+
+typedef struct {
+ // Switching and drive
+ mc_pwm_mode pwm_mode;
+ mc_comm_mode comm_mode;
+ mc_motor_type motor_type;
+ mc_sensor_mode sensor_mode;
+ // Limits
+ float l_current_max;
+ float l_current_min;
+ float l_in_current_max;
+ float l_in_current_min;
+ float l_abs_current_max;
+ float l_min_erpm;
+ float l_max_erpm;
+ float l_max_erpm_fbrake;
+ float l_max_erpm_fbrake_cc;
+ float l_min_vin;
+ float l_max_vin;
+ bool l_slow_abs_current;
+ bool l_rpm_lim_neg_torque;
+ float l_temp_fet_start;
+ float l_temp_fet_end;
+ float l_temp_motor_start;
+ float l_temp_motor_end;
+ float l_min_duty;
+ float l_max_duty;
+ // Overridden limits (Computed during runtime)
+ float lo_current_max;
+ float lo_current_min;
+ float lo_in_current_max;
+ float lo_in_current_min;
+ // Sensorless
+ float sl_min_erpm;
+ float sl_min_erpm_cycle_int_limit;
+ float sl_max_fullbreak_current_dir_change;
+ float sl_cycle_int_limit;
+ float sl_phase_advance_at_br;
+ float sl_cycle_int_rpm_br;
+ float sl_bemf_coupling_k;
+ // Hall sensor
+ int8_t hall_table[8];
+ float hall_sl_erpm;
+ // Speed PID
+ float s_pid_kp;
+ float s_pid_ki;
+ float s_pid_kd;
+ float s_pid_min_rpm;
+ // Pos PID
+ float p_pid_kp;
+ float p_pid_ki;
+ float p_pid_kd;
+ // Current controller
+ float cc_startup_boost_duty;
+ float cc_min_current;
+ float cc_gain;
+ float cc_ramp_step_max;
+ // Misc
+ int32_t m_fault_stop_time_ms;
+} mc_configuration;
+
+// Applications to use
+typedef enum {
+ APP_NONE = 0,
+ APP_PPM,
+ APP_ADC,
+ APP_UART,
+ APP_PPM_UART,
+ APP_ADC_UART,
+ APP_NUNCHUK,
+ APP_NRF,
+ APP_CUSTOM
+} app_use;
+
+// PPM control types
+typedef enum {
+ PPM_CTRL_TYPE_NONE = 0,
+ PPM_CTRL_TYPE_CURRENT,
+ PPM_CTRL_TYPE_CURRENT_NOREV,
+ PPM_CTRL_TYPE_CURRENT_NOREV_BRAKE,
+ PPM_CTRL_TYPE_DUTY,
+ PPM_CTRL_TYPE_DUTY_NOREV,
+ PPM_CTRL_TYPE_PID,
+ PPM_CTRL_TYPE_PID_NOREV
+} ppm_control_type;
+
+typedef struct {
+ ppm_control_type ctrl_type;
+ float pid_max_erpm;
+ float hyst;
+ float pulse_start;
+ float pulse_end;
+ bool median_filter;
+ bool safe_start;
+ float rpm_lim_start;
+ float rpm_lim_end;
+ bool multi_esc;
+ bool tc;
+ float tc_max_diff;
+} ppm_config;
+
+// ADC control types
+typedef enum {
+ ADC_CTRL_TYPE_NONE = 0,
+ ADC_CTRL_TYPE_CURRENT,
+ ADC_CTRL_TYPE_CURRENT_REV_CENTER,
+ ADC_CTRL_TYPE_CURRENT_REV_BUTTON,
+ ADC_CTRL_TYPE_CURRENT_NOREV_BRAKE_CENTER,
+ ADC_CTRL_TYPE_CURRENT_NOREV_BRAKE_BUTTON,
+ ADC_CTRL_TYPE_DUTY,
+ ADC_CTRL_TYPE_DUTY_REV_CENTER,
+ ADC_CTRL_TYPE_DUTY_REV_BUTTON
+} adc_control_type;
+
+typedef struct {
+ adc_control_type ctrl_type;
+ float hyst;
+ float voltage_start;
+ float voltage_end;
+ bool use_filter;
+ bool safe_start;
+ bool button_inverted;
+ bool voltage_inverted;
+ float rpm_lim_start;
+ float rpm_lim_end;
+ bool multi_esc;
+ bool tc;
+ float tc_max_diff;
+ uint32_t update_rate_hz;
+} adc_config;
+
+// Nunchuk control types
+typedef enum {
+ CHUK_CTRL_TYPE_NONE = 0,
+ CHUK_CTRL_TYPE_CURRENT,
+ CHUK_CTRL_TYPE_CURRENT_NOREV
+} chuk_control_type;
+
+typedef struct {
+ chuk_control_type ctrl_type;
+ float hyst;
+ float rpm_lim_start;
+ float rpm_lim_end;
+ float ramp_time_pos;
+ float ramp_time_neg;
+ bool multi_esc;
+ bool tc;
+ float tc_max_diff;
+} chuk_config;
+
+typedef struct {
+ // Settings
+ uint8_t controller_id;
+ uint32_t timeout_msec;
+ float timeout_brake_current;
+ bool send_can_status;
+ uint32_t send_can_status_rate_hz;
+
+ // Application to use
+ app_use app_to_use;
+
+ // PPM application settings
+ ppm_config app_ppm_conf;
+
+ // ADC application settings
+ adc_config app_adc_conf;
+
+ // UART application settings
+ uint32_t app_uart_baudrate;
+
+ // Nunchuk application settings
+ chuk_config app_chuk_conf;
+} app_configuration;
+
+// Communication commands
+typedef enum {
+ COMM_FW_VERSION = 0,
+ COMM_JUMP_TO_BOOTLOADER,
+ COMM_ERASE_NEW_APP,
+ COMM_WRITE_NEW_APP_DATA,
+ COMM_GET_VALUES,
+ COMM_SET_DUTY,
+ COMM_SET_CURRENT,
+ COMM_SET_CURRENT_BRAKE,
+ COMM_SET_RPM,
+ COMM_SET_POS,
+ COMM_SET_DETECT,
+ COMM_SET_SERVO_POS,
+ COMM_SET_MCCONF,
+ COMM_GET_MCCONF,
+ COMM_SET_APPCONF,
+ COMM_GET_APPCONF,
+ COMM_SAMPLE_PRINT,
+ COMM_TERMINAL_CMD,
+ COMM_PRINT,
+ COMM_ROTOR_POSITION,
+ COMM_EXPERIMENT_SAMPLE,
+ COMM_DETECT_MOTOR_PARAM,
+ COMM_REBOOT,
+ COMM_ALIVE,
+ COMM_GET_DECODED_PPM,
+ COMM_GET_DECODED_ADC,
+ COMM_GET_DECODED_CHUK,
+ COMM_FORWARD_CAN
+} COMM_PACKET_ID;
+
+// CAN commands
+typedef enum {
+ CAN_PACKET_SET_DUTY = 0,
+ CAN_PACKET_SET_CURRENT,
+ CAN_PACKET_SET_CURRENT_BRAKE,
+ CAN_PACKET_SET_RPM,
+ CAN_PACKET_SET_POS,
+ CAN_PACKET_FILL_RX_BUFFER,
+ CAN_PACKET_FILL_RX_BUFFER_LONG,
+ CAN_PACKET_PROCESS_RX_BUFFER,
+ CAN_PACKET_PROCESS_SHORT_BUFFER,
+ CAN_PACKET_STATUS
+} CAN_PACKET_ID;
+
+// Logged fault data
+typedef struct {
+ mc_fault_code fault;
+ float current;
+ float current_filtered;
+ float voltage;
+ float duty;
+ float rpm;
+ int tacho;
+ int tim_pwm_cnt;
+ int tim_samp_cnt;
+ int comm_step;
+ float temperature;
+} fault_data;
+
+// External LED state
+typedef enum {
+ LED_EXT_OFF = 0,
+ LED_EXT_NORMAL,
+ LED_EXT_BRAKE,
+ LED_EXT_TURN_LEFT,
+ LED_EXT_TURN_RIGHT,
+ LED_EXT_BRAKE_TURN_LEFT,
+ LED_EXT_BRAKE_TURN_RIGHT,
+ LED_EXT_BATT
+} LED_EXT_STATE;
+
+typedef struct {
+ int js_x;
+ int js_y;
+ int acc_x;
+ int acc_y;
+ int acc_z;
+ bool bt_c;
+ bool bt_z;
+} chuck_data;
+
+typedef struct {
+ int id;
+ systime_t rx_time;
+ float rpm;
+ float current;
+ float duty;
+} can_status_msg;
+
+typedef struct {
+ uint8_t js_x;
+ uint8_t js_y;
+ bool bt_c;
+ bool bt_z;
+ bool bt_push;
+ float vbat;
+} mote_state;
+
+typedef enum {
+ MOTE_PACKET_BATT_LEVEL = 0,
+ MOTE_PACKET_BUTTONS,
+ MOTE_PACKET_ALIVE
+} MOTE_PACKET;
+
+#endif /* DATATYPES_H_ */
diff --git a/vesc_driver/include/vesc_driver/v8stdint.h b/vesc_driver/include/vesc_driver/v8stdint.h
new file mode 100644
index 0000000..f3be96b
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/v8stdint.h
@@ -0,0 +1,57 @@
+// This header is from the v8 google project:
+// http://code.google.com/p/v8/source/browse/trunk/include/v8stdint.h
+
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Load definitions of standard types.
+
+#ifndef V8STDINT_H_
+#define V8STDINT_H_
+
+#include
+#include
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t; // NOLINT
+typedef unsigned short uint16_t; // NOLINT
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+// intptr_t and friends are defined in crtdefs.h through stdio.h.
+
+#else
+
+#include
+
+#endif
+
+#endif // V8STDINT_H_
diff --git a/vesc_driver/include/vesc_driver/vesc_driver.h b/vesc_driver/include/vesc_driver/vesc_driver.h
new file mode 100644
index 0000000..2b7f6dc
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/vesc_driver.h
@@ -0,0 +1,63 @@
+// -*- mode:c++; fill-column: 100; -*-
+
+#ifndef VESC_DRIVER_VESC_DRIVER_H_
+#define VESC_DRIVER_VESC_DRIVER_H_
+
+#include
+
+#include
+#include
+
+#include "vesc_driver/vesc_interface.h"
+#include "vesc_driver/vesc_packet.h"
+
+namespace vesc_driver
+{
+
+class VescDriver
+{
+public:
+
+ VescDriver(ros::NodeHandle nh,
+ ros::NodeHandle private_nh);
+
+private:
+ // interface to the VESC
+ VescInterface vesc_;
+ void vescPacketCallback(const boost::shared_ptr& packet);
+ void vescErrorCallback(const std::string& error);
+
+ // ROS services
+ ros::Publisher state_pub_;
+ ros::Subscriber duty_cycle_sub_;
+ ros::Subscriber current_sub_;
+ ros::Subscriber brake_sub_;
+ ros::Subscriber speed_sub_;
+ ros::Subscriber position_sub_;
+ ros::Subscriber servo_sub_;
+ ros::Timer timer_;
+
+ // driver modes (possible states)
+ typedef enum {
+ MODE_INITIALIZING,
+ MODE_OPERATING
+ } driver_mode_t;
+
+ // other variables
+ driver_mode_t driver_mode_; ///< driver state machine mode (state)
+ int fw_version_major_; ///< firmware major version reported by vesc
+ int fw_version_minor_; ///< firmware minor version reported by vesc
+
+ // ROS callbacks
+ void timerCallback(const ros::TimerEvent& event);
+ void dutyCycleCallback(const std_msgs::Float64::ConstPtr& duty_cycle);
+ void currentCallback(const std_msgs::Float64::ConstPtr& current);
+ void brakeCallback(const std_msgs::Float64::ConstPtr& brake);
+ void speedCallback(const std_msgs::Float64::ConstPtr& speed);
+ void positionCallback(const std_msgs::Float64::ConstPtr& position);
+ void servoCallback(const std_msgs::Float64::ConstPtr& servo);
+};
+
+} // namespace vesc_driver
+
+#endif // VESC_DRIVER_VESC_DRIVER_H_
diff --git a/vesc_driver/include/vesc_driver/vesc_interface.h b/vesc_driver/include/vesc_driver/vesc_interface.h
new file mode 100644
index 0000000..3bc50d0
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/vesc_interface.h
@@ -0,0 +1,122 @@
+// -*- mode:c++; fill-column: 100; -*-
+
+#ifndef VESC_DRIVER_VESC_INTERFACE_H_
+#define VESC_DRIVER_VESC_INTERFACE_H_
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include "vesc_driver/vesc_packet.h"
+
+namespace vesc_driver
+{
+
+/**
+ * Class providing an interface to the Vedder VESC motor controller via a serial port interface.
+ */
+class VescInterface : private boost::noncopyable
+{
+public:
+
+ typedef boost::function PacketHandlerFunction;
+ typedef boost::function ErrorHandlerFunction;
+
+ /**
+ * Creates a VescInterface object. Opens the serial port interface to the VESC if @p port is not
+ * empty, otherwise the serial port remains closed until connect() is called.
+ *
+ * @param port Address of the serial port, e.g. '/dev/ttyUSB0'.
+ * @param packet_handler Function this class calls when a VESC packet is received.
+ * @param error_handler Function this class calls when an error is detected, such as a bad
+ * checksum.
+ *
+ * @throw SerialException
+ */
+ VescInterface(const std::string& port = std::string(),
+ const PacketHandlerFunction& packet_handler = PacketHandlerFunction(),
+ const ErrorHandlerFunction& error_handler = ErrorHandlerFunction());
+
+ /**
+ * VescInterface destructor.
+ */
+ ~VescInterface();
+
+ /**
+ * Sets / updates the function that this class calls when a VESC packet is received.
+ */
+ void setPacketHandler(const PacketHandlerFunction& handler);
+
+ /**
+ * Sets / updates the function that this class calls when an error is detected, such as a bad
+ * checksum.
+ */
+ void setErrorHandler(const ErrorHandlerFunction& handler);
+
+ /**
+ * Opens the serial port interface to the VESC.
+ *
+ * @throw SerialException
+ */
+ void connect(const std::string& port);
+
+ /**
+ * Closes the serial port interface to the VESC.
+ */
+ void disconnect();
+
+ /**
+ * Gets the status of the serial interface to the VESC.
+ *
+ * @return Returns true if the serial port is open, false otherwise.
+ */
+ bool isConnected() const;
+
+ /**
+ * Send a VESC packet.
+ */
+ void send(const VescPacket& packet);
+
+ void requestFWVersion();
+ void requestState();
+ void setDutyCycle(double duty_cycle);
+ void setCurrent(double current);
+ void setBrake(double brake);
+ void setSpeed(double speed);
+ void setPosition(double position);
+ void setServo(double servo);
+
+private:
+ // Pimpl - hide serial port members from class users
+ class Impl;
+ boost::scoped_ptr impl_;
+};
+
+// todo: review
+class SerialException : public std::exception
+{
+ // Disable copy constructors
+ SerialException& operator=(const SerialException&);
+ std::string e_what_;
+public:
+ SerialException (const char *description) {
+ std::stringstream ss;
+ ss << "SerialException " << description << " failed.";
+ e_what_ = ss.str();
+ }
+ SerialException (const SerialException& other) : e_what_(other.e_what_) {}
+ virtual ~SerialException() throw() {}
+ virtual const char* what () const throw () {
+ return e_what_.c_str();
+ }
+};
+
+} // namespace vesc_driver
+
+#endif // VESC_DRIVER_VESC_INTERFACE_H_
diff --git a/vesc_driver/include/vesc_driver/vesc_packet.h b/vesc_driver/include/vesc_driver/vesc_packet.h
new file mode 100644
index 0000000..630634e
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/vesc_packet.h
@@ -0,0 +1,194 @@
+// -*- mode:c++; fill-column: 100; -*-
+
+#ifndef VESC_DRIVER_VESC_PACKET_H_
+#define VESC_DRIVER_VESC_PACKET_H_
+
+#include
+#include
+#include
+
+#include
+#include
+
+#include "vesc_driver/v8stdint.h"
+
+namespace vesc_driver
+{
+
+typedef std::vector Buffer;
+typedef std::pair BufferRange;
+typedef std::pair BufferRangeConst;
+
+/** The raw frame for communicating with the VESC */
+class VescFrame
+{
+public:
+ virtual ~VescFrame() {}
+
+ // getters
+ virtual const Buffer& frame() const {return *frame_;}
+
+ // VESC packet properties
+ static const int VESC_MAX_PAYLOAD_SIZE = 1024; ///< Maximum VESC payload size, in bytes
+ static const int VESC_MIN_FRAME_SIZE = 5; ///< Smallest VESC frame size, in bytes
+ static const int VESC_MAX_FRAME_SIZE = 6 + VESC_MAX_PAYLOAD_SIZE; ///< Largest VESC frame size, in bytes
+ static const unsigned int VESC_SOF_VAL_SMALL_FRAME = 2; ///< VESC start of "small" frame value
+ static const unsigned int VESC_SOF_VAL_LARGE_FRAME = 3; ///< VESC start of "large" frame value
+ static const unsigned int VESC_EOF_VAL = 3; ///< VESC end-of-frame value
+
+ /** CRC parameters for the VESC */
+ typedef boost::crc_optimal<16, 0x1021, 0, 0, false, false> CRC;
+
+protected:
+ /** Construct frame with specified payload size. */
+ VescFrame(int payload_size);
+
+ boost::shared_ptr frame_; ///< Stores frame data, shared_ptr for shallow copy
+ BufferRange payload_; ///< View into frame's payload section
+
+private:
+ /** Construct from buffer. Used by VescPacketFactory factory. */
+ VescFrame(const BufferRangeConst& frame, const BufferRangeConst& payload);
+
+ /** Give VescPacketFactory access to private constructor. */
+ friend class VescPacketFactory;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+/** A VescPacket is a VescFrame with a non-zero length payload */
+class VescPacket : public VescFrame
+{
+public:
+ virtual ~VescPacket() {}
+
+ virtual const std::string& name() const {return name_;}
+
+protected:
+ VescPacket(const std::string& name, int payload_size, int payload_id);
+ VescPacket(const std::string& name, boost::shared_ptr raw);
+
+private:
+ std::string name_;
+};
+
+typedef boost::shared_ptr VescPacketPtr;
+typedef boost::shared_ptr VescPacketConstPtr;
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketFWVersion : public VescPacket
+{
+public:
+ VescPacketFWVersion(boost::shared_ptr raw);
+
+ int fwMajor() const;
+ int fwMinor() const;
+
+};
+
+class VescPacketRequestFWVersion : public VescPacket
+{
+public:
+ VescPacketRequestFWVersion();
+
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketValues : public VescPacket
+{
+public:
+ VescPacketValues(boost::shared_ptr raw);
+
+ double v_in() const;
+ double temp_mos1() const;
+ double temp_mos2() const;
+ double temp_mos3() const;
+ double temp_mos4() const;
+ double temp_mos5() const;
+ double temp_mos6() const;
+ double temp_pcb() const;
+ double current_motor() const;
+ double current_in() const;
+ double rpm() const;
+ double duty_now() const;
+ double amp_hours() const;
+ double amp_hours_charged() const;
+ double watt_hours() const;
+ double watt_hours_charged() const;
+ double tachometer() const;
+ double tachometer_abs() const;
+ int fault_code() const;
+
+};
+
+class VescPacketRequestValues : public VescPacket
+{
+public:
+ VescPacketRequestValues();
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetDuty : public VescPacket
+{
+public:
+ VescPacketSetDuty(double duty);
+
+ // double duty() const;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetCurrent : public VescPacket
+{
+public:
+ VescPacketSetCurrent(double current);
+
+ // double current() const;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetCurrentBrake : public VescPacket
+{
+public:
+ VescPacketSetCurrentBrake(double current_brake);
+
+ // double current_brake() const;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetRPM : public VescPacket
+{
+public:
+ VescPacketSetRPM(double rpm);
+
+ // double rpm() const;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetPos : public VescPacket
+{
+public:
+ VescPacketSetPos(double pos);
+
+ // double pos() const;
+};
+
+/*------------------------------------------------------------------------------------------------*/
+
+class VescPacketSetServoPos : public VescPacket
+{
+public:
+ VescPacketSetServoPos(double servo_pos);
+
+ // double servo_pos() const;
+};
+
+} // namespace vesc_driver
+
+#endif // VESC_DRIVER_VESC_PACKET_H_
diff --git a/vesc_driver/include/vesc_driver/vesc_packet_factory.h b/vesc_driver/include/vesc_driver/vesc_packet_factory.h
new file mode 100644
index 0000000..f856f44
--- /dev/null
+++ b/vesc_driver/include/vesc_driver/vesc_packet_factory.h
@@ -0,0 +1,82 @@
+// -*- mode:c++; fill-column: 100; -*-
+
+#ifndef VESC_DRIVER_VESC_PACKET_FACTORY_H_
+#define VESC_DRIVER_VESC_PACKET_FACTORY_H_
+
+#include
+#include