Skip to content

Commit 948ee03

Browse files
committed
add time base scheduler
1 parent d18b8a6 commit 948ee03

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

‎tmScheduler/README.md‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Simple Time Base task scheduler
2+
3+
simple Time Base task scheduler for micropython.
4+
5+
6+
7+
## usage
8+
9+
1. define task, set function, paramters, interval, task state etc.
10+
2. define scheduler, recommend use **machine.Timer(-1)** (soft timer) as time base.
11+
3. add tasks to scheduler.
12+
4. run scheduler.
13+
14+
## demo
15+
16+
```
17+
from scheduler import Scheduler, Task
18+
import machine
19+
20+
def LED():
21+
pyb.LED(1).toggle()
22+
23+
def pn(n):
24+
print(n)
25+
26+
task1 = Task(LED, None, 1000)
27+
task2 = Task(pn, 1, 1000)
28+
task3 = Task(pn, 2, 1500)
29+
30+
sc = Scheduler(machine.Timer(-1))
31+
sc.add(task1)
32+
sc.add(task2)
33+
sc.add(task3)
34+
sc.scheduler()
35+
```
36+

‎tmScheduler/demo1.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from scheduler import Scheduler, Task
2+
import machine
3+
4+
def LED():
5+
pyb.LED(1).toggle()
6+
7+
def pn(n):
8+
print(n)
9+
10+
task1 = Task(LED, None, 1000)
11+
task2 = Task(pn, 1, 1000)
12+
task3 = Task(pn, 2, 1500)
13+
14+
sc = Scheduler(machine.Timer(-1))
15+
sc.add(task1)
16+
sc.add(task2)
17+
sc.add(task3)
18+
sc.scheduler()

‎tmScheduler/scheduler.py‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
'''
2+
simple Time base Task Scheduler
3+
'''
4+
5+
from micropython import const
6+
7+
TASK_STOP = const(0)
8+
TASK_RUN = const(1)
9+
10+
class Task():
11+
12+
def __init__(self, callback, param = None, interval = 1000, state = TASK_RUN):
13+
self._callback = callback
14+
self._param = param
15+
self._cnt = 10
16+
self._intv = interval
17+
self._state = state
18+
self._rt = 0
19+
20+
def pause(self):
21+
self._state = TASK_STOP
22+
23+
def resume(self):
24+
self._state = TASK_RUN
25+
26+
def run(self):
27+
if self._param == None:
28+
self._callback()
29+
else:
30+
self._callback(self._param)
31+
32+
class Scheduler():
33+
def __init__(self, tm, interval = 100, task_idle = None, task_err = None):
34+
self._tasks = []
35+
self._task_idle = task_idle
36+
self._task_err = task_err
37+
self._interval = interval
38+
self._tmr = tm
39+
self._tmr.init(period = interval, callback=self._tmrirq)
40+
41+
def _tmrirq(self, t):
42+
for i in range(len(self._tasks)):
43+
if self._tasks[i]._state == TASK_RUN:
44+
self._tasks[i]._rt += 1
45+
46+
def _run(self, task):
47+
if task._state == TASK_RUN:
48+
try:
49+
if task._rt >= task._cnt:
50+
task._rt = 0
51+
task.run()
52+
except:
53+
if self._task_err:
54+
self._task_err()
55+
56+
def scheduler(self):
57+
while True:
58+
for i in range(len(self._tasks)):
59+
task = self._tasks[i]
60+
self._run(task)
61+
if self._task_idle:
62+
self._task_idle()
63+
64+
def find(self, task):
65+
try:
66+
return self._tasks.index(task)
67+
except:
68+
return None
69+
70+
def clear(self):
71+
self._tasks.clear()
72+
73+
def add(self, task):
74+
if self.find(task) == None:
75+
self._tasks.append(task)
76+
task._cnt = task._intv // self._interval
77+
78+
def delete(self, task):
79+
try:
80+
self._tasks.remove(task)
81+
except:
82+
print('del task <', task, '> error')
83+
84+
def pause(self, task):
85+
if self.find(task) != None:
86+
self._tasks[self.find(task)].pause()
87+
88+
def resume(self, task):
89+
if self.find(task) != None:
90+
self._tasks[self.find(task)].resume()
91+
92+
def run(self, task):
93+
if self.find(task) != None:
94+
task._rt = task._cnt
95+
self._run(task)

0 commit comments

Comments
 (0)