Skip to content

4.8 C99 Registers Interface

Overview

C99 Registers provides read/write operations for R, PR, SR, MR, MH, and MI registers. C99 functions are flat entry points; strings and structures use caller-provided buffers.

Corresponding header:

  • include/c_arm_registers.h

Interface Signatures

Arm_Registers_ReadR

c
int Arm_Registers_ReadR(ArmHandle* h, int index, double* outValue);
ItemDescription
DescriptionReads an R register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , R register ID
outValue : double* , output R value pointer
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_WriteR

c
int Arm_Registers_WriteR(ArmHandle* h, int index, double value);
ItemDescription
DescriptionWrites an R register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , R register ID
value : double , value to write into the R register
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_DeleteR

c
int Arm_Registers_DeleteR(ArmHandle* h, int index);
ItemDescription
DescriptionDeletes an R register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , R register ID
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_ReadPR

c
int Arm_Registers_ReadPR(ArmHandle* h, int index, ArmPoseRegister* outReg);
ItemDescription
DescriptionReads a PR pose register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , PR register ID
outReg : ArmPoseRegister* , output PR structure allocated by the caller
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_WritePR

c
int Arm_Registers_WritePR(ArmHandle* h, const ArmPoseRegister* reg);
ItemDescription
DescriptionWrites a PR pose register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
reg : const ArmPoseRegister* , pointer parameter whose lifetime must remain valid during the call
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_DeletePR

c
int Arm_Registers_DeletePR(ArmHandle* h, int index);
ItemDescription
DescriptionDeletes a PR pose register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , PR register ID
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_ReadSR

c
int Arm_Registers_ReadSR(ArmHandle* h, int index, char* outBuf, size_t bufSize);
ItemDescription
DescriptionReads an SR string register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , SR register ID
outBuf : char* , output string buffer allocated by the caller
bufSize : size_t , output buffer size, including space for the trailing \0
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes
NotesString output uses the caller-provided buffer. If the buffer is insufficient, the function returns according to the status code

Arm_Registers_WriteSR

c
int Arm_Registers_WriteSR(ArmHandle* h, int index, const char* value);
ItemDescription
DescriptionWrites an SR string register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , SR register ID
value : const char* , SR string value to write
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_DeleteSR

c
int Arm_Registers_DeleteSR(ArmHandle* h, int index);
ItemDescription
DescriptionDeletes an SR string register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , SR register ID
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_ReadMR

c
int Arm_Registers_ReadMR(ArmHandle* h, int index, int* outValue);
ItemDescription
DescriptionReads an MR register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MR register ID
outValue : int* , output MR value pointer
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_WriteMR

c
int Arm_Registers_WriteMR(ArmHandle* h, int index, int value);
ItemDescription
DescriptionWrites an MR register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MR register ID
value : int , value to write into the MR register
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_DeleteMR

c
int Arm_Registers_DeleteMR(ArmHandle* h, int index);
ItemDescription
DescriptionDeletes an MR register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MR register ID
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_ReadMH

c
int Arm_Registers_ReadMH(ArmHandle* h, int index, int* outValue);
ItemDescription
DescriptionReads an MH register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MH register ID
outValue : int* , output MH value pointer
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_WriteMH

c
int Arm_Registers_WriteMH(ArmHandle* h, int index, int value);
ItemDescription
DescriptionWrites an MH register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MH register ID
value : int , value to write into the MH register
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_ReadMI

c
int Arm_Registers_ReadMI(ArmHandle* h, int index, int* outValue);
ItemDescription
DescriptionReads an MI register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MI register ID
outValue : int* , output MI value pointer
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Arm_Registers_WriteMI

c
int Arm_Registers_WriteMI(ArmHandle* h, int index, int value);
ItemDescription
DescriptionWrites an MI register
Request Parametersh : ArmHandle* , C99 session handle, usually from Arm_Create() ; business APIs require connection first
index : int , MI register ID
value : int , value to write into the MI register
Return ValueSTATUS_CODE integer value; 0 means success, other values should be handled as status codes

Register Types

