@@ -38,23 +38,55 @@ LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt | |||||
# Should not alter anything below this line | # Should not alter anything below this line | ||||
############################################################################### | ############################################################################### | ||||
SRC = blink.c blink8.c blink12.c \ | |||||
blink12drcs.c \ | |||||
pwm.c \ | |||||
speed.c wfi.c isr.c isr-osc.c \ | |||||
lcd.c lcd-adafruit.c clock.c \ | |||||
nes.c \ | |||||
softPwm.c softTone.c \ | |||||
delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ | |||||
lowPower.c \ | |||||
max31855.c \ | |||||
rht03.c \ | |||||
servo.c \ | |||||
isr1.c \ | |||||
test1.c \ | |||||
test2.c \ | |||||
buttons.c buttons2.c \ | |||||
getBanks.c | |||||
#SRC = blink.c blink8.c blink12.c \ | |||||
# blink12drcs.c \ | |||||
# pwm.c \ | |||||
# speed.c wfi.c isr.c isr-osc.c \ | |||||
# lcd.c lcd-adafruit.c clock.c \ | |||||
# nes.c \ | |||||
# softPwm.c softTone.c \ | |||||
# delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ | |||||
# lowPower.c \ | |||||
# max31855.c \ | |||||
# rht03.c \ | |||||
# servo.c \ | |||||
# isr1.c \ | |||||
# buttons.c buttons2.c \ | |||||
# getBanks.c | |||||
SRC = \ | |||||
blink12.c \ | |||||
blink12drcs.c \ | |||||
blink6drcs.c \ | |||||
blink8.c \ | |||||
blink8-drcn.c \ | |||||
blink.c \ | |||||
blink-thread.c \ | |||||
buttons2.c \ | |||||
buttons.c \ | |||||
clock.c \ | |||||
delayTest.c \ | |||||
ds1302.c \ | |||||
getBanks.c \ | |||||
isr1.c \ | |||||
isr.c \ | |||||
isr-osc.c \ | |||||
lcd-adafruit.c \ | |||||
lcd.c \ | |||||
lowPower.c \ | |||||
max31855.c \ | |||||
nes.c \ | |||||
okLed.c \ | |||||
pwm.c \ | |||||
rht03.c \ | |||||
serialRead.c \ | |||||
serialTest.c \ | |||||
servo.c \ | |||||
softPwm.c \ | |||||
softTone.c \ | |||||
speed.c \ | |||||
spiSpeed.c \ | |||||
wfi.c \ | |||||
OBJ = $(SRC:.c=.o) | OBJ = $(SRC:.c=.o) | ||||
@@ -78,8 +78,7 @@ void drawClockHands (void) | |||||
if (h > 12) | if (h > 12) | ||||
h -= 12 ; | h -= 12 ; | ||||
// Hour hand | |||||
// Hour hand | |||||
angle = h * 30 + m * 0.5 ; | angle = h * 30 + m * 0.5 ; | ||||
x0 = sin (rads (angle)) * (clockRadius * 0.75) ; | x0 = sin (rads (angle)) * (clockRadius * 0.75) ; | ||||
y0 = cos (rads (angle)) * (clockRadius * 0.75) ; | y0 = cos (rads (angle)) * (clockRadius * 0.75) ; | ||||
@@ -91,8 +90,7 @@ void drawClockHands (void) | |||||
lcd128x64lineTo (x0, y0, 1) ; | lcd128x64lineTo (x0, y0, 1) ; | ||||
} | } | ||||
// Minute hand | |||||
// Minute hand | |||||
angle = m * 6 ; | angle = m * 6 ; | ||||
x0 = sin (rads (angle)) * (clockRadius * 0.9) ; | x0 = sin (rads (angle)) * (clockRadius * 0.9) ; | ||||
y0 = cos (rads (angle)) * (clockRadius * 0.9) ; | y0 = cos (rads (angle)) * (clockRadius * 0.9) ; | ||||
@@ -104,8 +102,7 @@ void drawClockHands (void) | |||||
lcd128x64lineTo (x0, y0, 1) ; | lcd128x64lineTo (x0, y0, 1) ; | ||||
} | } | ||||
// Second hand | |||||
// Second hand | |||||
angle = s * 6 ; | angle = s * 6 ; | ||||
x0 = sin (rads (angle)) * (clockRadius * 0.2) ; | x0 = sin (rads (angle)) * (clockRadius * 0.2) ; | ||||
y0 = cos (rads (angle)) * (clockRadius * 0.2) ; | y0 = cos (rads (angle)) * (clockRadius * 0.2) ; | ||||
@@ -115,12 +112,11 @@ void drawClockHands (void) | |||||
lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; | lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; | ||||
lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; | lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; | ||||
// Text: | |||||
// Text: | |||||
sprintf (text, "%02d:%02d:%02d", h24, m, s) ; | sprintf (text, "%02d:%02d:%02d", h24, m, s) ; | ||||
lcd128x64puts (32, 24, text, 0, 1) ; | lcd128x64puts (32, 24, text, 0, 1) ; | ||||
sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ; | |||||
sprintf (text, "%2d/%2d/%2d", (uint8_t)now->tm_mday, (uint8_t)now->tm_mon + 1, (uint8_t)(now->tm_year - 100)) ; | |||||
lcd128x64puts (32, -23, text, 0, 1) ; | lcd128x64puts (32, -23, text, 0, 1) ; | ||||
} | } | ||||
@@ -133,16 +129,14 @@ void drawClockFace (void) | |||||
lcd128x64circle (0,0, clockRadius, 1, TRUE) ; | lcd128x64circle (0,0, clockRadius, 1, TRUE) ; | ||||
lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; | lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; | ||||
// The four big indicators for 12,15,30 and 45 | |||||
// The four big indicators for 12,15,30 and 45 | |||||
lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 | lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 | ||||
lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 | lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 | ||||
lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 | lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 | ||||
lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 | lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 | ||||
// Smaller 5 and 1 minute ticks | |||||
// Smaller 5 and 1 minute ticks | |||||
for (m = 0 ; m < 60 ; ++m) | for (m = 0 ; m < 60 ; ++m) | ||||
{ | { | ||||
px1 = sin (rads (m * 6)) * clockRadius ; | px1 = sin (rads (m * 6)) * clockRadius ; | ||||
@@ -167,15 +161,11 @@ void setup (void) | |||||
lcd128x64setOrigin (32, 32) ; | lcd128x64setOrigin (32, 32) ; | ||||
} | } | ||||
/* | /* | ||||
*********************************************************************** | *********************************************************************** | ||||
* The main program | * The main program | ||||
*********************************************************************** | *********************************************************************** | ||||
*/ | */ | ||||
int main (int argc, char *argv []) | int main (int argc, char *argv []) | ||||
{ | { | ||||
time_t now ; | time_t now ; | ||||
@@ -195,7 +185,6 @@ int main (int argc, char *argv []) | |||||
while (time (NULL) == now) | while (time (NULL) == now) | ||||
delayMs(10) ; | delayMs(10) ; | ||||
} | } | ||||
return 0 ; | return 0 ; | ||||
} | } |
@@ -37,7 +37,7 @@ int main() | |||||
int t ; | int t ; | ||||
int max, min ; | int max, min ; | ||||
int del ; | int del ; | ||||
int underRuns, overRuns, exactRuns, bogusRuns, total ; | |||||
int underRuns, overRuns, exactRuns, total; | |||||
int descheds ; | int descheds ; | ||||
@@ -73,7 +73,7 @@ static void Signal_handler(int sig); | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
void myInterrupt (void) | |||||
void myInterrupt (int pin) | |||||
{ | { | ||||
digitalWrite (OUT_PIN, 1) ; | digitalWrite (OUT_PIN, 1) ; | ||||
++globalCounter; | ++globalCounter; | ||||
@@ -58,14 +58,14 @@ static void Signal_handler(int sig); | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
void myInterrupt0 (void) { ++globalCounter [0] ; } | |||||
void myInterrupt1 (void) { ++globalCounter [1] ; } | |||||
void myInterrupt2 (void) { ++globalCounter [2] ; } | |||||
void myInterrupt3 (void) { ++globalCounter [3] ; } | |||||
void myInterrupt4 (void) { ++globalCounter [4] ; } | |||||
void myInterrupt5 (void) { ++globalCounter [5] ; } | |||||
void myInterrupt6 (void) { ++globalCounter [6] ; } | |||||
void myInterrupt7 (void) { ++globalCounter [7] ; } | |||||
void myInterrupt0 (int pin) { ++globalCounter [0] ; } | |||||
void myInterrupt1 (int pin) { ++globalCounter [1] ; } | |||||
void myInterrupt2 (int pin) { ++globalCounter [2] ; } | |||||
void myInterrupt3 (int pin) { ++globalCounter [3] ; } | |||||
void myInterrupt4 (int pin) { ++globalCounter [4] ; } | |||||
void myInterrupt5 (int pin) { ++globalCounter [5] ; } | |||||
void myInterrupt6 (int pin) { ++globalCounter [6] ; } | |||||
void myInterrupt7 (int pin) { ++globalCounter [7] ; } | |||||
/* | /* | ||||
@@ -68,7 +68,7 @@ static void Signal_handler(int sig); | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
void myInterrupt(void) { | |||||
void myInterrupt(int pin) { | |||||
// Only report button release on actual button release. | // Only report button release on actual button release. | ||||
// This interrupt sometimes fires for the wrong edge! | // This interrupt sometimes fires for the wrong edge! | ||||
@@ -40,7 +40,7 @@ | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
void lowPower (void) | |||||
void lowPower (int pin) | |||||
{ | { | ||||
time_t t ; | time_t t ; | ||||
@@ -36,8 +36,10 @@ | |||||
#include <wiringPi.h> | #include <wiringPi.h> | ||||
#include <wiringPiSPI.h> | #include <wiringPiSPI.h> | ||||
#ifndef TRUE | |||||
#define TRUE (1==1) | #define TRUE (1==1) | ||||
#define FALSE (!TRUE) | #define FALSE (!TRUE) | ||||
#endif | |||||
#define SPI_CHAN 0 | #define SPI_CHAN 0 | ||||
#define NUM_TIMES 100 | #define NUM_TIMES 100 | ||||
@@ -1,21 +1,21 @@ | |||||
/* | /* | ||||
* wfi.c: | * wfi.c: | ||||
* Wait for Interrupt test program | |||||
* Wait for Interrupt test program | |||||
* | * | ||||
* This program demonstrates the use of the waitForInterrupt() | |||||
* function in wiringPi. It listens to a button input on | |||||
* BCM_GPIO pin 17 (wiringPi pin 0) | |||||
* This program demonstrates the use of the waitForInterrupt() | |||||
* function in wiringPi. It listens to a button input on | |||||
* BCM_GPIO pin 17 (wiringPi pin 0) | |||||
* | * | ||||
* The biggest issue with this method is that it really only works | |||||
* well in Sys mode. | |||||
* The biggest issue with this method is that it really only works | |||||
* well in Sys mode. | |||||
* | * | ||||
* Jan 2013: This way of doing things is sort of deprecated now, see | |||||
* the wiringPiISR() function instead and the isr.c test program here. | |||||
* Jan 2013: This way of doing things is sort of deprecated now, see | |||||
* the wiringPiISR() function instead and the isr.c test program here. | |||||
* | * | ||||
* Copyright (c) 2012-2013 Gordon Henderson. | * Copyright (c) 2012-2013 Gordon Henderson. | ||||
*********************************************************************** | *********************************************************************** | ||||
* This file is part of wiringPi: | * This file is part of wiringPi: | ||||
* https://github.com/WiringPi/WiringPi/ | |||||
* https://github.com/WiringPi/WiringPi/ | |||||
* | * | ||||
* wiringPi is free software: you can redistribute it and/or modify | * 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 | * it under the terms of the GNU Lesser General Public License as published by | ||||
@@ -34,131 +34,158 @@ | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <signal.h> | |||||
#include <pthread.h> | |||||
#include <wiringPi.h> | #include <wiringPi.h> | ||||
static int terminate_process = 0; | |||||
static void Signal_handler(int sig); | |||||
// A 'key' which we can lock and unlock - values are 0 through 3 | // A 'key' which we can lock and unlock - values are 0 through 3 | ||||
// This is interpreted internally as a pthread_mutex by wiringPi | |||||
// which is hiding some of that to make life simple. | |||||
// This is interpreted internally as a pthread_mutex by wiringPi | |||||
// which is hiding some of that to make life simple. | |||||
#define COUNT_KEY 0 | |||||
#define COUNT_KEY 0 | |||||
// What BCM_GPIO input are we using? | // What BCM_GPIO input are we using? | ||||
#define BUTTON_PIN 17 | |||||
#define BUTTON_PIN 26 | |||||
// Debounce time in mS | // Debounce time in mS | ||||
#define DEBOUNCE_TIME 100 | |||||
#define DEBOUNCE_TIME 100 | |||||
// globalCounter: | // globalCounter: | ||||
// Global variable to count interrupts | |||||
// Should be declared volatile to make sure the compiler doesn't cache it. | |||||
// Global variable to count interrupts | |||||
// Should be declared volatile to make sure the compiler doesn't cache it. | |||||
static volatile int globalCounter = 0 ; | |||||
static volatile int globalCounter = 0; | |||||
/* | /* | ||||
* waitForIt: | * waitForIt: | ||||
* This is a thread created using the wiringPi simplified threading | |||||
* mechanism. It will wait on an interrupt on the button and increment | |||||
* a counter. | |||||
* This is a thread created using the wiringPi simplified threading | |||||
* mechanism. It will wait on an interrupt on the button and increment | |||||
* a counter. | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
PI_THREAD (waitForIt) | PI_THREAD (waitForIt) | ||||
{ | { | ||||
int state = 0 ; | |||||
int debounceTime = 0 ; | |||||
int state = 0; | |||||
int debounceTime = 0; | |||||
(void)piHiPri (10) ; // Set this thread to be high priority | |||||
(void)piHiPri (10); // Set this thread to be high priority | |||||
for (;;) | |||||
(void)digitalRead (BUTTON_PIN); // pre-read pin to avoid false trigger | |||||
while (!terminate_process) | |||||
{ | { | ||||
if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it | |||||
if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it | |||||
{ | { | ||||
// Bouncing? | |||||
if (millis () < debounceTime) | |||||
// Bouncing? | |||||
if (millis() < debounceTime) | |||||
{ | { | ||||
debounceTime = millis () + DEBOUNCE_TIME ; | |||||
continue ; | |||||
debounceTime = millis() + DEBOUNCE_TIME; | |||||
continue; | |||||
} | } | ||||
// We have a valid one | |||||
// We have a valid one | |||||
state ^= 1; | |||||
state ^= 1 ; | |||||
piLock (COUNT_KEY) ; | |||||
++globalCounter ; | |||||
piUnlock (COUNT_KEY) ; | |||||
// Wait for key to be released | |||||
piLock (COUNT_KEY); | |||||
++globalCounter; | |||||
piUnlock (COUNT_KEY); | |||||
// Wait for key to be released | |||||
while (digitalRead (BUTTON_PIN) == LOW) | while (digitalRead (BUTTON_PIN) == LOW) | ||||
delayMs (1) ; | |||||
{ | |||||
delayMs (10); | |||||
} | |||||
debounceTime = millis () + DEBOUNCE_TIME ; | |||||
debounceTime = millis() + DEBOUNCE_TIME; | |||||
} | } | ||||
} | } | ||||
return (void *) NULL ; | |||||
return (void *) NULL; | |||||
} | } | ||||
/* | /* | ||||
* setup: | |||||
* Demo a crude but effective way to initialise the hardware | |||||
* main | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
void setup (void) | |||||
int main (void) | |||||
{ | { | ||||
int lastCounter = 0; | |||||
int myCounter = 0; | |||||
// Use the gpio program to initialise the hardware | |||||
// (This is the crude, but effective) | |||||
system ("gpio edge 17 falling") ; | |||||
// Setup wiringPi | |||||
// ---------------------------------- | |||||
// Demo a crude but effective way to initialise the hardware | |||||
wiringPiSetupSys () ; | |||||
// Use the gpio program to initialise the hardware | |||||
// (This is the crude, but effective) | |||||
system ("gpio edge 26 falling"); | |||||
// Fire off our interrupt handler | |||||
// Setup wiringPi | |||||
wiringPiSetupSys(); | |||||
piThreadCreate (waitForIt) ; | |||||
// Fire off our interrupt handler | |||||
int tid = piThreadCreate (waitForIt); | |||||
} | |||||
// ---------------------------------- | |||||
// Set the handler for SIGTERM (15) | |||||
signal(SIGTERM, Signal_handler); | |||||
signal(SIGINT, Signal_handler); | |||||
signal(SIGQUIT, Signal_handler); | |||||
signal(SIGTRAP, Signal_handler); | |||||
signal(SIGABRT, Signal_handler); | |||||
signal(SIGALRM, Signal_handler); | |||||
signal(SIGUSR1, Signal_handler); | |||||
signal(SIGUSR2, Signal_handler); | |||||
/* | |||||
* main | |||||
********************************************************************************* | |||||
*/ | |||||
int main (void) | |||||
{ | |||||
int lastCounter = 0 ; | |||||
int myCounter = 0 ; | |||||
setup () ; | |||||
for (;;) | |||||
while (myCounter < 25) | |||||
{ | { | ||||
printf ("Waiting ... "); | printf ("Waiting ... "); | ||||
fflush (stdout) ; | |||||
fflush (stdout); | |||||
while (myCounter == lastCounter) | while (myCounter == lastCounter) | ||||
{ | { | ||||
piLock (COUNT_KEY) ; | |||||
myCounter = globalCounter ; | |||||
piUnlock (COUNT_KEY) ; | |||||
delayMs(500) ; | |||||
piLock (COUNT_KEY); | |||||
myCounter = globalCounter; | |||||
piUnlock (COUNT_KEY); | |||||
delayMs(75); | |||||
} | } | ||||
if (terminate_process) break; | |||||
printf (" Done. myCounter: %5d\n", myCounter) ; | |||||
lastCounter = myCounter ; | |||||
printf (" Done. myCounter: %5d\n", myCounter); | |||||
lastCounter = myCounter; | |||||
} | } | ||||
pthread_join(tid, NULL); | |||||
return 0 ; | |||||
printf ("Done.\n"); | |||||
return EXIT_SUCCESS; | |||||
} | } | ||||
//********************************************************************************************************************** | |||||
/** | |||||
* Intercepts and handles signals from QNX | |||||
* This function is called when the SIGTERM signal is raised by QNX | |||||
*/ | |||||
void Signal_handler(int sig) | |||||
{ | |||||
printf("Received signal %d\n", sig); | |||||
// Signal process to exit. | |||||
terminate_process = 1; | |||||
globalCounter++; | |||||
} | |||||
//********************************************************************************************************************** |
@@ -499,7 +499,7 @@ void doExport (int argc, char *argv[]) | |||||
* to exit the program. Crude but effective. | * to exit the program. Crude but effective. | ||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
static void wfi (void) | |||||
static void wfi (int pin) | |||||
{ | { | ||||
exit (EXIT_SUCCESS); | exit (EXIT_SUCCESS); | ||||
} | } | ||||
@@ -315,7 +315,7 @@ static int sysFds[64] = | |||||
}; | }; | ||||
// ISR Data | // ISR Data | ||||
static void (*isrFunctions[64])(void); | |||||
static void (*isrFunctions[64])(int pin); | |||||
// Doing it the Arduino way with lookup tables... | // Doing it the Arduino way with lookup tables... | ||||
@@ -1851,8 +1851,12 @@ static void *interruptHandler (UNU void *arg) | |||||
pinPass = -1; | pinPass = -1; | ||||
for (;;) | for (;;) | ||||
{ | |||||
if (waitForInterrupt (myPin, -1) > 0) | if (waitForInterrupt (myPin, -1) > 0) | ||||
isrFunctions[myPin] (); | |||||
{ | |||||
isrFunctions[myPin](myPin); | |||||
} | |||||
} | |||||
return NULL; | return NULL; | ||||
} | } | ||||
@@ -1866,7 +1870,7 @@ static void *interruptHandler (UNU void *arg) | |||||
* Returns 0 on success, -1 on failure (or program exits if !wiringPiReturnCodes) | * Returns 0 on success, -1 on failure (or program exits if !wiringPiReturnCodes) | ||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
int wiringPiISR (int pin, int mode, void (*function)(void)) | |||||
int wiringPiISR (int pin, int mode, void (*function)(int)) | |||||
{ | { | ||||
pthread_t threadId; | pthread_t threadId; | ||||
const char *modeS; | const char *modeS; | ||||
@@ -269,7 +269,7 @@ extern void digitalWriteByte2 (int value); | |||||
// Interrupts (Also Pi hardware specific) | // Interrupts (Also Pi hardware specific) | ||||
extern int waitForInterrupt (int pin, int mS); // Must be in SYS mode (wiringPiSetupSys was called for setup) | extern int waitForInterrupt (int pin, int mS); // Must be in SYS mode (wiringPiSetupSys was called for setup) | ||||
extern int wiringPiISR (int pin, int mode, void (*function)(void)); // Uses SYS mode, and also waitForInterrupt | |||||
extern int wiringPiISR (int pin, int mode, void (*function)(int)); // Uses SYS mode, and also waitForInterrupt | |||||
// Threads | // Threads | ||||
extern int piThreadCreate (void *(*fn)(void *)); | extern int piThreadCreate (void *(*fn)(void *)); | ||||