You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.2 KiB
258 lines
5.2 KiB
/* |
|
* 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 ; |
|
}
|
|
|