Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Hacksaar
rinx
Commits
d65eb353
Commit
d65eb353
authored
Feb 15, 2016
by
Ralf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
turn State into a trait
parent
a72d1fc0
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
38 deletions
+35
-38
src/brain/mod.rs
src/brain/mod.rs
+35
-38
No files found.
src/brain/mod.rs
View file @
d65eb353
...
...
@@ -23,49 +23,46 @@ struct Actors {
lock_actor
:
Box
<
Actor
<
LockAction
>
+
Send
>
,
}
s
tr
uc
t
State
{
run
:
Box
<
FnOnce
(
Actors
,
&
mut
Environment
)
->
(
Actors
,
Option
<
State
>
)
+
'static
>
,
tr
ai
t
State
{
fn
run
(
&
mut
self
,
Actors
,
&
mut
Environment
)
->
(
Actors
,
Option
<
Box
<
State
>
>
);
}
fn
user_command_reject_handler
(
ev
:
Event
)
{}
impl
State
{
fn
new
<
F
>
(
f
:
F
)
->
State
where
F
:
FnOnce
(
Actors
,
&
mut
Environment
)
->
(
Actors
,
Option
<
State
>
)
+
'static
{
State
{
run
:
Box
::
new
(
f
)
}
}
struct
UnLockingState
{
locking
:
bool
,
}
fn
new_locking
()
->
Self
{
Self
::
new
(|
mut
actors
,
env
|
{
// TODO: abort if already locked
let
mut
lock_actor
=
actors
.lock_actor
;
// move out
for
i
in
0
..
3
{
let
locker
=
Wakeable
::
new
(
move
|
t
|
{
lock_actor
.act
(
LockAction
::
PressLock
);
t
.sleep
(
Duration
::
from_millis
(
100
)
);
lock_actor
.act
(
LockAction
::
Release
);
lock_actor
});
let
r
=
env
.handle_events
(
Duration
::
from_secs
(
1
),
vec!
[
EventHandler
::
new_safe
(
user_command_reject_handler
),
EventHandler
::
new
(|
ev
|
{
match
ev
{
Event
::
DoorLocked
(
true
)
=>
HandlerResult
::
QuitLoop
,
_
=>
HandlerResult
::
Continue
,
}
}
),
]);
// take back lock_actor to feel complete again
lock_actor
=
locker
.terminate
();
if
r
!
=
EventsResult
::
Timeout
{
assert
!
(
r
==
EventsResult
::
ShuttingDown
||
env
.door_locked
());
break
;
}
impl
State
for
UnLockingState
{
fn
run
(
&
mut
self
,
mut
actors
:
Actors
,
env
:
&
mut
Environment
)
->
(
Actors
,
Option
<
Box
<
State
>>
)
{
// TODO: abort if already locked
let
mut
lock_actor
=
actors
.lock_actor
;
// move out
let
locking
=
self
.locking
;
for
i
in
0
..
3
{
let
locker
=
Wakeable
::
new
(
move
|
t
|
{
lock_actor
.act
(
if
locking
{
LockAction
::
PressLock
}
else
{
LockAction
::
PressUnlock
}
);
t
.sleep
(
Duration
::
from_millis
(
100
)
);
lock_actor
.act
(
LockAction
::
Release
);
lock_actor
});
let
r
=
env
.handle_events
(
Duration
::
from_secs
(
1
),
vec!
[
EventHandler
::
new
_safe
(
user_command_reject_handler
),
EventHandler
::
new
(|
ev
|
{
match
ev
{
Event
::
DoorLocked
(
b
)
if
b
==
locking
=>
HandlerResult
::
QuitLoop
,
_
=>
HandlerResult
::
Continue
,
}
}),
]);
// take back lock_actor to feel complete again
lock_acto
r
=
locker
.terminate
();
if
r
!=
EventsResult
::
Timeout
{
assert
!
(
r
==
EventsResult
::
ShuttingDown
||
env
.door_locked
()
==
locking
)
;
break
;
}
actors
.lock_actor
=
lock_actor
;
// move back
(
actors
,
None
)
}
)
}
actors
.lock_actor
=
lock_actor
;
// move back
(
actors
,
None
)
}
}
Write
Preview
Markdown
is supported
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