Badger2040: Bugfixes, danger LUTs, examples

pull/252/head
Phil Howard 2022-02-22 13:45:11 +00:00
rodzic 183dd5f8cb
commit 6ff5c39c1b
9 zmienionych plików z 1062 dodań i 10 usunięć

Wyświetl plik

@ -239,6 +239,62 @@ namespace pimoroni {
busy_wait();
}
void UC8151::turbo_luts() {
// 0x3c, 0x00, 0x2b, 0x2b, 0x24, 0x1a, ????
command(LUT_VCOM, {
0x00, 0x02, 0x02, 0x03, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
});
command(LUT_WW, {
0xa8, 0x02, 0x02, 0x03, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
});
command(LUT_BW, {
0xa8, 0x02, 0x02, 0x03, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
});
command(LUT_WB, {
0x54, 0x02, 0x02, 0x03, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
});
command(LUT_BB, {
0x54, 0x02, 0x02, 0x03, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
});
command(PLL, {
HZ_200
});
busy_wait();
}
void UC8151::init() {
// configure spi interface and pins
spi_init(spi, 12'000'000);
@ -285,6 +341,9 @@ namespace pimoroni {
case 2:
faster_luts();
break;
case 3:
turbo_luts();
break;
default:
break;
}
@ -326,6 +385,10 @@ namespace pimoroni {
busy_wait();
}
void UC8151::power_off() {
command(POF);
}
void UC8151::read(uint8_t reg, size_t len, uint8_t *data) {
gpio_put(CS, 0);

Wyświetl plik

@ -182,10 +182,12 @@ namespace pimoroni {
bool is_busy();
void reset();
void setup(uint8_t speed=0);
void power_off();
void default_luts();
void fast_luts();
void faster_luts();
void turbo_luts();
void read(uint8_t reg, size_t len, uint8_t *data);
void command(uint8_t reg, size_t len, const uint8_t *data);

Wyświetl plik

@ -174,6 +174,10 @@ namespace pimoroni {
return uc8151.is_busy();
}
void Badger2040::power_off() {
uc8151.power_off();
}
void Badger2040::update_speed(uint8_t speed) {
uc8151.update_speed(speed);
}

Wyświetl plik

@ -33,6 +33,7 @@ namespace pimoroni {
void halt();
void sleep();
bool is_busy();
void power_off();
// state
void led(uint8_t brightness);

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -0,0 +1,22 @@
import time
import badger2040
from machine import RTC
rtc = RTC()
screen = badger2040.Badger2040()
screen.update_speed(badger2040.UPDATE_TURBO)
while True:
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
hms = "{:02} {:02} {:02}".format(hour, minute, second)
ymd = "{:04}/{:02}/{:02}".format(year, month, day)
screen.pen(15)
screen.clear()
screen.pen(1)
screen.thickness(5)
screen.text(hms, 0, 0, 2.0)
screen.thickness(3)
screen.text(ymd, 0, 60, 1.0)
time.sleep(0.5)

Wyświetl plik

@ -0,0 +1,109 @@
import gc
import sys
import time
import math
import machine
import badger2040
page = 0
examples = [
"clock.py",
"fonts.py",
"clean.py",
"interrupt.py",
"scanline.py",
"lut-test.py",
"quictest.py"
]
MAX_PAGE = math.ceil(len(examples) / 3)
button_a = machine.Pin(badger2040.BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_b = machine.Pin(badger2040.BUTTON_B, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_c = machine.Pin(badger2040.BUTTON_C, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_up = machine.Pin(badger2040.BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_down = machine.Pin(badger2040.BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN)
# Early exit if a button is pressed
if button_a.value():
sys.exit(0)
screen = badger2040.Badger2040()
screen.update_speed(1)
def render():
screen.pen(15)
screen.clear()
screen.pen(0)
screen.thickness(2)
max_icons = min(3, len(examples[(page * 3):]))
for i in range(max_icons):
x = (14 + 80) * i + 14
label = examples[i + (page * 3)].replace(".py", "")
screen.rectangle(x, 24, 80, 80)
screen.text(label, x, 24 + 80 + 10, 0.5)
for i in range(MAX_PAGE):
x = 286
y = int((128 / 2) - (MAX_PAGE * 10 / 2) + (i * 10))
screen.pen(0)
screen.rectangle(x, y, 8, 8)
if page != i:
screen.pen(15)
screen.rectangle(x + 1, y + 1, 6, 6)
screen.update()
def launch(file):
for k in locals().keys():
if k not in ("gc", "file"):
del locals()[k]
gc.collect()
__import__(file)
def get_example(index):
try:
return examples[(page * 3) + index]
except IndexError:
return None
def button(pin):
global page
if pin == button_a:
example = get_example(0)
if example: launch(example)
if pin == button_b:
example = get_example(1)
if example: launch(example)
if pin == button_c:
example = get_example(2)
if example: launch(example)
if pin == button_up:
if page > 0:
page -= 1
render()
if pin == button_down:
if page < MAX_PAGE - 1:
page += 1
render()
button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_b.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_c.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_up.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
button_down.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
render()
while True:
time.sleep(1.0)

Wyświetl plik

@ -45,7 +45,7 @@ STATIC const mp_rom_map_elem_t Badger2040_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&Badger2040_line_obj) },
{ MP_ROM_QSTR(MP_QSTR_rectangle), MP_ROM_PTR(&Badger2040_rectangle_obj) },
{ MP_ROM_QSTR(MP_QSTR_glyph), MP_ROM_PTR(&Badger2040_glyph_obj) },
//{ MP_ROM_QSTR(MP_QSTR_glyph), MP_ROM_PTR(&Badger2040_glyph_obj) },
{ MP_ROM_QSTR(MP_QSTR_text), MP_ROM_PTR(&Badger2040_text_obj) },
{ MP_ROM_QSTR(MP_QSTR_command), MP_ROM_PTR(&Badger2040_command_obj) },
@ -71,6 +71,7 @@ STATIC const mp_map_elem_t badger2040_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_UPDATE_NORMAL), MP_ROM_INT(0) },
{ MP_ROM_QSTR(MP_QSTR_UPDATE_FAST), MP_ROM_INT(1) },
{ MP_ROM_QSTR(MP_QSTR_UPDATE_TURBO), MP_ROM_INT(2) },
{ MP_ROM_QSTR(MP_QSTR_UPDATE_SUPER_EXTRA_TURBO), MP_ROM_INT(3) },
{ MP_ROM_QSTR(MP_QSTR_WIDTH), MP_ROM_INT(296) },
{ MP_ROM_QSTR(MP_QSTR_HEIGHT), MP_ROM_INT(128) },

Wyświetl plik

@ -122,6 +122,8 @@ MICROPY_EVENT_POLL_HOOK
#endif
}
self->badger2040->power_off();
return mp_const_none;
}
@ -161,6 +163,8 @@ MICROPY_EVENT_POLL_HOOK
#endif
}
self->badger2040->power_off();
return mp_const_none;
}
@ -279,14 +283,14 @@ mp_obj_t Badger2040_rectangle(size_t n_args, const mp_obj_t *pos_args, mp_map_t
// image
mp_obj_t Badger2040_glyph(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_self, ARG_char, ARG_x, ARG_y, ARG_scale };
enum { ARG_self, ARG_char, ARG_x, ARG_y, ARG_scale, ARG_rotation };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_char, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_obj_new_float(1.0f)} },
{ MP_QSTR_rotation, MP_ARG_OBJ, {.u_obj = mp_obj_new_float(0.0f)} }
{ MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_rotation, MP_ARG_OBJ, {.u_obj = mp_const_none} }
};
// Parse args.
@ -296,10 +300,17 @@ mp_obj_t Badger2040_glyph(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_
int c = args[ARG_char].u_int;
int x = args[ARG_x].u_int;
int y = args[ARG_y].u_int;
float scale = mp_obj_get_float(args[ARG_scale].u_obj);
float scale = 1.0f;
if (args[ARG_scale].u_obj != mp_const_none) {
scale = mp_obj_get_float(args[ARG_scale].u_obj);
}
float rotation = 0.0f;
if (args[ARG_rotation].u_obj != mp_const_none) {
rotation = mp_obj_get_float(args[ARG_rotation].u_obj);
}
_Badger2040_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, _Badger2040_obj_t);
self->badger2040->glyph(c, x, y, scale);
self->badger2040->glyph(c, x, y, scale, rotation);
return mp_const_none;
}
@ -311,8 +322,8 @@ mp_obj_t Badger2040_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_a
{ MP_QSTR_message, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_obj_new_float(1.0f)} },
{ MP_QSTR_rotation, MP_ARG_OBJ, {.u_obj = mp_obj_new_float(0.0f)} }
{ MP_QSTR_scale, MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_rotation, MP_ARG_OBJ, {.u_obj = mp_const_none} }
};
// Parse args.
@ -322,8 +333,14 @@ mp_obj_t Badger2040_text(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_a
std::string message = mp_obj_to_string_r(args[ARG_message].u_obj);
int x = args[ARG_x].u_int;
int y = args[ARG_y].u_int;
float scale = mp_obj_get_float(args[ARG_scale].u_obj);
float rotation = mp_obj_get_float(args[ARG_rotation].u_obj);
float scale = 1.0f;
if (args[ARG_scale].u_obj != mp_const_none) {
scale = mp_obj_get_float(args[ARG_scale].u_obj);
}
float rotation = 0.0f;
if (args[ARG_rotation].u_obj != mp_const_none) {
rotation = mp_obj_get_float(args[ARG_rotation].u_obj);
}
_Badger2040_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, _Badger2040_obj_t);
self->badger2040->text(message, x, y, scale, rotation);