Skip to content

Commit

Permalink
feat(hardware): add ntcan support
Browse files Browse the repository at this point in the history
  • Loading branch information
GwnDaan committed Dec 16, 2024
1 parent 398bd33 commit c647d24
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 104 deletions.
202 changes: 115 additions & 87 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,23 @@ set(JUCE_WEB_BROWSER OFF)
set(BUILD_TESTING OFF)

if(WIN32)
set(CAN_DRIVER "WindowsPCANBasic")
list(APPEND CAN_DRIVER "TouCAN")

if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND MINGW))
list(APPEND CAN_DRIVER "WindowsInnoMakerUSB2CAN")
else()
message(STATUS "InnoMaker hardware will not be supported in this build because you are using mingw")
endif()
list(APPEND CAN_DRIVER "SYS_TEC")
set(CAN_DRIVER "WindowsPCANBasic")
list(APPEND CAN_DRIVER "TouCAN")

if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND MINGW))
list(APPEND CAN_DRIVER "WindowsInnoMakerUSB2CAN")
else()
message(
STATUS
"InnoMaker hardware will not be supported in this build because you are using mingw"
)
endif()
list(APPEND CAN_DRIVER "SYS_TEC")
list(APPEND CAN_DRIVER "NTCAN")
elseif(APPLE)
set(CAN_DRIVER "MacCANPCAN")
set(CAN_DRIVER "MacCANPCAN")
else()
set(CAN_DRIVER "SocketCAN")
set(CAN_DRIVER "SocketCAN")
endif()

find_package(JUCE MODULE)
Expand All @@ -32,21 +36,28 @@ find_package(Threads REQUIRED)

juce_add_gui_app(
AgISOVirtualTerminal
ICON_BIG doc/smallLogo.png
ICON_BIG
doc/smallLogo.png
# image file to use as an icon ICON_SMALL ...
COMPANY_NAME "Open-Agriculture"
COMPANY_COPYRIGHT "Open-Agriculture"
COMPANY_WEBSITE "https://github.com/Open-Agriculture"
PRODUCT_NAME "AgISOVirtualTerminal"
NEEDS_CURL FALSE
NEEDS_WEB_BROWSER FALSE
DESCRIPTION "An ISO11783-6 Server")
COMPANY_NAME
"Open-Agriculture"
COMPANY_COPYRIGHT
"Open-Agriculture"
COMPANY_WEBSITE
"https://github.com/Open-Agriculture"
PRODUCT_NAME
"AgISOVirtualTerminal"
NEEDS_CURL
FALSE
NEEDS_WEB_BROWSER
FALSE
DESCRIPTION
"An ISO11783-6 Server")

set_target_properties(AgISOVirtualTerminal PROPERTIES CXX_STANDARD 17)

target_compile_definitions(AgISOVirtualTerminal PRIVATE
JUCE_USE_CURL=0
JUCE_WEB_BROWSER=0)
target_compile_definitions(AgISOVirtualTerminal PRIVATE JUCE_USE_CURL=0
JUCE_WEB_BROWSER=0)

juce_generate_juce_header(AgISOVirtualTerminal)

Expand Down Expand Up @@ -87,80 +98,97 @@ target_sources(
"src/StringEncodingConversions.cpp"
"src/InputListComponent.cpp")


target_include_directories(AgISOVirtualTerminal
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include)

target_link_libraries(
AgISOVirtualTerminal
PRIVATE juce::juce_gui_extra juce::juce_audio_basics juce::juce_audio_utils isobus::Isobus isobus::HardwareIntegration
isobus::Utility
PRIVATE juce::juce_gui_extra juce::juce_audio_basics juce::juce_audio_utils
isobus::Isobus isobus::HardwareIntegration isobus::Utility
PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_lto_flags)

if(WIN32)
add_custom_command(
TARGET AgISOVirtualTerminal POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_LIST_DIR}/lib/PCANBasic.dll "$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM
)

add_custom_command(
TARGET AgISOVirtualTerminal POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_LIST_DIR}/lib/Usbcan64.dll "$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM
)

add_custom_command(
TARGET AgISOVirtualTerminal POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_LIST_DIR}/lib/canal.dll "$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM
)

