Toggle Navigation
Hatchery
Eggs
Joust
__init__.py
Users
Badges
Login
Register
MCH2022 badge?
go to mch2022.badge.team
__init__.py
raw
Content
# card10 Joust # based on https://github.com/adangert/JoustMania import display import os import utime import buttons from color import Color import leds import vibra import bhi160 COLOR_GREEN=(0,255,0) COLOR_RED=(255,0,0) COLOR_ORANGE=(255,125,0) COLOR_WHITE=(255,255,255) ACCELEROMETER = bhi160.BHI160Accelerometer() class JoustSensor: NUM_READINGS = 1 def __init__(self): self.sensor = ACCELEROMETER self.last_accels = [] self.jerk = 0.0 self.threshold = 1.8 def get_jerk(self): readings = list() while not readings: readings = self.sensor.read() if len(readings) > 0: self.last_accels = self.last_accels + readings self.last_accels = self.last_accels[-JoustSensor.NUM_READINGS:] jerk_x = sum([a.x for a in self.last_accels]) / JoustSensor.NUM_READINGS jerk_y = sum([a.y for a in self.last_accels]) / JoustSensor.NUM_READINGS jerk_z = sum([a.z for a in self.last_accels]) / JoustSensor.NUM_READINGS self.jerk = (jerk_x**2 + jerk_y**2 + jerk_z**2)**0.5 return self.jerk def too_fast(self): return self.get_jerk() > self.threshold def wait_button(): utime.sleep_ms(1000) while True: pressed = buttons.read( buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT ) if pressed != 0: break if pressed & buttons.BOTTOM_LEFT != 0: return "BL" if pressed & buttons.BOTTOM_RIGHT != 0: return "BR" if pressed & buttons.UPPER_RIGHT != 0: return "BR" if pressed & buttons.UPPER_LEFT != 0: return "UL" return "??" def joining_game(): set_display("JOIN ?", COLOR_WHITE) set_color(COLOR_WHITE) def status_in_game(): set_display("IN GAME", COLOR_GREEN) set_color(COLOR_GREEN) def status_out_game(): set_display("DROPPED", COLOR_RED) set_color(COLOR_RED) def set_display(text, colr): with display.open() as disp: disp.clear() disp.print(text, fg=colr, bg=(0,0,0), posx=30, posy=30) disp.update() def set_color(colr): for i in range(15): leds.prep(i, colr) leds.update() def countdown(n): colr = COLOR_WHITE for i in range(n,0,-1): if i == 3: colr = COLOR_RED elif i == 2: colr = COLOR_ORANGE elif i == 1: colr = COLOR_GREEN set_display("START: %d" % i, colr) leds.clear() vibra.vibrate(300) utime.sleep_ms(1000) vibra.vibrate(1000) def change_status(status): status() vibra.vibrate(1000) def run(): print("Starting ...") acc = JoustSensor() i=0 states = [joining_game, status_in_game, status_out_game] while True: current_status = states[i%len(states)] change_status(current_status) i+=1 if current_status == joining_game: wait_button() countdown(5) elif current_status == status_in_game: while not acc.too_fast(): pass elif current_status == status_out_game: wait_button() run()