diff --git a/wiringPi/test/Makefile b/wiringPi/test/Makefile index 299dcb4..0b68f96 100644 --- a/wiringPi/test/Makefile +++ b/wiringPi/test/Makefile @@ -3,7 +3,7 @@ CFLAGS = -Wall LDFLAGS = # Need BCM19 <-> BCM26, +PWM: BCM12 <-> BCM13, BCM18 <-> BCM17 connected (1kOhm) -tests = wiringpi_test0_version wiringpi_test1_sysfs wiringpi_test2_sysfs wiringpi_test3_device_wpi wiringpi_test4_device_phys wiringpi_test5_default wiringpi_test6_isr wiringpi_test7_bench wiringpi_test8_pwm wiringpi_test9_pwm +tests = wiringpi_test0_version wiringpi_test1_sysfs wiringpi_test2_sysfs wiringpi_test3_device_wpi wiringpi_test4_device_phys wiringpi_test5_default wiringpi_test6_isr wiringpi_test61_isr2 wiringpi_test7_bench wiringpi_test8_pwm wiringpi_test9_pwm # Need XO hardware xotests = wiringpi_xotest_test1_spi wiringpi_i2c_test1_pcf8574 wiringpi_test8_pwm wiringpi_test9_pwm @@ -34,6 +34,9 @@ wiringpi_test5_default: wiringpi_test6_isr: ${CC} ${CFLAGS} wiringpi_test6_isr.c -o wiringpi_test6_isr -lwiringPi +wiringpi_test61_isr2: + ${CC} ${CFLAGS} wiringpi_test61_isr2.c -o wiringpi_test61_isr2 -lwiringPi + wiringpi_test7_bench: ${CC} ${CFLAGS} wiringpi_test7_bench.c -o wiringpi_test7_bench -lwiringPi diff --git a/wiringPi/test/wiringpi_test61_isr2.c b/wiringPi/test/wiringpi_test61_isr2.c new file mode 100644 index 0000000..59e70e5 --- /dev/null +++ b/wiringPi/test/wiringpi_test61_isr2.c @@ -0,0 +1,255 @@ +// WiringPi test program: 3.16 new ISR2 function with 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 + + +int GPIO = 19; +int GPIOIN = 26; +const int ToggleValue = 4; +float irq_timstamp_duration_ms = 0; + +static volatile int globalCounter; +volatile long long gStartTime, gEndTime; +struct WPIWfiStatus wfiStatusOld; + +static void ISR(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++; +} + + +static void ISR2(struct WPIWfiStatus wfiStatus) { + struct timeval now; + char strEdge[3][10] = {"unknown", "falling", "raising"}; + int strEdgeidx = 0; //default + + gettimeofday(&now, 0); + if (0==gStartTime) { + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + } else { + gEndTime = now.tv_sec*1000000LL + now.tv_usec; + } + globalCounter++; + switch(wfiStatus.edge) { + case INT_EDGE_FALLING: strEdgeidx = INT_EDGE_FALLING; break; + case INT_EDGE_RISING: strEdgeidx = INT_EDGE_RISING; break; + } + if (wfiStatusOld.statusOK>0 && wfiStatusOld.pinBCM==wfiStatus.pinBCM) { + irq_timstamp_duration_ms = (wfiStatus.timeStamp_us - wfiStatusOld.timeStamp_us) / 1000.0f; + } else { + irq_timstamp_duration_ms = 0.0f; + } + printf("ISR occured @ %lld us: statusOK=%d, pin=%u, edge=%s (%d), duration=%g ms\n", + wfiStatus.timeStamp_us, wfiStatus.statusOK, wfiStatus.pinBCM, strEdge[strEdgeidx], wfiStatus.edge, irq_timstamp_duration_ms); + wfiStatusOld = wfiStatus; +} + +void digitalWriteBounce(int OUTpin, int value, int bounce) { + digitalWrite(OUTpin, value); + if (bounce>0) { + delay(1); + digitalWrite(OUTpin, !value); + delay(1); + digitalWrite(OUTpin, value); + } +} + +double StartSequence2(int Edge, int OUTpin, int INpin, int bounce) { + int expected; + float timeExpected_ms; + float irq_timstamp_sum = 0.0f; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + digitalWriteBounce(OUTpin, HIGH, bounce); + delay(10); + delay(190); + digitalWriteBounce(OUTpin, LOW, bounce); + delay(10); + if (INT_EDGE_BOTH == Edge) { + irq_timstamp_sum += irq_timstamp_duration_ms; + } + delay(90); + digitalWriteBounce(OUTpin, HIGH, bounce); + delay(10); + if (INT_EDGE_RISING == Edge || INT_EDGE_BOTH == Edge) { + irq_timstamp_sum += irq_timstamp_duration_ms; + } + delay(190); + digitalWriteBounce(OUTpin, LOW, bounce); + delay(10); + if (INT_EDGE_FALLING == Edge || INT_EDGE_BOTH == Edge) { + irq_timstamp_sum += irq_timstamp_duration_ms; + } + delay(90); + printf("Stop\n"); + int globalCounterCopy = globalCounter; + + if (INT_EDGE_BOTH == Edge) { + expected = 4; + timeExpected_ms = bounce ? 508: 500; + } else { + expected = 2; + timeExpected_ms = bounce ? 304: 300; + } + + if (globalCounter==expected) { + char str[1024]; + float fTime = (gEndTime - gStartTime) / 1000.0; + sprintf(str, "IRQ measured %g msec (~%g expected)", fTime, timeExpected_ms); + CheckSameFloat(str, fTime, timeExpected_ms, timeExpected_ms*0.01); + sprintf(str, "IRQ timestamp %g msec (~%g expected)", irq_timstamp_sum, timeExpected_ms); + CheckSameFloat(str, irq_timstamp_sum, timeExpected_ms, timeExpected_ms*0.01); + // new data struct + CheckSame("GPIO IRQ pin", wfiStatusOld.pinBCM, INpin); + if (INT_EDGE_FALLING==Edge || INT_EDGE_RISING==Edge) { + CheckSame("GPIO IRQ edge", wfiStatusOld.edge, Edge); + } + CheckSame("GPIO IRQ status", wfiStatusOld.statusOK, 1); + 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, int new) { + struct timeval now; + double fTime = 0.0; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + + if (INT_EDGE_RISING == Enge) { + digitalWrite(OUTpin, LOW); + if (new) { + wiringPiISR2(IRQpin, INT_EDGE_RISING, &ISR2, 0); + } else { + wiringPiISR(IRQpin, INT_EDGE_RISING, &ISR); + } + 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); + if (new) { + wiringPiISR2(IRQpin, INT_EDGE_FALLING, &ISR2, 0); + } else { + wiringPiISR(IRQpin, INT_EDGE_FALLING, &ISR); + } + 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) { + + int major=0, minor=0; + + wiringPiVersion(&major, &minor); + + printf("WiringPi GPIO test program 6b (using GPIO%d (output) and GPIO%d (input))\n", GPIO, GPIOIN); + printf("ISR and ISR2 test (WiringPi %d.%d)\n", major, minor); + + wiringPiSetupGpio() ; + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } + int IRQpin = GPIOIN; + int OUTpin = GPIO; + + wiringPiISR2(13, INT_EDGE_RISING, &ISR2, 0); // next pin + + memset(&wfiStatusOld, 0, sizeof(wfiStatusOld)); + + pinMode(IRQpin, INPUT); + pinMode(OUTpin, OUTPUT); + digitalWrite (OUTpin, LOW) ; + + /// -------------------- + for (int bounce=0; bounce<=1; bounce++) { + unsigned long bouncetime = 0; + if (0==bounce) { + printf("! --- default test (no bounce) --- !\n"); + } else { + bouncetime = 2000; //2 ms + printf("! --- test with bounce on input --- !\n"); + } + + printf("\nTesting IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + wiringPiISR2(IRQpin, INT_EDGE_RISING, &ISR2, bouncetime); + sleep(1); + StartSequence2(INT_EDGE_RISING, OUTpin, IRQpin, bounce); + printf("Stopp IRQ\n"); + wiringPiISRStop(IRQpin); + + printf("\nTesting IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + wiringPiISR2(IRQpin, INT_EDGE_FALLING, &ISR2, bouncetime); + sleep(1); + StartSequence2(INT_EDGE_FALLING, OUTpin, IRQpin, bounce); + printf("Stopp IRQ\n"); + wiringPiISRStop(IRQpin); + + printf("\nTesting IRQ @ GPIO%d with trigger @ GPIO%d both\n", IRQpin, OUTpin); + wiringPiISR2(IRQpin, INT_EDGE_BOTH, &ISR2, bouncetime); + sleep(1); + StartSequence2(INT_EDGE_BOTH, OUTpin, IRQpin, bounce); + printf("Stopp IRQ\n"); + wiringPiISRStop(IRQpin); + } + + for (int count=0; count<2; count++) { + printf("\nclassic function:\n"); + printf("=================\n"); + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_RISING, OUTpin, IRQpin, 0); + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin, 0); + + printf("\nnew function:\n"); + printf("===============\n"); + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_RISING, OUTpin, IRQpin, 1); + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin, 1); + } + pinMode(OUTpin, INPUT); + + return UnitTestState(); +}