Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Generating a QR code with only ARM Assembly (github.com/barrettotte)
85 points by barrettotte on Sept 8, 2021 | hide | past | favorite | 32 comments


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


Apparently it is possible to create QR codes on Factorio's minimap as well. I wonder if it could be automated using the in-game construction bots.

[Example](https://www.reddit.com/r/factorio/comments/gqfi33/you_can_ma...)


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...

I've uploaded for you to view here: https://mega.nz/file/ctQCxDaQ#Y7-XyMeR2e8nJQ79cJfWKmlfwxPm2Q...

Because, fuck ISO for paywalling knowledge!


Hos do you correct for angles around the axes x, y and z? That’s the hard part I imagine



And here's a Matlab implementation based on that paper:

https://github.com/lapauwThomas/QR_reader

Would be curious to see how it performs.


I updated the comment you replied to with more info :)


Thanks, this is going to be a fun read. =)


The only one I've used is https://github.com/zxing/zxing, but it was a long time ago. Seemed to work ok for DataMatrix.


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?

Huh, interesting -- zxing is in "Maintenance Mode Only": https://github.com/zxing/zxing

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?


If you just want effective and free and don’t care about open, Google’s is the best https://developers.google.com/ml-kit/vision/barcode-scanning

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.


Google's barcode kit seems to be available only for Android and iOS.


The zxing C++ port worked for me recently:

https://github.com/nu-book/zxing-cpp/


I wasn't able to find one for an important project and we ended up having to go with a commercial library. The open source ones were very unreliable.


Would you mind sharing which one? Did you look at a few / are there good comparison articles?


No OP, but I'm aware of a few:

- scandit: https://www.scandit.com/developers/

- cognex: https://cmbdn.cognex.com/

- aspose: https://products.aspose.com/barcode/

In open source, I heard of libdmtx[0], but not much happens on it these days. I also saw html5-qrcode[1]

[0]: https://github.com/dmtx

[1]: https://github.com/mebjas/html5-qrcode, which directly depends on a port of zxing to javascript.


Fascinating, thanks a lot for these.

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


When generating a QR code, you can decide how much redundancy to include, making the QR larger for the same data but more resilient to "scratches".


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 :-)

[0] https://blog.qrstuff.com/2011/12/14/qr-code-error-correction


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.


I tried libdmtx, but it was extremely slow, and also it had problems with most of my barcodes, even after I cleaned up the images as much as I could.


We ended up using one from a company called 2D technology group. They were the only one we found that supported ARM Linux and did grading of codes.


This is the third request for datamatrix barcodes I've seen on HN, Twitter, and Reddit today. What's going on?


I don't know about others, but I want to read Digikey barcodes. They are in data-matrix format.


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.


Wouldn't -Os optimize for size better than hand-crafted ASM? Genuine question.


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.


Bravo!


Every line in the code base is commented




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: