【FastRTPS】Example--自定義話題類型、話題關鍵字

例子來自FastRTPS文檔。

用戶可以通過fastrtpsgen自動生成話題類型,自定義話題類型時,需要實現serialize、deserialize和getKey方法。

關鍵字(Key)的作用:

不同的關鍵字可以看做同一個主題中的不同數據端點,這樣接收端(Subscriber或者RTPSReader)就可以根據關鍵字區分數據源或者數據類別。

關鍵字的使用:

1. 定義實現主題類型中的getKey方法(使用IDL文件時,需指定@Key,再用fastrtpsgen生成)

2. 在創建Publisher / Subscriber 時設置參數WITH_KEY

 

類型聲明:

typedef struct TestType{
    char name[6]; //@key
    int32_t value;
    TestType()
    {
        value = -1;
        COPYSTR(name,"UNDEF"); //Your preferred string copy method
    }
    void print()
    {
        printf("Name: %s",name);
        cout << " |Value: "<< value << endl;
    }
}TestType;

class TestTypeDataType:public TopicDataType
{
public:
    TestTypeDataType()
    {
        setName("TestType");
        m_typeSize = 6+4;
        m_isGetKeyDefined = true;
    };
    ~TestTypeDataType(){};
    bool serialize(void*data,SerializedPayload_t* payload);
    bool deserialize(SerializedPayload_t* payload,void * data);
    bool getKey(void*data,InstanceHandle_t* ihandle);
};

方法實現:

bool TestTypeDataType::serialize(void*data,SerializedPayload_t* payload){
    TestType* ptype = (TestType*)data;
    payload->length = 6+4;
     memcpy(payload->data,ptype->name,6);   
     memcpy(payload->data+6,ptype->value,4);
    return true;
}
bool TestTypeDataType::deserialize(SerializedPayload_t* payload,void * data){
     TestType* ptype = (TestType*)data;
     memcpy(&ptype->name,payload->data,6);
     memcpy(&ptype->value,payload->data+6,4);
     return true;
}
bool TestTypeDataType::getKey(void*data,InstanceHandle_t* handle){
    TestType* tp = (TestType*)data;
    handle->value[0]  = 0;
    handle->value[1]  = 0;
    handle->value[2]  = 0;
    handle->value[3]  = 5; //length of string in CDR BE
    handle->value[4]  = tp->name[0];
    handle->value[5]  = tp->name[1];
    handle->value[6]  = tp->name[2];
    handle->value[7]  = tp->name[3];
    handle->value[8]  = tp->name[4];
    for(uint8_t i=9;i<16;i++)
        handle->value[i]  = 0;
    return true;
}

註冊話題類型:

int main()
{
Participant* part; //CREATE A PARTICIPANT SOMEWHERE
...
TestTypeDataType TestTypeData;
Domain::registerType(part,(TopicDataType*)&TestTypeData);
...
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章