Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleanup, logs improvements, refactoring #9

Merged
merged 11 commits into from
May 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 9 additions & 35 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,6 @@ jobs:
with:
python-version: '3.x'

# - name: Install dependencies (Ubuntu)
# if: startsWith(matrix.config.os, 'ubuntu')
# run: |
# sudo apt-get update
# sudo apt-get install -y libboost-all-dev

# - name: Install dependencies (macOS)
# if: startsWith(matrix.config.os, 'macos')
# run: |
# brew install boost

- name: Install dependencies (Windows)
if: startsWith(matrix.config.os, 'windows')
run: |
choco install boost-msvc-14.2

- name: Set up CMake (All platforms)
uses: lukka/get-cmake@latest

Expand All @@ -60,15 +44,17 @@ jobs:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_ARCHITECTURE_ID=${{ matrix.config.arch }}
cmake --build build --config Release

- name: Rename binary
- name: Rename binary using sed and set env
run: |
mv build/ser2net2ser build/ser2net2ser-${{ env.VERSION }}-${{ matrix.config.os }}-${{ matrix.config.arch }}
OS_NAME=$(echo "${{ matrix.config.os }}" | sed 's/ubuntu-latest/linux/; s/macos-latest/darwin/')
echo "OS_NAME=$OS_NAME" >> $GITHUB_ENV
mv build/ser2net2ser build/ser2net2ser-${{ env.VERSION }}-$OS_NAME-${{ matrix.config.arch }}

- name: Upload Artifacts
uses: actions/upload-artifact@v3
with:
name: ser2net2ser-${{ env.VERSION }}-${{ matrix.config.os }}-${{ matrix.config.arch }}
path: build/ser2net2ser-${{ env.VERSION }}-${{ matrix.config.os }}-${{ matrix.config.arch }}
name: ser2net2ser-${{ env.VERSION }}-${{ env.OS_NAME }}-${{ matrix.config.arch }}
path: build/ser2net2ser-${{ env.VERSION }}-${{ env.OS_NAME }}-${{ matrix.config.arch }}

create-release:
needs: build-and-release
Expand All @@ -85,27 +71,15 @@ jobs:
- name: List all files in artifacts directory
run: ls -R artifacts

# - name: Create Release
# id: create_release
# uses: actions/create-release@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# tag_name: ${{ github.ref }}
# release_name: Release ${{ github.ref_name }}
# draft: false
# prerelease: false

- name: debug
- name: Debug file locations
run: |
pwd
ls -la artifacts/
find artifacts/ -type f

- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: artifacts/ser2net2ser*
file: artifacts/*/* # Changed this line to include subdirectories
tag: ${{ github.ref }}
release_name: Release ${{ github.ref_name }}
overwrite: true
Expand Down
55 changes: 38 additions & 17 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,44 @@ on:
branches: [ master ]

jobs:
build:
statick-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up CMake (All platforms)
uses: lukka/get-cmake@latest

- name: Set up Clang
uses: egor-tensin/setup-clang@v1
with:
version: latest

- name: Install dependencies
run: sudo apt-get install -y cppcheck clang-format

- name: Run Cppcheck
run: cppcheck --enable=all --std=c++17 --language=c++ --error-exitcode=1 --output-file=cppcheck_report.txt ./src
continue-on-error: true

- name: Check code format (Clang-Format)
run: clang-format -i -style=file $(find . -name '*.cpp' -or -name '*.h')

- name: Upload Cppcheck Results
uses: actions/upload-artifact@v2
if: always()
with:
name: cppcheck-results
path: cppcheck_report.txt

- name: Upload Clang-Format Results
uses: actions/upload-artifact@v2
if: always()
with:
name: format-results
path: $(find . -name '*.cpp' -or -name '*.h')

tests:
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
Expand All @@ -29,22 +66,6 @@ jobs:
with:
python-version: '3.x'

# - name: Install dependencies (Ubuntu)
# if: startsWith(matrix.config.os, 'ubuntu')
# run: |
# sudo apt-get update
# sudo apt-get install -y libboost-all-dev

# - name: Install dependencies (macOS)
# if: startsWith(matrix.config.os, 'macos')
# run: |
# brew install boost

# - name: Install dependencies (Windows)
# if: startsWith(matrix.config.os, 'windows')
# run: |
# choco install boost-msvc-14.2

- name: Set up CMake (All platforms)
uses: lukka/get-cmake@latest

Expand Down
1 change: 0 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
# Create core library without Logger.cpp, which is now in the logging library
add_library(core_lib
src/Logger.cpp
src/SerialServer.cpp
src/SerialClient.cpp
src/VirtualSerialPort.cpp
src/SerialPort.cpp
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Motivation

I've been using `socat` + `ser2net` for sharing serial devices over network for some time, mainly in my other project -> [kubeserial]. I've run into few limitations so I created this project to recreate the behaviour of `socat` + `ser2net` and then solve connection issues I've been having.
I've been using `socat` + `ser2net` for sharing serial devices over network for some time, mainly in my other project [kubeserial]. I've run into few limitations so I created this project to recreate the behaviour of `socat` + `ser2net` and then solve connection issues I've been having.

## Requirements

Expand Down
Binary file modified docs/connect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/serve.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions include/Logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
#include <sstream>
#include <mutex>
#include <string>
#include <iostream>
#include <chrono>
#include <iomanip>

class Logger {
public:
Expand Down
5 changes: 5 additions & 0 deletions include/SerialPort.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <cstring>
#include <stdexcept>
#include <thread>
#include <atomic>
#include <queue>
Expand Down
25 changes: 0 additions & 25 deletions include/SerialServer.h

This file was deleted.

8 changes: 4 additions & 4 deletions include/SocketClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,24 @@ class SocketClient {
Logger(Logger::Level::Info) << "Start connecting to socet server:" << server_ip << ":" << server_port;
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
Logger(Logger::Level::Error) << "Error creating socket: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Error creating socket: " << strerror(errno);
return false;
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
if (inet_pton(AF_INET, server_ip, &server_addr.sin_addr) <= 0) {
Logger(Logger::Level::Error) << "Invalid address/ Address not supported" << std::endl;
Logger(Logger::Level::Error) << "Invalid address/ Address not supported";
return false;
}

if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
Logger(Logger::Level::Error) << "Connection Failed: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Connection Failed: " << strerror(errno);
exit(1);
return false;
}

Logger(Logger::Level::Info) << "Connected to server at " << server_ip << ":" << server_port << std::endl;
Logger(Logger::Level::Info) << "Connected to server at " << server_ip << ":" << server_port;
return true;
}

Expand Down
4 changes: 4 additions & 0 deletions include/TCPServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
#include <netinet/in.h>
#include <unistd.h>
#include <string>
#include <thread>
#include <cstring>
#include <iostream>

#include "SerialPort.h"
#include "Logger.h"

Expand Down
3 changes: 0 additions & 3 deletions src/Logger.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
#include "Logger.h"
#include <iostream>
#include <chrono>
#include <iomanip>

std::mutex Logger::mtx;

Expand Down
11 changes: 5 additions & 6 deletions src/SerialClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using std::string;
using std::cout;
using std::cerr;
using std::endl;

SerialClient::SerialClient(const std::string& server_ip, unsigned short server_port, const std::string& vsp_name)
: vsp_(vsp_name) {
Expand All @@ -25,7 +24,7 @@ void SerialClient::run() {
FD_SET(socketClient_.sock_fd, &read_fds);

if (select(max_fd, &read_fds, NULL, NULL, NULL) < 0 && errno != EINTR) {
Logger(Logger::Level::Error) << "Select error: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Select error: " << strerror(errno);
break;
}

Expand All @@ -36,10 +35,10 @@ void SerialClient::run() {
Logger(Logger::Level::Info) << "From PTY: " << buffer;
socketClient_.sendToServer(buffer, bytes_read);
} else if (bytes_read == 0) {
Logger(Logger::Level::Info) << "PTY closed." << std::endl;
Logger(Logger::Level::Error) << "PTY closed.";
break;
} else {
Logger(Logger::Level::Error) << "Error reading from PTY: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Error reading from PTY: " << strerror(errno);
}
}

Expand All @@ -50,10 +49,10 @@ void SerialClient::run() {
Logger(Logger::Level::Info) << "From Server: " << buffer;
vsp_.async_write(buffer, bytes_read);
} else if (bytes_read == 0) {
Logger(Logger::Level::Info) << "Server closed connection." << std::endl;
Logger(Logger::Level::Info) << "Server closed connection.";
break;
} else {
Logger(Logger::Level::Error) << "Error reading from socket: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Error reading from socket: " << strerror(errno);
}
}
}
Expand Down
23 changes: 8 additions & 15 deletions src/SerialPort.cpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
#include "SerialPort.h"
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <cstring>
#include <stdexcept>

SerialPort::SerialPort(const std::string& device, int baud_rate) {
Logger(Logger::Level::Info) << "SerialPort init start - device " << device << " - baudRate - " << baud_rate << std::endl;
Logger(Logger::Level::Info) << "Initializing serial port connection to " << device << " baudRate " << baud_rate;
serial_fd = open(device.c_str(), O_RDWR | O_NOCTTY);
if (serial_fd < 0) {
Logger(Logger::Level::Error) << "Error opening serial port: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "Error opening serial port: " << strerror(errno);
throw std::runtime_error("Error opening serial port");
}

configurePort(baud_rate);
Logger(Logger::Level::Info) << "SerialPort init finish" << std::endl;
Logger(Logger::Level::Info) << "SerialPort init finish";
}

SerialPort::~SerialPort() {
Expand All @@ -26,7 +21,7 @@ void SerialPort::configurePort(int baud_rate) {
struct termios tty;
memset(&tty, 0, sizeof tty);
if (tcgetattr(serial_fd, &tty) != 0) {
Logger(Logger::Level::Error) << "tcgetattr failed: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "tcgetattr failed: " << strerror(errno);
throw std::runtime_error("tcgetattr failed");
}

Expand All @@ -49,25 +44,25 @@ void SerialPort::configurePort(int baud_rate) {
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout

if (tcsetattr(serial_fd, TCSANOW, &tty) != 0) {
Logger(Logger::Level::Error) << "tcsetattr failed: " << strerror(errno) << std::endl;
Logger(Logger::Level::Error) << "tcsetattr failed: " << strerror(errno);
throw std::runtime_error("tcsetattr failed");
}
}

void SerialPort::writeData(const std::string& data) {
Logger(Logger::Level::Info) << "SerialPort write data - " << data;
Logger(Logger::Level::Info) << "SerialPort - write: " << data;
write(serial_fd, data.c_str(), data.size());
}


void SerialPort::readLoop() {
Logger(Logger::Level::Info) << "SerialPort start reading loop";
Logger(Logger::Level::Info) << "SerialPort - start reading loop.";
while (keep_reading) {
char buf[1024];
int n = read(serial_fd, buf, sizeof(buf) - 1);
if (n > 0) {
buf[n] = '\0'; // Ensure null-termination
Logger(Logger::Level::Info) << "SerialPort read - " << buf;
Logger(Logger::Level::Info) << "SerialPort - read:" << buf;
std::lock_guard<std::mutex> lock(mtx);
read_buffer.push(std::string(buf));
cv.notify_one();
Expand All @@ -87,11 +82,9 @@ void SerialPort::stopReading() {
}

std::string SerialPort::readData() {
Logger(Logger::Level::Info) << "SerialPort read data";
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this]{ return !read_buffer.empty(); });
std::string data = read_buffer.front();
read_buffer.pop();
Logger(Logger::Level::Info) << "SerialPort read data - got data - " << data;
return data;
}
22 changes: 0 additions & 22 deletions src/SerialServer.cpp

This file was deleted.

Loading
Loading