259 lines
5.2 KiB
C
259 lines
5.2 KiB
C
/*
|
|
* 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 ;
|
|
}
|