add_custom_command(
TARGET AgISOVirtualTerminal POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_LIST_DIR}/lib/InnoMakerUsb2CanLib.dll "$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM
)
add_custom_command(
TARGET AgISOVirtualTerminal
POST_BUILD
COMMAND
"${CMAKE_COMMAND}" -E copy_if_different
${CMAKE_CURRENT_LIST_DIR}/lib/PCANBasic.dll
"$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM)

add_custom_command(
TARGET AgISOVirtualTerminal
POST_BUILD
COMMAND
"${CMAKE_COMMAND}" -E copy_if_different
${CMAKE_CURRENT_LIST_DIR}/lib/Usbcan64.dll
"$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM)

add_custom_command(
TARGET AgISOVirtualTerminal
POST_BUILD
COMMAND
"${CMAKE_COMMAND}" -E copy_if_different
${CMAKE_CURRENT_LIST_DIR}/lib/canal.dll
"$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM)

add_custom_command(
TARGET AgISOVirtualTerminal
POST_BUILD
COMMAND
"${CMAKE_COMMAND}" -E copy_if_different
${CMAKE_CURRENT_LIST_DIR}/lib/InnoMakerUsb2CanLib.dll
"$<TARGET_FILE_DIR:AgISOVirtualTerminal>"
VERBATIM)
endif()

if(APPLE)
install(
TARGETS AgISOVirtualTerminal
RUNTIME
DESTINATION bin
BUNDLE DESTINATION .
COMPONENT applications
)
install(
TARGETS AgISOVirtualTerminal
RUNTIME DESTINATION bin
BUNDLE DESTINATION . COMPONENT applications)
else()
install(
TARGETS AgISOVirtualTerminal
RUNTIME
DESTINATION bin
COMPONENT applications
)
install(TARGETS AgISOVirtualTerminal RUNTIME DESTINATION bin
COMPONENT applications)
endif()

if(MSVC)
install(FILES ${CMAKE_CURRENT_LIST_DIR}/lib/Usbcan64.dll DESTINATION bin COMPONENT applications)
install(FILES ${CMAKE_CURRENT_LIST_DIR}/lib/PCANBasic.dll DESTINATION bin COMPONENT applications)
install(FILES ${CMAKE_CURRENT_LIST_DIR}/lib/canal.dll DESTINATION bin COMPONENT applications)
install(FILES ${CMAKE_CURRENT_LIST_DIR}/lib/InnoMakerUsb2CanLib.dll DESTINATION bin COMPONENT applications)
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/lib/Usbcan64.dll
DESTINATION bin
COMPONENT applications)
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/lib/PCANBasic.dll
DESTINATION bin
COMPONENT applications)
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/lib/canal.dll
DESTINATION bin
COMPONENT applications)
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/lib/InnoMakerUsb2CanLib.dll
DESTINATION bin
COMPONENT applications)
endif()

set (CPACK_PACKAGE_NAME "AgISOVirtualTerminal")
set (CPACK_PACKAGE_VENDOR "Open-Agriculture")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "An ISO11783-6 Server")
set (CPACK_PACKAGE_VERSION "1.2.0")
set (CPACK_PACKAGE_VERSION_MAJOR "1")
set (CPACK_PACKAGE_VERSION_MINOR "2")
set (CPACK_PACKAGE_VERSION_PATCH "0")
set (CPACK_PACKAGE_INSTALL_DIRECTORY "AgISOVirtualTerminal")
set (CPACK_COMPONENTS_ALL applications)
set (CPACK_COMPONENT_APPLICATIONS_DISPLAY_NAME "AgISOVirtualTerminal")
set (CPACK_COMPONENT_APPLICATIONS_DESCRIPTION "A free and open source ISO11783-6 Server")
set (CPACK_PACKAGE_CONTACT "[email protected]")
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_LIST_DIR}/LICENSE")
set (CPACK_PACKAGE_EXECUTABLES "AgISOVirtualTerminal" "AgISOVirtualTerminal")
set(CPACK_PACKAGE_NAME "AgISOVirtualTerminal")
set(CPACK_PACKAGE_VENDOR "Open-Agriculture")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An ISO11783-6 Server")
set(CPACK_PACKAGE_VERSION "1.2.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "2")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "AgISOVirtualTerminal")
set(CPACK_COMPONENTS_ALL applications)
set(CPACK_COMPONENT_APPLICATIONS_DISPLAY_NAME "AgISOVirtualTerminal")
set(CPACK_COMPONENT_APPLICATIONS_DESCRIPTION
"A free and open source ISO11783-6 Server")
set(CPACK_PACKAGE_CONTACT "[email protected]")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_LIST_DIR}/LICENSE")
set(CPACK_PACKAGE_EXECUTABLES "AgISOVirtualTerminal" "AgISOVirtualTerminal")
set(CPACK_ALL_INSTALL_TYPES Full)
set(CPACK_COMPONENT_LIBRARIES_INSTALL_TYPES Full)
set(CPACK_COMPONENT_APPLICATIONS_INSTALL_TYPES Full)
Expand All @@ -171,16 +199,16 @@ set(CPACK_NSIS_MUI_UNICON ${CPACK_NSIS_INSTALLED_ICON_NAME})
set(CPACK_NSIS_DISPLAY_NAME "AgISOVirtualTerminal")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT applications)
include (InstallRequiredSystemLibraries)
include(InstallRequiredSystemLibraries)

