Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Hacksaar
Sphinx
Commits
dfe98478
Commit
dfe98478
authored
Oct 26, 2013
by
Ralf
Browse files
change the way the waker works: let others register to be called by it
parent
960dd08b
Changes
3
Hide whitespace changes
Inline
Side-by-side
statemachine.py
View file @
dfe98478
...
...
@@ -304,12 +304,13 @@ class StateMachine():
return
StateMachine
.
StateAuf
(
self
.
state_machine
)
return
super
().
handle_pins_event
()
def
__init__
(
self
,
actor
,
fallback
=
False
):
def
__init__
(
self
,
actor
,
waker
,
fallback
=
False
):
self
.
actor
=
actor
self
.
callback
=
ThreadFunction
(
self
.
_callback
,
name
=
"StateMachine"
)
self
.
current_state
=
StateMachine
.
StateStart
(
self
,
fallback
)
self
.
pins
=
None
self
.
old_pins
=
None
waker
.
register
(
lambda
:
self
.
callback
(
StateMachine
.
CMD_WAKEUP
),
1.0
)
# wake up every second
def
stop
(
self
):
self
.
callback
.
stop
()
...
...
tuerd
View file @
dfe98478
...
...
@@ -30,10 +30,10 @@ GPIO.setmode(GPIO.BOARD)
# bring 'em all up
the_actor
=
actor
.
Actor
()
the_machine
=
statemachine
.
StateMachine
(
the_actor
,
args
.
fallback
)
the_waker
=
waker
.
Waker
(
the_machine
)
the_machine
=
statemachine
.
StateMachine
(
the_actor
,
the_waker
,
args
.
fallback
)
the_socket
=
tysock
.
TySocket
(
the_machine
)
the_pins
=
pins
.
PinsWatcher
(
the_machine
)
the_waker
=
waker
.
Waker
(
the_machine
)
# we do the socket accept thing in the main thread
try
:
...
...
@@ -44,8 +44,8 @@ except KeyboardInterrupt:
pass
# bring 'em all down
the_waker
.
stop
()
the_pins
.
stop
()
the_waker
.
stop
()
# this one first, it "randomly" calls other threads
the_pins
.
stop
()
# as does this
the_machine
.
stop
()
the_actor
.
stop
()
...
...
waker.py
View file @
dfe98478
from
libtuer
import
ThreadRepeater
from
statemachine
import
StateMachine
from
collections
import
namedtuple
SLEEP_TIME
=
0.5
ToBeWoken
=
namedtuple
(
'ToBeWoken'
,
'f period time_since_call one_shot'
)
class
Waker
():
def
__init__
(
self
,
sm
):
self
.
_sm
=
sm
self
.
_t
=
ThreadRepeater
(
self
.
_wake
,
0.5
,
name
=
"Waker"
)
self
.
_t
=
ThreadRepeater
(
self
.
_wake
,
SLEEP_TIME
,
name
=
"Waker"
)
self
.
_tobewokens
=
[]
def
register
(
f
,
time
,
one_shot
=
False
):
'''Register a function which is called approximately every <time> seconds (or just once, if one_shot is True). f should return quickly, or it will delay the waker!'''
time
=
max
(
time
//
SLEEP_TIME
,
1
)
self
.
_tobewokens
.
append
(
ToBeWoken
(
f
,
time
,
0
,
one_shot
))
def
_wake
(
self
):
self
.
_sm
.
callback
(
StateMachine
.
CMD_WAKEUP
)
delete
=
[]
# run the functions we ought to run
for
tobewoken
,
idx
in
zip
(
self
.
_tobewokens
,
range
(
len
(
self
.
_tobewokens
))):
tobewoken
.
time_since_call
+=
1
if
tobewoken
.
time_since_call
>=
tobewoken
.
period
:
tobewoken
.
f
()
tobewoken
.
time_since_call
=
0
if
tobewoken
.
one_shot
:
delete
.
append
(
idx
)
# delete what we have to delete - in reverse order so the indices stay valid!
delete
.
reverse
()
for
idx
in
delete
:
del
self
.
_tobewokens
[
idx
]
def
stop
(
self
):
self
.
_t
.
stop
()
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment