|
@@ -5,75 +5,181 @@
|
|
|
#include <string.h>
|
|
|
#include <gfatimer.h>
|
|
|
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+typedef struct _T_PARAMS
|
|
|
+{
|
|
|
+ unsigned long nTriggers;
|
|
|
+ struct timespec *ptsStart;
|
|
|
+}T_PARAMS, *PT_PARAMS;
|
|
|
+
|
|
|
#define _NANOSECS_PER_SEC 1000000000
|
|
|
|
|
|
+static const int g_cpt[GTCP_Last] = {250, 500, 750, 1000, 1500, 2000, 5000, 10000};
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
static long long _TimeSpecDiffNs(const struct timespec *pts1, const struct timespec *pts2)
|
|
|
{
|
|
|
long long ns1 = (long long)pts1->tv_sec * _NANOSECS_PER_SEC + pts1->tv_nsec;
|
|
|
long long ns2 = (long long)pts2->tv_sec * _NANOSECS_PER_SEC + pts2->tv_nsec;
|
|
|
- return ns2 - ns1;
|
|
|
+ return (ns2 - ns1);
|
|
|
}
|
|
|
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+// callback are always called in the thread context of the timer thread!
|
|
|
+
|
|
|
+static void _TimerCallback(int tnum, void *pContext)
|
|
|
+{
|
|
|
+ struct timespec tsCur;
|
|
|
+ PT_PARAMS ptp = (PT_PARAMS)pContext;
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &tsCur);
|
|
|
+ long long elps = _TimeSpecDiffNs(ptp->ptsStart, &tsCur) / 1000000;
|
|
|
+ ptp->nTriggers++;
|
|
|
+
|
|
|
+ printf("Timer[%d] triggerd (%lu) at: %lld ms.\n", tnum, ptp->nTriggers, elps);
|
|
|
+
|
|
|
+ if(ptp->nTriggers < 4)
|
|
|
+ tw_set(tnum, 1000 * ptp->nTriggers); // restrigger timer
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf("Timer[%d] released!\n", tnum);
|
|
|
+ GfaUnregisterTimerCallback(tnum);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+// callback are always called in the thread context of the timer thread!
|
|
|
+
|
|
|
+static void _ClockPulseCallback(GfaTimerClockPulse cp, int state, void *pContext)
|
|
|
+{
|
|
|
+ struct timespec tsCur;
|
|
|
+ PT_PARAMS ptp = (PT_PARAMS)pContext;
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &tsCur);
|
|
|
+ long long elps = _TimeSpecDiffNs(ptp->ptsStart, &tsCur) / 1000000;
|
|
|
+
|
|
|
+ switch(cp)
|
|
|
+ {
|
|
|
+ case GTCP_250ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_500ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_750ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_1000ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_1500ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_2000ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_5000ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ case GTCP_10000ms:
|
|
|
+ ptp->nTriggers++;
|
|
|
+ printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ printf("Clock pulse %d invalid!\n", cp);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
- long long elps1, elps2;
|
|
|
- int tnum1 = 3, tnum2 = 14, nPulse, nOldPulse = 0;
|
|
|
- unsigned long tw1 = 1, tw2 = 1;
|
|
|
- struct timespec tsRes, tsStart, tsEnd1, tsEnd2;
|
|
|
- memset(&tsEnd1, 0, sizeof(tsEnd1));
|
|
|
- memset(&tsEnd2, 0, sizeof(tsEnd2));
|
|
|
-
|
|
|
- if(!GfaTimerInit(32, GTR_25ms))
|
|
|
+ T_PARAMS tp1, tp2, tp3;
|
|
|
+ long long elps;
|
|
|
+ int tnum1 = 0, tnum2 = 2, nPulse, nOldPulse = 0;
|
|
|
+ unsigned long tw = 1;
|
|
|
+ struct timespec tsStart, tsCur, tsEnd;
|
|
|
+
|
|
|
+ memset(&tsCur, 0, sizeof(tsCur));
|
|
|
+ memset(&tsEnd, 0, sizeof(tsEnd));
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &tsStart);
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+ if(!GfaTimerInit(32, GTR_50ms))
|
|
|
{
|
|
|
printf("GfaTimerInit failed!\n");
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+ tp1.nTriggers = 0;
|
|
|
+ tp1.ptsStart = &tsStart;
|
|
|
+ GfaRegisterTimerCallback(tnum2, _TimerCallback, &tp1);
|
|
|
+
|
|
|
+ tp2.nTriggers = 0;
|
|
|
+ tp2.ptsStart = &tsStart;
|
|
|
+ GfaRegisterClockPulseCallback(GTCP_500ms, _ClockPulseCallback, &tp2);
|
|
|
+
|
|
|
+ tp3.nTriggers = 0;
|
|
|
+ tp3.ptsStart = &tsStart;
|
|
|
+ GfaRegisterClockPulseCallback(GTCP_1500ms, _ClockPulseCallback, &tp3);
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
tf_set(tnum1);
|
|
|
tf_set(tnum2);
|
|
|
- tw_set(tnum1, 15000);
|
|
|
- tw_set(tnum2, 10000);
|
|
|
|
|
|
- clock_gettime(CLOCK_MONOTONIC, &tsStart);
|
|
|
+ tw_set(tnum1, 20000);
|
|
|
+ tw_set(tnum2, 500);
|
|
|
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
do
|
|
|
{
|
|
|
nPulse = cp_test(GTCP_750ms);
|
|
|
|
|
|
if(nOldPulse != nPulse)
|
|
|
{
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &tsCur);
|
|
|
+ elps = _TimeSpecDiffNs(&tsStart, &tsCur);
|
|
|
+ printf(" Clock pulse[%dms] polled (%s) at: %lld ms.\n", g_cpt[GTCP_750ms], nPulse ? "+" : "-", elps / 1000000);
|
|
|
nOldPulse = nPulse;
|
|
|
- printf("Pulse 750ms %d\n", nPulse);
|
|
|
- }
|
|
|
-
|
|
|
- if(tw1)
|
|
|
- {
|
|
|
- if(!(tw1 = tw_read(tnum1)))
|
|
|
- {
|
|
|
- clock_gettime(CLOCK_MONOTONIC, &tsEnd1);
|
|
|
- printf("T%d expired.\n", tnum1);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- if(tw2)
|
|
|
+ if(tw && !(tw = tw_read(tnum1)))
|
|
|
{
|
|
|
- if(!(tw2 = tw_read(tnum2)))
|
|
|
- {
|
|
|
- clock_gettime(CLOCK_MONOTONIC, &tsEnd2);
|
|
|
- printf("T%d expired.\n", tnum2);
|
|
|
- }
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &tsEnd);
|
|
|
+ printf(" Timer[%d] (polled) expired.\n", tnum1);
|
|
|
}
|
|
|
+
|
|
|
+ // do work ...
|
|
|
|
|
|
usleep(25000);
|
|
|
-// printf("T%d: %3lu, T%d: %3lu\n", tnum1, tw1, tnum2, tw2);
|
|
|
}
|
|
|
- while(tw1 || tw2);
|
|
|
+ while(tw);
|
|
|
|
|
|
- elps1 = _TimeSpecDiffNs(&tsStart, &tsEnd1);
|
|
|
- elps2 = _TimeSpecDiffNs(&tsStart, &tsEnd2);
|
|
|
+ GfaUnregisterTimerCallback(tnum2);
|
|
|
+ GfaUnregisterClockPulseCallback(GTCP_500ms);
|
|
|
+ GfaUnregisterClockPulseCallback(GTCP_1500ms);
|
|
|
+
|
|
|
+ GfaTimerRelease();
|
|
|
|
|
|
- printf("\nT%d effective: %lld ms.\n", tnum1, elps1 / 1000000);
|
|
|
- printf("T%d effective: %lld ms.\n", tnum2, elps2 / 1000000);
|
|
|
+ /////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
+ elps = _TimeSpecDiffNs(&tsStart, &tsEnd);
|
|
|
+ printf("\nTimer[%d] (polled) - effective measured time: %lld ms.\n\n", tnum1, elps / 1000000);
|
|
|
return 0;
|
|
|
}
|