// ServoProtocol.h was generated by ProtoGen version 3.2.a
/*
* This file 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 file 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 .
*
* Author: Oliver Walters / Currawong Engineering Pty Ltd
*/
#ifndef _SERVOPROTOCOL_H
#define _SERVOPROTOCOL_H
// Language target is C, C++ compilers: don't mangle us
#ifdef __cplusplus
extern "C" {
#endif
/*!
* \file
* \mainpage Servo protocol stack
*
* This is the ICD for the Currawong Engineering CAN Servo. This document
* details the Servo command and packet structure for communication with and
* configuration of the Servo
*
* The protocol API enumeration is incremented anytime the protocol is changed
* in a way that affects compatibility with earlier versions of the protocol.
* The protocol enumeration for this version is: 21
*
* The protocol version is 2.11
*/
#include
#include
#include // C string manipulation function header
//! \return the protocol API enumeration
#define getServoApi() 21
//! \return the protocol version string
#define getServoVersion() "2.11"
// Translation provided externally. The macro takes a `const char *` and returns a `const char *`
#ifndef translateServo
#define translateServo(x) x
#endif
typedef enum
{
SERVO_MODE_NORMAL, //!< The servo is in normal operational mode
SERVO_MODE_CALIBRATING,//!< The servo is in calibration mode (factory setting only)
SERVO_MODE_TEST, //!< The servo is in test mode (factory setting only)
SERVO_MODE_NUM_MODES
} ServoModes;
//! \return the label of a 'ServoModes' enum entry, based on its value
const char* ServoModes_EnumLabel(int value);
typedef enum
{
SERVO_TIMEOUT_ACTION_HOLD, //!< The servo will hold the current position
SERVO_TIMEOUT_ACTION_DISABLE,//!< The servo will be disabled
SERVO_TIMEOUT_ACTION_NEUTRAL,//!< The servo will move to its programmed neutral position
SERVO_NUM_TIMEOUT_MODES
} ServoTimeoutModes;
/*!
* Command multiple servo positions with a single command
*/
typedef enum
{
PKT_SERVO_MULTI_COMMAND_1 = 0x00,//!< Send a position command to servos 1,2,3,4
PKT_SERVO_MULTI_COMMAND_2, //!< Send a position command to servos 5,6,7,8
PKT_SERVO_MULTI_COMMAND_3, //!< Send a position command to servos 9,10,11,12
PKT_SERVO_MULTI_COMMAND_4, //!< Send a position command to servos 13,14,15,16
PKT_SERVO_MULTI_COMMAND_5, //!< Send a position command to servos 17,18,19,20
PKT_SERVO_MULTI_COMMAND_6, //!< Send a position command to servos 21,22,23,24
PKT_SERVO_MULTI_COMMAND_7, //!< Send a position command to servos 25,26,27,28
PKT_SERVO_MULTI_COMMAND_8, //!< Send a position command to servos 29,30,31,32
PKT_SERVO_MULTI_COMMAND_9, //!< Send a position command to servos 33,34,35,36
PKT_SERVO_MULTI_COMMAND_10, //!< Send a position command to servos 37,38,39,40
PKT_SERVO_MULTI_COMMAND_11, //!< Send a position command to servos 41,42,43,44
PKT_SERVO_MULTI_COMMAND_12, //!< Send a position command to servos 45,46,47,48
PKT_SERVO_MULTI_COMMAND_13, //!< Send a position command to servos 49,50,51,52
PKT_SERVO_MULTI_COMMAND_14, //!< Send a position command to servos 53,54,55,56
PKT_SERVO_MULTI_COMMAND_15, //!< Send a position command to servos 57,58,59,60
PKT_SERVO_MULTI_COMMAND_16 //!< Send a position command to servos 61,62,63,64
} ServoMultiCommandPackets;
//! \return the label of a 'ServoMultiCommandPackets' enum entry, based on its value
const char* ServoMultiCommandPackets_EnumLabel(int value);
/*!
* Servo CAN packet identifiers
*/
typedef enum
{
PKT_SERVO_POSITION_COMMAND = 0x10, //!< Send a position command to an individual servo
PKT_SERVO_NEUTRAL_COMMAND = 0x15, //!< Move the servo to the neutral position
PKT_SERVO_DISABLE = 0x20, //!< Disable a single servo, or all servos with a broadcast message
PKT_SERVO_ENABLE, //!< Enable a single servo, or all servos with a broadcast message
PKT_SERVO_SYSTEM_COMMAND = 0x50, //!< Servo system command
PKT_SERVO_SET_TITLE, //!< Set the title of this servo
PKT_SERVO_STATUS_A = 0x60, //!< Servo *STATUS_A* packet contains status and position information
PKT_SERVO_STATUS_B, //!< Servo *STATUS_B* packet contains current, temperature and other information
PKT_SERVO_STATUS_C, //!< Reserved for future use
PKT_SERVO_STATUS_D, //!< Reserved for future use
PKT_SERVO_ACCELEROMETER, //!< Raw accelerometer data
PKT_SERVO_ADDRESS = 0x70, //!< Servo address information
PKT_SERVO_TITLE, //!< Servo title information
PKT_SERVO_FIRMWARE, //!< Servo firmware information
PKT_SERVO_SYSTEM_INFO, //!< Servo system info (uptime, etc)
PKT_SERVO_TELEMETRY_CONFIG, //!< Telemetry settings
PKT_SERVO_SETTINGS_INFO, //!< Non-volatile settings configuration information
PKT_SERVO_FACTORY, //!< Factory data
PKT_SERVO_TELLTALE_A = 0x7A, //!< Servo telltale information
PKT_SERVO_LIMITS = 0x80, //!< Servo limits (current, strength, temperature)
PKT_SERVO_CURRENT_LIMITS, //!< Current limit control system settings
PKT_SERVO_POTENTIOMETER, //!< Potentiometer configuration
PKT_SERVO_BACKLASH,
PKT_SERVO_BIN_DATA, //!< Servo telltale binning data
PKT_SERVO_WEAR_LEVEL_A, //!< Wear estimate information packet 1 of 2
PKT_SERVO_WEAR_LEVEL_B, //!< Wear estimate information packet 2 of 2
PKT_SERVO_LOOKUP_TABLE, //!< Input/output mapping table information
PKT_SERVO_LOOKUP_ELEMENT, //!< Input/output mapping table element information
PKT_SERVO_CONFIG, //!< General servo configuration
PKT_SERVO_DELTA_CONFIG, //!< Position error configuration
PKT_SERVO_CALIBRATION, //!< Servo calibration data
PKT_SERVO_MOTION_CONTROL = 0x8C, //!< Servo motion control settings
PKT_SERVO_LIMIT_VALUES, //!< Servo limit value settings
PKT_SERVO_DEBUG_DELTA = 0x90, //!< Position debug information
PKT_SERVO_DEBUG_CTRL_LOOP, //!< Control loop debug information
PKT_SERVO_DEBUG_MOTOR, //!< Motor information
PKT_SERVO_DEBUG_MOTION_CTRL, //!< Motion control debug info
PKT_SERVO_CTRL_LOOP_SETTINGS = 0xA0, //!< Position control loop settings
PKT_SERVO_TELLTALE_SETTINGS = 0x101, //!< Telltale settings packet
PKT_SERVO_USER_SETTINGS = 0x105, //!< User settings (title, ID etc)
PKT_SERVO_SYSTEM_SETTINGS = 0x1FF //!< System settings (serial number, etc)
} ServoPackets;
//! \return the label of a 'ServoPackets' enum entry, based on its value
const char* ServoPackets_EnumLabel(int value);
/*!
* These commands are sent to the servo using the SERVO_SYSTEM_COMMAND packet
*/
typedef enum
{
CMD_SERVO_CONFIGURE_LOOKUP_TABLE = 0x00, //!< Configure I/O map parameters
CMD_SERVO_SET_LOOKUP_TABLE_ELEMENT, //!< Configure an individual I/O element
CMD_SERVO_GET_LOOKUP_TABLE_ELEMENT, //!< Request an individual I/O element
CMD_SERVO_SET_CONFIG = 0x10, //!< Set the servo configuration bits
CMD_SERVO_SET_CURRENT_LIMIT = 0x20, //!< Set the servo current limit
CMD_SERVO_SET_TEMPERATURE_LIMIT, //!< Set the over-temperature warning level
CMD_SERVO_SET_RATE_LIMIT, //!< Set the servo rate limit
CMD_SERVO_SET_STRENGTH, //!< Set the servo 'strength' (maximum motor duty cycle)
CMD_SERVO_SET_ILIMIT_KP, //!< Set the servo current-limit proportional gain value
CMD_SERVO_SET_ILIMIT_KI, //!< Set the servo current-limit integral gain value
CMD_SERVO_SET_MIN_PWM_LIMIT = 0x30, //!< Set the minimum clipping value for the servo PWM signal
CMD_SERVO_SET_MAX_PWM_LIMIT, //!< Set the maximum clipping value for the servo PWM signal
CMD_SERVO_SET_NEUTRAL_POSITION, //!< Set the neutral position for the servo
CMD_SERVO_SET_TELEMETRY_PERIOD = 0x40, //!< Set the servo telemetry period
CMD_SERVO_SET_SILENCE_PERIOD, //!< Set the servo silence period
CMD_SERVO_SET_TELEMETRY_PACKETS, //!< Configure telemetry packets
CMD_SERVO_REQUEST_HF_DATA = 0x43, //!< Request high-frequency telemetry data
CMD_SERVO_SET_CMD_TIMEOUT, //!< Set the command timeout for the servo
CMD_SERVO_SET_NODE_ID = 0x50, //!< Configure the CAN servo node ID
CMD_SERVO_SET_USER_ID_A, //!< Set User ID A
CMD_SERVO_SET_USER_ID_B, //!< Set User ID B
CMD_SERVO_CALIBRATE_POT = 0x60, //!< Initiate servo potentiometer calibration procedure
CMD_SERVO_START_TEST_MODE,
CMD_SERVO_STOP_TEST_MODE,
CMD_SERVO_START_BACKLASH_TEST,
CMD_SERVO_RESET_HALL_COUNTS,
CMD_SERVO_SET_MIDDLE_POS = 0x70,
CMD_SERVO_RESET_TELLTALES = 0x80, //!< Reset servo telltale data
CMD_SERVO_CLEAR_BIN_DATA,
CMD_SERVO_ERASE_EEPROM = 0x90,
CMD_SERVO_SET_COMMISSIONING_FLAG = 0x95, //!< Set servo commissioning flag
CMD_SERVO_RESET_DEFAULT_SETTINGS = 0xA0, //!< Reset servo configuration settings to default values
CMD_SERVO_SET_PROFILE_TASK = 0xF0, //!< Set the task to profile
CMD_SERVO_UNLOCK_SETTINGS = 0xF5, //!< Unlock servo settings
CMD_SERVO_LOCK_SETTINGS, //!< Lock servo settings
CMD_SERVO_ENTER_BOOTLOADER = 0xFB, //!< Enter bootloader mode
CMD_SERVO_RESET, //!< Reset servo
CMD_SERVO_SET_SERIAL_NUMBER = 0xFF //!< Set the serial number
} ServoCommands;
//! \return the label of a 'ServoCommands' enum entry, based on its value
const char* ServoCommands_EnumLabel(int value);
// The prototypes below provide an interface to the packets.
// They are not auto-generated functions, but must be hand-written
//! \return the packet data pointer from the packet
uint8_t* getServoPacketData(void* pkt);
//! \return the packet data pointer from the packet, const
const uint8_t* getServoPacketDataConst(const void* pkt);
//! Complete a packet after the data have been encoded
void finishServoPacket(void* pkt, int size, uint32_t packetID);
//! \return the size of a packet from the packet header
int getServoPacketSize(const void* pkt);
//! \return the ID of a packet from the packet header
uint32_t getServoPacketID(const void* pkt);
#ifdef __cplusplus
}
#endif
#endif // _SERVOPROTOCOL_H