Skip to content

Commit b13ba81

Browse files
authored
Merge pull request #12 from toppers/varray
可変配列長対応しました!
2 parents 56321ac + 3490d0c commit b13ba81

File tree

106 files changed

+4627
-3088
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+4627
-3088
lines changed

README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,25 @@ pdu/types
8181
```
8282

8383

84-
84+
## 設計情報
85+
86+
### offset
87+
88+
* 0列目:配列有無
89+
* single:配列ではない
90+
* array:固定長配列
91+
* varray:可変長配列
92+
* 1列目:データ型の種類
93+
* primitive:プリミティブデータ型
94+
* struct:構造体
95+
* 2列目:メンバ名
96+
* 3列目:データ型名
97+
* 4列目:メンバ・オフセット(単位:バイト)
98+
* 5列目:メンバ・サイズ(単位:バイト)
99+
* 固定長配列の場合:データ型のサイズ✖️配列長
100+
* 可変長配列の場合:データ型のサイズ(実行時まで配列長がわからないので配列長はかけられない)
101+
* 6列目:配列長
102+
* 固定長配列の場合:配列長
103+
* 可変長配列の場合:8固定(参照データ)
104+
* 0バイト目:配列長
105+
* 4バイト目:ヒープ領域のオフセット(単位:バイト)

config/ros_msgs.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ builtin_interfaces/Time
2929
std_msgs/String
3030
std_msgs/Bool
3131
sensor_msgs/PointCloud2
32-
hako_msgs/GameControllerOperation
32+
hako_msgs/GameControllerOperation
33+
hako_msgs/SimpleStructVarray

config/varray_size.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
}
66
},
77
"sensor_msgs": {
8-
"LaserScan": {
9-
"ranges": 360,
10-
"intensities": 360
11-
},
128
"PointCloud2": {
139
"fields": 4,
1410
"data": 176656
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"fields": [
3+
{
4+
"name": "aaa",
5+
"type": "int32"
6+
},
7+
{
8+
"name": "fixed_str",
9+
"type": "string[2]"
10+
},
11+
{
12+
"name": "varray_str",
13+
"type": "string[]"
14+
},
15+
{
16+
"name": "fixed_array",
17+
"type": "SimpleVarray[5]"
18+
},
19+
{
20+
"name": "data",
21+
"type": "SimpleVarray[]"
22+
}
23+
]
24+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"fields": [
3+
{
4+
"name": "data",
5+
"type": "int8[]"
6+
},
7+
{
8+
"name": "fixed_array",
9+
"type": "int8[10]"
10+
},
11+
{
12+
"name": "p_mem1",
13+
"type": "int32"
14+
}
15+
]
16+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
single:primitive:aaa:int32:0:4
2+
array:primitive:fixed_str:string:4:256:2
3+
varray:primitive:varray_str:string:260:128:8
4+
array:struct:fixed_array:SimpleVarray:268:120:5
5+
varray:struct:data:SimpleVarray:388:24:8
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
varray:primitive:data:int8:0:1:8
2+
array:primitive:fixed_array:int8:8:10:10
3+
single:primitive:p_mem1:int32:20:4

pdu/offset/sensor_msgs/LaserScan.offset

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ single:primitive:time_increment:float32:148:4
66
single:primitive:scan_time:float32:152:4
77
single:primitive:range_min:float32:156:4
88
single:primitive:range_max:float32:160:4
9-
array:primitive:ranges:float32:164:1440:360
10-
array:primitive:intensities:float32:1604:1440:360
9+
varray:primitive:ranges:float32:164:4:8
10+
varray:primitive:intensities:float32:172:4:8

pdu/types/builtin_interfaces/pdu_ctype_conv_Time.hpp

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "pdu_primitive_ctypes.h"
55
#include "ros_primitive_types.hpp"
66
#include "pdu_primitive_ctypes_conv.hpp"
7+
#include "pdu_dynamic_memory.hpp"
78
/*
89
* Dependent pdu data
910
*/
@@ -22,80 +23,81 @@
2223
* PDU ==> ROS2
2324
*
2425
***************************/
25-
static inline int hako_convert_pdu2ros_Time(Hako_Time &src, builtin_interfaces::msg::Time &dst)
26+
27+
static inline int _pdu2ros_Time(const char* heap_ptr, Hako_Time &src, builtin_interfaces::msg::Time &dst)
2628
{
27-
//primitive convert
29+
// primitive convert
2830
hako_convert_pdu2ros(src.sec, dst.sec);
29-
//primitive convert
31+
// primitive convert
3032
hako_convert_pdu2ros(src.nanosec, dst.nanosec);
33+
(void)heap_ptr;
3134
return 0;
3235
}
3336

34-
template<int _src_len, int _dst_len>
35-
int hako_convert_pdu2ros_array_Time(Hako_Time src[], std::array<builtin_interfaces::msg::Time, _dst_len> &dst)
37+
static inline int hako_convert_pdu2ros_Time(Hako_Time &src, builtin_interfaces::msg::Time &dst)
3638
{
37-
int ret = 0;
38-
int len = _dst_len;
39-
if (_dst_len > _src_len) {
40-
len = _src_len;
41-
ret = -1;
39+
void* base_ptr = (void*)&src;
40+
void* heap_ptr = hako_get_heap_ptr_pdu(base_ptr);
41+
// Validate magic number and version
42+
if (heap_ptr == nullptr) {
43+
return -1; // Invalid PDU metadata
4244
}
43-
for (int i = 0; i < len; i++) {
44-
(void)hako_convert_pdu2ros_Time(src[i], dst[i]);
45+
else {
46+
return _pdu2ros_Time((char*)heap_ptr, src, dst);
4547
}
46-
return ret;
47-
}
48-
template<int _src_len, int _dst_len>
49-
int hako_convert_pdu2ros_array_Time(Hako_Time src[], std::vector<builtin_interfaces::msg::Time> &dst)
50-
{
51-
dst.resize(_src_len);
52-
for (int i = 0; i < _src_len; i++) {
53-
(void)hako_convert_pdu2ros_Time(src[i], dst[i]);
54-
}
55-
return 0;
5648
}
5749

5850
/***************************
5951
*
6052
* ROS2 ==> PDU
6153
*
6254
***************************/
63-
static inline int hako_convert_ros2pdu_Time(builtin_interfaces::msg::Time &src, Hako_Time &dst)
55+
56+
static inline bool _ros2pdu_Time(builtin_interfaces::msg::Time &src, Hako_Time &dst, PduDynamicMemory &dynamic_memory)
6457
{
65-
//primitive convert
66-
hako_convert_ros2pdu(src.sec, dst.sec);
67-
//primitive convert
68-
hako_convert_ros2pdu(src.nanosec, dst.nanosec);
69-
return 0;
58+
try {
59+
// primitive convert
60+
hako_convert_ros2pdu(src.sec, dst.sec);
61+
// primitive convert
62+
hako_convert_ros2pdu(src.nanosec, dst.nanosec);
63+
} catch (const std::runtime_error& e) {
64+
std::cerr << "convertor error: " << e.what() << std::endl;
65+
return false;
66+
}
67+
(void)dynamic_memory;
68+
return true;
7069
}
7170

72-
template<int _src_len, int _dst_len>
73-
int hako_convert_ros2pdu_array_Time(std::array<builtin_interfaces::msg::Time, _src_len> &src, Hako_Time dst[])
71+
static inline int hako_convert_ros2pdu_Time(builtin_interfaces::msg::Time &src, Hako_Time** dst)
7472
{
75-
int ret = 0;
76-
int len = _dst_len;
77-
if (_dst_len > _src_len) {
78-
len = _src_len;
79-
ret = -1;
73+
PduDynamicMemory dynamic_memory;
74+
Hako_Time out;
75+
if (!_ros2pdu_Time(src, out, dynamic_memory)) {
76+
return -1;
8077
}
81-
for (int i = 0; i < len; i++) {
82-
(void)hako_convert_ros2pdu_Time(src[i], dst[i]);
78+
int heap_size = dynamic_memory.get_total_size();
79+
void* base_ptr = hako_create_empty_pdu(sizeof(Hako_Time), heap_size);
80+
if (base_ptr == nullptr) {
81+
return -1;
8382
}
84-
return ret;
83+
// Copy out on base data
84+
memcpy(base_ptr, (void*)&out, sizeof(Hako_Time));
85+
86+
// Copy dynamic part and set offsets
87+
void* heap_ptr = hako_get_heap_ptr_pdu(base_ptr);
88+
dynamic_memory.copy_to_pdu((char*)heap_ptr);
89+
90+
*dst = (Hako_Time*)base_ptr;
91+
return hako_get_pdu_meta_data(base_ptr)->total_size;
8592
}
86-
template<int _src_len, int _dst_len>
87-
int hako_convert_ros2pdu_array_Time(std::vector<builtin_interfaces::msg::Time> &src, Hako_Time dst[])
93+
94+
static inline Hako_Time* hako_create_empty_pdu_Time(int heap_size)
8895
{
89-
int ret = 0;
90-
int len = _dst_len;
91-
if (_dst_len > _src_len) {
92-
len = _src_len;
93-
ret = -1;
94-
}
95-
for (int i = 0; i < len; i++) {
96-
(void)hako_convert_ros2pdu_Time(src[i], dst[i]);
96+
// Allocate PDU memory
97+
char* base_ptr = (char*)hako_create_empty_pdu(sizeof(Hako_Time), heap_size);
98+
if (base_ptr == nullptr) {
99+
return nullptr;
97100
}
98-
return ret;
101+
return (Hako_Time*)base_ptr;
99102
}
100-
101103
#endif /* _PDU_CTYPE_CONV_HAKO_builtin_interfaces_Time_HPP_ */

pdu/types/can_msgs/pdu_ctype_HakoCan.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include "can_msgs/pdu_ctype_HakoCanHead.h"
77

88
typedef struct {
9-
Hako_HakoCanHead head;
10-
Hako_HakoCanBody body;
9+
Hako_HakoCanHead head;
10+
Hako_HakoCanBody body;
1111
} Hako_HakoCan;
1212

1313
#endif /* _pdu_ctype_can_msgs_HakoCan_H_ */

0 commit comments

Comments
 (0)