Ce document explique comment utiliser la bibliothèque ST3215 Rust depuis du code C/C++.
La bibliothèque ST3215 expose une interface FFI (Foreign Function Interface) compatible C, permettant son utilisation depuis C++ et d'autres langages supportant les ABI C.
- Module FFI (
src/ffi.rs) - Expose les fonctions Rust via une interface C - Header C (
include/st3215.h) - Déclarations de fonctions pour C/C++ - Bibliothèque dynamique - Compilée en
.dll(Windows),.so(Linux) ou.dylib(macOS)
- Rust : Installation via rustup
- CMake : Version 3.15 ou supérieure
- Compilateur C++ :
- Windows : Visual Studio 2019+ ou MinGW
- Linux : GCC ou Clang
- macOS : Xcode Command Line Tools
build.batchmod +x build.sh
./build.sh-
Compiler la bibliothèque Rust :
cargo build --release
-
Le header est généré automatiquement lors du build dans
include/st3215.h -
Compiler l'exemple C++ :
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release ../examples/cpp cmake --build . --config Release
#include "st3215.h"ST3215Handle* handle = st3215_new("COM3"); // Windows
// ou
ST3215Handle* handle = st3215_new("/dev/ttyUSB0"); // Linux// Ping un servo
int32_t found = st3215_ping_servo(handle, 1);
// Lire la position
uint16_t position;
if (st3215_read_position(handle, 1, &position) == 0) {
std::cout << "Position: " << position << std::endl;
}
// Déplacer le servo
st3215_move_to(handle, 1, 2048, 1000, 50);
// Vérifier si en mouvement
int32_t moving = st3215_is_moving(handle, 1);st3215_free(handle);ST3215Handle* st3215_new(const char* device);Crée une nouvelle instance ST3215. Retourne NULL en cas d'erreur.
void st3215_free(ST3215Handle* handle);Libère une instance ST3215.
int32_t st3215_ping_servo(ST3215Handle* handle, uint8_t servo_id);Vérifie la présence d'un servo. Retourne 1 si trouvé, 0 sinon.
size_t st3215_list_servos(ST3215Handle* handle, uint8_t* out_ids, size_t max_ids);Liste tous les servos connectés. Retourne le nombre de servos trouvés.
int32_t st3215_move_to(ST3215Handle* handle, uint8_t servo_id,
uint16_t position, uint16_t speed, uint8_t acceleration);Déplace un servo vers une position cible.
position: 0-4095speed: 0-4095acceleration: 0-254
int32_t st3215_is_moving(ST3215Handle* handle, uint8_t servo_id);Vérifie si un servo est en mouvement. Retourne 1 si en mouvement, 0 si arrêté, -1 en cas d'erreur.
int32_t st3215_enable_torque(ST3215Handle* handle, uint8_t servo_id, int32_t enable);Active ou désactive le couple d'un servo.
int32_t st3215_read_position(ST3215Handle* handle, uint8_t servo_id, uint16_t* out_position);Lit la position actuelle (0-4095).
int32_t st3215_read_speed(ST3215Handle* handle, uint8_t servo_id, uint16_t* out_speed);Lit la vitesse actuelle.
int32_t st3215_read_voltage(ST3215Handle* handle, uint8_t servo_id, float* out_voltage);Lit la tension en volts.
int32_t st3215_read_current(ST3215Handle* handle, uint8_t servo_id, float* out_current);Lit le courant en mA.
int32_t st3215_read_temperature(ST3215Handle* handle, uint8_t servo_id, uint8_t* out_temperature);Lit la température en °C.
int32_t st3215_read_load(ST3215Handle* handle, uint8_t servo_id, float* out_load);Lit la charge en pourcentage.
char* st3215_version(void);Retourne la version de la bibliothèque. La chaîne doit être libérée avec st3215_free_string.
void st3215_free_string(char* s);Libère une chaîne allouée par la bibliothèque.
Voir examples/cpp/example.cpp pour un exemple complet démontrant :
- Connexion au port série
- Scan des servos
- Lecture des informations
- Contrôle de mouvement
- Gestion des erreurs
Pour intégrer la bibliothèque dans votre projet CMake :
# Définir le chemin vers la bibliothèque
set(ST3215_ROOT "/path/to/servo-controller")
set(ST3215_INCLUDE "${ST3215_ROOT}/include")
set(ST3215_LIB "${ST3215_ROOT}/target/release")
# Ajouter l'include
target_include_directories(your_target PRIVATE ${ST3215_INCLUDE})
# Lier la bibliothèque
if(WIN32)
target_link_libraries(your_target PRIVATE "${ST3215_LIB}/st3215.dll.lib")
else()
target_link_libraries(your_target PRIVATE "${ST3215_LIB}/libst3215.so")
endif()Les fonctions retournent généralement :
0en cas de succès-1en cas d'erreurNULLpour les pointeurs en cas d'échec
Toujours vérifier les valeurs de retour avant d'utiliser les données.
L'instance ST3215Handle utilise des mutex en interne pour protéger l'accès au port série. Vous pouvez appeler les fonctions depuis plusieurs threads, mais gardez à l'esprit que les opérations série sont séquentielles.
- Port série : Assurez-vous d'avoir les permissions nécessaires sur le port série (Linux/macOS)
- Baudrate : Le baudrate par défaut est 1000000 bps
- Timeout : Les opérations ont un timeout de 50ms par défaut
- Ressources : Toujours appeler
st3215_free()pour libérer les ressources
Copiez st3215.dll dans le même répertoire que votre exécutable, ou ajoutez le chemin à la variable PATH.
sudo usermod -a -G dialout $USER
# Déconnexion/reconnexion nécessairexattr -d com.apple.quarantine libst3215.dylibPour plus d'informations, consultez :
- README.md du projet
- Documentation Rust :
cargo doc --open - Exemples dans
examples/