-
Notifications
You must be signed in to change notification settings - Fork 0
Home
inxware is a development environment for embedded systems that seperates embedded software development integration from application development and systems engineering.
The platform enables engineers and developers to create sophisticated embedded applications without the formidable systems integration drag of conventional embedded programming.
This repository is for those wishing to modify, extend or port the platform to their requiremnts. It is not needed for developing on supported hardware products.
inxware is built around the eRT (event-based RunTime) system that defines a simple uniform event-based API for software components and simplifies all types of data and control interconnection between components.
The ert-components repository contains the core components needed for the inxware eRT system - a high-performance, event-driven runtime designed to run no-code applications on everything from $1 microcontrollers to industrial servers. eRT bridges the gap between ease of use and professional capability, delivering near C/C++ performance while maintaining the simplicity of visual development.
- Universal Hardware Compatibility: Runs on microcontrollers, embedded linux, servers including Arduino boards, ESP32, Raspberry Pi, Android, Linux, Windows, or any custom hardware.
- Component-Based Architecture: Reusable functional blocks organized into specialized toolboxes (core, networking, GUI, media, ML, machine vision)
- Event-Driven Performance: Native event processing approaches the speed of compiled C/C++
- Consolidates Vendor Toolchains & SDKs: Cross-compilation for all targets using Docker environments and GNU Make
- Hardware Abstraction: Uniform component APIs across all platforms with varying capabilities
The platform consists of three main elements:
- Lucid IDE: Visual development environment for creating no-code applications
- eRT Runtime: High-performance execution engine and Component Library (this repository)
- Component Builder: An eclipse plugin that combies graphical function block definition and C/C++ code management.
Whether you're building IoT devices, industrial automation, digital signage, or embedded AI applications, inxware provides the tools to rapid prototype, develop, and deploy sophisticated solutions without the traditional complexity of embedded programming.
Building eRT requires:
- Ubuntu 22+ (recommended) or compatible Linux system
- Git & Git-LFS for repository management
- Docker for containerized cross-compilation
- GNU Make and build-essential tools
These can be installed with
sudo apt install build-essentials git docker-
Clone the Repository
git clone git@github.com:inxware/ert-components.git cd ert-components -
Configure Your Target Platform
./configure # List available targets ./configure linux_x86_64_clang # then choose one
-
Install Dependencies
make prepdeps # Downloads a few GB of SDK dependencies -
Build the inxware Runtime
make all_docker # Build using Docker environment make targetenv # Create runtime environment
-
Test Your Build
./configure -run # runs the../TARGET_TREES/ehs_env-[your-target]/bin/ehs.exe staging build
For detailed build instructions, see eRT Build Guide.
eRT supports numerous platforms out of the box:
| Platform | Architecture | Status | Use Cases |
|---|---|---|---|
| Linux | x86, x86_64, ARM, ARM64 | ✅ Working | Servers, edge computing, Raspberry Pi |
| ESP32 | Xtensa (esp32,S3,C2) | ✅ Community | IoT devices, sensors, wireless |
| Arduino | Various MCUs | ✅ Community | Industrial, prototypes, Education |
| NXP Kenetis | ARM Cortex-M | ✅ Community | Industrial/Atomotive |
| STM32 | ARM Cortex-M | ✅ Ask inx | Consumer/Industrial/Atomotives |
| Android | ARM, ARM64 | ✅ Community | Mobile apps, industrial tablets |
| Windows | x86,x86_64 | ✅ Community | Desktop applications & simulators |
| UNITY3D | Win/Android/Linux | ✅ Ask inx | Digital Signage, VR, Audio |
New platforms and legacy platforms are also available. Ask us!
☑️ Some Systems ✅ All Systems
| Feature | Contrib Tech | Linux | MCUs | Windows |
|---|---|---|---|---|
| GPIO/PWM | Arduino, wiringPi, SDK | ✅ | ✅ | 🔍 |
| Machine Learning | TF-lite | ✅ | 🚧 | ✅ |
| Vachine Vision | OpenCV, GST | ✅ | 🧪 | ✅ |
| GFX/UI | GTK, LVGL, FB | ✅ | ☑️ | ✅ |
| TCPIP/HTTP/MQTT | LWIP, Linux, Curl, ... | ✅ | ✅ | ✅ |
| WiFi | WPASup, ESP32, | ☑️ | ☑️ | ❌ |
| Zigbee | ESP | 🚧 | ✅ | 🚧 |
| Thread/Matter | WiFi, Zigbee, | ☑️ | ☑️ | 🚧 |
| LoRa/LoRaWAN | MODEM (RAK, E5, STM) | ✅ | ✅ | ✅ |
☑️ Some Systems ✅ All Systems 🚧 WIP 🧪 Experimental 🔍 emulated ❌ No Support
Use the ./configure command to explore which platforms are available in your ert-components repo.
The ert-components repository contains the central build system for device software as well as containing source code for all inxware components. Components are arranged in the source tree in directories relating to differently themed toolboxes. All components have a platform independent API and business logic layer and may be supported by hardware-specific code and bindings.
-
Common/Components/- Platform independent implementation-
core/- Essential operators, buffers, converters -
networking/- HTTP, MQTT, sockets, protocols -
gui/- Graphics and UI components -
media/- Audio/video processing -
ml/- Machine learning algorithms -
mv/- Machine vision and image processing
-
-
target/Component-HAL/- Abstraction for binding to target-specific libraries and platforms. -
target/os-arch/- OS and architecture specific code -
target/platform/- Finest-grained product and hardare specific configuration (e.g. "boards")
ert-compoents also contains embedded systems utilities like flashing tools, product generation scripts and a command line-based CI system for unit and system build regression testing.
eRT's modular architecture makes porting to new platforms straightforward. The system separates platform-specific code from cross-platform components to amximise re-usability and consistenct across different target types.
The modular approach allows for features to be disabled or stubbed to allow incremental builds of platforms and reduced feature-sert versions to support resource or SDK capability constraints.
- Platform Configuration - Define build settings and capabilities
- OS-Architecture Support - Implement system-level abstractions
- HAL Implementation - Create hardware abstraction layer
- Component Integration - Port platform-specific components
- Testing & Validation - Ensure functionality and performance
-
Cross-Platform Core: All code in
./Common/MUST run on every target -
Target-Specific Code: Platform implementations in
./target/ -
Docker Environments: Containerized builds ensure consistency (
Dockerfile/Dockerhub) -
Component APIs: Uniform interfaces with platform-specific capabilities (use
iCB) - Hardware Abstraction: Transferable hardware independence structure through a single HAL API layer.
For comprehensive porting information, see eRT Porting Guide.
-
If you have a new software component or type of peripheral you will most likely integrate this as a new Function Block Compoent.
-
If you have a new implementation of an existing function block component or Feature Toolbox then you will most likely want to implement a new directory
./target/Component-HAL/<Feature>/<Implementation>to support your implementation.
eRT's component-based architecture makes it easy to integrate new technologies and extend platform capabilities. Components are the building blocks that users combine in the Lucid IDE to create applications.
Each component consists of:
-
.cdffile - XML component description for the Lucid IDE - C/C++ implementation - Business logic and hardware interfaces
-
help.html- Documentation displayed in Lucid -
tests/directory - Unit tests and example applications - Visual representation - Bitmap files for IDE display
- Define Interface - Specify inputs, outputs, and parameters
- Implement Logic - Write C/C++ following eRT patterns
- Create Documentation - Help files and examples
- Add Visual Assets - Icons and representations
- Integrate & Test - Add to appropriate toolbox
Components are organized into thematic toolboxes:
- Core - Essential operators, buffers, control structures
- Networking - Communication protocols and interfaces
- GUI - User interface and graphics components
- Peripherals - GPIO, sensors, actuators
- Media - Audio/video processing capabilities
- Machine Vision - Image processing and computer vision
- Machine Learning - AI algorithms and inference
New technologies can be integrated at multiple levels:
- Component Level - Add new functional blocks to existing toolboxes
- HAL Level - Implement hardware abstractions for new devices
- Platform Level - Port eRT to entirely new platforms
- Middleware Level - Integrate third-party libraries and SDKs
You will probbly need to consult the detailed documentation before developing a new component, but a brief is provided here. Component development is supported with the following elements of inxware:
- inxware Component Builder (iCB) - Eclipse plugin for visual component creation
- Build System - GNU Make with Docker containerization
- Testing Framework - Automated regression testing
- Documentation - Integrated help system

