From 063afd100e92e117aa8df17e95797fa962be9662 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 5 May 2024 14:50:21 +0200 Subject: [PATCH] #234 --- wiringPi/test/wiringpi_test6_isr.c | 170 +++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 wiringPi/test/wiringpi_test6_isr.c diff --git a/wiringPi/test/wiringpi_test6_isr.c b/wiringPi/test/wiringpi_test6_isr.c new file mode 100644 index 0000000..bae44b2 --- /dev/null +++ b/wiringPi/test/wiringpi_test6_isr.c @@ -0,0 +1,170 @@ +// WiringPi test program: Kernel char device interface / sysfs successor +// Compile: gcc -Wall wiringpi_test1_device.c -o wiringpi_test1_device -lwiringPi + +#include "wpi_test.h" +#include +#include +#include +#include +#include + + +const int GPIO = 19; +const int GPIOIN = 26; +const int ToggleValue = 4; + + +static volatile int globalCounter; +volatile long long gStartTime, gEndTime; + + +static void wfi (void) { + struct timeval now; + + gettimeofday(&now, 0); + if (0==gStartTime) { + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + } else { + gEndTime = now.tv_sec*1000000LL + now.tv_usec; + } + globalCounter++; +} + + +double StartSequence (int Enge, int OUTpin) { + int expected; + double timeExpected; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + digitalWrite(OUTpin, HIGH); + delay(200); + digitalWrite(OUTpin, LOW); + delay(100); + digitalWrite(OUTpin, HIGH); + delay(200); + digitalWrite(OUTpin, LOW); + delay(100); + printf("Stop\n"); + int globalCounterCopy = globalCounter; + + if (INT_EDGE_BOTH == Enge) { + expected = 4; + timeExpected = 500; + } else { + expected = 2; + timeExpected = 300; + } + + if (globalCounter==expected) { + double fTime = (gEndTime - gStartTime) / 1000000.0; + printf("IRQ worked %g sec (~%gs expected)", fTime, timeExpected/1000.0); + double diff = fTime-(timeExpected/1000.0); + if(diff<0.05 && diff>0) { + printf(" -> %spassed%s\n", COLORGRN, COLORDEF); + } else { + printf(" -> %sfailed%s\n", COLORRED, COLORDEF); + } + + return fTime; + } else { + printf("IRQ not worked got %d iterations (%d exprected)\n\n", globalCounterCopy, expected); + return 0; + } +} + + +double DurationTime(int Enge, int OUTpin, int IRQpin) { + struct timeval now; + double fTime = 0.0; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + + if (INT_EDGE_RISING == Enge) { + digitalWrite(OUTpin, LOW); + wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; + sleep(1); + gettimeofday(&now, 0); + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + digitalWrite(OUTpin, HIGH); + delay(20); + digitalWrite(OUTpin, LOW); + } else if (INT_EDGE_FALLING == Enge) { + digitalWrite(OUTpin, HIGH); + wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; + sleep(1); + gettimeofday(&now, 0); + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + digitalWrite(OUTpin, LOW); + } + + sleep(1); + fTime = (gEndTime - gStartTime); + printf("IRQ detect time %g usec", fTime); + if (fTime<2000 && fTime>0) { + printf(" -> %spassed%s\n", COLORGRN, COLORDEF); + } else { + printf(" -> %sfailed%s\n", COLORRED, COLORDEF); + } + wiringPiISRStop (IRQpin) ; + + return fTime; +} + +int main (void) { + const int IRQpin = GPIOIN ; + const int OUTpin = GPIO ; + int major, minor; + + wiringPiVersion(&major, &minor); + + printf("WiringPi GPIO test program 1 (using GPIO%d (output) and GPIO%d (input))\n", GPIO, GPIOIN); + printf(" testing irq\n"); + + printf("\nISR test (WiringPi %d.%d)\n", major, minor); + + wiringPiSetupGpio() ; + + pinMode(IRQpin, INPUT); + pinMode(OUTpin, OUTPUT); + digitalWrite (OUTpin, LOW) ; + + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_RISING, OUTpin); + printf("Testing close\n"); + + wiringPiISRStop (IRQpin) ; + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_FALLING, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d both\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_BOTH, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_BOTH, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; + + for (int count=0; count<2; count++) { + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_RISING, OUTpin, IRQpin); + + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin); + } + pinMode(OUTpin, INPUT); + + return 0 ; +}