eCAL - enhanced Communication Abstraction Layer

Overview

eCAL - enhanced Communication Abstraction Layer

Copyright (c) 2020, Continental Corporation.

🏠 http://ecal.io

License

License

Build States

Build Windows Server 2019

Build Ubuntu 18.04

Build Ubuntu 20.04

Build Ubuntu 20.04 (Iceoryx)

Build macOS Catalina 10.15

Preface

The enhanced Communication Abstraction Layer (eCAL) is a middleware that enables scalable, high performance interprocess communication on a single computer node or between different nodes in a computer network. eCAL uses a publish / subscribe pattern to automatically connect different nodes in the network. It's choosing the best available data transport mechanisms - UDP for network communication and High Performance Shared Memory for local communication.

eCAL

  • is fast (1 - 10 GB/s depends on payload size - check measured performance here)
  • provides publish / subscribe and client / server patterns
  • is designed brokerless
  • provides a C++ and C interface for easy integration into other languages (like python or csharp)
  • supports intel and arm platforms
  • has powerful tools for recording, replay and monitoring all your data flows - decentralized
  • integrates gently into your ROS2 environement with the brand new eCAL RMW

eCAL runs on

  • Windows (stable)
  • Linux (stable)
  • QNX (stable)
  • MacOS (experimental)
  • FreeBSD (experimental)

Really ?? Just another pub/sub middleware ? Why ? What is the different to my beloved fully featured DDS ?

  • it's stupid simple - no complex configuration effort for all kind of communication details or QOS settings
  • it's message protocol agnostic - choose the message protocol that fits to your needs like Google Protobuf, CapnProto, Flatbuffers ..
  • it's using the standardized recording format HDF5

What is on the roadmap ?

  • more language bindings (rust, go-lang)
  • and ?? tell us about your use case :-)

GitHub project using / used by eCAL

Links

