"My company makes a device with a movable wheel that's connected to a computer," Geoff writes, "the device incorporates a design where notches in the wheel encode a binary pattern that can be read by sensors. The computer determines the position of the wheel by reading the sensors from a digital I/O card."
"It's actually a clever way of putting an impromptu encoder on the wheel. The software is, unfortunately, not so clever."
#define POS_0 0
#define POS_1 01
#define POS_2 10
#define POS_3 11
#define POS_4 100
#define POS_5 101
#define POS_6 110
#define POS_7 111
#define POS_8 1000
#define POS_9 1001
...snip...
int bit0 = DIO_Input & 1;
int bit1 = DIO_Input & 2;
int bit2 = DIO_Input & 4;
int bit3 = DIO_Input & 8;
// normalize
if (bit0 != 0) bit0 = 1;
if (bit1 != 0) bit1 = 1;
if (bit2 != 0) bit2 = 1;
if (bit3 != 0) bit3 = 1;
Position = 1000*bit3 + 100*bit2 + 10*bit1 + bit0;
...snip...
// Which position is engaged?
switch (Position)
{
case POS_0: {
pWidget->nCurrentPosition = 0;
pWidget->sCurrentPosition = pWidget->m_sPositionName_0;
break;
}
case POS_1: {
pWidget->nCurrentPosition = 1;
pWidget->sCurrentPosition = pWidget->m_sPositionName_1;
break;
}
...snip...
case POS_9: {
pWidget->nCurrentPosition = 9;
pWidget->sCurrentPosition = pWidget->m_sPositionName_9;
break;
}
}