Community developers typically work within their private user toolbox directory. Components for standard toolboxes are managed by inx limited and are managed alongside CDF file deployments to the Lucid IDE. All components are cryptographically signed to ensure API compatibility with devices and applications developed with the Lucid IDE.
If you are supporting inxware features with new technologies you will begin by adding a new directory into ./ert-components/target/Component-HAL/<Relevant Feature>/<Your Variant
You will add a feature.mk file to this to build it and extend the conditional include in the parent feature.mk file to select it when the relevnt EHS_<FEATURE>_SUPPORT is set to use your implementation.
If your imiplementation already has a build system for your target and/or you do not want to include the source in the ert-component repository you can instead build it outside the repo (e.g. in the
ert-contrib-middlewarerepos and place the headers and libraries in the relevant./target_libs/$OS-$ARCH-$MIDDLEWARE>)/build/directory. You then only need to add some binding code in./ert-components/target/Component-HAL/to call your libraries. See detailed porting documentation for more details of this. You should also build a Dockerfile and build a container for building the target that can then be used to build ert-with the same host SDK.
There are a number of utilities for building, deployng and debugging with Docker container images.
If you are creating new components and not porting to a new environment you wont need to work directly with any Docker/container management commands as the correct Dockerimage is run for you when using make commands like make all_docker
make publish_docker_imageBuilds the Dockerfile .target/platform/<your platform>/Dockefile and publishes it with the name in .target/platform/<your platform>/Dockerimagename
make target_buildenvThis is useful during development if you need to debug the build environment. in this environment you don't need to use the _socker suffix to build commands e.g. make all instead of make all_docker
Ready to get started? Choose your path:
- 📥 Building Applications: Download prebuilt runtimes from AppLand
- 🔧 Platform Development: Follow the Getting Started
- 🛠️ Porting to New Hardware: Check the Porting Guide
- 💡 Component Development: Explore Adding Your Technology
For questions, support, or to learn more about inxware, visit creeate a ticket, discussion or ping us a line:
- github issues
- github discussions
- inxware.io - Let's have a chat!
copyright inx limited, UK, 2025 - join the inxware community @appland
- event_identifier - Registers which input event was last asserted as an index integer
- event_switch - Asserts different events based index integer
- event_text_switch - Asserts events conditioned on string LUT matches.
- EventCounter_versatile1 - Counts events (up and down, with overflow detection)
- trigger_counter - Simple EventCounter
- trigger_eventor2 - Combines all event paths and passes all events through unconditionally
- trigger_eventand2 - Waits for all events to be asserted
- trigger_eventManRstAnd1 - Waits for all events to be asserted and requires a reset event to before retriggering again.
- trigger_eventrstand2 - Waits for all events to be asserted and requires a reset event to before retriggering again.
- trigger_eventboolctrl - passes events through conditional on a Boolean value.
- trigger_eventsetrstbool - Sets and unsets a Boolean depending on event inputs
- trigger_eventtoggbool - Toggles a Boolean value on each inout event.
- trigger_negedgedetect - Asserts events on negative edge of a Boolean value change
- trigger_posedgedetect - Asserts events on positive edge of a Boolean value change
- trigger_eventedgedetect - Asserts events when a Boolean value changes
- STATE - Represents a State in Lucid
- state_condition - Event driven state condition --> transition and actions
- state_debug - To debug state machines this function block is required.
- state_manager - Each state machine is defined by a State Manager
- ArrayBool1 - Array of Boolean Values
- ArrayInt1 - Array Integer Values
- ArrayReal1 - Array of Real Values
- ArrayString1 - Array of String Values
- buffer_fifobbq - FIFO Boolean
- buffer_fifoiiq - FIFO Integer
- buffer_fiforrq - FIFO Real
- buffer_fifossq - FIFO String
- buffer_lifobbq - LIFO Boolean
- buffer_lifoiiq - LIFO Integer
- buffer_liforrq - LIFO Real
- buffer_lifossq - LIFO String
- const_b1 - Boolean Constant
- const_i1 - Integer Constant
- const_r1 - Real Constant
- const_s1 - String Constant
- convertor_tranbix - Converts Bool to Int
- convertor_tranbrx - Converts Bool to Real
- convertor_tranbsx - Converts Int to Bool
- convertor_tranibx - Converts Int to Bool
- convertor_tranirx - Converts Int to Real
- convertor_tranisx - Converts Int to String
- convertor_tranrbx - Converts Real to Bool
- convertor_tranrix - Converts Real to Int
- convertor_tranrsx - Converts Real to String
- convertor_transbx - Converts String to Bool
- convertor_transix - Converts String to Int
- convertor_transrx - Converts String to Real
- logic_and2bbx - Two Input And
- logic_and3bbx - Three Input And
- logic_and4bbx - Four Input And
- logic_nand2bbx - Two Input Nand
- logic_nand3bbx - Three Input Nand
- logic_nand4bbx - Four Input Nand
- logic_nor2bbx - Two Input Nor
- logic_nor3bbx - Three Input Nor
- logic_nor4bbx - Four Input Nor
- logic_notbbx - Not
- logic_or2bbx - Two Input Or
- logic_or3bbx - Three Input Or
- logic_or4bbx - Four Input Or
- logic_xorbbx - Two Input Xor
- calc2_i1 - Single variable expression
- calc2_i2 - 2 variable expression
- calc2_i4 - 4 variable expression
- calc2_i6 - 6 variable expression
- calc2_i8 - 8 variable expression
- operator_absix - AbsoluteInt
- operator_add2ix - AdditionTwo Input Int
- operator_add2rx - AdditionTwo Input Real
- operator_addacci - AddAccumulateInt
- operator_addaccr - AddAccumulateReal
- operator_divix - DivisionInt
- operator_divrx - DivisionReal
- operator_max - Max_Int
- operator_min - Min_Int
- operator_modix - ModulusInt
- operator_modrx - ModulusReal
- operator_mul2ix - MultiplyTwo Input Int
- operator_mul2rx - MultiplyTwo Input Real
- operator_mul3ix - MultiplyThree Input Int
- operator_mul3rx - MultiplyThree Input Real
- operator_mul4ix - MultiplyFour Input Int
- operator_mul4rx - MultiplyFour Input Real
- operator_powix - PowerInt
- operator_powrx - PowerReal
- integrator - Integrator_Int
- integrator_r - Integrator_Real
- operator_cmeibx - operator_cmeibx
- operator_cmeibx1 - ComparatorGreaterEqualInt1
- operator_cmerbx - operator_cmerbx
- operator_cmerbx1 - ComparatorGreaterEqualReal1
- operator_cmpibx - operator_cmpibx
- operator_cmpibx1 - ComparatorGreaterInt1
- operator_cmprbx - operator_cmprbx
- operator_cmprbx1 - ComparatorGreaterReal1
- operator_equibx - operator_equibx
- operator_equibx1 - ComparatorEqualInt1
- operator_equrbx - operator_equrbx
- operator_equrbx1 - ComparatorEqualReal1
- operator_asinhrx - ArcHyperbolicSineReal
- operator_asinrx - ArcSineReal
- operator_atanhrx - ArcHyperbolicTanReal
- operator_atanrx - ArcTanReal
- operator_coshrx - operator_coshrx
- operator_cosrx - CosineReal
- operator_acoshrx - ArcHyperbolicCosineReal
- operator_acosrx - ArcCosineReal
- operator_exprx - ExponentialReal
- operator_log10rx - LogBaseTenReal
- operator_logrx - LogReal
- operator_sqrix - SquareInt
- operator_sqrrx - SquareReal
- operator_sqrtrx - SquareRootReal
- operator_subacci - SubAccumulateInt
- operator_subaccr - SubAccumulateReal
- operator_subix - SubtractionInt
- operator_subrx - SubtractionReal
- operator_tanhrx - HyperbolicTanReal
- operator_tanrx - TanReal
- indexed_mux_int - Indexed Mux Int
- indexed_mux_str - Indexed Mux String
- map_int - Map Int
- mux_1b - mux_1b
- mux_1i - mux_1i
- mux_1r - mux_1r
- mux_1s - mux_1s
- mux_2b - MultiplexTwo Input Bool
- mux_2i - MultiplexTwo Input Int
- mux_2r - MultiplexTwo Input Real
- mux_2s - MultiplexTwo Input String
- mux_3b - MultiplexThree Input Bool
- mux_3i - MultiplexThree Input Int
- mux_3r - MultiplexThree Input Real
- mux_3s - MultiplexThree Input String
- mux_4b - MultiplexFour Input Bool
- mux_4i - MultiplexFour Input Int
- mux_4r - MultiplexFour Input Real
- mux_4s - MultiplexFour Input String
- mux_8b - 8-Input Indexed Boolean Multiplexer Function Block
- mux_8i - 8-Input Indexed Integer Multiplexer Function Block
- mux_8r - 8-Input Real Number Multiplexer Function Block
- mux_8s - Number Multiplexer Function Block
- num_mux - Numeric Multiplexer Function Block
- binary2decimal8 - binary2decimal8
- cgi2json - cgi2json Function Block
- hex2string - Hex String to String Conversion Function Block
- int2HexString - Int2HexString Function Block
- json_stream - JSON Stream Parser Function Block
- JSONObjectFunctionBlock - JSON Object
- key_value - Key Value Pair
- sample2string - Samples to String
- xml_stream - XML Stream
- database - database
- inx-permanent_storage_bool - inx-permanent_storage_bool
- inx-permanent_storage_int - inx-permanent_storage_int
- inx-permanent_storage_real - inx-permanent_storage_real
- inx-permanent_storage_string - inx-permanent_storage_string
- demux_2b - DemultiplexTwoOutputBool
- demux_2i - DemultiplexTwoOutputInt
- demux_2r - DemultiplexTwoOutputReal
- demux_2s - DemultiplexTwoOutputString
- demux_3b - DemultiplexThreeOutputBool
- demux_3i - DemultiplexThreeOutputInt
- demux_3r - DemultiplexThreeOutputReal
- demux_3s - DemultiplexThreeOutputString
- demux_4b - DemultiplexFourOutputBool
- demux_4i - DemultiplexFourOutputInt
- demux_4r - DemultiplexFourOutputReal
- demux_4s - DemultiplexFourOutputString
- demux_8b - 8-Output Boolean Demultiplexer Function Block
- demux_8i - 8-Output Indexed Integer Demultiplexer Function Block
- demux_8r - 8-Output Real Number Demultiplexer Function Block
- demux_8s - 8-Output String Demultiplexer Function Block
- demux_8indexedb - IndexedDemultiplexer_Bool
- demux_8indexedi - IndexedDemultiplexer_Int
- demux_8indexedr - IndexedDemultiplexer_Real
- demux_8indexeds - IndexedDemultiplexer_String
- indexed_demux_int - Indexed Demux Int
- num_demux - Numeric Demultiplexer Function Block
- string_divider - String Divider
- string_subs - SubString
- stringfn_cats - CatString
- stringfn_charats - CharAtString
- stringfn_cmps - CmpString
- stringfn_finds - FindString
- stringfn_formats - string_format_2
- stringfn_formats8 - string_format_8
- stringfn_inserts - InsertString
- stringfn_lens - LenString
- stringfn_lwrs - to LowerString
- stringfn_scanf8 - string_scanf
- stringfn_strats - StrAtString
- stringfn_uprs - to UpperString
- file_rob - FILE_ReadOnly_Bool
- file_roi - FILE_ReadOnly_Int
- file_ror - FILE_ReadOnly_Real
- file_ros - FILE_ReadOnly_String
- file_wob - FILE_WriteOnly_Bool
- file_woi - FILE_WriteOnly_Int
- file_wor - FILE_WriteOnly_Real
- file_wos - FILE_WriteOnly_String
- fs_dir_create_remove - FileSystemDirCreateRemove
- fs_dir_list - FileSystemDirList1
- adc_read - adc_read
- dac - Digital-to-Analog Converter
- display_backlight - Display Backlight Function Block
- gpio_in - GPIO In
- gpio_out - Gpio Output
- numeric_display_char - Digit Display
- pwm - Pulse Width Modulation
- gui_image_file - GUI Image File
- gui_leds - gui_leds
- gui_patch - Gui Patch
- gui_text_bool - gui_text_bool
- gui_text_bool1 - gui_text_bool1
- gui_text_bool2 - Gui Text Bool
- gui_text_int - gui_text_int
- gui_text_int1 - gui_text_int1
- gui_text_int2 - Gui Text Int
- gui_text_real - gui_text_real
- gui_text_real1 - gui_text_real1
- gui_text_real2 - Gui Text Real
- gui_text_string - gui_text_string
- gui_text_string1 - gui_text_string1
- gui_text_string2 - Gui Text String
- gui_viewport - Gui Viewport
- guiimage - guiimage
- guiimage1 - guiimage1
- guitextbox_b - guitextbox_b
- guitextbox_i - guitextbox_i
- guitextbox_r - guitextbox_r
- guitextbox_s - guitextbox_s
- ui_chart - Gui Chart
- ui_list - Gui List
- ui_spinner - Gui Spinner
- keypress - Reads key presses & control keys
- inx-unity - Provides media and animation widget interface
- unity2 - Unity 3D
- webkit - JavaScript/WebKit Interface (Obsolete)
- AvailableLanguages - AvailableLanguages
- SelectLang - SelectLang
- audio_input_level - Calibrate Function Block
- devman_player - devman_player
- playlist_manager - Play Manager
- dtv_diag_s - Dtvdiagnosticstring
- dtv_pvr_list - dtv_pvr_list
- dtv_pvr_play - dtv_pvr_play
- dtv_pvr_play2 - Dtvpvrplay2
- dtv_remote - dtv_remote
- dtv_remote1 - dtv_remote1
- dtv_remote2 - Dtvremotekey2
- inx-netsocket - Provides a raw TCPIP Socket Client
- netsocketrsrvr - Provides a raw TCPIP Socket Server
- url_get - Implements HTTP requests with file or in-memory result processing.
- mqtt_client - MQTT Client
- mqtt_publish - MQTT Publish
- mqtt_subscribe - MQTT Subscribe
- network_config - TCPIP Network Config
- devman_interface - Devman Device Management control and data source.
- wifi_station - Wifi station configurator
- lorawan - LoRaWAN configuration and data processing
- uart - Bi directional UART data IO.
- uart_config - UART Config (e.g. USB, TTL, RS232, RS485)
- modbus_config - Modbus Configuration
- modbus_slave_register - Modbus Slave mode register read/write.
- modbus_read - MODBUS Master Mode data register read
- modbus_write - MODBUS Master Mode register Write
- ADC Polled Analogue to Digital converter.
- ADC_continuous Advanced ADC supporting clocked ISR modes and advanced signal averaging.
- FFT8 Fast Fourier Transform of 8 bit binary input data
- FIR8 Finite Impulse Response filter for 8 bit binary data.
- IIR8 Infinite Impulse Response filter for 8 bit binary data.
- [calibrate](ADC calibrate) - Calibrates the ADCs
- pid_controller - PID Controller with hardware accelertion options
- pid_relay_config - PID GPIO/PWM Configuration Function Block
- mv_camera - Provides access to camera input data image streams
- mv_idsplay - Renders camera image streams.
- mv_resize - Resizes an image using given interpolation method
- mv_crop - Crops and image width and height at a give offset
- mv_apriltag_reader Plain Old Prgramming AprilTag Reader
- ml_tflite_inference Machine learning model inference.
- ml_osvm Online iterative machine learning (training& inference).
- reboot - Reboot the device
- rtc - RealTimeClock - provdes date/time from RTC device or OS.
- rtinfo - RuntimeInfo (e.g. MAC/IP address, memory,... )
- scheduler - Weekly Scheduler
- system_exec - Executes linux shell commands
- rng - Random Number Generator (may use hardware RNG)
- time_clock - time internal clock generator
- wall_clock - wall clock (date/time) provider.
- appget - Application Server
- appinfo - App Info
- application_info_getter - application_info_getter
- application_run - ApplicationRun
- ehs_controller - Runtime Control
- ota - OTA Function Block for updating firmware
- ota_data_parser - Assembles OTA data files from Devman.
Some function blocks that can be used Lucid app are for visual/organisation purposes only and do not translate into any executable ert-components.
- xinputb - XinputBoolean
- xinputi - XinputInteger
- xinputr - XinputReal
- xinputs - XinputString
- xoutputb - XoutputBoolean
- xoutputi - XoutputInteger
- xoutputr - XoutputReal
- xoutputs - XoutputString
-Note this file is autogenerated from ert-config help files and may not currently be complete or properly categorised!