if(APPLE)
set(CPACK_GENERATOR DragNDrop ${CPACK_GENERATOR})
set(CPACK_GENERATOR "DragNDrop")
set(CPACK_DMG_FORMAT "UDBZ")
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
set(CPACK_SYSTEM_NAME "OSX")
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
set(CPACK_PACKAGE_ICON ${CPACK_NSIS_INSTALLED_ICON_NAME})
set(CPACK_GENERATOR DragNDrop ${CPACK_GENERATOR})
set(CPACK_GENERATOR "DragNDrop")
set(CPACK_DMG_FORMAT "UDBZ")
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
set(CPACK_SYSTEM_NAME "OSX")
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
set(CPACK_PACKAGE_ICON ${CPACK_NSIS_INSTALLED_ICON_NAME})
endif()

# Must be after the last CPACK macros
Expand Down
15 changes: 7 additions & 8 deletions cmake/FindCAN_Stack.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
if (NOT TARGET isobus::isobus)
include(FetchContent)
FetchContent_Declare(
CAN_Stack
GIT_REPOSITORY https://github.com/Open-Agriculture/AgIsoStack-plus-plus.git
GIT_TAG 67e231298f2ca8367d437d903e396aa3bcefe080
)
FetchContent_MakeAvailable(CAN_Stack)
if(NOT TARGET isobus::isobus)
include(FetchContent)
FetchContent_Declare(
CAN_Stack
GIT_REPOSITORY https://github.com/Open-Agriculture/AgIsoStack-plus-plus.git
GIT_TAG db00fa406a6d83bf8cb75cc32650eb29e0f396e9)
FetchContent_MakeAvailable(CAN_Stack)
endif()
1 change: 1 addition & 0 deletions include/ConfigureHardwareComponent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ConfigureHardwareComponent : public Component
ComboBox hardwareInterfaceSelector;
TextEditor socketCANNameEditor;
TextEditor touCANSerialEditor;
TextEditor ntCANChannelEditor;
TextButton okButton;
std::vector<std::shared_ptr<isobus::CANHardwarePlugin>> &parentCANDrivers;

Expand Down
38 changes: 29 additions & 9 deletions src/ConfigureHardwareComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@
#include "isobus/isobus/can_stack_logger.hpp"
#include "isobus/utility/to_string.hpp"

#ifdef JUCE_WINDOWS
#include "isobus/hardware_integration/toucan_vscp_canal.hpp"
#elif JUCE_LINUX
#include "isobus/hardware_integration/socket_can_interface.hpp"
#endif
#include "isobus/hardware_integration/available_can_drivers.hpp"

