Skip to content

Commit b1ac4c5

Browse files
committed
Initial AMS Demo Code
1 parent ec0ab99 commit b1ac4c5

File tree

4 files changed

+62938
-0
lines changed

4 files changed

+62938
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
"""
2+
This example solicits that apple devices that provide notifications connect to it, initiates
3+
pairing, prints existing notifications and then prints any new ones as they arrive.
4+
"""
5+
6+
import time
7+
import displayio
8+
import terminalio
9+
from adafruit_gizmo import tft_gizmo
10+
from adafruit_display_text.label import Label
11+
from adafruit_display_shapes.rect import Rect
12+
from adafruit_bitmap_font import bitmap_font
13+
import adafruit_ble
14+
from adafruit_ble.advertising.standard import SolicitServicesAdvertisement
15+
from adafruit_ble_apple_media import AppleMediaService
16+
from adafruit_circuitplayground import cp
17+
18+
BACKGROUND_COLOR = 0x444444 # Gray
19+
TEXT_COLOR = 0xFF0000 # Red
20+
BORDER_COLOR = 0xAAAAAA # Light Gray
21+
STATUS_COLOR = BORDER_COLOR
22+
23+
# PyLint can't find BLERadio for some reason so special case it here.
24+
radio = adafruit_ble.BLERadio() # pylint: disable=no-member
25+
a = SolicitServicesAdvertisement()
26+
a.solicited_services.append(AppleMediaService)
27+
radio.start_advertising(a)
28+
29+
def wrap_in_tilegrid(open_file):
30+
odb = displayio.OnDiskBitmap(open_file)
31+
return displayio.TileGrid(odb, pixel_shader=displayio.ColorConverter())
32+
33+
def make_background(width, height, color):
34+
color_bitmap = displayio.Bitmap(width, height, 1)
35+
color_palette = displayio.Palette(1)
36+
color_palette[0] = color
37+
38+
return displayio.TileGrid(color_bitmap,
39+
pixel_shader=color_palette,
40+
x=0, y=0)
41+
42+
def load_font(fontname, text):
43+
font = bitmap_font.load_font(fontname)
44+
font.load_glyphs(text.encode('utf-8'))
45+
return font
46+
47+
def make_label(text, x, y, color, font=terminalio.FONT):
48+
if isinstance(font, str):
49+
font = load_font(font, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,?")
50+
text_area = Label(font, text=text, color=color, max_glyphs=30)
51+
text_area.x = x
52+
text_area.y = y
53+
return text_area
54+
55+
display = tft_gizmo.TFT_Gizmo()
56+
group = displayio.Group(max_size=20)
57+
display.show(group)
58+
59+
while True:
60+
if not radio.connected:
61+
group.append(wrap_in_tilegrid(open("/graphic_tfts_ams_connect.bmp", "rb")))
62+
63+
while not radio.connected:
64+
pass
65+
66+
group.pop()
67+
print("connected")
68+
69+
known_notifications = set()
70+
71+
# Draw the text fields
72+
print("Loading Font Glyphs...")
73+
title_label = make_label("None", 20, 20, TEXT_COLOR, font="/fonts/Arial-Bold-18.bdf")
74+
artist_label = make_label("None", 20, 50, TEXT_COLOR, font="/fonts/Arial-16.bdf")
75+
album_label = make_label("None", 20, 180, TEXT_COLOR, font="/fonts/Arial-16.bdf")
76+
status_label = make_label("None", 80, 220, STATUS_COLOR, font="/fonts/Arial-16.bdf")
77+
group.append(make_background(240, 240, BACKGROUND_COLOR))
78+
border = Rect(10, 8, 200, 190, outline=BORDER_COLOR, stroke=1)
79+
group.append(title_label)
80+
group.append(artist_label)
81+
group.append(album_label)
82+
group.append(status_label)
83+
group.append(border)
84+
85+
while radio.connected:
86+
try:
87+
for connection in radio.connections:
88+
if not connection.paired:
89+
connection.pair()
90+
print("paired")
91+
92+
ams = connection[AppleMediaService]
93+
title_label.text = "{}".format(ams.title)
94+
album_label.text = "{}".format(ams.album)
95+
artist_label.text = "{}".format(ams.artist)
96+
if ams.playing:
97+
status_label.text = "Playing on {}".format(ams.player_name)
98+
elif ams.paused:
99+
status_label.text = "Paused on {}".format(ams.player_name)
100+
if cp.button_a:
101+
ams.toggle_play_pause()
102+
time.sleep(0.1)
103+
104+
if cp.button_b:
105+
if cp.switch:
106+
ams.previous_track()
107+
else:
108+
ams.next_track()
109+
time.sleep(0.1)
110+
except RuntimeError:
111+
# Skip Bad Packets, unknown commands, etc.
112+
pass
113+
114+
print("disconnected")
115+
# Remove all layers
116+
while group.__len__():
117+
group.pop()

0 commit comments

Comments
 (0)