aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/examples/ecore_timer_example.c
blob: 2d5d3685c60705de29c413c5c60481241c96f30c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <Ecore.h>
#include <unistd.h>

#define TIMEOUT_1 1.0 // interval for timer1
#define TIMEOUT_2 3.0 // timer2 - delay timer1
#define TIMEOUT_3 8.2 // timer3 - pause timer1
#define TIMEOUT_4 11.0 // timer4 - resume timer1
#define TIMEOUT_5 14.0 // timer5 - change interval of timer1
#define TIMEOUT_6 18.0 // top timer1 and start timer7 and timer8 with changed precision
#define TIMEOUT_7 1.1 // interval for timer7
#define TIMEOUT_8 1.2 // interval for timer8
#define DELAY_1 3.0 // delay time for timer1 - used by timer2
#define INTERVAL1 2.0 // new interval for timer1 - used by timer5

static double _initial_time = 0;

struct context { // helper struct to give some context to the callbacks
     Ecore_Timer *timer1;
     Ecore_Timer *timer2;
     Ecore_Timer *timer3;
     Ecore_Timer *timer4;
     Ecore_Timer *timer5;
     Ecore_Timer *timer6;
     Ecore_Timer *timer7;
     Ecore_Timer *timer8;
};

static double
_get_current_time(void)
{
   return ecore_time_get() - _initial_time;
}

static Eina_Bool
_timer1_cb(void *data)
{
   printf("Timer1 expired after %0.3f seconds.\n", _get_current_time());
   return ECORE_CALLBACK_RENEW;
}

static Eina_Bool
_timer2_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer2 expired after %0.3f seconds. "
	  "Adding delay of %0.3f seconds to timer1.\n",
	  _get_current_time(), DELAY_1);

   ecore_timer_delay(ctxt->timer1, DELAY_1);

   ctxt->timer2 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer3_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer3 expired after %0.3f seconds. "
	  "Freezing timer1.\n", _get_current_time());

   ecore_timer_freeze(ctxt->timer1);

   ctxt->timer3 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer4_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer4 expired after %0.3f seconds. "
	  "Resuming timer1, which has %0.3f seconds left to expire.\n",
	  _get_current_time(), ecore_timer_pending_get(ctxt->timer1));

   ecore_timer_thaw(ctxt->timer1);

   ctxt->timer4 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer5_cb(void *data)
{
   struct context *ctxt = data;
   double interval = ecore_timer_interval_get(ctxt->timer1);

   printf("Timer5 expired after %0.3f seconds. "
	  "Changing interval of timer1 from %0.3f to %0.3f seconds.\n",
	  _get_current_time(), interval, INTERVAL1);

   ecore_timer_interval_set(ctxt->timer1, INTERVAL1);

   ctxt->timer5 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer7_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer7 expired after %0.3f seconds.\n", _get_current_time());

   ctxt->timer7 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer8_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer8 expired after %0.3f seconds.\n", _get_current_time());

   ctxt->timer8 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

static Eina_Bool
_timer6_cb(void *data)
{
   struct context *ctxt = data;
   printf("Timer6 expired after %0.3f seconds.\n", _get_current_time());

   printf("Stopping timer1.\n");

   ecore_timer_del(ctxt->timer1);
   ctxt->timer1 = NULL;

   printf("Starting timer7 (%0.3fs) and timer8 (%0.3fs).\n",
	  TIMEOUT_7, TIMEOUT_8);

   ctxt->timer7 = ecore_timer_add(TIMEOUT_7, _timer7_cb, ctxt);
   ctxt->timer8 = ecore_timer_add(TIMEOUT_8, _timer8_cb, ctxt);

   ecore_timer_precision_set(0.2);

   ctxt->timer6 = NULL;
   return ECORE_CALLBACK_CANCEL;
}

int main(int argc, char **argv)
{
   struct context ctxt = {0};

   if (!ecore_init())
     {
	printf("ERROR: Cannot init Ecore!\n");
	return -1;
     }

   _initial_time = ecore_time_get();

   ctxt.timer1 = ecore_timer_add(TIMEOUT_1, _timer1_cb, &ctxt);
   ctxt.timer2 = ecore_timer_add(TIMEOUT_2, _timer2_cb, &ctxt);
   ctxt.timer3 = ecore_timer_add(TIMEOUT_3, _timer3_cb, &ctxt);
   ctxt.timer4 = ecore_timer_add(TIMEOUT_4, _timer4_cb, &ctxt);
   ctxt.timer5 = ecore_timer_add(TIMEOUT_5, _timer5_cb, &ctxt);
   ctxt.timer6 = ecore_timer_add(TIMEOUT_6, _timer6_cb, &ctxt);

   printf("start the main loop.\n");

   ecore_main_loop_begin();

   if (ctxt.timer1)
     ecore_timer_del(ctxt.timer1);
   if (ctxt.timer2)
     ecore_timer_del(ctxt.timer2);
   if (ctxt.timer3)
     ecore_timer_del(ctxt.timer3);
   if (ctxt.timer4)
     ecore_timer_del(ctxt.timer4);
   if (ctxt.timer5)
     ecore_timer_del(ctxt.timer5);
   if (ctxt.timer6)
     ecore_timer_del(ctxt.timer6);
   if (ctxt.timer7)
     ecore_timer_del(ctxt.timer7);
   if (ctxt.timer8)
     ecore_timer_del(ctxt.timer8);

   ecore_shutdown();

   return 0;
}