@ -0,0 +1,82 @@ |
||||
"""DevRant Client for TiLDA-MK4 |
||||
""" |
||||
___name___ = "DevRant" |
||||
___license___ = "MIT" |
||||
___dependencies___ = ["app", "wifi", "http", "ugfx_helper"] |
||||
___categories___ = ["Other"] |
||||
___launchable___ = True |
||||
|
||||
import ugfx, wifi, http, json, utime, ugfx_helper, dialogs, app |
||||
|
||||
char_ln = 25 |
||||
ln_pg = 19 |
||||
|
||||
def loop(): |
||||
skip = 0 |
||||
while True: |
||||
ugfx.clear(ugfx.html_color(0x544c6d)) |
||||
data= json.loads(http.get("https://devrant.com/api/devrant/rants?app=3&sort=top&range=day&limit=1&skip="+str(skip)).raise_for_status().content)["rants"][0] |
||||
|
||||
text=data["text"].split(" ") |
||||
screens = [[]] |
||||
line = "" |
||||
screen = 0 |
||||
for word in text: |
||||
if len(line+word)+1 >= char_ln: |
||||
if len(screens[screen]) >= ln_pg: |
||||
screen+=1 |
||||
screens.append([]) |
||||
screens[screen].append(line) |
||||
line=word |
||||
else: |
||||
line = line + " " + word |
||||
if len(screens[screen]) < ln_pg: |
||||
screens[screen].append(line) |
||||
else: |
||||
screens.append([line]) |
||||
|
||||
|
||||
hold=True |
||||
page = 0 |
||||
while hold: |
||||
ugfx.clear(ugfx.html_color(0x544c6d)) |
||||
ugfx.area(0,0,240,35,ugfx.html_color(0x41476d)) |
||||
ugfx.text(5,5,str(data["score"])+"++ " + data["user_username"] + ":",ugfx.BLACK) |
||||
|
||||
ugfx.text(5,20,"Page: " + str(page+1) + "/" + str(len(screens)),ugfx.BLACK) |
||||
count = 0 |
||||
for line in screens[page]: |
||||
ugfx.text(5,35+count*15,line,ugfx.BLACK) |
||||
count+=1 |
||||
hold_btn = True |
||||
while hold_btn: |
||||
if tilda.Buttons.is_pressed(tilda.Buttons.BTN_Menu): |
||||
return |
||||
if tilda.Buttons.is_pressed(tilda.Buttons.BTN_A): |
||||
skip += 1 |
||||
hold_btn = False |
||||
hold = False |
||||
while tilda.Buttons.is_pressed(tilda.Buttons.BTN_A): |
||||
utime.sleep_ms(10) |
||||
if tilda.Buttons.is_pressed(tilda.Buttons.JOY_Right): |
||||
if page < len(screens)-1: |
||||
page += 1 |
||||
hold_btn = False |
||||
while tilda.Buttons.is_pressed(tilda.Buttons.JOY_Right): |
||||
utime.sleep_ms(10) |
||||
if tilda.Buttons.is_pressed(tilda.Buttons.JOY_Left): |
||||
if page > 0: |
||||
page -= 1 |
||||
hold_btn = False |
||||
while tilda.Buttons.is_pressed(tilda.Buttons.JOY_Left): |
||||
utime.sleep_ms(10) |
||||
|
||||
|
||||
ugfx_helper.init() |
||||
ugfx.clear() |
||||
ugfx.text(5,5, "DevRant for the TiLDA Mk4", ugfx.BLACK) |
||||
ugfx.text(5, 40, "Connecting To WIFI", ugfx.BLACK) |
||||
wifi.connect() |
||||
ugfx.text(5, 40, "Connecting To WIFI", ugfx.WHITE) |
||||
loop() |
||||
app.restart_to_default() |
@ -0,0 +1,208 @@ |
||||
"""Simple brainfuck (an esoteric programming language) interpreter. |
||||
|
||||
Runs very slowly... prints sierpinski triangle""" |
||||
|
||||
___name___ = "bf interpreter" |
||||
___license___ = "MIT" |
||||
___dependencies___ = ["sleep", "app"] |
||||
___categories___ = ["Other"] |
||||
|
||||
import ugfx, os, time, sleep, app |
||||
from tilda import Buttons |
||||
from time import sleep_ms |
||||
|
||||
# initialize screen |
||||
ugfx.init() |
||||
ugfx.clear() |
||||
|
||||
ugfx.set_default_font(ugfx.FONT_TITLE) |
||||
|
||||
|
||||
Prog=""" |
||||
+>-[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++[-]->>>>+>>>+>>>+>>>+>>>+> |
||||
>>+>>>+>>>+>>>++[-<+]-<<<<+<<++++[->++++++++<]<++[------>+<]>++<<+[--->++<]>++ |
||||
<<-[--->+<]>------<+[-<+]-<[>>+[->+]-<[-]<<[-]+++[>[-]++++++++++.[-]+++[>+[>>+<< |
||||
-]>>[<<++[-<+]->++[->+]->-]<<+[-<+]->-[-[-[-[-[-[-[-[->>>]>>>]>>>]>>>]>>>]>>>]>> |
||||
>]>>>]>>>>>>>>>>>>>>>>>>>>> > > > > > > > > > > > > >>>>>>>>>>[+[-<+]-<<<<<<.>>> |
||||
>>>>]>[+[-<+]-<<<< <<<.>>>>>>>>]>[+[- |
||||
<+]-<<<<<<<<.>>> tic tac toe >>>>>>]+[-<+]-<< |
||||
<<<.>>>-]<-]+++ to play: type a number (1 to 9) to +++++++.[-]<<<< |
||||
<<[<<<<<<<<<<<+ place an X at that grid location [--->++<]>+++.[ |
||||
->+++++++<]>.++ ++++.-[---->+<] |
||||
>+++.---[->+++<] [ http://mitxela.com/ ] >.+++[->++++<]>+ |
||||
.+++++.-[->+++++<] >.[--->+<]>-.+[-<+ |
||||
]-<[-]>>>>]<[<<<<<<<++++[++++>---<]>+.[++++>---<]>-.+++[->+++<]>++.+[--->+<]>+.+ |
||||
[---->+<]>+++.[--->+<]>-.[-]+[-<+]-<[-]>>>>]<[<<<<<<<<<<+[--->++<]>+++.[->++++++ |
||||
+<]>.++++++.-[---->+<]>+++.++++++[->++<]>.+[--->+<]>.++++.++++[->+++<]>.--[--->+ |
||||
<]>.[--->+<]>-.+[-<+]-<[-]>>>>]<+[-<+]-<[>>->>>>>>+[-<<<<[-]<<[-]>>>>-[>>[-]+<<+ |
||||
<[-]<[-]<[-]<[-]-[----->+<]>---<,>[-<->]<[>>+>+<<<-]>>[<<+>>-]+++++++++[->-[<<]> |
||||
]>>-]<<<<[-]>>>>[-]+<<<<<<[>>+>+<<<-]>>[<<+>>-]>>]>>-<<<[-]<<[<->-]<-[-[-[-[-[-[ |
||||
-[-[->>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>]]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
||||
>[->++[-<+]->>>>>[>>>[>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>[> |
||||
>>[>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>>[>>>[+[- |
||||
<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-] |
||||
++[->+]->]]]+[-<+]->>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+ |
||||
[-<+]->>>>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>> |
||||
>[>>>>>>>>>>>>[>>>>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>[>> |
||||
>>>>[>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]-<<<<<<<<<-[++[->+]-<<<<<<<<<<[ |
||||
-]++[->+]->>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>[+[-<+]-<<<<<<<<<<[-]+ |
||||
[->+]->]+[-<+]->>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>[+[-< |
||||
+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[ |
||||
-<+]->>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>> |
||||
>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<< |
||||
<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->] |
||||
+[-<+]-<<[-]>[-]+>>>>>>[>>>[>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>[>>[>>> |
||||
>[+[-<+]-<[-]<[-]+++[->+]->]]]>+[-<+]->>>>[>>>>[>>>[+[-<+]-<[-]<[-]++[->+]->]]]> |
||||
+[-<+]->>>>>>>>>>>>>>[>>>[>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>>>>>> |
||||
>>>[>>[>>>>[+[-<+]-<[-]<[-]++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>[>>>>[>>>[+[-<+] |
||||
-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>>[>>[+[-<+]-<[-]<[-]++ |
||||
++++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>[>>>>[+[-<+]-<[-]<[-]+++++++ |
||||
++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>[>>>>[>>>[+[-<+]-<[-]<[-]++++++++[->+] |
||||
->]]]>+[-<+]->>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]]]>+[-<+]-> |
||||
>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>[> |
||||
>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-< |
||||
[-]<[-]+++++++++[->+]->]]]>+[-<+]->>>>>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]++ |
||||
++++[->+]->]]]>+[-<+]->>>>>>>[>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]+++[->+]->]]]> |
||||
+[-<+]->>>>>>>>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+] |
||||
->>>>>>>>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>> |
||||
>>>[>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>[>>>>>>>>>>>> |
||||
[>>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>>>>[>>>>> |
||||
>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>>>[>>>>>>[>>>>>[+[-<+]-<[-]< |
||||
[-]++++++++[->+]->]]]>+[-<+]->>>>>>>>>>[>>>>>>>[>>>>>>[+[-<+]-<[-]<[-]++++[->+]- |
||||
>]]]>+[-<+]->>>>>>[>>>[>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>>[>[>>>>>[+[- |
||||
<+]-<[-]<[-]+++[->+]->]]]>+[-<+]->>>>[>>>>>[>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-< |
||||
+]->>>>>>>>>>>>>>>[>>>[>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>> |
||||
[>[>>>>>[+[-<+]-<[-]<[-]++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>[>>>>>[>>>[+[-<+]-< |
||||
[-]<[-]+++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>>>[>[+[-<+]-<[-]<[-]++++ |
||||
++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>[>>>>>[+[-<+]-<[-]<[-]++++++++ |
||||
+[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>[>>>>>[>>>[+[-<+]-<[-]<[-]++++++++[->+] |
||||
->]]]>+[-<+]->>>>>>[>>>>>>>>>[>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]]]>+[-<+]-> |
||||
>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>> |
||||
[>>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>[>>>>>>>>>[>>>>>>>[+[-<+] |
||||
-<[-]<[-]+++++++++[->+]->]]]>+[-<+]->>>>>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[- |
||||
]++++++[->+]->]]]>+[-<+]->>>>>>>[>>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]+++[->+]-> |
||||
]]]>+[-<+]->>>>>>>>>>>>[>>>>>>>>>[>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[ |
||||
-<+]->>>>>>>>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->> |
||||
>>>>>>>>[>>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>>[>>>>> |
||||
>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>>>> |
||||
>[>>>>>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>>>>[>>>>>>[>>>>[+[-<+ |
||||
]-<[-]<[-]++++++++[->+]->]]]>+[-<+]->>>>>>>>>>[>>>>>>>>[>>>>>>[+[-<+]-<[-]<[-]++ |
||||
++[->+]->]]]>+[-<+]-<[>>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++ |
||||
+++++[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]+[-<+] |
||||
->>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]+[-<+]->>>>[+[-<+]-<[-]<[-]++[->+]->]+[-< |
||||
+]->>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++++[->+]->]+[-<+]->>>>>>>>>>>> |
||||
>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]+[-<+]->>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[ |
||||
->+]->]+[-<+]->>>>>>>[+[-<+]-<[-]<[-]+++[->+]->]+[-<+]->>>>>>>>>>>>>>>>[+[-<+]-< |
||||
[-]<[-]++++++[->+]->]+[-<+]->]>>+[-<+]-<<<<[+[->+]->>>>>>>>>>>>>>>>>[+[-<+]-<[-] |
||||
<[-]++[->+]->]+[-<+]->]>>>>+[-<+]-<<[>>>+[-<+]-<[-]<[+[-<+]->++[->+]-<<-]+[-<+]- |
||||
>-[-[-[-[-[-[-[-[->>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
||||
>>>>>>>>>>>>>->>++[-<+]->]>>>>+[-<+]-<<[-]>>>+[-<+]-<<<<[-]>>>>>+[-<+]->>>>>>[>> |
||||
>[>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>[>>>[>>>[+[-<+]-<<< |
||||
<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>>>[>>>[+[-<+]-<<<<<<<<<< |
||||
<[-]++[->+]->]]]+[-<+]->>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]-> |
||||
]]]+[-<+]->>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]- |
||||
>>>>>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>[ |
||||
>>>>>>>>>>>>[>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>[> |
||||
>>>>>[>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]-<[-]]++[->+]->]+[-<+]-<+[ |
||||
-<+]-<]>>+[->+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+[-[-]<+]-<+[-[-]<+]-<+>] |
||||
""" |
||||
|
||||
|
||||
|
||||
# Hello World |
||||
#Prog="++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." |
||||
|
||||
# Sierpinski |
||||
Prog=""" |
||||
++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ |
||||
-<<<[ |
||||
->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< |
||||
]>.>+[>>]>+ |
||||
]""" |
||||
|
||||
|
||||
|
||||
|
||||
buf="" |
||||
def output(t): |
||||
global buf |
||||
buf+=t |
||||
buf=buf[-(16*80):] |
||||
ugfx.clear() |
||||
lines=buf.split("\n") |
||||
lines=lines[-16:] |
||||
for i,v in enumerate(lines): |
||||
ugfx.text(5,i*20+5, v+" ", ugfx.BLACK) |
||||
|
||||
lastpushed=0 |
||||
def pushed(n): |
||||
global Tape, TP, waiting |
||||
if (waiting): |
||||
output(n+" \n") |
||||
Tape[TP]=ord(n) |
||||
waiting=False |
||||
|
||||
|
||||
|
||||
Buttons.enable_interrupt(Buttons.BTN_1, lambda button_id:pushed("1"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_2, lambda button_id:pushed("2"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_3, lambda button_id:pushed("3"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_4, lambda button_id:pushed("4"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_5, lambda button_id:pushed("5"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_6, lambda button_id:pushed("6"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_7, lambda button_id:pushed("7"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_8, lambda button_id:pushed("8"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_9, lambda button_id:pushed("9"), on_press=True, on_release=False) |
||||
Buttons.enable_interrupt(Buttons.BTN_0, lambda button_id:pushed("0"), on_press=True, on_release=False) |
||||
|
||||
|
||||
|
||||
output("Loading...") |
||||
|
||||
|
||||
|
||||
|
||||
waiting=False |
||||
Prog+='\0' |
||||
Tape=[0]*256 |
||||
PP=-1 |
||||
TP=0 |
||||
while True: |
||||
if (waiting): |
||||
sleep_ms(200) |
||||
else: |
||||
PP=PP+1 |
||||
if (PP>=len(Prog)): |
||||
waiting=True |
||||
output("END!") |
||||
elif (Prog[PP]=="+"): |
||||
Tape[TP]=Tape[TP]+1 |
||||
elif (Prog[PP] =="-"): |
||||
Tape[TP]=Tape[TP]-1 |
||||
elif (Prog[PP] ==">"): |
||||
TP=TP+1 |
||||
elif (Prog[PP] =="<"): |
||||
TP=TP-1 |
||||
elif (Prog[PP] =="."): |
||||
output(chr(Tape[TP])) |
||||
elif (Prog[PP] ==","): |
||||
waiting=True |
||||
elif (Prog[PP] =="["): |
||||
if (Tape[TP]==0): |
||||
depth=1 |
||||
while (depth>0): |
||||
PP=PP+1 |
||||
if (Prog[PP]=="]"): |
||||
depth = depth - 1 |
||||
if (Prog[PP]=="["): |
||||
depth = depth + 1 |
||||
elif (Prog[PP] =="]"): |
||||
if (Tape[TP]!=0): |
||||
depth=1 |
||||
while (depth>0): |
||||
PP=PP-1 |
||||
if (Prog[PP]=="]"): |
||||
depth = depth + 1 |
||||
if (Prog[PP]=="["): |
||||
depth = depth - 1 |
||||
|
@ -0,0 +1,58 @@ |
||||
''' Random card generator, includes Base Set, The First Expansion, The Second Expansion, The Third Expansion, The Fourth Expansion, The Fifth Expansion, The Sixth Expansion, Green Box Expansion, 90s Nostalgia Pack, Box Expansion, Fantasy Pack, Food Pack, Science Pack and World Wide Web Pack ''' |
||||
|
||||
___name___ = "Cards Against EMF" |
||||
___license___ = ["MIT"] |
||||
___dependencies___ = ["random", "ugfx_helper", "sleep"] |
||||
___categories___ = ["Games"] |
||||
___bootstrapped___ = False # Whether or not apps get downloaded on first install. Defaults to "False", mostly likely you won't have to use this at all. |
||||
|
||||
import ugfx, json, random |
||||
|
||||
from tilda import Buttons |
||||
from app import restart_to_default |
||||
|
||||
ugfx.init() |
||||
ugfx.clear() |
||||
ugfx.text(10, 10, "CARDS AGAINST EMF", ugfx.BLACK) |
||||
ugfx.text(10, 40, "A for a question", ugfx.BLACK) |
||||
ugfx.text(10, 60, "B for an answer", ugfx.BLACK) |
||||
ugfx.text(10, 80, "MENU to exit", ugfx.BLACK) |
||||
|
||||
b=ugfx.Style() |
||||
b.set_background(ugfx.BLACK) |
||||
b.set_enabled([ugfx.WHITE, ugfx.BLACK, ugfx.BLACK, ugfx.BLACK]) # sets the style for when something is enabled |
||||
w=ugfx.Style() |
||||
w.set_background(ugfx.WHITE) |
||||
|
||||
with open("cards_against_emf/cards.json") as data: |
||||
d = json.load(data) |
||||
|
||||
def get_black(): |
||||
x = random.randint(1, 320) |
||||
ugfx.clear(ugfx.html_color(0x000000)) |
||||
text = str(d["blackCards"][x]["text"]) |
||||
ugfx.Label(0, 0, 240, 400, text, style=b) |
||||
|
||||
def get_white(): |
||||
y = random.randint(1, 1271) |
||||
ugfx.clear(ugfx.html_color(0xffffff)) |
||||
text = str(d["whiteCards"][y]) |
||||
ugfx.Label(0, 0, 240, 400, text, style=w) |
||||
|
||||
Buttons.enable_interrupt( |
||||
Buttons.BTN_A, |
||||
lambda button_id:get_black(), |
||||
on_press=True, |
||||
on_release=False) |
||||
|
||||
Buttons.enable_interrupt( |
||||
Buttons.BTN_B, |
||||
lambda button_id:get_white(), |
||||
on_press=True, |
||||
on_release=False) |
||||
|
||||
Buttons.enable_interrupt( |
||||
Buttons.BTN_Menu, |
||||
lambda button_id:restart_to_default(), |
||||
on_press=True, |
||||
on_release=False) |
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,93 @@ |
||||
"""Default homescreen |
||||
|
||||
This is the default homescreen for the Tilda Mk4. |
||||
It gets automatically installed when a badge is |
||||
newly activated or reset. |
||||
""" |
||||
|
||||
___title___ = "Homescreen (PyCon)" |
||||
___license___ = "MIT" |
||||
___categories___ = ["Homescreens"] |
||||
___dependencies___ = ["homescreen"] |
||||
___launchable___ = False |
||||
___bootstrapped___ = True |
||||
|
||||
import ugfx |
||||
from homescreen import * |
||||
import time |
||||
from tilda import Buttons |
||||
|
||||
init() |
||||
|
||||
# Padding for name |
||||
intro_height = 30 |
||||
intro_text = "Hi! I'm" |
||||
name_height = 60 |
||||
status_height = 20 |
||||
info_height = 30 |
||||
logo_path = "home_pycon/python_single.png" |
||||
logo_height = 82 |
||||
logo_width = 55 |
||||
|
||||
# Maximum length of name before downscaling |
||||
max_name = 8 |
||||
|
||||
# Background stuff |
||||
bg_color = 0xfecb2f |
||||
ugfx.clear(ugfx.html_color(bg_color)) |
||||
|
||||
# Colour stuff |
||||
style = ugfx.Style() |
||||
style.set_enabled([ugfx.BLACK, ugfx.html_color(bg_color), ugfx.html_color(bg_color), ugfx.html_color(bg_color)]) |
||||
style.set_background(ugfx.html_color(bg_color)) |
||||
ugfx.set_default_style(style) |
||||
|
||||
# Draw for people to see |
||||
ugfx.orientation(90) |
||||
|
||||
# Logo stuff |
||||
ugfx.display_image( |
||||
int((ugfx.width() - logo_width) / 2), |
||||
int((ugfx.height() - logo_height) / 2), |
||||
logo_path |
||||
) |
||||
|
||||
|
||||
|
||||
|
||||
# Draw introduction |
||||
ugfx.set_default_font(ugfx.FONT_TITLE) |
||||
ugfx.Label(0, ugfx.height() - name_height - intro_height, ugfx.width(), intro_height, intro_text, justification=ugfx.Label.CENTER) |
||||
# Process name |
||||
name_setting = name("Set your name in the settings app") |
||||
if len(name_setting) <= max_name: |
||||
ugfx.set_default_font(ugfx.FONT_NAME) |
||||
else: |
||||
ugfx.set_default_font(ugfx.FONT_MEDIUM_BOLD) |
||||
# Draw name |
||||
ugfx.Label(0, ugfx.height() - name_height, ugfx.width(), name_height, name_setting, justification=ugfx.Label.CENTER) |
||||
|
||||
|
||||
|
||||
# Draw for wearer to see |
||||
ugfx.orientation(270) |
||||
# Title |
||||
ugfx.set_default_font(ugfx.FONT_TITLE) |
||||
ugfx.Label(0, ugfx.height() - info_height * 2, ugfx.width(), info_height, "TiLDA Mk4", justification=ugfx.Label.CENTER) |
||||
# info |
||||
ugfx.Label(0, ugfx.height() - info_height, ugfx.width(), info_height, "Long Press MENU", justification=ugfx.Label.CENTER) |
||||
|
||||
ugfx.set_default_font(ugfx.FONT_SMALL) |
||||
status = ugfx.Label(0, ugfx.height() - info_height * 2 - status_height, ugfx.width(), status_height, "", justification=ugfx.Label.CENTER) |
||||
|
||||
# update loop |
||||
while True: |
||||
text = ""; |
||||
value_wifi_strength = wifi_strength() |
||||
value_battery = battery() |
||||
if value_wifi_strength: |
||||
text += "Wi-Fi: %s%%, " % int(value_wifi_strength) |
||||
if value_battery: |
||||
text += "Battery: %s%%" % int(value_battery) |
||||
status.text(text) |
||||
sleep_or_exit(0.5) |
After Width: | Height: | Size: 963 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.7 KiB |
@ -0,0 +1,80 @@ |
||||
"""Nyan cat |
||||
""" |
||||
___name___ = "Nyan" |
||||
___license___ = "MIT" |
||||
___dependencies___ = ["app", "homescreen", "ugfx_helper"] |
||||
___categories___ = ["Homescreens"] |
||||
___bootstrapped___ = False |
||||
|
||||
from app import * |
||||
import ugfx |
||||
from homescreen import * |
||||
import ugfx_helper |
||||
import machine |
||||
|
||||
from tilda import Buttons |
||||
from machine import Neopix |
||||
|
||||
ext = False |
||||
bkl = False |
||||
|
||||
intro_text = "Hi! I'm" |
||||
name_height = 70 |
||||
intro_height = 30 |
||||
max_name = 8 |
||||
|
||||
def cbButtonA(button_id): |
||||
global bkl |
||||
bkl = False |
||||
|
||||
def cbButtonB(button_id): |
||||
global ext |
||||
ext = True |
||||
|
||||
frame = 0 |
||||
|
||||
def force_backlight(): |
||||
if ugfx.backlight() == 0: |
||||
ugfx.power_mode(ugfx.POWER_ON) |
||||
ugfx.backlight(100) |
||||
|
||||
ugfx_helper.init() |
||||
ugfx.clear() |
||||
|
||||
ugfx.orientation(180) |
||||
force_backlight() |
||||
|
||||
|
||||
|
||||
#everything from here onwards is unknown |
||||
# Colour stuff |
||||
style = ugfx.Style() |
||||
style.set_enabled([ugfx.WHITE,ugfx.html_color(0x003265),ugfx.html_color(0x003265),ugfx.html_color(0x003265)]) |
||||
style.set_background(ugfx.html_color(0x003265)) |
||||
ugfx.set_default_style(style) |
||||
ugfx.orientation(90) |
||||
|
||||
# Draw for people to see |
||||
ugfx.orientation(90) |
||||
# Draw introduction |
||||
ugfx.set_default_font(ugfx.FONT_TITLE) |
||||
ugfx.Label(0, ugfx.height() - name_height - intro_height, ugfx.width(), intro_height, intro_text, justification=ugfx.Label.CENTER) |
||||
# Process name |
||||
name_setting = name("Set your name in the settings app") |
||||
if len(name_setting) <= max_name: |
||||
ugfx.set_default_font(ugfx.FONT_NAME) |
||||
else: |
||||
ugfx.set_default_font(ugfx.FONT_MEDIUM_BOLD) |
||||
# Draw name |
||||
ugfx.Label(0, ugfx.height() - name_height, ugfx.width(), name_height, name_setting, justification=ugfx.Label.CENTER) |
||||
|
||||
i = 0 |
||||
while True: |
||||
strimage = 'nyan/frame_'+str(i)+'_delay-0.07s.gif' |
||||
ugfx.display_image(0, 0, strimage) |
||||
i = i + 1 |
||||
if i > 11: |
||||
i = 0 |
||||
sleep_or_exit(0.5) |
||||
|
||||
app.restart_to_default() |
@ -0,0 +1,145 @@ |
||||
""" |
||||
Orbs Game: Set your name and see the scores |
||||
""" |
||||
___name___ = "Orbs Game" |
||||
___license___ = "MIT" |
||||
___dependencies___ = ["app", "dialogs", "sim800", "ugfx_helper"] |
||||
___categories___ = ["Games"] |
||||
___bootstrapped___ = True |
||||
|
||||
from app import * |
||||
from dialogs import * |
||||
import utime |
||||
import ugfx |
||||
import ugfx_helper |
||||
from orbs.umqtt.simple import MQTTClient |
||||
import network |
||||
from machine import mem32 |
||||
import wifi |
||||
wifi.connect() |
||||
|
||||
ugfx_helper.init() |
||||
ugfx.clear() |
||||
broker='151.216.207.139' |
||||
mqtt_username='orbs' |
||||
mqtt_password='orbs123' |
||||
scoretext="" |
||||
|
||||
MACAddress=str(mem32[0x400fef20]) + str(mem32[0x400fef24]) + str(mem32[0x400fef28]) + str(mem32[0x400fef2C]) |
||||
regOK=False |
||||
regFAILED=False |
||||
|
||||
def mqtt_connect(): |
||||
client = MQTTClient(MACAddress,broker, user=mqtt_username, password=mqtt_password) |
||||
client.set_callback(sub_cb) |
||||
connected=False |
||||
try: |
||||
client.connect() |
||||
connected=True |
||||
except Exception as err: |
||||
connected=False |
||||
if (connected): |
||||
return client |
||||
else: |
||||
return False |
||||
|
||||
def sub_cb(topic,msg): |
||||
global regOK |
||||
global regFAILED |
||||
global scoretext |
||||
try: |
||||
(t1,t2,t3,targetBadge,messageType)=topic.decode('utf-8').split('/') |
||||
strmsg=msg.decode('utf-8') |
||||
if messageType=="regok": |
||||
regOK=True |
||||
if messageType=="regerror": |
||||
regFAILED=True |
||||
if messageType=="scores": |
||||
scoretext=msg |
||||
except: |
||||
return |
||||
|
||||
|
||||
def update_token(token): |
||||
lb=open("token.txt","w") |
||||
lb.write(token) |
||||
lb.close() |
||||
|
||||
def do_gettoken(): |
||||
notice("Enter your RFID token ID digits only. Get it right!", title="Orbs Game") |
||||
token=prompt_text("Enter token:") |
||||
if len(token)==8 or len(token)==14 or len(token)==20: |
||||
return token |
||||
else: |
||||
notice("Invalid token", title="Orbs Game") |
||||
return "" |
||||
|
||||
def do_register(client): |
||||
playername=prompt_text("Enter name:") |
||||
playername=playername.replace(",",".") |
||||
regOK==False |
||||
regFAILED==False |
||||
if len(playername)>3: |
||||
client.publish("/registration/from/" + MACAddress + "/name",mytoken + "," + playername) |
||||
notice("Name request sent") |
||||
client.check_msg() |
||||
if regOK==True: |
||||
notice("Registration completed") |
||||
if regFAILED==True: |
||||
notice("Registration failed") |
||||
else: |
||||
notice("Name too short") |
||||
|
||||
def get_token(): |
||||
try: |
||||
lb=open("token.txt","r") |
||||
token=lb.readline() |
||||
lb.close() |
||||
if token=="": |
||||
token=do_gettoken() |
||||
except: |
||||
token="" |
||||
if token=="": |
||||
token=do_gettoken() |
||||
return token |
||||
|
||||
def do_showscores(client): |
||||
client.publish("/registration/from/" + MACAddress + "/score",mytoken) |
||||
notice("Requested scores") |
||||
client.check_msg() |
||||
if len(scoretext)>0: |
||||
(playername,playerscore,rank,redscore,greenscore,bluescore)=scoretext.decode('utf-8').split(',') |
||||
notice("Player: " + playername + chr(13) + "Score: " + playerscore + chr(13) + "Rank: " + rank) |
||||
notice("Red Score: " + redscore + chr(13) + "Green Score: " + greenscore + chr(13) + "Blue Score: " + bluescore) |
||||
else: |
||||
notice("Failed to get scores") |
||||
|
||||
mqttclient=mqtt_connect() |
||||
while (not mqttclient): |
||||
utime.sleep(2) |
||||
mqttclient=mqtt_connect() |
||||
mqttclient.subscribe(topic='/badge/to/' + MACAddress + '/#') |
||||
#mqttclient.subscribe(topic='/scoreboard/to/all/#') |
||||
mytoken=get_token() |
||||
if len(mytoken)==0: |
||||
notice("Token required",title="Orbs Game") |
||||
try: |
||||
mqttclient.close() |
||||
except: |
||||
restart_to_default() |
||||
restart_to_default() |
||||
update_token(mytoken) |
||||
|
||||
|
||||
menuset = [] |
||||
menuset.append({ "title" : "Register", "index" : 1 }) |
||||
menuset.append({ "title" : "Scores", "index" : 2 }) |
||||
|
||||
while True: |
||||
selection = prompt_option(menuset, text="Orbs Game", select_text="Select", none_text="Exit") |
||||
if (not selection): |
||||
restart_to_default() |
||||
elif (selection["index"]==1): |
||||
do_register(mqttclient) |
||||
elif (selection["index"]==2): |
||||
do_showscores(mqttclient) |
@ -0,0 +1,43 @@ |
||||
import utime |
||||
from . import simple |
||||
|
||||
class MQTTClient(simple.MQTTClient): |
||||
|
||||
DELAY = 2 |
||||
DEBUG = False |
||||
|
||||
def delay(self, i): |
||||
utime.sleep(self.DELAY) |
||||
|
||||
def log(self, in_reconnect, e): |
||||
if self.DEBUG: |
||||
if in_reconnect: |
||||
print("mqtt reconnect: %r" % e) |
||||
else: |
||||
print("mqtt: %r" % e) |
||||
|
||||
def reconnect(self): |
||||
i = 0 |
||||
while 1: |
||||
try: |
||||
return super().connect(False) |
||||
except OSError as e: |
||||
self.log(True, e) |
||||
i += 1 |
||||
self.delay(i) |
||||
|
||||
def publish(self, topic, msg, retain=False, qos=0): |
||||
while 1: |
||||
try: |
||||
return super().publish(topic, msg, retain, qos) |
||||
except OSError as e: |
||||
self.log(False, e) |
||||
self.reconnect() |
||||
|
||||
def wait_msg(self): |
||||
while 1: |
||||
try: |
||||
return super().wait_msg() |
||||
except OSError as e: |
||||
self.log(False, e) |
||||
self.reconnect() |
@ -0,0 +1,204 @@ |
||||
import usocket as socket |
||||
import ustruct as struct |
||||
from ubinascii import hexlify |
||||
|
||||
class MQTTException(Exception): |
||||
pass |
||||
|
||||
class MQTTClient: |
||||
|
||||
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0, |
||||
ssl=False, ssl_params={}): |
||||
if port == 0: |
||||
port = 8883 if ssl else 1883 |
||||
self.client_id = client_id |
||||
self.sock = None |
||||
self.server = server |
||||
self.port = port |
||||
self.ssl = ssl |
||||
self.ssl_params = ssl_params |
||||
self.pid = 0 |
||||
self.cb = None |
||||
self.user = user |
||||
self.pswd = password |
||||
self.keepalive = keepalive |
||||
self.lw_topic = None |
||||
self.lw_msg = None |
||||
self.lw_qos = 0 |
||||
self.lw_retain = False |
||||
|
||||
def _send_str(self, s): |
||||
self.sock.write(struct.pack("!H", len(s))) |
||||
self.sock.write(s) |
||||
|
||||
def _recv_len(self): |
||||
n = 0 |
||||
sh = 0 |
||||
while 1: |
||||
b = self.sock.read(1)[0] |
||||
n |= (b & 0x7f) << sh |
||||
if not b & 0x80: |
||||
return n |
||||
sh += 7 |
||||
|
||||
def set_callback(self, f): |
||||
self.cb = f |
||||
|
||||
def set_last_will(self, topic, msg, retain=False, qos=0): |
||||
assert 0 <= qos <= 2 |
||||
assert topic |
||||
self.lw_topic = topic |
||||
self.lw_msg = msg |
||||
self.lw_qos = qos |
||||
self.lw_retain = retain |
||||
|
||||
def connect(self, clean_session=True): |
||||
self.sock = socket.socket() |
||||
addr = socket.getaddrinfo(self.server, self.port)[0][-1] |
||||
self.sock.connect(addr) |
||||
if self.ssl: |
||||
import ussl |
||||
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) |
||||
premsg = bytearray(b"\x10\0\0\0\0\0") |
||||
msg = bytearray(b"\x04MQTT\x04\x02\0\0") |
||||
|
||||
sz = 10 + 2 + len(self.client_id) |
||||
msg[6] = clean_session << 1 |
||||
if self.user is not None: |
||||
sz += 2 + len(self.user) + 2 + len(self.pswd) |
||||
msg[6] |= 0xC0 |
||||
if self.keepalive: |
||||
assert self.keepalive < 65536 |
||||
msg[7] |= self.keepalive >> 8 |
||||
msg[8] |= self.keepalive & 0x00FF |
||||
if self.lw_topic: |
||||
sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg) |
||||
msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 |
||||
msg[6] |= self.lw_retain << 5 |
||||
|
||||
i = 1 |
||||
while sz > 0x7f: |
||||
premsg[i] = (sz & 0x7f) | 0x80 |
||||
sz >>= 7 |
||||
i += 1 |
||||
premsg[i] = sz |
||||
|
||||
self.sock.write( |