TypeReadWriteDeleteData
RArm_Registers_ReadRArm_Registers_WriteRArm_Registers_DeleteRdouble
PRArm_Registers_ReadPRArm_Registers_WritePRArm_Registers_DeletePRArmPoseRegister
SRArm_Registers_ReadSRArm_Registers_WriteSRArm_Registers_DeleteSRString
MRArm_Registers_ReadMRArm_Registers_WriteMRArm_Registers_DeleteMRint
MHArm_Registers_ReadMHArm_Registers_WriteMHNo delete APIint
MIArm_Registers_ReadMIArm_Registers_WriteMINo delete APIint

Parameters and Rules

ItemRule
indexController-side register ID
Arm_Registers_ReadSR()Uses char* + bufSize to output the string. The buffer must include space for the trailing \0
Arm_Registers_ReadPR()Outputs ArmPoseRegister ; caller passes a valid structure pointer
Arm_Registers_WritePR()Uses ArmPoseRegister.id to specify the PR ID to write
MH / MIProvide read/write APIs, but no delete APIs
Write and deleteChange controller register state; confirm the site business before running them

ArmPoseRegister Fields

FieldTypeDescription
idintPR register ID
cartdouble[6]Cartesian pose data
jointdouble[9]Joint pose data
poseTypeintPose type. See ArmPoseType
turnCycleint[9]Joint turn-cycle information
wristFlipintWrist flip flag
armUpDownintArm up/down posture flag
armBackFrontintArm back/front posture flag
armLeftRightintArm left/right posture flag
namechar[64]Pose name
commentchar[128]Pose comment

Minimal Call Example

c
#include <stdio.h>     // printf for printing R register value
#include "c_arm_api.h" // C99 SDK umbrella header

int main(void)
{
    ArmHandle* h = Arm_Create();
    double rValue = 0.0;
    if (h == NULL) {
        return 1;
    }

    if (Arm_Connect(h, "10.27.1.2", "10.27.1.102") != 0) {
        Arm_Destroy(h);
        return 1;
    }

    int ret = Arm_Registers_ReadR(h, 1, &rValue);
    printf("r1=%f\n", rValue);
    Arm_Disconnect(h);
    Arm_Destroy(h);
    return ret == 0 ? 0 : 1;
}

Scenario Examples

c
double rValue = 0.0;
ArmPoseRegister pr = {0};
char sr[128] = {0};
int mr = 0;
int mh = 0;
int mi = 0;
int readRRet = Arm_Registers_ReadR(h, 1, &rValue);
int readPRRet = Arm_Registers_ReadPR(h, 1, &pr);
int readSRRet = Arm_Registers_ReadSR(h, 1, sr, sizeof(sr));
int readMRRet = Arm_Registers_ReadMR(h, 1, &mr);
int readMHRet = Arm_Registers_ReadMH(h, 1, &mh);
int readMIRet = Arm_Registers_ReadMI(h, 1, &mi);
/* int writeRRet = Arm_Registers_WriteR(h, 1, rValue); */
/* int writePRRet = Arm_Registers_WritePR(h, &pr); */
/* int writeSRRet = Arm_Registers_WriteSR(h, 1, "demo"); */
/* int writeMRRet = Arm_Registers_WriteMR(h, 1, mr); */
/* int writeMHRet = Arm_Registers_WriteMH(h, 1, mh); */
/* int writeMIRet = Arm_Registers_WriteMI(h, 1, mi); */
/* int deleteRRet = Arm_Registers_DeleteR(h, 1); */
/* int deletePRRet = Arm_Registers_DeletePR(h, 1); */
/* int deleteSRRet = Arm_Registers_DeleteSR(h, 1); */
/* int deleteMRRet = Arm_Registers_DeleteMR(h, 1); */
(void)readRRet;
(void)readPRRet;
(void)readSRRet;
(void)readMRRet;
(void)readMHRet;
(void)readMIRet;

Example code:

c99/registers_basic/src/main.cpp
cpp
#include <stdio.h>
#include <string.h>

extern "C" {
#include "c_arm_api.h"
}

