1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/dynamixel.h

172 lines
5.7 KiB
C

/*
* Copyright (C) 2017 Inria
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @defgroup drivers_dynamixel Dynamixel driver
* @ingroup drivers_actuators
* @brief Drivers for any device using dynamixel's servomotors communication bus
*
* The bus is mainly used for servomotors, but a device can be anything : sensors, other actuators.
*
* @{
*
* @file
* @brief Interface definition for Dynamixel devices driver
*
* @author Loïc Dauphin <loic.dauphin@inria.fr>
*/
#ifndef DYNAMIXEL_H
#define DYNAMIXEL_H
#include <stdlib.h>
#include <stdbool.h>
#include "dynamixel_protocol.h"
#include "uart_half_duplex.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef uint8_t dynamixel_id_t; /**< device id type */
typedef uint16_t dynamixel_addr_t; /**< register address type */
/**
* @brief Descriptor struct for a dynamixel device
*/
typedef struct {
uart_half_duplex_t *stream; /**< the stream used */
dynamixel_id_t id; /**< the device address */
} dynamixel_t;
/**
* @brief Possible dynamixel return values
*/
enum {
DYNAMIXEL_OK, /**< Success */
DYNAMIXEL_TIMEOUT, /**< No response from the device */
DYNAMIXEL_BUFFER_TOO_SMALL, /**< Buffer is too small for the message */
DYNAMIXEL_INVALID_MESSAGE, /**< Invalid message received */
};
/**
* @brief Send a PING message to a device
*
* @param[in] stream the stream
* @param[in] id the device address
*
* @return DYNAMIXEL_OK if a device answered
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_ping(uart_half_duplex_t *stream, dynamixel_id_t id);
/**
* @brief Initialize a Dynamixel device
*
* @param[out] device the Dynamixel device
* @param[in] stream the stream
* @param[in] id the device address
*/
void dynamixel_init(dynamixel_t *device, uart_half_duplex_t *stream, dynamixel_id_t id);
/**
* @brief Write to a device 8bits register
*
* @param[in] device the Dynamixel device
* @param[in] reg the register to write
* @param[in] value the value to write
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_write8(const dynamixel_t *device, dynamixel_addr_t reg, uint8_t value);
/**
* @brief Write to a device 16bits register
*
* @param[in] device the Dynamixel device
* @param[in] reg the register to write
* @param[in] value the value to write
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_write16(const dynamixel_t *device, dynamixel_addr_t reg, uint16_t value);
/**
* @brief Write to a device address
*
* @param[in] device the Dynamixel device
* @param[in] reg the address to start write
* @param[in] data the data to write
* @param[in] length the data length
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_write(const dynamixel_t *device, dynamixel_addr_t reg, const uint8_t *data, size_t length);
/**
* @brief Read from a device 8bits register
*
* @param[in] device the Dynamixel device
* @param[in] reg the register to read
* @param[out] value the value to read
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_read8(const dynamixel_t *device, dynamixel_addr_t reg, uint8_t *value);
/**
* @brief Read from a device 16bits register
*
* @param[in] device the Dynamixel device
* @param[in] reg the register to read
* @param[out] value the value to read
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_read16(const dynamixel_t *device, dynamixel_addr_t reg, uint16_t *value);
/**
* @brief Read from a device address
*
* @param[in] device the Dynamixel device
* @param[in] reg the address to start read
* @param[out] data the data buffer to fill
* @param[in] length the data length
*
* @return DYNAMIXEL_OK on success
* @return DYNAMIXEL_TIMEOUT if the device did not answer
* @return DYNAMIXEL_BUFFER_TOO_SMALL if buffer is too small for the message
* @return DYNAMIXEL_INVALID_MESSAGE if an invalid message was received
*/
int dynamixel_read(const dynamixel_t *device, dynamixel_addr_t reg, uint8_t *data, size_t length);
#ifdef __cplusplus
}
#endif
#endif /* DYNAMIXEL_H */
/** @} */