To "clean up" the Learn System repo, we need to move groups of guides into subdirectories. This PR duplicates the CLUE guides into the CLUE subdirectory so guides may be changed prior to deleting redundant project repos to make more space.
134 lines
4.1 KiB
Python
134 lines
4.1 KiB
Python
# SPDX-FileCopyrightText: 2020 Carter Nelson for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import time
|
|
import random
|
|
import displayio
|
|
from adafruit_bitmap_font import bitmap_font
|
|
from adafruit_display_text import label
|
|
from adafruit_clue import clue
|
|
|
|
#--| User Config |-------------------------------
|
|
BACKGROUND_COLOR = 0xCFBC17
|
|
HEXAGRAM_COLOR = 0xBB0000
|
|
FONT_COLOR = 0x005500
|
|
SHAKE_THRESHOLD = 20
|
|
MELODY = ( (1000, 0.1), # (freq, duration)
|
|
(1200, 0.1),
|
|
(1400, 0.1),
|
|
(1600, 0.2))
|
|
#--| User Config |-------------------------------
|
|
|
|
# Defined in order treating each hexagram as a 6 bit value.
|
|
HEXAGRAMS = (
|
|
"EARTH", "RETURN", "THE ARMY", "PREVAILING", "MODESTY", " CRYING\nPHEASANT",
|
|
"ASCENDANCE", "PEACE", "WEARINESS", "THUNDER", "LETTING\n LOOSE",
|
|
"MARRYING\n MAIDEN", " SMALL\nEXCESS", "ABUNDANCE", "STEADFASTNESS",
|
|
" GREAT\nINJURY", "SUPPORT", "RETRENCHMENT", "WATER", "FRUGALITY",
|
|
"ADMONISHMENT", "FULFILLMENT", "THE WELL", "WAITING", "ILLNESS",
|
|
"THE CHASE", "TRAPPED", "LAKE", "CUTTING", "REVOLUTION", " GREAT\nEXCESS",
|
|
"STRIDE", "LOSS", "THE CHEEKS", "BLINDNESS", "DECREASE", "MOUNTAIN",
|
|
"DECORATION", "WORK", " BIG\nCATTLE", "ADVANCE", "BITING", "UNFULFILLMENT",
|
|
"ABANDONED", "TRAVELER", "FIRE", " THE\nCAULDRON", " GREAT\nHARVEST",
|
|
"VIEW", "INCREASE", "FLOWING", "SINCERITY", "PROGRESS", "FAMILY", "WIND",
|
|
" SMALL\nCATTLE", "OBSTRUCTION", "PROPRIETY", "THE COURT", "TREADING",
|
|
"LITTLE\n PIG", "GATHERING", "RENDEZVOUS", "HEAVEN",
|
|
)
|
|
|
|
# Grab the CLUE's display
|
|
display = clue.display
|
|
|
|
# Background fill
|
|
bg_bitmap = displayio.Bitmap(display.width, display.height, 1)
|
|
bg_palette = displayio.Palette(1)
|
|
bg_palette[0] = BACKGROUND_COLOR
|
|
background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette)
|
|
|
|
# Hexagram setup
|
|
sprite_sheet = displayio.Bitmap(11, 4, 2)
|
|
palette = displayio.Palette(2)
|
|
palette.make_transparent(0)
|
|
palette[0] = 0x000000
|
|
palette[1] = HEXAGRAM_COLOR
|
|
|
|
for x in range(11):
|
|
sprite_sheet[x, 0] = 1 # - - 0 YIN
|
|
sprite_sheet[x, 1] = 0
|
|
sprite_sheet[x, 2] = 1 # --- 1 YANG
|
|
sprite_sheet[x, 3] = 0
|
|
sprite_sheet[5, 0] = 0
|
|
|
|
tile_grid = displayio.TileGrid(sprite_sheet, pixel_shader=palette,
|
|
width = 1,
|
|
height = 6,
|
|
tile_width = 11,
|
|
tile_height = 2)
|
|
|
|
hexagram = displayio.Group(x=60, y=15, scale=10)
|
|
hexagram.append(tile_grid)
|
|
|
|
# Hexagram name label
|
|
# font credit: https://www.instagram.com/cove703/
|
|
font = bitmap_font.load_font("/christopher_done_24.bdf")
|
|
font.load_glyphs(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
|
|
hexname = label.Label(font, text=" "*40, color=FONT_COLOR)
|
|
# this will initially hold the "shake for reading" message
|
|
hexname.text = " SHAKE\n FOR\nREADING"
|
|
hexname.anchor_point = (0.5, 0.5)
|
|
hexname.anchored_position = (120, 120)
|
|
|
|
# Set up main display group (splash)
|
|
splash = displayio.Group()
|
|
display.root_group = splash
|
|
|
|
# Add background and text label
|
|
splash.append(background)
|
|
splash.append(hexname)
|
|
|
|
def show_hexagram(number):
|
|
for i in range(6):
|
|
tile_grid[5-i] = (number >> i) & 0x01
|
|
|
|
def show_name(number):
|
|
hexname.text = HEXAGRAMS[number]
|
|
hexname.anchored_position = (120, 180)
|
|
|
|
#===================================
|
|
# MAIN CODE
|
|
#===================================
|
|
print("shake")
|
|
# wait for shake
|
|
while not clue.shake(shake_threshold=SHAKE_THRESHOLD):
|
|
pass
|
|
|
|
# calibrate the mystic universe
|
|
x, y, z = clue.acceleration
|
|
random.seed(int(time.monotonic() + abs(x) + abs(y) + abs(z)))
|
|
|
|
# cast a reading
|
|
reading = random.randrange(64)
|
|
print("reading = ", reading, HEXAGRAMS[reading])
|
|
|
|
# play a melody
|
|
for note, duration in MELODY:
|
|
clue.play_tone(note, duration)
|
|
|
|
# prompt to show
|
|
display.auto_refresh = False
|
|
hexname.text = " GOT IT\n\nPRESS BUTTON\n TO SEE"
|
|
hexname.anchored_position = (120, 120)
|
|
display.auto_refresh = True
|
|
while not clue.button_a and not clue.button_b:
|
|
pass
|
|
|
|
# and then show it
|
|
display.auto_refresh = False
|
|
splash.append(hexagram)
|
|
show_hexagram(reading)
|
|
show_name(reading)
|
|
display.auto_refresh = True
|
|
|
|
# hold here until reset
|
|
while True:
|
|
pass
|