circuitpython
rust-bindgen
circuitpython | rust-bindgen | |
---|---|---|
94 | 56 | |
4,325 | 4,931 | |
0.4% | 1.0% | |
0.0 | 9.1 | |
5 days ago | 5 days ago | |
C | Rust | |
GNU General Public License v3.0 or later | BSD 3-clause "New" or "Revised" License |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
circuitpython
-
Talking to the Pico over USB
The keypad itself can mimic any keypresses on a regular keyboard if the Pico is installed with CircuitPython, so the Pico-to-Mac communication is already set up. For the Mac to communicate with the Pico, I managed to piece the instructions together from various sources. That’s the bit I’ll be bringing together into this article.
-
Thoughts on a machine?
As another point for those interested, it (to my knowledge) is currently the ONLY implementation of a scoring machine that the firmware for the device is written in Circuit Python. which gives this unit an advantage when it comes to any and all multi tasking that the unit may need to do.
-
Unveiling secrets of the ESP32: creating an open-source Mac layer
The barrier to entry has never been lower. Last night I prototyped some code in Python on my Mac to talk to a Bluetooth peripheral, and then had ChatGPT translate it to Arduino C++ code for a $5 ESP32 which mostly worked on the first go.
You can even run Python on microcontrollers these days. See Adafruit's https://circuitpython.org for which they publish modules for many (almost all?) of the sensors they sell. The modern microcontroller frameworks hide much of the complexity of Wi-Fi, Bluetooth, filesystems, etc. so you can do complicated things with minimal effort. You can really cobble something together in an afternoon.
-
ALT.CTRL.GameCraft Workshop @ Beta Festival Write-up
The Pico runs CircuitPython and uses Adafruit's HID library to emulate a keyboard. It's also possible to emulate a mouse and a gamepad (there are some experiments for gamepad emulation in experiments).
- CircuitPython added supports for Makerdiary nRF52840 Connect Kit
-
HT1632c library for circuitpython
Asked your question in the adafruit discord and they said there's no HT1632c library for circuit python yet. There is a library for micropython. You can request to have it ported from the Micropython library I linked to by opening a feature request in the Circuit Python Github. That would be your best option for now or attempt to port the library yourself.
- Question about programming arduino
-
This may be an odd question but can someone give me a Tl;dr of the Adafruit ecosystem between 2019-now?
Microcontrollers can run Python now https://circuitpython.org/
-
Projects for newbs!
I'm aware of two versions of Python for microcontrollers. Micro Python and Circuit Python
-
Pause and resume more than one audiofile with audiocore
I tried to look in https://github.com/adafruit/circuitpython/tree/main/shared-bindings at audiocore, audioio, an audiomixer looking for a way to access the sample counter manually but I have no clue what I'm looking at :(
rust-bindgen
-
Part 1: A Deep Dive into Rust and C Memory Interoperability
Rust bindgen[1] will automatically generate native Rust stucts (and unions) from C headers where possible. Note that c_int, c_char, etc. are just aliases for the cooresponding native Rust types.
However, not all C constructs have idomatic Rust equivalents. For example, bitfields don't exist in Rust, and unlike Rust enums, C enums can have any value of the underlying type. And for ABI reasons, it's very commom in C APIs to use a pointer to an opaque type paired with what are effectively accessor function and methods, so mapping them to accessors and methods on a "Handle" type in Rust often is the most idomatic Rust representation of the C interface.
[1]: https://github.com/rust-lang/rust-bindgen
-
Ask HN: What less-popular systems programming language are you using?
You only hand-write function bindings in simple or well-constrained cases.
In general, the expectation is that you will use bindgen [0].
It's a very easy process:
1. Create a `build.rs` file in your Rust project, which defines pre-build actions. Use it to call bindgen on whatever headers you want to import, and optionally to define library linkage. This file is very simple and mainly boilerplate. [1]
2. Import your bindgen-generated header as a module and... just use it. [2]
You can also skip step 1: bindgen is also a CLI tool, so if your C target is stable, you can just run bindgen once to generate the Rust interface module and move that right into your crate.
[0]: https://rust-lang.github.io/rust-bindgen/
[1]: https://rust-lang.github.io/rust-bindgen/tutorial-3.html
[2]: https://github.com/Charles-Schleich/Rust-Bindgen-Example/blo...
-
Static search trees: 40x faster than binary search
Well, I don't use makefiles to deploy software with Rust. I also have never used lex or yacc, but I bet there are similar tools in the ecosystem, or wrappers for those. That would obviate what I will offer below.
Often a new language in a project would define an application boundary. So those would be different containers or services. I may deploy via container images, or an OS specific installer, etc. If we aren't crossing an application boundary I may use FFI. Sometimes I use https://rust-lang.github.io/rust-bindgen/ to smooth that over for C dependencies. There is also a nice concept called a build.rs file: https://doc.rust-lang.org/cargo/reference/build-script-examp.... There's also tools like: https://github.com/casey/just and https://sagiegurari.github.io/cargo-make/
I rarely use multiple languages with Rust. A lot of interpreted languages have bindings through crates and can go in to a project through Cargo. If it involves JS/TS on desktop, I'm usually using Tauri for that. Guess it depends on the system?
Hopefully that helps. You can also still use a Makefile if you want I just haven't dealt with one in a long time.
-
Eliminating Memory Safety Vulnerabilities at the Source
Essentially, this has been Rusts value proposition from the outset - build a language that you can integrate into other codebases seamlessly, hence the choice of no runtime, no garbage collector etc. Bindgen (https://github.com/rust-lang/rust-bindgen) and similar tooling were around essentially since day one to assist in that.
It’s the only approach that has any chance of transitioning away from unsafe languages for existing, mature codebases. Rewriting entirely in a different language is not a reasonable proposition for every practical real-world project.
-
Rust for Filesystems
Now, if you have a complex library and don't want to write all of the declarations by hand, you can use a tool like bindgen to automatically generate those extern declarations from a C header file: https://github.com/rust-lang/rust-bindgen
There's an argument to be made that something like bindgen could be included in Rust, not requiring a third party dependency and setting up build.rs to invoke it, but that's not really the issue at hand in this article.
The issue is not the low-level bindings, but higher level wrappers that are more idiomatic in Rust. There's no way you're going to be able to have a general tool that can automatically do that from arbitrary C code.
- Rust Bindgen
-
ffizz: Build a Beautiful C API in Rust
Rust supports two kinds of FFI: calling into Rust from another language; and calling into another language from Rust. Most of the thought and tooling that exists right now is organized around the second kind. For example, bindgen is a popular tool that generates useful Rust wrappers from a C or C++ header file.
-
Best practices in creating a Rust API for a C++ library? Seeking advice from those who've done it before.
I have looked into bindgen, but found that it would not be feasible due to OMPL not having a C API, just C++.
-
the graphics driver doesn't work on gentoo.
Yes! Are you running LLVM version 16.0.0 or newer, by any chance? I believe this is an issue with some builds of bindgen with newer versions of LLVM. See https://github.com/rust-lang/rust-bindgen/issues/2488
-
Any sort of plugin engine with dynamic load ability and any limitations?
On native, you have to define a C API, probably using a header file. Even if both sides are implemented in Rust, they have to speak that C API (documentation).
What are some alternatives?
MicroPython - MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems
cxx - Safe interop between Rust and C++
moddable - Tools for developers to create truly open IoT products using standard JavaScript on low cost microcontrollers.
JNA - Java Native Access
micropython-ulab - a numpy-like fast vector module for micropython, circuitpython, and their derivatives
autocxx - Tool for safe ergonomic Rust/C++ interop driven from existing C++ headers