def fontDemo(sec=5, rot=False): tx = "FONTS" if rot: tx = "ROTATED " + tx header(tx, True) tx = "ESP32-MicrpPython" n = time.time() + sec while time.time() < n: frot = 0 if rot: frot = math.floor(machine.random(359) / 5) * 5 for font in fontnames: if (not rot) or (font != lcd.FONT_7seg): x = machine.random(maxx - 8) if font != lcd.FONT_7seg: lcd.font(font, rotate=frot) _, fsz = lcd.fontSize() y = machine.random(miny, maxy - fsz) lcd.text(x, y, tx, machine.random(0xFFFFFF)) else: l = machine.random(6, 12) w = machine.random(1, l // 3) lcd.font(font, rotate=frot, dist=l, width=w) _, fsz = lcd.fontSize() y = machine.random(miny, maxy - fsz) lcd.text(x, y, "-12.45/", machine.random(0xFFFFFF)) if buttonA.wasPressed(): break lcd.resetwin()
def mapView(lon=0, lat=0, zoom=0): m = MapData(lon, lat, zoom, 50) try: img = png(getMap(lon, lat, zoom, 50), callback=lcd.drawPixel).render(0, 0) del img except MemoryError: lcd.text(0, 10, 'Not enough RAM', 0) gc.collect() sm = SelectionManagerV2(1, 7, selectionRenderer) while True: drawControls() s = sm.loop() callbacks = (m.scaleUp, m.scaleDown, m.moveLeft, m.moveRight, m.moveUp, m.moveDown, mainMenu) if s != 6: callbacks[s]() del callbacks try: img = png(getMap(m.lon, m.lat, m.zoom, m.pitch), callback=lcd.drawPixel).render(0, 0) del img except MemoryError: lcd.text(0, 10, 'Not enough RAM', 0) gc.collect() else: return mainMenu
def header(tx, setclip): # adjust screen dimensions (depends on used display and orientation) global maxx, maxy, miny maxx, maxy = lcd.screensize() lcd.clear() if maxx < 240: lcd.font(lcd.FONT_Small, rotate=0) else: lcd.font(lcd.FONT_Default, rotate=0) _, miny = lcd.fontSize() miny += 5 lcd.rect(0, 0, maxx - 1, miny - 1, lcd.OLIVE, lcd.DARKGREY) lcd.text(lcd.CENTER, 2, tx, lcd.CYAN, transparent=True) if setclip: lcd.setwin(0, miny, maxx, maxy)
def get_partBtn(): load_screen() parts = api.getParts() lcd.clear() for part in parts: if part['name'] == partName: partCount = part["quantity"] message = "{}-off {}".format(part['quantity'], part['name']) lcd.text(lcd.CENTER, lcd.CENTER, message) lcd.text(lcd.CENTER, lcd.BOTTOM, "Hold to refresh")
def get_partBtn(): load_screen() id = get_id() part = api.getPart(id) part = part['data']['getPart'] lcd.clear() partCount = part['quantity'] message = "{}x {}".format(part['quantity'], part['name']) lcd.text(lcd.CENTER, lcd.CENTER, message) lcd.text(lcd.CENTER, lcd.BOTTOM, "Hold to refresh") return part['id']
def over(): Snake.timer.deinit() lcd.clear() lcd.text(lcd.CENTER, lcd.CENTER, "GAME OVER") lcd.text(lcd.CENTER, 10, "score: " + repr(len(Snake.tail))) while btnA.isPressed(): pass while True: if btnA.isPressed(): Snake.reset() Game.prepareField() return 0
def _draw_once(self): '''最初に一度だけ描画する処理''' # 枠を表示 (デバッグ用) #lcd.rect(0, 0, self.width + 1, self.height + 1, lcd.BLACK) # 温度計の液溜め部分(正式には「球部」)の円を描画 lcd.circle(self.circle_x, self.circle_y, self.circle_radius, self.color, self.color) # 目盛りの間隔 (摂氏度) tick = 10 # 目盛りとグラフの隙間のピクセル数 m = 2 # 目盛りの長さ (ピクセル) l = 8 # 目盛りと軸の数字の隙間のピクセル数 m2 = 4 # フォントの設定 lcd.font(lcd.FONT_Default, color=self.axis_color, transparent=True) # TODO: ラベルを描画 label_x = self.bar_x - m - l - m2 - lcd.textWidth(self.label) label_y = self.y lcd.text(label_x, label_y, self.label) # フォントの設定 lcd.font(lcd.FONT_Default, color=self.axis_color, transparent=True) # フォントサイズ font_width, font_height = lcd.fontSize() half_font_height = int(round(font_height / 2)) min_ylabel = int(math.ceil(self.min_value / 10)) * 10 for i in range(min_ylabel, self.max_value + 1, tick): y1 = self._calc_y(i) # 目盛り (左) lcd.line(self.bar_x - m - l, y1, self.bar_x - m, y1, self.axis_color) # 目盛り (右) lcd.line(self.bar_x + self.bar_width + m, y1, self.bar_x + self.bar_width + m + l, y1, self.axis_color) # 目盛りラベル tick_label = '{}'.format(i) lcd.print(tick_label, self.bar_x - m - l - m2 - lcd.textWidth(tick_label), y1 - half_font_height, self.axis_color)
def renderChatMsg(usr, msg): global msgQueue if len(msgQueue) > 8: msgQueue.pop(0) lcd.clear() msgQueue.append(usr + ':' + msg) if tcfg['tickers']: for i in range(len(msgQueue)): ticker.text[i] = msgQueue[i] else: lcd.clear() lcd.text(0, 2, '\n'.join(msgQueue[-4:]))
def draw(state): # draw time lcd.font(lcd.FONT_DejaVu40) m, s = divmod(state.time, 60) lcd.text(lcd.CENTER, 100, "{:02}:{:02}".format(m, s)) # draw menu lcd.font(lcd.FONT_DejaVu24) if state.state == IDLE: lcd.print("inc", 50, lcd.BOTTOM) lcd.print("dec", 140, lcd.BOTTOM) lcd.print("start", 225, lcd.BOTTOM) elif state.state == RUNNING: lcd.print(" ", 50, lcd.BOTTOM) lcd.print(" ", 140, lcd.BOTTOM) lcd.print("stop ", 227, lcd.BOTTOM)
def game_start(): lcd.font(lcd.FONT_DejaVu18) GAME_RUNNING = True HEALTH = 10 bird = [80,20,0,0,15] # y,x,vy,vx,r blns = [[80,-10,0,-1,15,lcd.BLUE],[40,-10,0.2,-0.5,10,lcd.GREEN]] # y,x,vy,vx,r,color GRAV = -1 lastbtn = False while GAME_RUNNING: if HEALTH < 1: break if buttonA.isPressed() and not lastbtn: bird[2] += 15 lastbtn = buttonA.isPressed() bird[2] += GRAV bird[2] *= 0.9 bird[0] += bird[2] bird[0] = min(max(bird[4], bird[0]), 160-bird[4]) lcd.clear() lcd.fillCircle(int(bird[0]), bird[1], bird[4], lcd.RED) lcd.fillCircle(int(bird[0])+6, bird[1]+2, 3, lcd.WHITE) lcd.fillCircle(int(bird[0])+6, bird[1]+10, 3, lcd.WHITE) lcd.fillCircle(int(bird[0])+6, bird[1]+2, 1, lcd.BLACK) lcd.fillCircle(int(bird[0])+6, bird[1]+10, 1, lcd.BLACK) lcd.fillTriangle(int(bird[0])-5, bird[1]+13, int(bird[0])-10, bird[1]+3, int(bird[0]), bird[1]+3, lcd.YELLOW) for b in blns: if b[1] < -b[4]: b[1] = 80+b[4] b[0] = randint(20,140) b[2] = (randint(0,10)-5)/5.0 b[3] = -randint(5,10)/5.0 b[4] = randint(5,15) b[5] = getrandbits(24) b[0] += b[2] b[1] += b[3] if((b[0]-bird[0])**2 + (b[1]-bird[1])**2 < (bird[4]+b[4])**2): HEALTH -= 1 b[1] = -100 tone([(440, 100)]) lcd.line(int(b[0]),int(b[1]),int(b[0])-(4*b[4]),int(b[1]),lcd.WHITE) lcd.fillCircle(int(b[0]),int(b[1]),b[4],b[5]) lcd.print(str(HEALTH)+" <3",140,0,lcd.WHITE,rotate=90) sleep_ms(30) lcd.setTextColor(lcd.WHITE) lcd.text(40,0,"GAME") lcd.text(20,0,"OVER") sleep_ms(700) tone(TONE_DENY) reset()
def mainMenu(): def worldMap(): return mapView def leave(): import sys sys.exit() lcd.clear(0x2b4860) lcd.fillRect(0, 0, 80, 12, 0xc6585a) lcd.font(lcd.FONT_Arial12) lcd.text(lcd.CENTER, 0, 'MAPS', 0xFFFFFF) lcd.font(lcd.FONT_Small) callbacks = (worldMap, search, findMe) s = SelectionManagerV2(0, 4, selectionRenderer).loop() return callbacks[s]
def render(self): if self.active: self.obs.render() else: lcd.setColor(0xffffff) lcd.text(20, 40, "Press") lcd.text(31, 55, "M5") lcd.text(22, 70, "Start") lcd.text(20, 85, "Game")
def search(): from accelKeyboard import Keyboard from geolocate import findPlace inputText = Keyboard().loop() coords = findPlace(inputText) del Keyboard del inputText del findPlace if coords: gc.collect() return mapView(coords[0], coords[1], 14 if coords[2] != 'city' else 8) else: lcd.clear() lcd.text(0, 20, 'Place not Found') lcd.text(lcd.CENTER, 100, 'ok') while not btnA.isPressed() or btnB.isPressed(): while btnA.isPressed() or btnB.isPressed(): pass return search
def trippleText(x, y, txt, clr): if tcfg['textBG'] is not False: lcd.textClear(x, y, txt, int(tcfg['textBG'])) else: lcd.text(x, y + 1, txt, 0) lcd.text(x, y - 1, txt, 0) lcd.text(x, y, txt, clr)
def gamesMenu(itemOffset=0): ofy = 0 data = twitchAPI('games/top', {'limit': 3, 'offset': itemOffset}) games = [] lcd.clear() lcd.drawLine(0, 0, 80, 0, 0x6441a5) for item in data['top']: lcd.fillRect(0, ofy, 80, 45, 0x333333) lcd.text(lcd.CENTER, ofy + 16, 'LOADING') loadAndDrawOnePreview( item['game']['box']['template'].replace('{width}', '80').replace( '{height}', '45'), 0, 1 + ofy) trippleText(2, ofy + 2, item['game']['name'], 0xffffff) games.append(item['game']['name']) trippleText(lcd.RIGHT, ofy + 32, str(item['viewers']), 0xFF0000) ofy += 46 lcd.text(4, 144, 'more', 0xFFFFFF) lcd.text(44, 144, 'back', 0xFFFFFF) def gameCallback(sel): global gameFilter if sel < 3: if sel >= len(games): return mainMenu gameFilter = games[sel].replace(' ', '+') return [(streamsMenu, streamsMenu, streamsMenu, gamesMenu, mainMenu)[sel], (itemOffset + sel if sel == 3 else 0)] return SelectionManager(3, offsetY=1, boxH=46, callback=gameCallback, menu=2).loop()
def streamsMenu(streamOffset=0): ofy = 0 data = twitchAPI('streams', { 'limit': 3, 'offset': streamOffset, 'game': gameFilter }) channels = [] lcd.clear() lcd.drawLine(0, 0, 80, 0, 0x6441a5) for item in data['streams']: lcd.fillRect(0, ofy, 80, 45, 0x333333) lcd.text(lcd.CENTER, ofy + 16, 'LOADING') loadAndDrawOnePreview(item['preview']['small'], 0, 1 + ofy) trippleText(2, ofy + 2, item['channel']['name'], 0xffffff) channels.append(item['channel']['name']) trippleText(lcd.RIGHT, ofy + 32, str(item['viewers']), 0xFF0000) ofy += 46 del data lcd.text(4, 144, 'more', 0xFFFFFF) lcd.text(44, 144, 'back', 0xFFFFFF) def sc(n=0): return selectChannel(channels[n]) def channelCallback(sel): return [(sc, sc, sc, streamsMenu, mainMenu)[sel], (streamOffset + sel if sel == 3 else sel)] return SelectionManager(3, offsetY=1, boxH=46, callback=channelCallback, menu=2).loop()
def resdisplay(apresults, n, time): lcd.rect(0, 0, 320, 24, lcd.BLUE, lcd.BLUE) lcd.font(lcd.FONT_Ubuntu, transparent=True) lcd.text(0, 2, 'N_AP:%d N_SCAN:%d TIME:%d' % (len(apresults), n, time), lcd.WHITE) lcd.rect(0, 24, 320, 186, lcd.BLACK, lcd.BLACK) lcd.setCursor(0, 24) lcd.font(lcd.FONT_DefaultSmall) if len(apresults) < 15: i = 0 for apresult in apresults: resstr = '%02d, ch: %02d, rs: %d, %s\n' % ( i + 1, apresult[2], apresult[3], apresult[0].decode()) lcd.print(resstr, color=lcd.WHITE) i = i + 1 else: for i in range(0, 15): apresult = apresults[i] resstr = '%02d, ch: %02d, rs: %d, %s\n' % ( i + 1, apresult[2], apresult[3], apresult[0].decode()) lcd.print(resstr, color=lcd.WHITE)
def mainMenu(idk=0): global gameFilter gameFilter = '' lcd.font(lcd.FONT_Small) lcd.clear() drawHeader() lcd.text(lcd.CENTER, 20, 'Streams') lcd.text(lcd.CENTER, 40, 'Games') lcd.text(lcd.CENTER, 60, 'Users') lcd.text(lcd.CENTER, 80, 'Exit') def mainCallback(sel): return (streamsMenu, gamesMenu, searchMenu, leave)[sel] return SelectionManager(4, offsetY=18, callback=mainCallback).loop()
def selectChannel(name): global ticker import uwebsockets.client as uwc lcd.clear() lcd.text(lcd.CENTER, 40, 'joining') lcd.text(lcd.CENTER, 60, 'chat') lcd.font(lcd.FONT_UNICODE) if tcfg['tickers']: ticker = Ticker([''] * 9, 0xffffff, rotation=0, sliding=False, speed=16, delay=10, x=2, multiline=True) exitChat = False with uwc.connect('wss://irc-ws.chat.twitch.tv') as ws: ws.send('NICK justinfan123') #ws.send('CAP REQ :twitch.tv/tags') ws.send('JOIN #' + name) msg = ws.recv() i = 0 while msg.find('/NAMES') == -1: msg = ws.recv() msg = ws.recv() while not exitChat: if msg != '': #gc.collect() parseChatMsg(msg) msg = ws.recv() while btnB.isPressed(): exitChat = True if tcfg['tickers']: ticker.stop() del ticker return mainMenu
def dispFont(sec=5): header("DISPLAY FONTS", False) if maxx < 240: tx = "MicroPython" else: tx = "Hi from MicroPython" starty = miny + 4 n = time.time() + sec while time.time() < n: y = starty x = 0 i = 0 while y < maxy: if i == 0: x = 0 elif i == 1: x = lcd.CENTER elif i == 2: x = lcd.RIGHT i = i + 1 if i > 2: i = 0 for font in fontnames: if font == lcd.FONT_7seg: lcd.font(font) lcd.text(x, y, "-12.45/", machine.random(0xFFFFFF)) else: lcd.font(font) lcd.text(x, y, tx, machine.random(0xFFFFFF)) _, fsz = lcd.fontSize() y = y + 2 + fsz if y > (maxy - fsz): y = maxy if buttonA.wasPressed(): break
def drawNaviButton(self, strA='UP', strB='DOWN', strC='SELECT'): lcd.rect(0, self.H - self.h_bottom, self.W, self.h_bottom, lcd.DARKGREY, lcd.DARKGREY) lcd.line(int(self.W / 3), self.H - self.h_bottom, int(self.W / 3), self.H, lcd.WHITE) lcd.line(int(2 * self.W / 3), self.H - self.h_bottom, int(2 * self.W / 3), self.H, lcd.WHITE) lcd.text(40, 215, strA, lcd.WHITE) lcd.text(135, 215, strB, lcd.WHITE) lcd.text(240, 215, strC, lcd.WHITE)
def drawBusData(): if not info: return lcd.clear(0xffffff) offsetY = 2 offsetX = 35 info['data']['transports'].sort(reverse=order, key= \ lambda x: int(getBusTimeData(x['times'][0])['value']) if len(x['times']) > 0 else float('inf')) for i, t in enumerate(info['data']['transports']): lcd.fillRoundRect(2, offsetY, 30, 12, 2, getVehicleColor(t['type'])) lcd.text(6 + xCenter[len(t['name'])], offsetY, t['name'], 0xffffff) if len(t['times']) > 0: if mode == 0: target = getBusTimeData(t['times'][0]) lcd.text(38, offsetY, target['text'], 0) else: currentTime = info['data']['currentTime'] // 1000 + info[ 'data']['tzOffset'] for k, v in enumerate(t['times']): target = getBusTimeData(v) arrivalTime = int(target['value']) + int( target['tzOffset']) waitTime = str( getMinuteWaitTime(currentTime, arrivalTime)) lcd.fillRoundRect(1 + offsetX, offsetY, 20, 12, 2, getWaitTimeColor(int(waitTime))) if len(waitTime) > 2: waitTime = str(int(waitTime) // 60 + 1) + 'H' lcd.text(offsetX + xCenter[len(waitTime)], offsetY, waitTime, 0xffffff) offsetX += 22 if k == 1: break offsetX = 35 offsetY += 13 if i == 10: break displayTime()
def drawNaviButton(self, strA='START', strB='STOP', strC='EXIT'): lcd.text(40, 215, strA, lcd.WHITE) lcd.text(135, 215, strB, lcd.WHITE) lcd.text(240, 215, strC, lcd.WHITE)
def drawControls(): lcd.fillRect(0, 148, 80, 11, 0x2b4860) pos = array('b', (4, 14, 24, 34, 44, 48, 54, 58, 66, 68, 70)) txt = '+-<>/\\\\/...' for i, char in enumerate(txt): lcd.text(pos[i], 148, char, 0xffffff)
from network import STA_IF, AP_IF, WLAN from auth import connectWifi from m5stack import lcd lcd.hsb2rgb(0.5, 0.5, 0.5) sys.path[1] = '/flash/lib' wlan = WLAN(STA_IF) ap = WLAN(AP_IF) wlan.active(True) ap.active(True) cred = connectWifi() wlan.connect(cred[0], cred[1]) lcd.text(lcd.CENTER, lcd.LASTY, "Connecting to {}".format(cred[0])) elli = "" tmo = 0 tm = 0 while not wlan.isconnected(): if tmo == 300: lcd.clear() tm += 1 elli += "." tmo = 0 if tm == 4: tm = 0 elli = "" lcd.text(lcd.CENTER, lcd.CENTER, elli)
def create_dead_ui(self): lcd.setColor(0xff0000) lcd.text(19, 30, "Dead!")
def create_init_ui(self): lcd.drawLine(0, 140, 80, 140) lcd.text(0, 6, "Dino Run")
def mainMenuText(): lcd.text(lcd.CENTER, 22, 'World Map') lcd.text(lcd.CENTER, 34, 'Search') lcd.text(lcd.CENTER, 46, 'Find me') lcd.text(lcd.CENTER, 58, 'Exit')
def render(self): lcd.setColor(0xffffff) lcd.text(0, 145, str(self.score)) for com in self.components: com.render()
def displayTime(): time = rtc.now() txt = '{:02d}:{:02d}:{:02d}'.format(*time[-3:]) lcd.textClear(9, 148, txt, 0xFFFFFF) lcd.text(9, 148, txt, 0)