Skip to content

Commit 6c9a88f

Browse files
Julián Bermúdez OrtegaBorjaOuterelo
andauthored
Release v1.2.0 (#52)
* Isolated install (#48) * Add isolated install flag. * Add isolated and non-isolated CI tests. * Fix Windows warning in CI. * Add colcon.pkg file. (#49) * Origin/Offset [7903] (#51) * Implement ucdr_advance_buffer function. * Add origin and offset to ucdrBuffer struct. * Refactor basic functions. * Fix ucdr_advance_buffer function. * Update README.md with the new functions provided. * Set project version to 1.2.0. * Bugfix in ucdr_reset_buffer function (#53) * Add unit tests for common functions. * Fix ucdr_reset_buffer function. Co-authored-by: Borja Outerelo <borjaouterelo@gmail.com>
1 parent b156463 commit 6c9a88f

11 files changed

Lines changed: 382 additions & 41 deletions

File tree

CMakeLists.txt

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,14 @@ option(UCDR_SUPERBUILD "Enable superbuild compilation." ON)
2424
option(UCDR_BUILD_TESTS "Build tests." OFF)
2525
option(UCDR_BUILD_EXAMPLES "Build examples." OFF)
2626
option(UCDR_PIC "Control Position Independent Code." ON)
27+
option(UCDR_ISOLATED_INSTALL "Install the project into a separated folder with version control." ON)
2728
option(BUILD_SHARED_LIBS "Control shared/static library building." OFF)
2829

2930
option(UCDR_BUILD_CI_TESTS "Build CI test cases." OFF)
3031
if(UCDR_BUILD_CI_TESTS)
3132
set(UCDR_BUILD_TESTS ON)
3233
endif()
3334

34-
include(GNUInstallDirs)
35-
set(BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for binaries")
36-
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for C headers")
37-
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
38-
set(DATA_INSTALL_DIR ${CMAKE_INSTALL_DATADIR} CACHE PATH "Installation directory for data")
39-
if(WIN32)
40-
set(LICENSE_INSTALL_DIR . CACHE PATH "Installation directory for licenses")
41-
else()
42-
set(LICENSE_INSTALL_DIR ${DATA_INSTALL_DIR}/${PROJECT_NAME} CACHE PATH "Installation directory for licenses")
43-
endif()
4435
set(CONFIG_BIG_ENDIANNESS OFF CACHE BOOL "Set the machine endianness to big endianness (default: little endianness).")
4536

4637
# Set CMAKE_BUILD_TYPE to Release by default.
@@ -57,7 +48,7 @@ endif()
5748
###############################################################################
5849
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
5950
if(NOT UCDR_SUPERBUILD)
60-
project(microcdr VERSION "1.1.2" LANGUAGES C)
51+
project(microcdr VERSION "1.2.0" LANGUAGES C)
6152
else()
6253
project(ucdr_superbuild NONE)
6354
include(${PROJECT_SOURCE_DIR}/cmake/SuperBuild.cmake)
@@ -81,6 +72,24 @@ if(MSVC OR MSVC_IDE)
8172
check_msvc_arch()
8273
endif()
8374

75+
###############################################################################
76+
# Set install directories
77+
###############################################################################
78+
if(UCDR_ISOLATED_INSTALL)
79+
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}-${PROJECT_VERSION}")
80+
endif()
81+
82+
include(GNUInstallDirs)
83+
set(BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for binaries")
84+
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for C headers")
85+
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
86+
set(DATA_INSTALL_DIR ${CMAKE_INSTALL_DATADIR} CACHE PATH "Installation directory for data")
87+
if(WIN32)
88+
set(LICENSE_INSTALL_DIR . CACHE PATH "Installation directory for licenses")
89+
else()
90+
set(LICENSE_INSTALL_DIR ${DATA_INSTALL_DIR}/${PROJECT_NAME} CACHE PATH "Installation directory for licenses")
91+
endif()
92+
8493
###############################################################################
8594
# Targets
8695
###############################################################################

README.md

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@ As *MicroCDR* uses a static buffer, that means the user has to provide a defined
5454
## API functions
5555
5656
```c
57-
void ucdr_init_buffer (ucdrBuffer* ub, uint8_t* data, size_t size);
58-
void ucdr_init_buffer_offset (ucdrBuffer* ub, uint8_t* data, size_t size, size_t offset);
57+
void ucdr_init_buffer (ucdrBuffer* ub, uint8_t* data, size_t size);
58+
void ucdr_init_buffer_origin (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin);
59+
void ucdr_init_buffer_origin_offset (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin, size_t offset);
60+
void ucdr_init_buffer_origin_offset_endian (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin, size_t offset, ucdrEndianness endianness);
5961
```
6062
Initialize a `ucdrBuffer` structure, the main struct of *MicroCDR*.
61-
- `ub`: the `ucdrBuffer` struct
63+
- `ub`: the `ucdrBuffer` struct.
6264
- `data`: the buffer that the `ucdrBuffer` will use.
6365
- `size`: the size of the buffer that the `ucdrBuffer` will use.
66+
- `origin`: the origin of the XCDR stream.
6467
- `offset`: where the serialization/deserialization will start.
68+
- `endianness`: the endianness of the XCDR stream.
6569
Initially, the serialization/deserialization starts at the beginning of the buffer.
6670

6771
---
@@ -75,6 +79,16 @@ Copy a `ucdrBuffer` structure data to another `ucdrBuffer` structure.
7579
7680
---
7781
82+
```c
83+
void ucdr_set_on_full_buffer_callback (ucdrBuffer* ub, OnFullBuffer on_full_buffer, void* args);
84+
```
85+
Sets the `on_full_buffer` callback which will be called each time the buffer arises its end.
86+
- `ub`: the `ucdrBuffer` struct.
87+
- `on_full_buffer`: the callcack.
88+
- `args`: the argument passes to the callback.
89+
90+
---
91+
7892
```c
7993
void ucdr_reset_buffer (ucdrBuffer* ub);
8094
void ucdr_reset_buffer_offset(ucdrBuffer* ub, size_t offset);
@@ -116,6 +130,15 @@ Returns the alignment necessary to serialize/deserialize a type with `data_size`
116130
- `data_size`: the bytes of the data that you are asking for.
117131
---
118132

133+
```c
134+
void ucdr_advance_buffer(const ucdrBuffer* ub, size_t size);
135+
```
136+
Advances the XCDR stream `size` bytes without de/serialization involved.
137+
138+
- `ub`: the `ucdrBuffer` struct to ask the alignment.
139+
- `size`: the bytes to advance.
140+
---
141+
119142
```c
120143
size_t ucdr_buffer_size(const ucdrBuffer* ub);
121144
```

ci/linux/CMakeLists.txt

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ if(_have_c_fprofile_abs_path)
3434
set(_c_flags "${_c_flags} -fprofile-abs-path")
3535
endif()
3636

37-
ExternalProject_Add(microcdr
37+
ExternalProject_Add(microcdr_isolated
3838
SOURCE_DIR
3939
${CMAKE_CURRENT_SOURCE_DIR}/../../
4040
BINARY_DIR
4141
${PROJECT_BINARY_DIR}/microcdr-build
4242
INSTALL_DIR
43-
${PROJECT_BINARY_DIR}/temp_install
43+
${PROJECT_BINARY_DIR}/temp_install/isolated
4444
TEST_AFTER_INSTALL
4545
TRUE
4646
TEST_COMMAND
@@ -58,4 +58,33 @@ ExternalProject_Add(microcdr
5858
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
5959
-DUCDR_BUILD_CI_TESTS:BOOL=ON
6060
-DGTEST_INDIVIDUAL:BOOL=ON
61+
)
62+
63+
ExternalProject_Add(microcdr_non_isolated
64+
SOURCE_DIR
65+
${CMAKE_CURRENT_SOURCE_DIR}/../../
66+
BINARY_DIR
67+
${PROJECT_BINARY_DIR}/microcdr-build
68+
INSTALL_DIR
69+
${PROJECT_BINARY_DIR}/temp_install/non_isolated
70+
TEST_AFTER_INSTALL
71+
TRUE
72+
BUILD_COMMAND
73+
""
74+
TEST_COMMAND
75+
COMMAND ${CMAKE_CTEST_COMMAND} -VV -T Test -R "test-case*"
76+
CMAKE_CACHE_ARGS
77+
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
78+
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
79+
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
80+
-DCMAKE_C_FLAGS:STRING=${_c_flags}
81+
-DCMAKE_CXX_FLAGS:STRING=${_cxx_flags}
82+
-DCMAKE_EXE_LINKER_FLAGS:STRING=${_exe_linker_flags}
83+
-DCMAKE_SHARED_LINKER_FLAGS:STRING=${_shared_linker_flags}
84+
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
85+
-DUCDR_BUILD_CI_TESTS:BOOL=ON
86+
-DUCDR_ISOLATED_INSTALL:BOOL=OFF
87+
-DGTEST_INDIVIDUAL:BOOL=ON
88+
DEPENDS
89+
microcdr_isolated
6190
)

cmake/SuperBuild.cmake

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,18 @@ if(UCDR_BUILD_TESTS)
3535
PREFIX
3636
${PROJECT_BINARY_DIR}/googletest
3737
INSTALL_DIR
38-
${PROJECT_BINARY_DIR}/temp_install
38+
${PROJECT_BINARY_DIR}/temp_install/googletest
3939
CMAKE_ARGS
4040
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
41-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
4241
$<$<PLATFORM_ID:Windows>:-Dgtest_force_shared_crt:BOOL=ON>
4342
BUILD_COMMAND
4443
COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config Release --target install
4544
COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config Debug --target install
4645
INSTALL_COMMAND
4746
""
4847
)
49-
set(GTEST_ROOT ${PROJECT_BINARY_DIR}/temp_install CACHE PATH "" FORCE)
50-
set(GMOCK_ROOT ${PROJECT_BINARY_DIR}/temp_install CACHE PATH "" FORCE)
48+
set(GTEST_ROOT ${PROJECT_BINARY_DIR}/temp_install/googletest CACHE PATH "" FORCE)
49+
set(GMOCK_ROOT ${PROJECT_BINARY_DIR}/temp_install/googletest CACHE PATH "" FORCE)
5150
list(APPEND _deps googletest)
5251
endif()
5352
endif()

colcon.pkg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "microcdr",
3+
"type": "cmake",
4+
"cmake-args":[
5+
"-DUCDR_ISOLATED_INSTALL=OFF"
6+
]
7+
}

include/ucdr/microcdr.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ typedef struct ucdrBuffer
4545
uint8_t *final;
4646
uint8_t *iterator;
4747

48+
size_t origin;
49+
size_t offset;
50+
4851
ucdrEndianness endianness;
4952
uint8_t last_data_size;
5053

@@ -59,18 +62,20 @@ typedef struct ucdrBuffer
5962
// Main functions
6063
// ------------------------------------------------
6164

62-
UCDRDLLAPI void ucdr_init_buffer (ucdrBuffer* ub, uint8_t* data, size_t size);
63-
UCDRDLLAPI void ucdr_init_buffer_offset (ucdrBuffer* ub, uint8_t* data, size_t size, size_t offset);
64-
UCDRDLLAPI void ucdr_init_buffer_offset_endian (ucdrBuffer* ub, uint8_t* data, size_t size, size_t offset, ucdrEndianness endianness);
65-
UCDRDLLAPI void ucdr_copy_buffer (ucdrBuffer* ub_dest, const ucdrBuffer* ub_source);
66-
UCDRDLLAPI void ucdr_set_on_full_buffer_callback (ucdrBuffer* ub, OnFullBuffer on_full_buffer, void* args);
65+
UCDRDLLAPI void ucdr_init_buffer (ucdrBuffer* ub, uint8_t* data, size_t size);
66+
UCDRDLLAPI void ucdr_init_buffer_origin (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin);
67+
UCDRDLLAPI void ucdr_init_buffer_origin_offset (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin, size_t offset);
68+
UCDRDLLAPI void ucdr_init_buffer_origin_offset_endian (ucdrBuffer* ub, uint8_t* data, size_t size, size_t origin, size_t offset, ucdrEndianness endianness);
69+
UCDRDLLAPI void ucdr_copy_buffer (ucdrBuffer* ub_dest, const ucdrBuffer* ub_source);
70+
UCDRDLLAPI void ucdr_set_on_full_buffer_callback (ucdrBuffer* ub, OnFullBuffer on_full_buffer, void* args);
6771

6872
UCDRDLLAPI void ucdr_reset_buffer (ucdrBuffer* ub);
6973
UCDRDLLAPI void ucdr_reset_buffer_offset (ucdrBuffer* ub, size_t offset);
7074

7175
UCDRDLLAPI void ucdr_align_to (ucdrBuffer* ub, size_t alignment);
7276
UCDRDLLAPI size_t ucdr_alignment (size_t buffer_position, size_t data_size);
7377
UCDRDLLAPI size_t ucdr_buffer_alignment (const ucdrBuffer* ub, size_t data_size);
78+
UCDRDLLAPI void ucdr_advance_buffer (ucdrBuffer* ub, size_t size);
7479

7580
UCDRDLLAPI size_t ucdr_buffer_size (const ucdrBuffer* ub);
7681
UCDRDLLAPI size_t ucdr_buffer_length (const ucdrBuffer* ub);

src/c/common.c

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,48 @@ void ucdr_set_on_full_buffer_callback(ucdrBuffer* ub, OnFullBuffer on_full_buffe
6464
// -------------------------------------------------------------------
6565
// PUBLIC IMPLEMENTATION
6666
// -------------------------------------------------------------------
67-
void ucdr_init_buffer(ucdrBuffer* ub, uint8_t* data, size_t size)
67+
void ucdr_init_buffer(
68+
ucdrBuffer* ub,
69+
uint8_t* data,
70+
size_t size)
6871
{
69-
ucdr_init_buffer_offset(ub, data, size, 0u);
72+
ucdr_init_buffer_origin(ub, data, size, 0u);
7073
}
7174

72-
void ucdr_init_buffer_offset(ucdrBuffer* ub, uint8_t* data, size_t size, size_t offset)
75+
void ucdr_init_buffer_origin(
76+
ucdrBuffer* ub,
77+
uint8_t* data,
78+
size_t size,
79+
size_t origin)
7380
{
74-
ucdr_init_buffer_offset_endian(ub, data, size, offset, UCDR_MACHINE_ENDIANNESS);
81+
ucdr_init_buffer_origin_offset(ub, data, size, origin, 0u);
7582
}
7683

77-
void ucdr_init_buffer_offset_endian(ucdrBuffer* ub, uint8_t* data, size_t size, size_t offset, ucdrEndianness endianness)
84+
void ucdr_init_buffer_origin_offset(
85+
ucdrBuffer* ub,
86+
uint8_t* data,
87+
size_t size,
88+
size_t origin,
89+
size_t offset)
90+
{
91+
ucdr_init_buffer_origin_offset_endian(ub, data, size, origin, offset, UCDR_MACHINE_ENDIANNESS);
92+
}
93+
94+
void ucdr_init_buffer_origin_offset_endian(
95+
ucdrBuffer* ub,
96+
uint8_t* data,
97+
size_t size,
98+
size_t origin,
99+
size_t offset,
100+
ucdrEndianness endianness)
78101
{
79102
ub->init = data;
80103
ub->final = ub->init + size;
81104
ub->iterator = ub->init + offset;
82-
ub->last_data_size = 0u;
105+
ub->origin = origin;
106+
ub->offset = origin + offset;
83107
ub->endianness = endianness;
108+
ub->last_data_size = 0u;
84109
ub->error = false;
85110
ub->on_full_buffer = NULL;
86111
ub->args = NULL;
@@ -100,18 +125,22 @@ void ucdr_reset_buffer(ucdrBuffer* ub)
100125
void ucdr_reset_buffer_offset(ucdrBuffer* ub, size_t offset)
101126
{
102127
ub->iterator = ub->init + offset;
128+
ub->offset = ub->origin + offset;
103129
ub->last_data_size = 0u;
104130
ub->error = false;
105131
}
106132

107133
void ucdr_align_to(ucdrBuffer* ub, size_t size)
108134
{
109-
ub->iterator += ucdr_buffer_alignment(ub, size);
135+
size_t alignment = ucdr_buffer_alignment(ub, size);
136+
ub->offset += alignment;
137+
138+
// TODO (julibert): rethink.
139+
ub->iterator += alignment;
110140
if(ub->iterator > ub->final)
111141
{
112142
ub->iterator = ub->final;
113143
}
114-
115144
ub->last_data_size = (uint8_t)size;
116145
}
117146

@@ -122,12 +151,30 @@ size_t ucdr_alignment(size_t current_alignment, size_t data_size)
122151

123152
size_t ucdr_buffer_alignment(const ucdrBuffer* ub, size_t data_size)
124153
{
125-
if(data_size > ub->last_data_size)
154+
return (data_size > ub->last_data_size)
155+
? (data_size - ((uint32_t)(ub->offset - ub->origin) % data_size)) & (data_size - 1)
156+
: 0;
157+
}
158+
159+
void ucdr_advance_buffer(ucdrBuffer* ub, size_t size)
160+
{
161+
if (ucdr_check_buffer_available_for(ub, size))
126162
{
127-
return (data_size - ((uint32_t)(ub->iterator - ub->init) % data_size)) & (data_size - 1);
163+
ub->iterator += size;
164+
ub->offset += size;
128165
}
129-
130-
return 0;
166+
else
167+
{
168+
size_t remaining_size = size;
169+
size_t serialization_size;
170+
while(0 < (serialization_size = ucdr_check_final_buffer_behavior_array(ub, remaining_size, 1)))
171+
{
172+
remaining_size -= serialization_size;
173+
ub->iterator += serialization_size;
174+
ub->offset += serialization_size;
175+
}
176+
}
177+
ub->last_data_size = 1;
131178
}
132179

133180
size_t ucdr_buffer_size(const ucdrBuffer* ub)

0 commit comments

Comments
 (0)