Skip to content

Commit bc6f5fe

Browse files
authored
Merge pull request #13 from Mazurel/Cmake-multi-platform-CI
Basic CI Support
2 parents 5ee168e + 5e7e43f commit bc6f5fe

File tree

9 files changed

+154
-17
lines changed

9 files changed

+154
-17
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
name: CMake on multiple platforms
2+
3+
on:
4+
push:
5+
branches: ["master"]
6+
pull_request:
7+
branches: ["master"]
8+
9+
jobs:
10+
build:
11+
runs-on: ${{ matrix.os }}
12+
13+
strategy:
14+
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations.
15+
fail-fast: false
16+
17+
# Currently supported:
18+
# - Linux + GCC
19+
# - Linux + CLANG
20+
# Planned:
21+
# - Windows + CL
22+
matrix:
23+
os: [ubuntu-latest, windows-latest]
24+
build_type: [Release]
25+
c_compiler: [gcc, clang, cl]
26+
include:
27+
- os: ubuntu-latest
28+
c_compiler: gcc
29+
cpp_compiler: g++
30+
- os: ubuntu-latest
31+
c_compiler: clang
32+
cpp_compiler: clang++
33+
exclude:
34+
- os: windows-latest
35+
c_compiler: cl
36+
- os: windows-latest
37+
c_compiler: gcc
38+
- os: windows-latest
39+
c_compiler: clang
40+
- os: ubuntu-latest
41+
c_compiler: cl
42+
43+
steps:
44+
- uses: actions/checkout@v4
45+
with:
46+
submodules: "recursive"
47+
fetch-depth: 1
48+
49+
# Dependecies needed only for Linux - Modbus Communication
50+
- name: Install dependencies
51+
run: |
52+
sudo apt-get update
53+
sudo apt-get install -y libnet1-dev
54+
if: matrix.os == 'ubuntu-latest'
55+
56+
- name: Set reusable strings
57+
id: strings
58+
shell: bash
59+
run: |
60+
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
61+
62+
- name: Configure CMake
63+
run: >
64+
cmake -B ${{ steps.strings.outputs.build-output-dir }}
65+
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
66+
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
67+
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
68+
-DMODBUS_EXAMPLE=ON
69+
-DMODBUS_TESTS=ON
70+
-DMODBUS_COMMUNICATION=${{ matrix.os == 'windows-latest' && 'OFF' || matrix.os == 'ubuntu-latest' && 'ON' }}
71+
-S ${{ github.workspace }}
72+
73+
- name: Build
74+
run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}
75+
76+
- name: Test
77+
run: ${{ steps.strings.outputs.build-output-dir }}/tests/Google_Tests_run

CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ project(protocolConverter)
33

44
set(CMAKE_CXX_STANDARD 17)
55

6-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -pedantic")
6+
if (MSVC)
7+
add_compile_options(/W3)
8+
else()
9+
add_compile_options(-Wall -Wextra -Werror -pedantic)
10+
endif()
711

812
option(MODBUS_EXAMPLE "Build example program" OFF)
913
option(MODBUS_TESTS "Build tests" OFF)

include/MB/modbusRequest.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class ModbusRequest {
7171
}
7272

7373
/**
74-
* Simple constructor, that allows to create "dummy" ModbusResponse
74+
* Simple constructor, that allows to create "dummy" ModbusRequest
7575
* object. May be useful in some cases.
7676
*/
7777
explicit ModbusRequest(
@@ -80,7 +80,15 @@ class ModbusRequest {
8080
uint16_t address = 0, uint16_t registersNumber = 0,
8181
std::vector<ModbusCell> values = {}) noexcept;
8282

83-
ModbusRequest(const ModbusRequest &) = default;
83+
/**
84+
* Copy constructor for the response.
85+
*/
86+
ModbusRequest(const ModbusRequest&);
87+
88+
/**
89+
* Equal operator for the response.
90+
*/
91+
ModbusRequest& operator=(const ModbusRequest &);
8492

8593
//! Returns string representation of object
8694
[[nodiscard]] std::string toString() const noexcept;

include/MB/modbusResponse.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,15 @@ class ModbusResponse {
8080
uint16_t address = 0, uint16_t registersNumber = 0,
8181
std::vector<ModbusCell> values = {});
8282

83-
ModbusResponse(const ModbusResponse &) = default;
83+
/**
84+
* Copy constructor for the response.
85+
*/
86+
ModbusResponse(const ModbusResponse&);
87+
88+
/**
89+
* Equal operator for the response.
90+
*/
91+
ModbusResponse& operator=(const ModbusResponse &);
8492

8593
//! Converts object to it's string representation
8694
[[nodiscard]] std::string toString() const;

include/MB/modbusUtils.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,8 @@ inline void pushUint16(std::vector<uint8_t> &buffer, const uint16_t val) {
233233
buffer.push_back(low);
234234
}
235235

236+
//! Ignore some value explicitly
237+
template<typename T>
238+
inline void ignore_result(T&& v) { (void)v; }
239+
236240
} // namespace MB::utils

src/Serial/connection.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Licensed under: MIT License <http://opensource.org/licenses/MIT>
44

55
#include "Serial/connection.hpp"
6+
#include "modbusUtils.hpp"
67
#include <sys/poll.h>
78