Issues
  • Add generic description field to monitoring data

    Add generic description field to monitoring data

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [x] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [ ] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior? eCAL monitoring data only contains description for topic type.

    Issue Number: #436

    What is the new behavior? eCAL monitoring data will contain generic description for publisher and subscriber endpoints.

    Does this introduce a breaking change?

    • [ ] Yes
    • [x] No

    Other information

    enhancement 
    opened by brakmic-aleksandar 21
  • Publisher can used Shared Memory and UDP

    Publisher can used Shared Memory and UDP

    I was wondering if it was possible for a single publisher to:

    1. Use Shared Memory for other processes on the same host that are subscribing
    2. Use UDP Multicast for other processes that are on different hosts that are subscribing.

    I'm just not sure if this is taken care of automatically (or possible!)

    opened by JeremyBYU 20
  • eCAL 5.7.1 & iceoryx losing messages if having multiple subscribers

    eCAL 5.7.1 & iceoryx losing messages if having multiple subscribers

    Hello!

    I've built eCAL 5.7.1 with iceoryx with the following cmake command: cmake .. -DCMAKE_BUILD_TYPE=Release -DECAL_THIRDPARTY_BUILD_PROTOBUF=ON -DECAL_THIRDPARTY_BUILD_CURL=OFF -DECAL_THIRDPARTY_BUILD_HDF5=ON -DHAS_CAPNPROTO=ON -DBUILD_APPS=OFF -DBUILD_SAMPLES=ON -DBUILD_TIME=ON -DECAL_LAYER_ICEORYX=ON

    Running ecal_sample_latency_snd and ecal_sample_latency_rec_cb along with RouDi give fine results, however, the samples running multiple instances of subscribers produce the following output:

    publisher:

    sudo ./ecal_sample_multiple_snd
    CUDPSender: Setting TTL failed: Invalid argument
    CUDPSender: Setting TTL failed: Invalid argument
    2020-09-30 17:11:01.161 [ Info  ]: Application registered management segment 0x7f5d3e8000 with size 113341568 to id 1
    2020-09-30 17:11:01.161 [ Info  ]: Application registered payload segment 0x7f39c39000 with size 595259200 to id 2
    ...
    pub  109:       3199 Msg/s
    pub  110:       3199 Msg/s
    pub  111:       3199 Msg/s
    pub  112:       3199 Msg/s
    pub  113:       3199 Msg/s
    pub  114:       3199 Msg/s
    pub  115:       3199 Msg/s
    ...
    Sum:          639964  Msg/s
    Sum:             639 kMsg/s
    Sum:               0 MMsg/s
    

    receiver:

    ./ecal_sample_multiple_rec_cb
    CUDPSender: Setting TTL failed: Invalid argument
    CUDPSender: Setting TTL failed: Invalid argument
    create subscribers ..
    2020-09-30 17:10:53.850 [ Info  ]: Application registered management segment 0x7f693e8000 with size 113341568 to id 1
    2020-09-30 17:10:53.851 [ Info  ]: Application registered payload segment 0x7f45c39000 with size 595259200 to id 2
    ...
    sub  109:          0 Msg/s
    sub  110:          0 Msg/s
    sub  111:          0 Msg/s
    sub  112:       3199 Msg/s
    sub  113:          0 Msg/s
    sub  114:          0 Msg/s
    sub  115:          0 Msg/s
    ...
    Sum:            3200  Msg/s
    Sum:               3 kMsg/s
    Sum:               0 MMsg/s
    

    I suppose all subscribers should receive the corresponding message, not just one. I tried to run an other sample code:

    // create 2 publishers
    eCAL::CPublisher pub1("foo1", "std::string");
    eCAL::CPublisher pub2("foo2", "std::string");
     
    // sending "hello world" on 2 different topics
    while(eCAL::Ok())
    {
      pub1.Send("hello");
      eCAL::Process::SleepMS(1000);
      pub2.Send("world");
    }
    
    
    // define a subscriber callback function
    void OnReceive(const char* topic_name_, const std::string& message_)
    {
      printf("We received %s on topic %s\n.", message_.c_str(), topic_name_);
    }
     
    // create 2 subscriber
    eCAL::string::CSubscriber sub1("foo1");
    eCAL::string::CSubscriber sub2("foo2");
     
    // register subscriber callback function
    auto callback = std::bind(OnReceive, std::placeholders::_1, std::placeholders::_2);
    sub1.AddReceiveCallback(callback);
    sub2.AddReceiveCallback(callback);
     
    // idle main thread
    while(eCAL::Ok())
    {
      // sleep 100 ms
      std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    

    In this case, only sub2 is triggered, given 'foo2' in the output. Swapping sub1 declaration with sub2, output will change to 'foo1'. In case of even more subscribers, only the last declarated one triggers. However, splitting each subscriber into different processes, and running parallel each, everything works as they meant to be. But I need to have them all in one process.

    The ecal.ini file(s) were left as default, having:

    network_enabled= true
    inproc_rec_enabled= true
    shm_rec_enabled= true
    udp_mc_rec_enabled= true
    npcap_enabled= false
    use_inproc=0
    use_shm=2
    use_udp_mc=2
    

    Anyways, if I change ecal.ini content, the situation above still exists.

    If so, what am I doing wrong? I would appreciate if anyone could help me with this issue.

    opened by Philip-Kovacs 16
  • Service client `Call` and `CallAsync` APIs do not have a timeout argument

    Service client `Call` and `CallAsync` APIs do not have a timeout argument

    Describe the bug The APIs in ecal_client.h for CServiceClient::Call and CServiceClient::CallAsync do not have a timeout option. It doesn't appear the user has any way of bounding the time that the operation takes. This makes it more challenging for application code to be robust against missing or unresponsive services.

    To Reproduce

    1. Initiate a Call to a very long running service handler

    Expected behavior The client call fails after a user-specified timeout and signals the timeout to the application.

    Desktop (please complete the following information):

    • OS: Ubuntu
    • Version 20.04

    Additional context Add any other context about the problem here.

    opened by bsirang 15
  • Dynamic Service Client

    Dynamic Service Client

    Is your feature request related to a problem? Please describe. I'd like to develop a generic utility to issue service calls to arbitrary service servers since it is a useful tool for testing and development.

    I did something similar with publishing by using this API eCAL::Util::GetDescription(topic); to get the protobuf description during runtime so I can create a dynamic publisher.

    Describe the solution you'd like Ideally I'd like some APIs available to be able to query the service definitions at runtime to be able to call methods dynamically.

    Additional context I'm trying to write a command line utility that would take a JSON string for the request message and a method name to then convert into the request message and call the service with.

    in progress... 
    opened by bsirang 14
  • eCAL Cloud Configuration Not Sending/Receiving Data Correctly

    eCAL Cloud Configuration Not Sending/Receiving Data Correctly

    Currently I have two machines on the same LAN that both send out multicasts to one another via two different streams using eCAL in Cloud Mode. After configuring the network shown in the documentation (here), neither the server or device is able to receive multicast messages from one another.

    • The programs running on the server and device work when eCAL is in Local Mode and both the server and device are on the same machine which suggests the issue is with the network configuration.
    • I tried setting up the network configuration using both netplan and the GUI method shown in the documentation; neither method worked.
    • Using the eCAL monitor GUI, I saw that messages were being written to the topic on the device, but none of those messages were being received on the server which was subscribed to that topic.
    • ecal_sample_person_snd and ecal_sample_person_rec were each tested on each machine and there were no issues there.

    Other details:

    • Both machines are connected to the network using a WiFi dongle
    • Using Google Protobuf
    • Code (I'm not doing anything complicated at all): device tx, server rx

    /etc/netplan/50-ecal-multicast.yaml on the device (server is the same just with a different static IP)

    # Replace eth0 with your network adapter!
    network:
      version: 2
      renderer: NetworkManager # GUI integration for desktop Ubuntu
      ethernets:
    
        # Replace eth0 with your interface!
        wlan0:
    
          # Either use DHCP...
          dhcp4: no
          dhcp6: no
    
          # ... or configure a static address!
          addresses:
            - 10.6.3.148/24
    
          routes:
            - to: 239.0.0.0/24
              via: 0.0.0.0
              metric: 1
    

    ecal.ini (Same on both machines. Cloud mode on, hops to 10, only cloud mode enabled)

    [network]
    network_enabled           = true
    multicast_group           = 239.0.0.1
    multicast_mask            = 0.0.0.15
    multicast_port            = 14000
    multicast_ttl             = 10
    multicast_sndbuf          = 5242880
    multicast_rcvbuf          = 5242880
    
    bandwidth_max_udp         = -1
    
    inproc_rec_enabled        = false
    shm_rec_enabled           = false
    udp_mc_rec_enabled        = true
    
    npcap_enabled             = false
    
    [publisher]
    use_inproc                = 0
    use_shm                   = 0
    use_udp_mc                = 1
    

    Loopback file is the same as whats shown in the documentation.

    If anyone has insight into how to get this working it would be greatly appreciated as I've been stuck on this issue for quite some time.

    opened by JeffreyZh4ng 13
  • eCAL vcpkg

    eCAL vcpkg

    Hi, would you consider adding a vcpkg build (for the ecal libraries not the gui & thirdparty libraries) ? -That would greatly ease the build and integration process on windows & linux.

    opened by niclar 13
  • eCAL_Sub_Receive declaration appears to be incorrect.

    eCAL_Sub_Receive declaration appears to be incorrect.

    Howdy!

    https://github.com/continental/ecal/blob/master/ecal/core/include/ecal/cimpl/ecal_subscriber_cimpl.h#L109

    I believe that this should declare the buf_ parameter as void** and not void*. There isn't a problem calling this and passing a reference to a void* in C or C++; but when generating the FFI interface for other languages it's going to cause troubles. In my case, the code generated by bindgen prevented me from using this function.

    I'm happy to submit a PR.

    Cheers, Chip

    opened by photex 12
  • [Mon]: Refactoring duplication to prefer std::find_if

    [Mon]: Refactoring duplication to prefer std::find_if

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [ ] Feature
    • [ ] Code style update (formatting, renaming)
    • [x] Refactoring (no functional changes, no api changes)
    • [ ] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the new behavior?

    Refactored to use C++ standard library algorithms, which abstracts previous code to a more universal offical-standard abstraction. As the code is now using standard algorithms, there are many great benefits which accompany it.

    Does this introduce a breaking change?

    • [ ] Yes
    • [x] No

    Other information

    OS: Debian Sid Compiler: GCC (Debian 11.2.0-16) 11.2.0

    Very happy to co-author to merge.

    opened by tcoyvwac 11
  • High CPU consumes when the topic with  low frequency, small message size

    High CPU consumes when the topic with low frequency, small message size

    Bug Description I just subscribed to one topic /scam, the frequency is 10hzīŧŒ message size is 3k.

      void OnReceive(const char* topic_name_, const struct eCAL::SReceiveCallbackData* data_)
      {
        std::cout << "OnReceive scam message size(KB):"<< (data_->size)/1024 << std::endl;
      }
    
    int main(int argc, char **argv) {
      // Initialize eCAL
        eCAL::Initialize(argc, argv, "listener");
        eCAL::CSubscriber sub("/scam");
        sub.AddReceiveCallback(std::bind(OnReceive, std::placeholders::_1, std::placeholders::_2));
        while (eCAL::Ok()) {
          // sleep 100 ms
          std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    }
    

    I found the CPU ratio is relatively high as bellow: Selection_187

    Expected behavior As a comparison, I also tested another framework zero-zmq , the CPU usage is below 1%;

    Test Env

    • OS: Ubuntu 16.04
    • Platform Architecture: aarch64 Byte Order: Little Endian CPU(s): 6 On-line CPU(s) list: 0-5 Thread(s) per core: 1 Core(s) per socket: 3 Socket(s): 2 CPU max MHz: 1800.0000 CPU min MHz: 408.0000
    question 
    opened by long131ss 11
  • Python Service Example does not work

    Python Service Example does not work

    The Python simple service example does not work. The example is an integrated server and client example. The program hangs/is-stuck when the client tries to call the server on line 76: https://github.com/continental/ecal/blob/master/samples/python/minimal_service/minimal_service.py#L76

    (realsense) ➜  realsense-tracking git:(master) ✗ python -m scripts.scratch.minimal_service
    eCAL v5.8.5 (18.03.2021)
    
    'DemoService' method 'foo' requested with : b'hello foo 1'
    

    This might be because Python is single threaded and it cant handle being a server and client in the way ECAL is currently structured for python bindings? Note this example I posted a while back still works as expected. It splits the sever and client into two files and two separate python processes.

    On a totally different note: I will be trying to create an ECAL server as well as having ECAL subscriber in the same python process soon. I'm wondering how ECAL is handling threading for these purposes and if everything will work out of the box. Wondering if its all on the same thread (with GIL), 2 threads, or even more. And if proper threading or multiprocessing locks will work to synchronize between them. I'll try it and see how it goes.

    bug 
    opened by JeremyBYU 11
  • macos m1 run sample failed with segmentation fault

    macos m1 run sample failed with segmentation fault

    Describe the bug segmentation fault,

    To Reproduce Steps to reproduce the behavior:

    1. this is my cmake
    cmake .. -DCMAKE_BUILD_TYPE=Release -DHAS_QT5=OFF -DHAS_CAPNPROTO=ON -DBUILD_STANDALONE_PY_WHEEL=ON -DHAS_HDF5=OFF
    
    1. run sample
    ./ecal_sample_minimal_snd_c 
    eCAL::Config - Could not load ini file, using defaults. File name : ecal.ini
    [1]    86023 segmentation fault  ./ecal_sample_minimal_snd_c
    
    1. lldb
    lldb ./ecal_sample_minimal_snd_c
    (lldb) target create "./ecal_sample_minimal_snd_c"
    Current executable set to '/Users/xixioba/Desktop/gitlabs/ecal/build/bin/ecal_sample_minimal_snd_c' (arm64).
    (lldb) r
    Process 87656 launched: '/Users/xixioba/Desktop/gitlabs/ecal/build/bin/ecal_sample_minimal_snd_c' (arm64)
    eCAL::Config - Could not load ini file, using defaults. File name : ecal.ini
    Process 87656 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x78)
        frame #0: 0x00000001004c03c8 libecal_core.5.dylib`asio::detail::scheduler::init_task() + 20
    libecal_core.5.dylib`asio::detail::scheduler::init_task:
    ->  0x1004c03c8 <+20>: ldrb   w20, [x0, #0x78]
        0x1004c03cc <+24>: cbz    w20, 0x1004c03d8          ; <+36>
        0x1004c03d0 <+28>: add    x0, x19, #0x38
        0x1004c03d4 <+32>: bl     0x1004edc98               ; symbol stub for: pthread_mutex_lock
    Target 0: (ecal_sample_minimal_snd_c) stopped.
    (lldb) bt
    * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x78)
      * frame #0: 0x00000001004c03c8 libecal_core.5.dylib`asio::detail::scheduler::init_task() + 20
        frame #1: 0x0000000100405890 libecal_core.5.dylib`asio::execution_context::service* asio::detail::service_registry::create<asio::detail::reactive_socket_service<asio::ip::udp>, asio::io_context>(void*) + 120
        frame #2: 0x00000001004bf114 libecal_core.5.dylib`asio::detail::service_registry::do_use_service(asio::execution_context::service::key const&, asio::execution_context::service* (*)(void*), void*) + 88
        frame #3: 0x00000001004090a8 libecal_core.5.dylib`asio::basic_socket<asio::ip::udp, asio::any_io_executor>::basic_socket<asio::io_context>(asio::io_context&, asio::ip::udp const&, asio::constraint<is_convertible<asio::io_context&, asio::execution_context&>::value, asio::defaulted_constraint>::type) + 68
        frame #4: 0x00000001004075a0 libecal_core.5.dylib`eCAL::CUDPSenderImpl::CUDPSenderImpl(eCAL::SSenderAttr const&) + 132
        frame #5: 0x0000000100408254 libecal_core.5.dylib`eCAL::CUDPSender::Create(eCAL::SSenderAttr const&) + 96
        frame #6: 0x0000000100474df0 libecal_core.5.dylib`eCAL::CLog::Create() + 1000
        frame #7: 0x0000000100473680 libecal_core.5.dylib`eCAL::CGlobals::Initialize(unsigned int, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >*) + 788
        frame #8: 0x000000010045ae7c libecal_core.5.dylib`eCAL::Initialize(int, char**, char const*, unsigned int) + 2332
        frame #9: 0x0000000100003ddc ecal_sample_minimal_snd_c`main + 80
        frame #10: 0x000000010001108c dyld`start + 520
    (lldb) 
    
    opened by xixioba 1
  • Feature/shellcheck warnings

    Feature/shellcheck warnings

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [ ] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [X] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior?

    • When analyzed by shellcheck, it gives warnings for the shell script build.sh.
    • In this script an unnecessary parameter is passed to detect the root directory.

    Issue Number: N/A

    What is the new behavior?

    • When analyzed by shellcheck, it gives now zero warnings.
    • The unnecessary parameter is removed.

    Does this introduce a breaking change?

    • [ ] Yes
    • [X] No

    Other information

    This branch just cleans the shell script, there are no functional changes.

    opened by OrhanKupusoglu 0
  • Multicast groups are not updated when network interfaces change on linux

    Multicast groups are not updated when network interfaces change on linux

    Describe the bug

    Starting ecal nodes, on a machine with the main network interface down and just the loopback available, will not start network communication when the main network interface goes up. Nodes need to manually restarted when network interfaces are up and running to get network communication going.

    To Reproduce Steps to reproduce the behavior:

    Setup

    2 Devices. Both Linux. Multicast routes for lo and main interface (enp2s0f0) are set on both devices.

    239.0.0.0/24 dev enp2s0f0 proto static metric 1
    239.0.0.0/24 dev lo proto static metric 1000
    

    Test

    Start ecal_sample_minimal_snd on one machine and ecal_sample_minimal_rec on the other with the ethernet cable unplugged.

    On the machine running ecal_sample_minimal_rec. You will see the following in 'ip maddr show'. Multicast group is joined on loopback device. Makes sense. enp2s0f0 is down.

    ip maddr show | grep "lo\|enp2s0f0\|239.0.0"
    
    1:      lo
            inet  239.0.0.7
            inet  239.0.0.1 users 2
    2:      enp2s0f0
    

    Plug cable in enp2s0f0.

    ip maddr show | grep "lo\|enp2s0f0\|239.0.0"
    
    1:      lo
            inet  239.0.0.7
            inet  239.0.0.1 users 2
    2:      enp2s0f0
    

    The subscription doesn't start. The group is still just joined on lo.

    Same thing again with cable plugged in at the beginning. The group is joined on enp2s0f0 because it was up at the time and has a higher metric(?).

    ip maddr show | grep "lo\|enp2s0f0\|239.0.0"
    
    1:      lo
    2:      enp2s0f0
            inet  239.0.0.7
            inet  239.0.0.1 users 2
    

    Unplugging the cable will stop packets getting through and it resumes after plugging the cable back in. Also ecal_mon_gui will complain about getting ecal monitoring information when it was started before the cable was unplugged.

    Expected behavior Network communication should start when the main network interface comes up and ecal_mon_gui shouldn't be reporting monitoring errors. Also nodes should not need to be restarted to recover communication.

    Desktop:

    • OS: Ubuntu
    • Version 22.04

    Additional context

    I've created a workaround. So far for linux only.

    The idea was to add thread to CUDPReceiverAsio which keeps track of multicast groups and up running and running network interfaces. When groups are joined/left or network interfaces come up/go down the groups get updated.

    I am guessing that 'm_socket.set_option(asio::ip::multicast::join_group(asio::ip::make_address(ipaddr_)), ec);' in UDPReceiverAsio::AddMultiCastGroup just joins the group on one interface. I think it's the one up with the lowest metric in this case 'lo'. So when the network interfaces change the group has to be re-joined to make the communication recover.

    The workaround can be found here: https://github.com/tekniqueltd/ecal/commit/b5282a79075499992bf0747ca95511b4e91eb593

    But maybe there is an easier way to deal with this?

    opened by floroeske 3
  • Explicitly include <cstring> for strerror() to support GCC12.

    Explicitly include for strerror() to support GCC12.

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [ ] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [x] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior? The build fails with GCC 12 on Arch Linux because strerror() is not found in filesystem.cpp.

    Issue Number: N/A

    What is the new behavior? The build passes with GCC 12 on Arch Linux because cstring is included explicitly.

    Does this introduce a breaking change?

    • [ ] Yes
    • [x] No

    Other information This problem is also present in fineftp-server, so this pull request alone won't fix the whole problem. I also created pull request for fineftp-server in their repository and will probably ask for a version bump once that is processed.

    opened by Blutkoete 0
  • Test using robust mutex among multiple processes

    Test using robust mutex among multiple processes

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [x] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [ ] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior?

    Issue Number: N/A

    What is the new behavior?

    Does this introduce a breaking change?

    • [x] Yes
    • [ ] No

    Other information

    opened by hassnaaHamdi 0
Releases(v5.10.1)
Owner
Continental
Continental develops pioneering technologies and services for sustainable and connected mobility of people and their goods.
Continental
eCAL - enhanced Communication Abstraction Layer

eCAL - enhanced Communication Abstraction Layer The enhanced Communication Abstraction Layer (eCAL) is a middleware that enables scalable, high perfor

Continental 513 Jun 27, 2022
Low Level Graphics Library (LLGL) is a thin abstraction layer for the modern graphics APIs OpenGL, Direct3D, Vulkan, and Metal

Low Level Graphics Library (LLGL) Documentation NOTE: This repository receives bug fixes only, but no major updates. Pull requests may still be accept

Lukas Hermanns 1.4k Jun 19, 2022
A versatile script engine abstraction layer.

ScriptX A versatile script engine abstraction layer ScriptX is a script engine abstraction layer. A variety of script engines are encapsulated on the

Tencent 345 Jun 27, 2022
Yet another abstraction layer - a general purpose C++ library.

Yet Another Abstraction Layer What yaal is a cross platform, general purpose C++ library. This library provides unified, high level, C++ interfaces an

Marcin Konarski 15 Jun 30, 2022
NVRHI (NVIDIA Rendering Hardware Interface) is a library that implements a common abstraction layer over multiple graphics APIs

NVRHI Introduction NVRHI (NVIDIA Rendering Hardware Interface) is a library that implements a common abstraction layer over multiple graphics APIs (GA

NVIDIA GameWorks 381 Jun 19, 2022
Direct3D to OpenGL abstraction layer

TOGL Direct3D -> OpenGL translation layer. Taken directly from the DOTA2 source tree; supports: Limited subset of Direct3D 9.0c Bytecode-level HLSL ->

Valve Software 2k Jun 26, 2022
GnuTLS implements the TLS/SSL (Transport Layer Security aka Secure Sockets Layer) protocol

GnuTLS implements the TLS/SSL (Transport Layer Security aka Secure Sockets Layer) protocol

Jonathan Bastien-Filiatrault 3 Jun 3, 2021
Kokkos C++ Performance Portability Programming EcoSystem: The Programming Model - Parallel Execution and Memory Abstraction

Kokkos: Core Libraries Kokkos Core implements a programming model in C++ for writing performance portable applications targeting all major HPC platfor

Kokkos 1k Jun 25, 2022
Compression abstraction library and utilities

Squash - Compresion Abstraction Library

null 362 Jun 6, 2022
PhysicsFS; a portable, flexible file i/o abstraction.

PhysicsFS; a portable, flexible file i/o abstraction.

Ryan C. Gordon 205 Jun 24, 2022
Portable, Noto-powered font-rendering abstraction based on FreeType and Raqm

Mechascribe Mechascribe is still under construction and nothing is functional yet. Mechascribe is a text rendering abstraction trying to support as mu

null 4 Jan 27, 2022
Mesh Data Abstraction Library

MDAL Mesh Data Abstraction Library MDAL is OSGeo Community Project see Unstructured Mesh Layers see 3D layered meshes see 1D meshes see Mesh frame edi

lutraconsulting 113 Jun 23, 2022
Language that provides an abstraction to a PART of GTK difficulty

Welcome to GPP_COMPILER Language that provides an abstraction to a PART of GTK difficulty . To get projet on your computer, clone it using the followi

null 9 Jan 28, 2022
a minimal C++, SDL2, OpenGL abstraction for general game and application development

hept the hept abstraction is a minimal lightweight layer above C++ and SDL dependencies: - SDL2 - C++17 or above - GLM example use: #include "hept.h"

ENDESGA 10 May 23, 2022
A programmable and highly maneuverable robotic cat for STEM education and AI-enhanced services.

OpenCat is the open-source Arduino and Raspberry Pi-based robotic pet framework developed by Petoi, the maker of futuristic programmable robot

Petoi LLC 717 Jun 23, 2022
IA-LIO-SAM is enhanced LIO-SAM using Intensity and Ambient channel from OUSTER LiDAR.

IA-LIO-SAM Construction monitoring is one of the key modules in smart construction. Unlike structured urban environment, construction site mapping is

Kevin Jung 70 Jun 26, 2022
Registry Explorer - enhanced Registry editor/viewer

Registry Explorer Replacement for the Windows built-in Regedit.exe tool. Improvements over that tool include: Show real Registry (not just the standar

Pavel Yosifovich 951 Jun 25, 2022
The QPEP-Enhanced Direct Sparse Odometry (DSO) with Loop Closure

QPEP-DSO: Quadratic Pose Estimation Problems (QPEP) Enhanced Direct Sparse Odometry with Loop Closure Code Arch The codes are motivated by DSO (https:

Jin Wu 8 Jun 23, 2022
QPEP (Quadratic Pose Estimation Problems) Enhanced VINS-Mono SLAM System

VINS-Mono-QPEP The QPEP (Quadratic Pose Estimation Problems) Enhanced VINS-Mono

Jin Wu 24 Jun 3, 2022
Quake Enhanced Capture the Flag multiplayer mod

QECTF Quake Enhanced Capture the Flag multiplayer mod What is it? This is a multiplayer deathmatch mod for Quake Enhanced that adds basic capture the

null 4 Jun 21, 2022
Combination of various small tweaks/mods for Quake Enhanced

QETweaks A collection of "tweaks" (small mods) for Quake Enhanced multiplayer servers. Enabling tweaks Set saved1 console variable to desired value be

CK 1 Dec 29, 2021
This repository contains a set of InternalBlue patches for the BCM4375B1 Bluetooth controller, allowing to sniff and inject Zigbee, Mosart and Enhanced ShockBurst packets from a Samsung Galaxy S20 smartphone.

RadioSploit 1.0 - Patches This repository contains a set of InternalBlue patches for the BCM4375B1 Bluetooth controller, allowing to sniff and inject

Romain Cayre 11 Aug 29, 2021
Plus42 : An Enhanced HP-42S Calculator Simulator

------------------------------------------------------------------------------- Plus42 is an advanced scientific programmable calculator app. It simul

Thomas Okken 12 Mar 8, 2022
Quake Enhanced mod where one player (The Juggernaut) is very strong and all other players have to kill the Juggernaut

QE Juggernaut Quake Enhanced Juggernaut (A modification of the QEHunter mod by JPiolho.) This is a multiplayer mod where one player is the Juggernaut.

null 2 Jun 6, 2022
Enhanced CMake Project Manager plugin for Qt Creator

CMakeProjectManager2 Alternative CMake support for Qt Creator. Main differents from original CMakeProject plugin: Project file list readed from file s

Alexander Drozdov 71 May 24, 2022
A powerful duplicate file finder and an enhanced fork of 'fdupes'.

Introduction jdupes is a program for identifying and taking actions upon duplicate files. A WORD OF WARNING: jdupes IS NOT a drop-in compatible replac

Jody Bruchon 1.2k Jun 26, 2022
A Visual Studio extension that provides enhanced support for editing High Level Shading Language (HLSL) files

HLSL Tools for Visual Studio This extension is for Visual Studio 2017 / 2019. Go here for the Visual Studio Code extension. HLSL Tools is a Visual Stu

Tim Jones 398 Jun 22, 2022
A Quake Enhanced mod to manipulate entities. Inspired by the Half-Life metamod plugin 'Entmod'

QEEntmod A Quake Enhanced mod to manipulate entities. Inspired by the Half-Life metamod plugin 'Entmod' Can be used standalone or easily implemented i

null 1 Mar 17, 2022
OpenVi is an enhanced and portable implementation of the Berkeley vi / ex text editor, originally developed by Bill Joy.

OpenVi is an enhanced and portable implementation of the Berkeley vi / ex text editor, originally developed by Bill Joy.

Jeffrey H. Johnson 84 Jun 15, 2022