On a similar note, I've been working on a QR code generator in Minecraft using redstone (the in-game equivalent of circuits), it has both been rather interesting and very painful to create. Definitely a great way to gain experience. I'll probably finish the project sometime this week.
Oh man I always wanted to build some insane things with redstone, but never got around to diving in. I have a little 4-bit architecture I'm working on so one day I can implement it in Minecraft and/or Satisfactory.
I hope to see your creation sometime, that sounds awesome
OT. Does anyone know of a good open source library to read "Data Matrix" 2d barcodes? The ones I found are either broken or extremely slow. The frustrating part is that there seem to be many mobile phone apps which can do it just fine, but I want to run this in my own code on my desktop machine, so each barcode can trigger an appropriate action.
The spec is quite clear (i was able to implement creating datamatrix codes of all sizes/shaped from the spec in C in a day). Take a look at it. It also covers how to decode them. You might be able to write it yourself and learn a lot in the process.
It goes into great depth on suggested methods to decode. See section 9 "Reference decode algorithm for Data Matrix" in ISO/IEC 16022 second edition 2006-09-15, which you'll need to BUY...
zxing has an online decoder -- https://zxing.org/w/decode.jspx -- but I've seen it fail so often that I'm wondering whether it's very "strict" / doesn't account for image distortion that much?
Or does the web site use hardcoded settings that are more tweakable in the library?
I'd be suuuuper interested to know: what's the state of the art in terms of QR decoding, both in terms of decoding speed, amenability to various image distortions, and (which I've always dreamed of) the ability to partially decode a QR code, even if the error correction fails for some parts of it, or even totally? i.e. a very very verbose debugging/decoding mode?
Also depending on your application you could buy a hardware scanner like https://www.zebra.com/us/en/products/scanners/fixed-mount-sc... for cheap secondhand since they are all over retail. The protocol can be as simple as it “types” the barcode over USB HID like a keyboard, or there are more specialized modes.
Scandit and Cognex have iOS apps, and Aspose has a web recognizer demo.
I tried all three with a 2D QR code (my vax card!) from which I truncated ~2-3 bit-"rows" from the bottom. None of the apps/site detected the code.
This is truly not a thorough test -- the 2D rows may be more information-dense than I think i.e. they are not recoverable using the built-in error correction (basically I'm removing too much information -- the equivalent of a long/deep scratch on a CD).
--
I'm just trying to get an intuitive sense of how much damage a QR code can sustain and ... I guess if there's such a thing as QR code forensics (there must be...??) for decoding partial codes versus not detecting "anything".
Thanks again for the links. Super interesting space
Thanks. Looking into it [0], the QR code I'm testing uses the "up to 7% damage" error correction level L, which makes sense since there's already a lot of data being packed in the (vax proof) code.
... I still want to find a debugging/verbose QR decoder :-)
There are a lot more QR code libraries available, and while they're conceptually very similar, the open source DataMatrix libraries are much less developed and are far less reliable.
you should obviously never use assembly for this type of project/application.
...unless you're working in certain types of embedded development, where rewriting code in Asm to save going to the next larger size of device is a semi-common occurrence.
I'm not really familiar with ARM Asm so I can't easily point out optimisation opportunities like I can with x86, but would like to see a size comparison with a stripped-down C implementation (of similar capability) put through a compiler.
My experience is mostly with x86, where the answer is a definitive "no"; for ARM, my guess is "likely no" --- it's a RISC, so instruction selection isn't as critical, and all instructions are fixed-width so again there isn't as much flexibility in instruction selection (e.g. in x86 a "xor reg, reg" is the canonical way to zero a register, and explicit loading with a constant 0 is very much discouraged and a few bytes bigger, even compilers know about that now.) That said, I've also seen compilers do ridiculous stupid things which no human ever would.
Cant speak much for x86, but for many older / less common architectures (I can speak for z80) the compilers aren’t as advanced or are missing extensive optimizations.