int main(void)
{
    // [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
    // [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
    // [ZH] 创建并连接 SDK 句柄。
    // [EN] Create the SDK handle and connect to the robot.
    ArmHandle* handle = Arm_Create();
    if (handle == NULL) {
        printf("[c99_registers] 创建句柄失败 / Failed to create the handle\n");
        return 1;
    }
    int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
    if (ret != 0) {
        printf("[c99_registers] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
        Arm_Destroy(handle);
        return 1;
    }
    printf("[c99_registers] 机器人连接成功 / Robot connected successfully\n");

    // [ZH] 顺序读取全部寄存器类型。
    // [EN] Read all register types in sequence.
    double rValue = 0.0;
    ArmPoseRegister prValue;
    char srValue[256] = {0};
    int mrValue = 0;
    int mhValue = 0;
    int miValue = 0;
    memset(&prValue, 0, sizeof(prValue));
    ret = Arm_Registers_ReadR(handle, 0, &rValue);
    printf("[c99_registers] ReadR 状态码 / ReadR status code: %d, R[0]=%.6f\n", ret, rValue);
    ret = Arm_Registers_ReadPR(handle, 0, &prValue);
    printf("[c99_registers] ReadPR 状态码 / ReadPR status code: %d, PR[0].id=%d, name=%s\n", ret, prValue.id, prValue.name);
    ret = Arm_Registers_ReadSR(handle, 0, srValue, sizeof(srValue));
    printf("[c99_registers] ReadSR 状态码 / ReadSR status code: %d, SR[0]=%s\n", ret, srValue);
    ret = Arm_Registers_ReadMR(handle, 0, &mrValue);
    printf("[c99_registers] ReadMR 状态码 / ReadMR status code: %d, MR[0]=%d\n", ret, mrValue);
    ret = Arm_Registers_ReadMH(handle, 0, &mhValue);
    printf("[c99_registers] ReadMH 状态码 / ReadMH status code: %d, MH[0]=%d\n", ret, mhValue);
    ret = Arm_Registers_ReadMI(handle, 0, &miValue);
    printf("[c99_registers] ReadMI 状态码 / ReadMI status code: %d, MI[0]=%d\n", ret, miValue);

    // [ZH] 顺序执行全部写接口与删除接口。
    // [EN] Execute all write APIs and delete APIs in sequence.
    ret = Arm_Registers_WriteR(handle, 0, rValue);
    printf("[c99_registers] WriteR 状态码 / WriteR status code: %d\n", ret);
    ret = Arm_Registers_DeleteR(handle, 0);
    printf("[c99_registers] DeleteR 状态码 / DeleteR status code: %d\n", ret);
    ret = Arm_Registers_WritePR(handle, &prValue);
    printf("[c99_registers] WritePR 状态码 / WritePR status code: %d\n", ret);
    ret = Arm_Registers_DeletePR(handle, prValue.id);
    printf("[c99_registers] DeletePR 状态码 / DeletePR status code: %d\n", ret);
    ret = Arm_Registers_WriteSR(handle, 0, srValue);
    printf("[c99_registers] WriteSR 状态码 / WriteSR status code: %d\n", ret);
    ret = Arm_Registers_DeleteSR(handle, 0);
    printf("[c99_registers] DeleteSR 状态码 / DeleteSR status code: %d\n", ret);
    ret = Arm_Registers_WriteMR(handle, 0, mrValue);
    printf("[c99_registers] WriteMR 状态码 / WriteMR status code: %d\n", ret);
    ret = Arm_Registers_DeleteMR(handle, 0);
    printf("[c99_registers] DeleteMR 状态码 / DeleteMR status code: %d\n", ret);
    ret = Arm_Registers_WriteMH(handle, 0, mhValue);
    printf("[c99_registers] WriteMH 状态码 / WriteMH status code: %d\n", ret);
    ret = Arm_Registers_WriteMI(handle, 0, miValue);
    printf("[c99_registers] WriteMI 状态码 / WriteMI status code: %d\n", ret);

    // [ZH] 断开连接并销毁句柄。
    // [EN] Disconnect and destroy the handle.
    Arm_Disconnect(handle);
    Arm_Destroy(handle);
    printf("[c99_registers] 示例结束 / Example finished\n");
    return 0;
}