Easy of use, Cross platform, Multi dongle, Powerful script ability, CLI support
Document: https://app.whyengineer.com
EcuBus-Pro is a free and open source alternative to CAN-OE
, designed for automotive ECU development. Our tool offers:
- 🆓 Open source and free
- 🚀 Intuitive user interface
- 💻 Cross-platform compatibility
- 🔌 Multi-vendor USB dongle support (PEAK, Kvaser, ZLG, etc.)
- 📝 TypeScript-based scripting capabilities
- ⌨️ Comprehensive CLI support
See our User Manual for detailed documentation.
Vendor | Supported Protocols |
---|---|
PEAK | CAN CAN-FD LIN |
KVASER | CAN CAN-FD |
ZLG | CAN CAN-FD |
Toomoss | CAN CAN-FD (Coming Soon) |
Feature | Capabilities |
---|---|
Platform Support | Windows (exe,portable) Linux (deb) |
UDS | CAN/CAN-FD DoIP LIN |
Scripting | see script |
Database | LIN LDF (edit and export) |
Graph | Signal Graph |
Our script engine leverages Node.js
, enabling you to:
- Use standard Node.js functions
- Access EcuBus-Pro's extensive API
- Automate testing and diagnostics
Streamline your workflow with CLI support for UDS sequences:
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏
You can also consider sponsoring us to get extra technical support services. If you do, you can get access to the ecubus/technical-support repository, which has the following benefits:
- Handling Issues with higher priority
- One-to-one technical consulting service
- Help to write addon code to access 0x27,0x29 dll functions
This project exists thanks to all the people who have contributed:
Your contributions are always welcome! Please have a look at the contribution guidelines first.
Your logo will show up here.
Apache-2.0
<script setup> import 'viewerjs/dist/viewer.css'; import Viewer from 'viewerjs'; import { onMounted,onUnmounted} from 'vue'; onMounted(() => { const images = document.querySelectorAll('img[alt="base1"]'); const viewerContainer = document.createElement('div'); //setup attribute id for viewerContainer viewerContainer.setAttribute('id', 'viewerContainer'); viewerContainer.style.display = 'none'; document.body.appendChild(viewerContainer); //css pointer images.forEach(img => img.style.cursor = 'pointer'); images.forEach(img => viewerContainer.appendChild(img.cloneNode(true))); const viewer = new Viewer(viewerContainer, { inline: false, zoomRatio: 0.1, }); images.forEach((img, index) => { img.addEventListener('click', () => { viewer.view(index); }); }); }); onUnmounted(() => { const viewerContainer = document.getElementById('viewerContainer'); if (viewerContainer) { viewerContainer.remove(); } }); </script>