josh e01f879400 make SIGINT exit program
git-svn-id: svn://anubis/misc/parapin-led@56 bd8a9e45-a331-0410-811e-c64571078777
2008-04-30 22:57:14 +00:00

105 lines
2.3 KiB
C

#include <parapin.h>
#include <stdlib.h> /* atoi() */
#include <unistd.h> /* usleep() */
#include <signal.h>
#define LED_A LP_PIN02
#define LED_B LP_PIN03
#define LED_C LP_PIN04
#define LED_D LP_PIN05
#define LED_E LP_PIN06
#define LED_F LP_PIN07
#define LED_G LP_PIN08
#define LED_DP LP_PIN09
#define LED_1 LP_PIN17
#define LED_2 LP_PIN16
#define LED_3 LP_PIN14
#define LED_POSITION_MASK (LED_1 | LED_2 | LED_3)
#define LED_ALL (LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G | LED_DP | LED_1 | LED_2 | LED_3)
#define DELAY 250 /* microsecond delay between displaying digits */
int digit2pins[] = {
LED_A | LED_B | LED_C | LED_D | LED_E | LED_F,
LED_B | LED_C,
LED_A | LED_B | LED_G | LED_E | LED_D,
LED_A | LED_B | LED_G | LED_C | LED_D,
LED_F | LED_G | LED_B | LED_C,
LED_A | LED_F | LED_G | LED_C | LED_D,
LED_A | LED_F | LED_G | LED_E | LED_C | LED_D,
LED_A | LED_B | LED_C,
LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G,
LED_A | LED_B | LED_C | LED_D | LED_F | LED_G
};
int position2pins[] = {
LED_1,
LED_2,
LED_3
};
void turnOnDigit(int digitPosition, int value);
void shutDown(int p);
int main(int argc, char * argv[])
{
/* initialize the parapin user-land library */
pin_init_user(LPT1);
/* set up pins as output pins */
pin_output_mode(LED_ALL);
if (argc == 2)
{
/* get the value to display from the command-line */
int value = atoi(argv[1]);
/* register an interrupt signal handler to clear the pins */
signal(SIGINT, shutDown);
int digits[3];
register int i;
for (i = 0; i < 3; i++)
{
digits[2-i] = value % 10;
value /= 10;
}
/* loop displaying digits */
i = 0;
for (;;)
{
turnOnDigit(i, digits[i]);
usleep(DELAY);
i++;
if (i == 3)
i = 0;
}
}
else
{
clear_pin(LED_ALL);
}
}
void turnOnDigit(int digitPosition, int value)
{
/* turn all pins off */
clear_pin(LED_ALL);
/* enable the positional pin */
register int pinSet = LED_POSITION_MASK & ~position2pins[digitPosition];
pinSet |= digit2pins[value];
set_pin(pinSet);
}
void shutDown(int p)
{
clear_pin(LED_ALL);
exit(0);
}