| /* |
| * piGlow1.c: |
| * Very simple demonstration of the PiGlow board. |
| * This uses the piGlow devLib. |
| * |
| * Copyright (c) 2013 Gordon Henderson. |
| *********************************************************************** |
| * This file is part of wiringPi: |
| * https://projects.drogon.net/raspberry-pi/wiringpi/ |
| * |
| * wiringPi is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Lesser General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * wiringPi is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. |
| *********************************************************************** |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <poll.h> |
| |
| #include <wiringPi.h> |
| #include <piGlow.h> |
| |
| #define PIGLOW_BASE 533 |
| |
| #ifndef TRUE |
| # define TRUE (1==1) |
| # define FALSE (!TRUE) |
| #endif |
| |
| |
| /* |
| * keypressed: clearKeypressed: |
| * Simple but effective ways to tell if the enter key has been pressed |
| ********************************************************************************* |
| */ |
| |
| static int keypressed (void) |
| { |
| struct pollfd polls ; |
| |
| polls.fd = fileno (stdin) ; |
| polls.events = POLLIN ; |
| |
| return poll (&polls, 1, 0) != 0 ; |
| } |
| |
| static void clearKeypressed (void) |
| { |
| while (keypressed ()) |
| (void)getchar () ; |
| } |
| |
| |
| /* |
| * pulseLed: |
| * Pulses the LED at position leg, ring from off to a max. value, |
| * then off again |
| ********************************************************************************* |
| */ |
| |
| static void pulseLed (int leg, int ring) |
| { |
| int i ; |
| |
| for (i = 0 ; i < 140 ; ++i) |
| { |
| piGlow1 (leg, ring, i) ; |
| delay (1) ; |
| } |
| delay (10) ; |
| for (i = 140 ; i >= 0 ; --i) |
| { |
| piGlow1 (leg, ring, i) ; |
| delay (1) ; |
| } |
| } |
| |
| /* |
| * pulseLeg: |
| * Same as above, but a whole leg at a time |
| ********************************************************************************* |
| */ |
| |
| static void pulseLeg (int leg) |
| { |
| int i ; |
| |
| for (i = 0 ; i < 140 ; ++i) |
| { |
| piGlowLeg (leg, i) ; delay (1) ; |
| } |
| delay (10) ; |
| for (i = 140 ; i >= 0 ; --i) |
| { |
| piGlowLeg (leg, i) ; delay (1) ; |
| } |
| } |
| |
| |
| /* |
| * pulse Ring: |
| * Same as above, but a whole ring at a time |
| ********************************************************************************* |
| */ |
| |
| static void pulseRing (int ring) |
| { |
| int i ; |
| |
| for (i = 0 ; i < 140 ; ++i) |
| { |
| piGlowRing (ring, i) ; delay (1) ; |
| } |
| delay (10) ; |
| for (i = 140 ; i >= 0 ; --i) |
| { |
| piGlowRing (ring, i) ; delay (1) ; |
| } |
| } |
| |
| #define LEG_STEPS 3 |
| |
| static int legSequence [] = |
| { |
| 4, 12, 99, |
| 99, 4, 12, |
| 12, 99, 4, |
| } ; |
| |
| |
| #define RING_STEPS 16 |
| |
| static int ringSequence [] = |
| { |
| 0, 0, 0, 0, 0, 64, |
| 0, 0, 0, 0, 64, 64, |
| 0, 0, 0, 64, 64, 0, |
| 0, 0, 64, 64, 0, 0, |
| 0, 64, 64, 0, 0, 0, |
| 64, 64, 0, 0, 0, 0, |
| 64, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, |
| 64, 0, 0, 0, 0, 0, |
| 64, 64, 0, 0, 0, 0, |
| 0, 64, 64, 0, 0, 0, |
| 0, 0, 64, 64, 0, 0, |
| 0, 0, 0, 64, 64, 0, |
| 0, 0, 0, 0, 64, 64, |
| 0, 0, 0, 0, 0, 64, |
| 0, 0, 0, 0, 0, 0, |
| } ; |
| |
| /* |
| * main: |
| * Our little demo prgoram |
| ********************************************************************************* |
| */ |
| |
| int main (void) |
| { |
| int i ; |
| int step, ring, leg ; |
| |
| // Always initialise wiringPi: |
| // Use the Sys method if you don't need to run as root |
| |
| wiringPiSetupSys () ; |
| |
| // Initialise the piGlow devLib with our chosen pin base |
| |
| piGlowSetup (1) ; |
| |
| // LEDs, one at a time |
| |
| printf ("LEDs, one at a time\n") ; |
| for (; !keypressed () ;) |
| for (leg = 0 ; leg < 3 ; ++leg) |
| { |
| for (ring = 0 ; ring < 6 ; ++ring) |
| { |
| pulseLed (leg, ring) ; |
| if (keypressed ()) |
| break ; |
| } |
| if (keypressed ()) |
| break ; |
| } |
| clearKeypressed () ; |
| |
| // Rings, one at a time |
| |
| printf ("Rings, one at a time\n") ; |
| for (; !keypressed () ;) |
| for (ring = 0 ; ring < 6 ; ++ring) |
| { |
| pulseRing (ring) ; |
| if (keypressed ()) |
| break ; |
| } |
| clearKeypressed () ; |
| |
| // Legs, one at a time |
| |
| printf ("Legs, one at a time\n") ; |
| for (; !keypressed () ;) |
| for (leg = 0 ; leg < 3 ; ++leg) |
| { |
| pulseLeg (leg) ; |
| if (keypressed ()) |
| break ; |
| } |
| clearKeypressed () ; |
| |
| delay (1000) ; |
| |
| // Sequence - alternating rings, legs and random |
| |
| printf ("Sequence now\n") ; |
| for (; !keypressed () ;) |
| { |
| for (i = 0 ; i < 20 ; ++i) |
| for (step = 0 ; step < LEG_STEPS ; ++step) |
| { |
| for (leg = 0 ; leg < 3 ; ++leg) |
| piGlowLeg (leg, legSequence [step * 3 + leg]) ; |
| delay (80) ; |
| } |
| |
| for (i = 0 ; i < 10 ; ++i) |
| for (step = 0 ; step < RING_STEPS ; ++step) |
| { |
| for (ring = 0 ; ring < 6 ; ++ring) |
| piGlowRing (ring, ringSequence [step * 6 + ring]) ; |
| delay (80) ; |
| } |
| |
| for (i = 0 ; i < 1000 ; ++i) |
| { |
| leg = random () % 3 ; |
| ring = random () % 6 ; |
| piGlow1 (leg, ring, random () % 256) ; |
| delay (5) ; |
| piGlow1 (leg, ring, 0) ; |
| } |
| } |
| |
| return 0 ; |
| } |