This commit is contained in:
Dave Astels 2018-12-23 10:44:21 -05:00
parent 27ad985b1d
commit 692f1ae346
2 changed files with 46 additions and 23 deletions

View file

@ -12,7 +12,7 @@ Licensed under the MIT license.
All text above must be included in any redistribution.
"""
# pylint: disable=global-statement
# pylint: disable=global-statement,stop-iteration-return,no-self-use
import time
import random
@ -126,7 +126,7 @@ def random_color():
blue = random_color_byte()
return (red, green, blue)
# Color cycling. See https://learn.adafruit.com/hacking-ikea-lamps-with-circuit-playground-express/lamp-it-up
# Color cycling.
def wheel(pos):
# Input a value 0 to 255 to get a color value.
@ -230,6 +230,15 @@ def stop_playing():
if audio.playing:
audio.stop()
def almost_NY():
t = rtc.datetime
return (t.tm_mday == 31 and
t.tm_mon == 12 and
t.tm_hour == 23 and
t.tm_min == 59 and
t.tm_sec == 50)
state = WAITING_STATE
paused_state = None
@ -284,11 +293,7 @@ while True:
switch.update()
test_trigger = True
if test_trigger or (t.tm_mday == 31 and
t.tm_mon == 12 and
t.tm_hour == 23 and
t.tm_min == 59 and
t.tm_sec == 50):
if test_trigger or almost_NY():
test_trigger = False
# Play the song
start_playing('./countdown.wav')

View file

@ -1,4 +1,3 @@
import time
"""
Class based state machine implementation
@ -13,6 +12,9 @@ Licensed under the MIT license.
All text above must be included in any redistribution.
"""
# pylint: disable=global-statement,stop-iteration-return,no-self-use
import time
import random
import board
from digitalio import DigitalInOut, Direction, Pull
@ -105,7 +107,7 @@ def random_color():
blue = random_color_byte()
return (red, green, blue)
# Color cycling. See https://learn.adafruit.com/hacking-ikea-lamps-with-circuit-playground-express/lamp-it-up
# Color cycling.
def wheel(pos):
# Input a value 0 to 255 to get a color value.
@ -287,6 +289,9 @@ class State(object):
class WaitingState(State):
def __init__(self):
super().__init__()
@property
def name(self):
return 'waiting'
@ -317,6 +322,7 @@ class WaitingState(State):
class DroppingState(State):
def __init__(self):
super().__init__()
self.rainbow = None
self.rainbow_time = 0
self.drop_finish_time = 0
@ -336,11 +342,10 @@ class DroppingState(State):
def exit(self, machine):
State.exit(self, machine)
now = time.monotonic()
servo.throttle = 0.0
stop_playing()
machine.reset_fireworks()
machine.firework_stop_time = now + FIREWORKS_DURATION
machine.firework_stop_time = time.monotonic() + FIREWORKS_DURATION
def update(self, machine):
if State.update(self, machine):
@ -356,6 +361,9 @@ class DroppingState(State):
class BurstState(State):
def __init__(self):
super().__init__()
@property
def name(self):
return 'burst'
@ -377,6 +385,9 @@ class BurstState(State):
class ShowerState(State):
def __init__(self):
super().__init__()
@property
def name(self):
return 'shower'
@ -391,7 +402,7 @@ class ShowerState(State):
def update(self, machine):
if State.update(self, machine):
if shower(machine, time.monotonic()):
if now >= machine.firework_stop_time:
if time.monotonic() >= machine.firework_stop_time:
machine.go_to_state('idle')
else:
machine.go_to_state('burst')
@ -401,6 +412,9 @@ class ShowerState(State):
class IdleState(State):
def __init__(self):
super().__init__()
@property
def name(self):
return 'idle'
@ -420,6 +434,9 @@ class IdleState(State):
class RaisingState(State):
def __init__(self):
super().__init__()
@property
def name(self):
return 'raising'
@ -448,11 +465,12 @@ class RaisingState(State):
class PausedState(State):
@property
def __init__(self):
super().__init__()
self.switch_pressed_at = 0
self.paused_servo = 0
@property
def name(self):
return 'paused'
@ -481,17 +499,17 @@ class PausedState(State):
################################################################################
# Create the state machine
machine = StateMachine()
machine.add_state(WaitingState())
machine.add_state(DroppingState())
machine.add_state(BurstState())
machine.add_state(ShowerState())
machine.add_state(IdleState())
machine.add_state(RaisingState())
machine.add_state(PausedState())
pretty_state_machine = StateMachine()
pretty_state_machine.add_state(WaitingState())
pretty_state_machine.add_state(DroppingState())
pretty_state_machine.add_state(BurstState())
pretty_state_machine.add_state(ShowerState())
pretty_state_machine.add_state(IdleState())
pretty_state_machine.add_state(RaisingState())
pretty_state_machine.add_state(PausedState())
machine.go_to_state('waiting')
pretty_state_machine.go_to_state('waiting')
while True:
switch.update()
machine.update()
pretty_state_machine.update()