pull/12/merge
CloudSir 4 years ago committed by GitHub
commit df5cd59700
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -13,7 +13,7 @@ int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
return 0; return 0;
} }
int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData) int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated)
{ {
if (!timer || !callback ) { if (!timer || !callback ) {
return -1; return -1;
@ -29,8 +29,10 @@ int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t cal
/* Init timer. */ /* Init timer. */
timer->deadline = platformTicksFunction() + timing; timer->deadline = platformTicksFunction() + timing;
timer->timeout = timing;
timer->callback = callback; timer->callback = callback;
timer->userData = userData; timer->userData = userData;
timer->is_repeated = is_repeated;
/* Insert timer. */ /* Insert timer. */
for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) { for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) {
@ -51,6 +53,7 @@ int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t cal
int MultiTimerStop(MultiTimer* timer) int MultiTimerStop(MultiTimer* timer)
{ {
MultiTimer** nextTimer = &timerList; MultiTimer** nextTimer = &timerList;
timer->is_repeated = 0;
/* Find and remove timer. */ /* Find and remove timer. */
for (; *nextTimer; nextTimer = &(*nextTimer)->next) { for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
MultiTimer* entry = *nextTimer; MultiTimer* entry = *nextTimer;
@ -76,6 +79,9 @@ int MultiTimerYield(void)
/* call callback */ /* call callback */
if (entry->callback) { if (entry->callback) {
entry->callback(entry, entry->userData); entry->callback(entry, entry->userData);
if(entry->is_repeated == 1) {
MultiTimerStart(entry, entry->timeout, entry->callback, entry->userData, 1);
}
} }
} }
return 0; return 0;

@ -37,7 +37,9 @@ typedef void (*MultiTimerCallback_t)(MultiTimer* timer, void* userData);
struct MultiTimerHandle { struct MultiTimerHandle {
MultiTimer* next; MultiTimer* next;
uint64_t timeout;
uint64_t deadline; uint64_t deadline;
uint8_t is_repeated;
MultiTimerCallback_t callback; MultiTimerCallback_t callback;
void* userData; void* userData;
}; };
@ -57,9 +59,10 @@ int MultiTimerInstall(PlatformTicksFunction_t ticksFunc);
* @param timing Set the start time. * @param timing Set the start time.
* @param callback deadline callback. * @param callback deadline callback.
* @param userData user data. * @param userData user data.
* @param is_repeated repeat(1) or not(0).
* @return int 0: success, -1: fail. * @return int 0: success, -1: fail.
*/ */
int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData); int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated);
/** /**
* @brief Stop the timer work, remove the handle off work list. * @brief Stop the timer work, remove the handle off work list.

@ -24,7 +24,7 @@ MultiTimer timer1;
3. 设置定时时间,超时回调处理函数, 用户上下指针,启动定时器; 3. 设置定时时间,超时回调处理函数, 用户上下指针,启动定时器;
```c ```c
int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData); int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated);
``` ```
4. 在主循环调用定时器后台处理函数 4. 在主循环调用定时器后台处理函数
@ -71,27 +71,26 @@ uint64_t PlatformTicksGetFunc(void)
void exampleTimer1Callback(MultiTimer* timer, void *userData) void exampleTimer1Callback(MultiTimer* timer, void *userData)
{ {
printf("exampleTimer1Callback-> %s.\r\n", (char*)userData); printf("exampleTimer1Callback-> %s.\r\n", (char*)userData);
MultiTimerStart(timer, 1000, exampleTimer1Callback, userData);
} }
void exampleTimer2Callback(MultiTimer* timer, void *userData) void exampleTimer2Callback(MultiTimer* timer, void *userData)
{ {
printf("exampleTimer2Callback-> %s.\r\n", (char*)userData); printf("exampleTimer2Callback-> %s.\r\n", (char*)userData, 0);
} }
void exampleTimer3Callback(MultiTimer* timer, void *userData) void exampleTimer3Callback(MultiTimer* timer, void *userData)
{ {
printf("exampleTimer3Callback-> %s.\r\n", (char*)userData); printf("exampleTimer3Callback-> %s.\r\n", (char*)userData);
MultiTimerStart(timer, 4567, exampleTimer3Callback, userData); MultiTimerStart(timer, 4567, exampleTimer3Callback, userData, 0);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
MultiTimerInstall(PlatformTicksGetFunc); MultiTimerInstall(PlatformTicksGetFunc);
MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer"); MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer", 1);
MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer"); MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer", 0);
MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer"); MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer", 0);
while (1) { while (1) {
MultiTimerYield(); MultiTimerYield();

@ -6,6 +6,7 @@
MultiTimer timer1; MultiTimer timer1;
MultiTimer timer2; MultiTimer timer2;
MultiTimer timer3; MultiTimer timer3;
MultiTimer timer4;
uint64_t PlatformTicksGetFunc(void) uint64_t PlatformTicksGetFunc(void)
{ {
@ -17,7 +18,6 @@ uint64_t PlatformTicksGetFunc(void)
void exampleTimer1Callback(MultiTimer* timer, void *userData) void exampleTimer1Callback(MultiTimer* timer, void *userData)
{ {
printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
MultiTimerStart(timer, 1000, exampleTimer1Callback, userData);
} }
void exampleTimer2Callback(MultiTimer* timer, void *userData) void exampleTimer2Callback(MultiTimer* timer, void *userData)
@ -28,16 +28,28 @@ void exampleTimer2Callback(MultiTimer* timer, void *userData)
void exampleTimer3Callback(MultiTimer* timer, void *userData) void exampleTimer3Callback(MultiTimer* timer, void *userData)
{ {
printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
MultiTimerStart(timer, 4567, exampleTimer3Callback, userData); MultiTimerStart(timer, 4567, exampleTimer3Callback, userData, 0);
}
int count = 0;
void exampleTimer4Callback(MultiTimer* timer, void *userData)
{
count++;
printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
if (count >= 3) {
printf("Timer 4 stop.\n");
MultiTimerStop(timer);
}
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
MultiTimerInstall(PlatformTicksGetFunc); MultiTimerInstall(PlatformTicksGetFunc);
MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer"); MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer", 1);
MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer"); MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer", 0);
MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer"); MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer", 0);
MultiTimerStart(&timer4, 2000, exampleTimer4Callback, "2000ms timer - Timer4, loop 3 times", 1);
while (1) { while (1) {
MultiTimerYield(); MultiTimerYield();

Loading…
Cancel
Save