ConfigureHardwareComponent::ConfigureHardwareComponent(ConfigureHardwareWindow &parent, std::vector<std::shared_ptr<isobus::CANHardwarePlugin>> &canDrivers) :
okButton("OK"),
Expand All @@ -30,16 +26,17 @@ ConfigureHardwareComponent::ConfigureHardwareComponent(ConfigureHardwareWindow &
hardwareInterfaceSelector.setTextWhenNothingSelected("Select Hardware Interface");

#ifdef ISOBUS_WINDOWSINNOMAKERUSB2CAN_AVAILABLE
hardwareInterfaceSelector.addItemList({ "PEAK PCAN USB", "Innomaker2CAN", "TouCAN", "SysTec" }, 1);
hardwareInterfaceSelector.addItemList({ "PEAK PCAN USB", "Innomaker2CAN", "TouCAN", "SysTec", "NTCAN" }, 1);
#else
hardwareInterfaceSelector.addItemList({ "PEAK PCAN USB", "Innomaker2CAN (not supported with mingw)", "TouCAN", "SysTec" }, 1);
hardwareInterfaceSelector.addItemList({ "PEAK PCAN USB", "Innomaker2CAN (not supported with mingw)", "TouCAN", "SysTec", "NTCAN" }, 1);
#endif

int selectedID = 1;

for (std::uint8_t i = 0; i < parentCANDrivers.size(); i++)
{
if ((nullptr != parentCANDrivers.at(i)) &&
(parentCANDrivers.at(i) == isobus::CANHardwareInterface::get_assigned_can_channel_frame_handler(0)))
if ((nullptr != parentCANDrivers.at(i)) &&
(parentCANDrivers.at(i) == isobus::CANHardwareInterface::get_assigned_can_channel_frame_handler(0)))
{
selectedID = i + 1;
break;
Expand All @@ -57,6 +54,14 @@ ConfigureHardwareComponent::ConfigureHardwareComponent(ConfigureHardwareWindow &
{
touCANSerialEditor.setVisible(false);
}
if (5 == hardwareInterfaceSelector.getSelectedId())
{
ntCANChannelEditor.setVisible(true);
}
else
{
ntCANChannelEditor.setVisible(false);
}
repaint();
};
addAndMakeVisible(hardwareInterfaceSelector);
Expand All @@ -68,6 +73,12 @@ ConfigureHardwareComponent::ConfigureHardwareComponent(ConfigureHardwareWindow &
touCANSerialEditor.setTopLeftPosition(10, 140);
touCANSerialEditor.setInputFilter(inputFilter, true);
addChildComponent(touCANSerialEditor);
ntCANChannelEditor.setName("NTCAN Channel");
ntCANChannelEditor.setText("0");
ntCANChannelEditor.setSize(getWidth() - 20, 30);
ntCANChannelEditor.setTopLeftPosition(10, 140);
ntCANChannelEditor.setInputFilter(inputFilter, true);
addChildComponent(ntCANChannelEditor);
#elif JUCE_LINUX
socketCANNameEditor.setName("SocketCAN Interface Name");
socketCANNameEditor.setText(std::static_pointer_cast<isobus::SocketCANInterface>(parentCANDrivers.at(0))->get_device_name());
Expand All @@ -84,6 +95,11 @@ ConfigureHardwareComponent::ConfigureHardwareComponent(ConfigureHardwareWindow &
int serial = touCANSerialEditor.getText().trim().getIntValue();
std::static_pointer_cast<isobus::TouCANPlugin>(parentCANDrivers.at(hardwareInterfaceSelector.getSelectedId() - 1))->reconfigure(0, static_cast<std::uint32_t>(serial));
}
else if (5 == hardwareInterfaceSelector.getSelectedId()) // NTCAN
{
int channel = ntCANChannelEditor.getText().trim().getIntValue();
std::static_pointer_cast<isobus::NTCANPlugin>(parentCANDrivers.at(hardwareInterfaceSelector.getSelectedId() - 1))->reconfigure(channel);
}

if (nullptr != isobus::CANHardwareInterface::get_assigned_can_channel_frame_handler(0))
{
Expand Down Expand Up @@ -120,6 +136,10 @@ void ConfigureHardwareComponent::paint(Graphics &graphics)
{
graphics.drawFittedText("TouCAN Serial Number", touCANSerialEditor.getBounds().getX(), touCANSerialEditor.getBounds().getY() - 14, touCANSerialEditor.getBounds().getWidth(), 12, Justification::centredLeft, 1);
}
else if (5 == hardwareInterfaceSelector.getSelectedId())
{
graphics.drawFittedText("NTCAN Serial Number (42=Virtual)", touCANSerialEditor.getBounds().getX(), touCANSerialEditor.getBounds().getY() - 14, touCANSerialEditor.getBounds().getWidth(), 12, Justification::centredLeft, 1);
}
#elif JUCE_LINUX
graphics.drawFittedText("Socket CAN Interface Name", socketCANNameEditor.getBounds().getX(), socketCANNameEditor.getBounds().getY() - 14, socketCANNameEditor.getBounds().getWidth(), 12, Justification::centredLeft, 1);
#endif
Expand Down
1 change: 1 addition & 0 deletions src/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class AgISOVirtualTerminalApplication : public juce::JUCEApplication
#endif
canDrivers.push_back(std::make_shared<isobus::TouCANPlugin>(static_cast<std::int16_t>(0), 0));
canDrivers.push_back(std::make_shared<isobus::SysTecWindowsPlugin>());
canDrivers.push_back(std::make_shared<isobus::NTCANPlugin>(0));
#elif defined(JUCE_MAC)
canDrivers.push_back(std::make_shared<isobus::MacCANPCANPlugin>(PCAN_USBBUS1));
#else
Expand Down

0 comments on commit c647d24

Please sign in to comment.