I'm fiddling with a serial motor controller board, trying to get it working with a Raspberry Pi. (It works nicely with an Arduino, but one thing I'm learning is that everything hardware-related is far easier with Arduino than with RPi.)
The excellent Arduino library helpfully provided by Pololu has a list of all the commands the board understands. Since it's Arduino, they're in C++, and look something like this:
#define QIK_GET_FIRMWARE_VERSION 0x81 #define QIK_GET_ERROR_BYTE 0x82 #define QIK_GET_CONFIGURATION_PARAMETER 0x83 [ ... ] #define QIK_CONFIG_DEVICE_ID 0 #define QIK_CONFIG_PWM_PARAMETER 1and so on.
On the Arduino side, I'd prefer to use Python, so I need to get them to look more like:
QIK_GET_FIRMWARE_VERSION = 0x81 QIK_GET_ERROR_BYTE = 0x82 QIK_GET_CONFIGURATION_PARAMETER = 0x83 [ ... ] QIK_CONFIG_DEVICE_ID = 0 QIK_CONFIG_PWM_PARAMETER = 1... and so on ... with an indent at the beginning of each line since I want this to be part of a class.
There are 32 #defines, so of course, I didn't want to make all those changes by hand. So I used vim. It took a little fiddling -- mostly because I'd forgotten that vim doesn't offer + to mean "one or more repetitions", so I had to use * instead. Here's the expression I ended up with:
.,$s/\#define *\([A-Z0-9_]*\) *\(.*\)/ \1 = \2/
In English, you can read this as:
From the current line to the end of the file (
look for a pattern
consisting of only capital letters, digits and underscores
[A-Z0-9_]). Save that as expression #1 (
Skip over any spaces, then take the rest of the line (
and call it expression #2 (
Then replace all that with a new line consisting of 4 spaces,
expression 1, a spaced-out equals sign, and expression 2
\1 = \2).
Who knew that all you needed was a one-line regular expression to translate C into Python?
(Okay, so maybe it's not quite that simple. Too bad a regexp won't handle the logic inside the library as well, and the pin assignments.)
[ 21:38 Jan 19, 2013 More linux/editors | permalink to this entry | ]