Fixed build process.

This commit is contained in:
2026-04-03 22:28:07 +02:00
parent 0b54793b08
commit 884e8e903e
12 changed files with 100 additions and 43 deletions

View File

@@ -19,7 +19,7 @@ SOURCES += \
bcdriver.cpp \ bcdriver.cpp \
bcdriverstatewidget.cpp \ bcdriverstatewidget.cpp \
bcdrivertinycan.cpp \ bcdrivertinycan.cpp \
bcthemeswitchbutton.cpp \ bcthemebutton.cpp \
bctoggleswitch.cpp \ bctoggleswitch.cpp \
bctransmitter.cpp \ bctransmitter.cpp \
bcvalue.cpp \ bcvalue.cpp \
@@ -40,7 +40,7 @@ HEADERS += \
bcdriverstatewidget.h \ bcdriverstatewidget.h \
bcdrivertinycan.h \ bcdrivertinycan.h \
bcmainwindow.h \ bcmainwindow.h \
bcthemeswitchbutton.h \ bcthemebutton.h \
bctoggleswitch.h \ bctoggleswitch.h \
bctransmitter.h \ bctransmitter.h \
bcvalue.h \ bcvalue.h \

View File

@@ -28,10 +28,16 @@ qt_add_executable(BionxControl WIN32 MACOSX_BUNDLE
bcvaluemodel.cpp bcvaluemodel.h bcvaluemodel.cpp bcvaluemodel.h
bcvalueslider.cpp bcvalueslider.h bcvalueslider.ui bcvalueslider.cpp bcvalueslider.h bcvalueslider.ui
bcxmlloader.cpp bcxmlloader.h bcxmlloader.cpp bcxmlloader.h
libwin/can_drv_win.c
libwin/mhs_can_drv.c
main.cpp main.cpp
) )
# Plattformspezifische CAN-Treiber einbinden
if(WIN32)
target_sources(BionxControl PRIVATE libwin/can_drv_win.c)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_sources(BionxControl PRIVATE libwin/mhs_can_drv.c)
endif()
target_include_directories(BionxControl PRIVATE target_include_directories(BionxControl PRIVATE
. .
libwin libwin
@@ -129,4 +135,3 @@ install(TARGETS BionxControl
BUNDLE DESTINATION . BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
) )

View File

@@ -4,15 +4,15 @@ FROM debian:trixie
# Verhindert interaktive Prompts während der Installation # Verhindert interaktive Prompts während der Installation
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
# 1. Multiarch für arm64 aktivieren # 1. Multiarch für armhf aktivieren
RUN dpkg --add-architecture arm64 && \ RUN dpkg --add-architecture armhf && \
apt-get update && \ apt-get update && \
apt-get upgrade -y apt-get upgrade -y
# 2. Host-Build-Tools und Cross-Compiler installieren # 2. Host-Build-Tools und Cross-Compiler für 32-Bit installieren
RUN apt-get install -y \ RUN apt-get install -y \
build-essential \ build-essential \
crossbuild-essential-arm64 \ crossbuild-essential-armhf \
cmake \ cmake \
ninja-build \ ninja-build \
git \ git \
@@ -24,11 +24,11 @@ RUN apt-get install -y \
qt6-tools-dev-tools \ qt6-tools-dev-tools \
qt6-svg-dev qt6-svg-dev
# 4. Qt6 Bibliotheken für das TARGET (arm64) installieren # 4. Qt6 Bibliotheken für das TARGET (armhf) installieren
RUN apt-get install -y \ RUN apt-get install -y \
qt6-base-dev:arm64 \ qt6-base-dev:armhf \
libglvnd-dev:arm64 \ libglvnd-dev:armhf \
qt6-svg-dev:arm64 qt6-svg-dev:armhf
# Aufräumen # Aufräumen
RUN apt-get clean && rm -rf /var/lib/apt/lists/* RUN apt-get clean && rm -rf /var/lib/apt/lists/*

View File

@@ -1,23 +1,23 @@
# Name des Zielsystems # Name des Zielsystems
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_SYSTEM_PROCESSOR arm)
# Die Cross-Compiler aus dem Debian-Paket # Die Cross-Compiler aus dem Debian-Paket für 32-Bit (armhf)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc) set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)
# Wo das System nach Bibliotheken und Headern suchen soll (Sysroot) # Wo das System nach Bibliotheken und Headern suchen soll (Sysroot)
set(CMAKE_SYSROOT /) set(CMAKE_SYSROOT /)
# Pfade für pkg-config anpassen, damit es die arm64 .pc Dateien findet # Pfade für pkg-config anpassen, damit es die armhf .pc Dateien findet
set(ENV{PKG_CONFIG_DIR} "") set(ENV{PKG_CONFIG_DIR} "")
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig") set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT}) set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
# Suchverhalten für find_package(), find_library() etc. # Suchverhalten für find_package(), find_library() etc.
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Programme (wie moc) auf dem Host suchen set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Programme (wie moc) auf dem Host suchen
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Libs nur im Target (arm64) suchen set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Libs nur im Target (armhf) suchen
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Header nur im Target (arm64) suchen set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Header nur im Target (armhf) suchen
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # CMake-Pakete nur im Target suchen set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # CMake-Pakete nur im Target suchen
# *** WICHTIG FÜR QT6 *** # *** WICHTIG FÜR QT6 ***

View File

@@ -34,7 +34,7 @@
#include <QTimer> #include <QTimer>
#include <QMessageBox> #include <QMessageBox>
#include <bcthemeswitchbutton.h> #include <bcthemebutton.h>
#include <bcdriverstatewidget.h> #include <bcdriverstatewidget.h>
#include <bcmainwindow.h> #include <bcmainwindow.h>
#include <bcvaluedelegate.h> #include <bcvaluedelegate.h>
@@ -189,9 +189,9 @@ void BCMainWindow::initStatusBar()
_statusBar->addPermanentWidget(conState); _statusBar->addPermanentWidget(conState);
conState->installEventFilter(this); conState->installEventFilter(this);
BCThemeSwitchButton* themeBtn = new BCThemeSwitchButton(this); BCThemeButton* themeBtn = new BCThemeButton(this);
_statusBar->addPermanentWidget(themeBtn); _statusBar->addPermanentWidget(themeBtn);
connect(themeBtn, &BCThemeSwitchButton::themeChanged, this, [this](bool isDark) connect(themeBtn, &BCThemeButton::themeChanged, this, [this](bool isDark)
{ {
QString message = isDark ? "using DarkMode." : "using LightMode."; QString message = isDark ? "using DarkMode." : "using LightMode.";
onShowMessage( message ); onShowMessage( message );

View File

@@ -30,10 +30,10 @@
***************************************************************************/ ***************************************************************************/
#include <bcthemeswitchbutton.h> #include <bcthemebutton.h>
BCThemeSwitchButton::BCThemeSwitchButton(QWidget *parent ) BCThemeButton::BCThemeButton(QWidget *parent )
: QPushButton(parent) : QPushButton(parent)
{ {
// Visuelles Setup: Flach, keine Ränder, Hand-Cursor // Visuelles Setup: Flach, keine Ränder, Hand-Cursor
@@ -42,7 +42,7 @@ BCThemeSwitchButton::BCThemeSwitchButton(QWidget *parent )
setFixedSize( 24, 24 ); setFixedSize( 24, 24 );
updateIcon(); updateIcon();
connect(this, &QPushButton::clicked, this, &BCThemeSwitchButton::toggleMode); connect(this, &QPushButton::clicked, this, &BCThemeButton::toggleMode);
} }
@@ -50,7 +50,7 @@ BCThemeSwitchButton::BCThemeSwitchButton(QWidget *parent )
* @brief Setzt den DarkMode * @brief Setzt den DarkMode
*/ */
void BCThemeSwitchButton::setDarkMode( bool isDark ) void BCThemeButton::setDarkMode( bool isDark )
{ {
_isDarkMode = !isDark; _isDarkMode = !isDark;
toggleMode(); toggleMode();
@@ -61,7 +61,7 @@ void BCThemeSwitchButton::setDarkMode( bool isDark )
* @brief Schaltet den akutellen Mode um. * @brief Schaltet den akutellen Mode um.
*/ */
void BCThemeSwitchButton::toggleMode() void BCThemeButton::toggleMode()
{ {
_isDarkMode = !_isDarkMode; _isDarkMode = !_isDarkMode;
updateIcon(); updateIcon();
@@ -73,7 +73,7 @@ void BCThemeSwitchButton::toggleMode()
* @brief Icon & Tooltip anpassen * @brief Icon & Tooltip anpassen
*/ */
void BCThemeSwitchButton::updateIcon() void BCThemeButton::updateIcon()
{ {
setText(_isDarkMode ? "🌙" : "☀️"); setText(_isDarkMode ? "🌙" : "☀️");
setToolTip(_isDarkMode ? "Use LightMode" : "Use DarkMode"); setToolTip(_isDarkMode ? "Use LightMode" : "Use DarkMode");

View File

@@ -43,13 +43,13 @@
* zu wechseln * zu wechseln
*/ */
class BCThemeSwitchButton : public QPushButton class BCThemeButton : public QPushButton
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit BCThemeSwitchButton(QWidget *parent = nullptr); explicit BCThemeButton(QWidget *parent = nullptr);
void setDarkMode( bool isDark ); void setDarkMode( bool isDark );
signals: signals:

40
build_and_deploy.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# Bricht das Skript ab, falls ein Befehl (z. B. der Build) fehlschlägt
set -e
# --- Variablen (Bitte anpassen!) ---
IMAGE_NAME="qt-cross-rpi"
# Trage hier den genauen Namen deines fertig kompilierten Executables ein:
BINARY_NAME="BionxControl"
TARGET_USER="chris"
TARGET_IP="192.168.0.106"
TARGET_DIR="/home/chris/projects/BionxControl"
# Den Namen der Toolchain aus deiner Vorlage oder der zuvor erstellten Datei
TOOLCHAIN_FILE="armhf-toolchain.cmake"
echo "=== 1. Baue das Docker-Image ==="
docker build -t ${IMAGE_NAME} .
echo "=== 2. Kompiliere das Projekt im Container ==="
# Wir führen die Build-Befehle direkt im Container aus, anstatt interaktiv zu starten.
# Das -it flag wurde entfernt, da wir es als Skript ausführen.
docker run --rm -v "$(pwd):/workspace" ${IMAGE_NAME} bash -c "
echo 'Bereinige altes Build-Verzeichnis...'
rm -rf dockerbuild
mkdir dockerbuild
cd dockerbuild
echo 'Führe CMake aus...'
cmake -DCMAKE_TOOLCHAIN_FILE=../${TOOLCHAIN_FILE} -G Ninja ..
echo 'Starte Build (Ninja)...'
ninja
"
echo "=== 3. Deploy auf den Raspberry Pi via scp ==="
# Kopiert das neu gebaute Binary auf die Zielmaschine
scp "dockerbuild/${BINARY_NAME}" "${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}"
echo "=== Deployment erfolgreich abgeschlossen! ==="

View File

@@ -31,6 +31,7 @@
#include <QApplication> #include <QApplication>
#include <QSysInfo>
#include <QFile> #include <QFile>
#include <QDebug> #include <QDebug>
@@ -45,9 +46,19 @@ int main(int argc, char *argv[])
QApplication app(argc, argv); QApplication app(argc, argv);
BCMainWindow mainWindow;
if (QSysInfo::machineHostName() == "BionxControl")
{
mainWindow.setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
mainWindow.showFullScreen();
}
else
{
// Normaler Fenster-Modus (z. B. für die Entwicklung auf dem Desktop)
mainWindow.show();
}
BCMainWindow w;
w.show();
return app.exec(); return app.exec();

View File

@@ -7,6 +7,7 @@
/* Text: #000000, #1f1f1f */ /* Text: #000000, #1f1f1f */
/* Borders: #e1e1e1, #d1d1d1 */ /* Borders: #e1e1e1, #d1d1d1 */
/* === QWidget Base === */ /* === QWidget Base === */
QWidget { QWidget {
background-color: #f3f3f3; background-color: #f3f3f3;
@@ -250,3 +251,8 @@ QLineEdit:disabled {
color: #a0a0a0; color: #a0a0a0;
border: 1px solid #e1e1e1; border: 1px solid #e1e1e1;
} }
QSlider {
background: hotpink;
}

0
runme.sh Normal file
View File

View File

@@ -1,14 +1,9 @@
docker build -t qt-cross-rpi . docker build -t qt-cross-rpi .
// eigentlich: docker buildx build --platform linux/arm64 -t qt-cross-rpi --load .
docker run --rm -it -v "$(pwd):/workspace" qt-cross-rpi bash docker run --rm -it -v "$(pwd):/workspace" qt-cross-rpi bash
# 1. Erstelle einen separaten Build-Ordner und wechsle dorthin
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../arm32-toolchain.cmake -G Ninja ..
# 2. Konfiguriere das Projekt mit CMake und deiner Toolchain-Datei für aarch64
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake -G Ninja ..
# 3. Starte den Kompiliervorgang
ninja ninja