From 483c72215b26926cb48d798a6f0bf991a775fc99 Mon Sep 17 00:00:00 2001 From: John Vidler Date: Tue, 26 May 2020 06:59:18 +0100 Subject: [PATCH] Updated to use pigpio library over the wiringpi library --- Makefile | 24 +++++++++++++ README.md | 7 ++++ hddledPi.c | 25 +++++++++----- netledPi.c | 99 +++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 116 insertions(+), 39 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..38e5d0e --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +# tool macros +CC := gcc +CFLAGS := -Wall -O3 -pthread -lpigpio -lrt + +# default rule +default: all + +# phony rules +.PHONY: all +all: netledPi actledPi hddledPi + +netledPi: + $(CC) $(CFLAGS) -o netledPi netledPi.c + +hddledPi: + $(CC) $(CFLAGS) -o hddledPi hddledPi.c + +actledPi: + $(CC) $(CFLAGS) -o actledPi actledPi.c + + +.PHONY: clean +clean: + @rm -f *.o netledPi hddledPi actledPi diff --git a/README.md b/README.md index 5bd1d63..0c2e7f0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ # PiLEDlights For the Raspberry Pi - Make LEDs blink on network and/or SD card/USB storage activity. +## Modified to use the piGPIO library +I've modified these sources to use the piGPIO library instead of the unsupported wiringPi library. + +The original README text is here for reference, but the actual parameters and values are now different (netleds, for example now has a distinct tx and rx LED) + +## Original README + hddledPi blinks a LED connected to a GPIO pin on any mass storage access. Not only on SD card access, but also on USB thumbdrive and hard drive activity. netledPi blinks a LED connected to a GPIO pin when there is activity on any network interface. Not only the built-in ethernet interface, but also on any other USB ethernet or WiFi interface. actledPi blinks the Pi's ACT led on all mass storage I/O, i.e. not only the SD card. diff --git a/hddledPi.c b/hddledPi.c index 3ba3283..725eb2a 100644 --- a/hddledPi.c +++ b/hddledPi.c @@ -61,11 +61,11 @@ #include #include #include -#include +#include static unsigned int o_refresh = 20; /* milliseconds */ -static unsigned int o_gpiopin = 10; /* wiringPi numbering scheme */ +static unsigned int o_gpiopin = 4; /* BCM numbering scheme */ static int o_detach = 0; static volatile sig_atomic_t running = 1; @@ -125,9 +125,9 @@ void led(int on) { return; if (on) { - digitalWrite (o_gpiopin, HIGH); + gpioWrite( o_gpiopin, PI_HIGH ); } else { - digitalWrite (o_gpiopin, LOW); + gpioWrite( o_gpiopin, PI_LOW ); } current = on; @@ -163,7 +163,7 @@ error_t parse_options(int key, char *arg, struct argp_state *state) { int main(int argc, char **argv) { struct argp_option options[] = { { "detach", 'd', NULL, 0, "Detach from terminal" }, - { "pin", 'p', "VALUE", 0, "GPIO pin where LED is connected (default: wiringPi pin 10, physical pin 24 on the P1 header)" }, + { "pin", 'p', "VALUE", 0, "GPIO pin where LED is connected (default: BCM 4, physical pin 7 on the P1 header)" }, { "refresh", 'r', "VALUE", 0, "Refresh interval (default: 20 ms)" }, { 0 }, }; @@ -184,8 +184,12 @@ int main(int argc, char **argv) { delay.tv_sec = o_refresh / 1000; delay.tv_nsec = 1000000 * (o_refresh % 1000); - wiringPiSetup () ; - pinMode (o_gpiopin, OUTPUT) ; + /* If we can't set up pigpio, then just bail */ + if( gpioInitialise() < 0 ) { + fprintf( stderr, "Unable to setup the piGPIO library. STOP." ); + return -1; + } + gpioSetMode( o_gpiopin, PI_OUTPUT ); /* Open the vmstat file */ @@ -196,7 +200,7 @@ int main(int argc, char **argv) { } /* Ensure the LED is off */ - led(LOW); + led(0); /* Save the current I/O stat values */ if (activity(vmstat) < 0) @@ -240,7 +244,10 @@ int main(int argc, char **argv) { } /* Ensure the LED is off */ - led(LOW); + led(0); + + /* Halt any library functions */ + gpioTerminate(); status = EXIT_SUCCESS; diff --git a/netledPi.c b/netledPi.c index a2ab93a..03ef7d8 100644 --- a/netledPi.c +++ b/netledPi.c @@ -61,17 +61,46 @@ #include #include #include -#include +#include static unsigned int o_refresh = 20; /* milliseconds */ -static unsigned int o_gpiopin = 11; /* wiringPi numbering scheme */ +static unsigned int o_gpiopin_tx = 2; +static unsigned int o_gpiopin_rx = 3; static int o_detach = 0; static volatile sig_atomic_t running = 1; static char *line = NULL; static size_t len = 0; +/* Update the TX LED */ +void tx_led(int on) { + static int tx_current = 1; /* Ensure the LED turns off on first call */ + if (tx_current == on) + return; + + if (on) + gpioWrite( o_gpiopin_tx, PI_HIGH ); + else + gpioWrite( o_gpiopin_tx, PI_LOW ); + + tx_current = on; +} + +/* Update the RX LED */ +void rx_led(int on) { + static int rx_current = 1; /* Ensure the LED turns off on first call */ + if (rx_current == on) + return; + + if (on) + gpioWrite( o_gpiopin_rx, PI_HIGH ); + else + gpioWrite( o_gpiopin_rx, PI_LOW ); + + rx_current = on; +} + /* Reread the netdevices file */ int activity(FILE *netdevices) { static unsigned int prev_inpackets, prev_outpackets; @@ -118,28 +147,23 @@ int activity(FILE *netdevices) { } /* Anything changed? */ - result = (prev_inpackets != inpackets) || - (prev_outpackets != outpackets); + if( prev_inpackets != inpackets ) + rx_led( PI_HIGH ); + else + rx_led( PI_LOW ); + + if( prev_outpackets != outpackets ) + tx_led( PI_HIGH ); + else + tx_led( PI_LOW ); + prev_inpackets = inpackets; prev_outpackets = outpackets; - return result; + return 0; } -/* Update the LED */ -void led(int on) { - static int current = 1; /* Ensure the LED turns off on first call */ - if (current == on) - return; - if (on) { - digitalWrite (o_gpiopin, HIGH); - } else { - digitalWrite (o_gpiopin, LOW); - } - - current = on; -} /* Signal handler -- break out of the main loop */ void shutdown(int sig) { @@ -158,9 +182,15 @@ error_t parse_options(int key, char *arg, struct argp_state *state) { argp_failure(state, EXIT_FAILURE, 0, "refresh interval must be at least 10"); break; - case 'p': - o_gpiopin = strtol(arg, NULL, 10); - if ((o_gpiopin < 0) || (o_gpiopin > 29)) + case 3: + o_gpiopin_tx = strtol(arg, NULL, 10); + if ((o_gpiopin_tx < 0) || (o_gpiopin_tx > 29)) + argp_failure(state, EXIT_FAILURE, 0, + "pin number must be between 0 and 29"); + break; + case 4: + o_gpiopin_rx = strtol(arg, NULL, 10); + if ((o_gpiopin_rx < 0) || (o_gpiopin_rx > 29)) argp_failure(state, EXIT_FAILURE, 0, "pin number must be between 0 and 29"); break; @@ -169,9 +199,11 @@ error_t parse_options(int key, char *arg, struct argp_state *state) { } int main(int argc, char **argv) { + struct argp_option options[] = { { "detach", 'd', NULL, 0, "Detach from terminal" }, - { "pin", 'p', "VALUE", 0, "GPIO pin where LED is connected (default: wiringPi pin 11, physical pin 25 on the P1 header)" }, + { "tx" , 0, "VALUE", 0, "GPIO pin where LED is connected (transmit data) (default: BCM 2 physical pin 3 on the P1 header)" }, + { "rx", 1, "VALUE", 0, "GPIO pin where LED is connected (receive data) (default: BCM 3 physical pin 5 on the P1 header)" }, { "refresh", 'r', "VALUE", 0, "Refresh interval (default: 20 ms)" }, { 0 }, }; @@ -192,8 +224,13 @@ int main(int argc, char **argv) { delay.tv_sec = o_refresh / 1000; delay.tv_nsec = 1000000 * (o_refresh % 1000); - wiringPiSetup () ; - pinMode (o_gpiopin, OUTPUT) ; + /* If we can't set up pigpio, then just bail */ + if( gpioInitialise() < 0 ) { + fprintf( stderr, "Unable to setup the piGPIO library. STOP." ); + return -1; + } + gpioSetMode( o_gpiopin_tx, PI_OUTPUT ); + gpioSetMode( o_gpiopin_rx, PI_OUTPUT ); /* Open the netdevices file */ @@ -204,7 +241,8 @@ int main(int argc, char **argv) { } /* Ensure the LED is off */ - led(LOW); + tx_led(0); + rx_led(0); /* Save the current I/O stat values */ if (activity(netdevices) < 0) @@ -238,21 +276,22 @@ int main(int argc, char **argv) { /* Loop until signal received */ while (running) { - int a; if (nanosleep(&delay, NULL) < 0) break; - a = activity(netdevices); - if (a < 0) + if( activity(netdevices) < 0 ) break; - led(a); } /* Ensure the LED is off */ - led(LOW); + tx_led(0); + rx_led(0); status = EXIT_SUCCESS; out: + /* Halt any library functions */ + gpioTerminate(); + if (line) free(line); if (netdevices) fclose(netdevices); return status;