89
using namespace MB::Serial;
@@ -139,7 +140,7 @@ std::vector<uint8_t> Connection::send(std::vector<uint8_t> data) {
139140
// most cases)
140141
tcflush(_fd, TCOFLUSH);
141142
// Write
142-
write(_fd, data.begin().base(), data.size());
143+
utils::ignore_result(write(_fd, data.begin().base(), data.size()));
143144
// It may be a good idea to use tcdrain, although it has tendency to not
144145
// work as expected tcdrain(_fd);
145146

src/TCP/connection.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Licensed under: MIT License <http://opensource.org/licenses/MIT>
44

55
#include "TCP/connection.hpp"
6+
#include <cstdint>
67
#include <sys/poll.h>
78
#include <sys/socket.h>
89

@@ -25,16 +26,16 @@ std::vector<uint8_t> Connection::sendRequest(const MB::ModbusRequest &req) {
2526
std::vector<uint8_t> rawReq;
2627
rawReq.reserve(6);
2728

28-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[1]);
29-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[0]);
29+
rawReq.push_back(static_cast<const uint8_t&&>(reinterpret_cast<const uint8_t *>(&_messageID)[1]));
30+
rawReq.push_back(static_cast<uint8_t>(_messageID));
3031
rawReq.push_back(0x00);
3132
rawReq.push_back(0x00);
3233

3334
std::vector<uint8_t> dat = req.toRaw();
3435

3536
uint32_t size = dat.size();
36-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[1]);
37-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[0]);
37+
rawReq.push_back(static_cast<const uint16_t&&>(reinterpret_cast<const uint16_t *>(&size)[1]));
38+
rawReq.push_back(static_cast<uint16_t>(size));
3839

3940
rawReq.insert(rawReq.end(), dat.begin(), dat.end());
4041

@@ -47,16 +48,16 @@ std::vector<uint8_t> Connection::sendResponse(const MB::ModbusResponse &res) {
4748
std::vector<uint8_t> rawReq;
4849
rawReq.reserve(6);
4950

50-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[1]);
51-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[0]);
51+
rawReq.push_back(static_cast<const uint8_t&&>(reinterpret_cast<const uint8_t *>(&_messageID)[1]));
52+
rawReq.push_back(static_cast<uint8_t>(_messageID));
5253
rawReq.push_back(0x00);
5354
rawReq.push_back(0x00);
5455

5556
std::vector<uint8_t> dat = res.toRaw();
5657

5758
uint32_t size = dat.size();
58-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[1]);
59-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[0]);
59+
rawReq.push_back(static_cast<const uint16_t&&>(reinterpret_cast<const uint16_t *>(&size)[1]));
60+
rawReq.push_back(static_cast<uint16_t>(size));
6061

6162
rawReq.insert(rawReq.end(), dat.begin(), dat.end());
6263

@@ -69,16 +70,16 @@ std::vector<uint8_t> Connection::sendException(const MB::ModbusException &ex) {
6970
std::vector<uint8_t> rawReq;
7071
rawReq.reserve(6);
7172

72-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[1]);
73-
rawReq.push_back(reinterpret_cast<const uint8_t *>(&_messageID)[0]);
73+
rawReq.push_back(static_cast<const uint8_t&&>(reinterpret_cast<const uint8_t *>(&_messageID)[1]));
74+
rawReq.push_back(static_cast<uint8_t>(_messageID));
7475
rawReq.push_back(0x00);
7576
rawReq.push_back(0x00);
7677

7778
std::vector<uint8_t> dat = ex.toRaw();
7879

7980
uint32_t size = dat.size();
80-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[1]);
81-
rawReq.push_back(reinterpret_cast<uint16_t *>(&size)[0]);
81+
rawReq.push_back(static_cast<const uint16_t&&>(reinterpret_cast<const uint16_t *>(&size)[1]));
82+
rawReq.push_back(static_cast<uint16_t>(size));
8283

8384
rawReq.insert(rawReq.end(), dat.begin(), dat.end());
8485

src/modbusRequest.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ ModbusRequest::ModbusRequest(uint8_t slaveId, utils::MBFunctionCode functionCode
3030
}
3131
}
3232

33+
ModbusRequest::ModbusRequest(const ModbusRequest& reference) :
34+
_slaveID(reference.slaveID()),
35+
_functionCode(reference.functionCode()),
36+
_address(reference.registerAddress()),
37+
_registersNumber(reference.numberOfRegisters()),
38+
_values(reference.registerValues()){ }
39+
40+
41+
ModbusRequest& ModbusRequest::operator=(const ModbusRequest &reference) {
42+
this->_slaveID = reference.slaveID();
43+
this->_functionCode = reference.functionCode();
44+
this->_address = reference.registerAddress();
45+
this->_registersNumber = reference.numberOfRegisters();
46+
this->_values = reference.registerValues();
47+
return *this;
48+
}
49+
3350
ModbusRequest::ModbusRequest(const std::vector<uint8_t> &inputData, bool CRC) {
3451
try {
3552
if (inputData.size() < 3)

src/modbusResponse.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ ModbusResponse::ModbusResponse(uint8_t slaveId, utils::MBFunctionCode functionCo
3030
}
3131
}
3232

33+
ModbusResponse::ModbusResponse(const ModbusResponse& reference) :
34+
_slaveID(reference.slaveID()),
35+
_functionCode(reference.functionCode()),
36+
_address(reference.registerAddress()),
37+
_registersNumber(reference.numberOfRegisters()),
38+
_values(reference.registerValues()){ }
39+
40+
41+
ModbusResponse& ModbusResponse::operator=(const ModbusResponse &reference) {
42+
this->_slaveID = reference.slaveID();
43+
this->_functionCode = reference.functionCode();
44+
this->_address = reference.registerAddress();
45+
this->_registersNumber = reference.numberOfRegisters();
46+
this->_values = reference.registerValues();
47+
return *this;
48+
}
49+
3350
ModbusResponse::ModbusResponse(std::vector<uint8_t> inputData, bool CRC) {
3451
try {
3552
if (inputData.size() < 3)

0 commit comments

Comments
 (0)