summaryrefslogtreecommitdiffstatshomepage
path: root/drivers/display/lcd160cr_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/display/lcd160cr_test.py')
-rw-r--r--drivers/display/lcd160cr_test.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/drivers/display/lcd160cr_test.py b/drivers/display/lcd160cr_test.py
new file mode 100644
index 0000000000..5571a4c3aa
--- /dev/null
+++ b/drivers/display/lcd160cr_test.py
@@ -0,0 +1,161 @@
+# Driver test for official MicroPython LCD160CR display
+# MIT license; Copyright (c) 2017 Damien P. George
+
+import time, math, framebuf, lcd160cr
+
+def get_lcd(lcd):
+ if type(lcd) is str:
+ lcd = lcd160cr.LCD160CR(lcd)
+ return lcd
+
+def show_adc(lcd, adc):
+ data = [adc.read_core_temp(), adc.read_core_vbat(), 3.3]
+ try:
+ data[2] = adc.read_vref()
+ except:
+ pass
+ for i in range(3):
+ lcd.set_text_color((825, 1625, 1600)[i], 0)
+ lcd.set_font(2)
+ lcd.set_pos(0, 100 + i * 16)
+ lcd.write('%4s: ' % ('TEMP', 'VBAT', 'VREF')[i])
+ if i > 0:
+ s = '%6.3fV' % data[i]
+ else:
+ s = '%5.1f°C' % data[i]
+ lcd.set_font(1, bold=0, scale=1)
+ lcd.write(s)
+
+def test_features(lcd):
+ # if we run on pyboard then use ADC and RTC features
+ try:
+ import pyb
+ adc = pyb.ADCAll(12, 0xf0000)
+ rtc = pyb.RTC()
+ except:
+ adc = None
+ rtc = None
+
+ # set orientation and clear screen
+ lcd = get_lcd(lcd)
+ lcd.set_orient(lcd160cr.PORTRAIT)
+ lcd.set_pen(0, 0)
+ lcd.erase()
+
+ # create M-logo
+ mlogo = framebuf.FrameBuffer(bytearray(17 * 17 * 2), 17, 17, framebuf.RGB565)
+ mlogo.fill(0)
+ mlogo.fill_rect(1, 1, 15, 15, 0xffffff)
+ mlogo.vline(4, 4, 12, 0)
+ mlogo.vline(8, 1, 12, 0)
+ mlogo.vline(12, 4, 12, 0)
+ mlogo.vline(14, 13, 2, 0)
+
+ # create inline framebuf
+ offx = 14
+ offy = 19
+ w = 100
+ h = 75
+ fbuf = framebuf.FrameBuffer(bytearray(w * h * 2), w, h, framebuf.RGB565)
+ lcd.set_spi_win(offx, offy, w, h)
+
+ # initialise loop parameters
+ tx = ty = 0
+ t0 = time.ticks_us()
+
+ for i in range(300):
+ # update position of cross-hair
+ t, tx2, ty2 = lcd.get_touch()
+ if t:
+ tx2 -= offx
+ ty2 -= offy
+ if tx2 >= 0 and ty2 >= 0 and tx2 < w and ty2 < h:
+ tx, ty = tx2, ty2
+ else:
+ tx = (tx + 1) % w
+ ty = (ty + 1) % h
+
+ # create and show the inline framebuf
+ fbuf.fill(lcd.rgb(128 + int(64 * math.cos(0.1 * i)), 128, 192))
+ fbuf.line(w // 2, h // 2,
+ w // 2 + int(40 * math.cos(0.2 * i)),
+ h // 2 + int(40 * math.sin(0.2 * i)),
+ lcd.rgb(128, 255, 64))
+ fbuf.hline(0, ty, w, lcd.rgb(64, 64, 64))
+ fbuf.vline(tx, 0, h, lcd.rgb(64, 64, 64))
+ fbuf.rect(tx - 3, ty - 3, 7, 7, lcd.rgb(64, 64, 64))
+ for phase in (-0.2, 0, 0.2):
+ x = w // 2 - 8 + int(50 * math.cos(0.05 * i + phase))
+ y = h // 2 - 8 + int(32 * math.sin(0.05 * i + phase))
+ fbuf.blit(mlogo, x, y)
+ for j in range(-3, 3):
+ fbuf.text('MicroPython',
+ 5, h // 2 + 9 * j + int(20 * math.sin(0.1 * (i + j))),
+ lcd.rgb(128 + 10 * j, 0, 128 - 10 * j))
+ lcd.show_framebuf(fbuf)
+
+ # show results from the ADC
+ if adc:
+ show_adc(lcd, adc)
+
+ # show the time
+ if rtc:
+ lcd.set_pos(2, 0)
+ lcd.set_font(1)
+ t = rtc.datetime()
+ lcd.write('%4d-%02d-%02d %2d:%02d:%02d.%01d' % (t[0], t[1], t[2], t[4], t[5], t[6], t[7] // 100000))
+
+ # compute the frame rate
+ t1 = time.ticks_us()
+ dt = time.ticks_diff(t1, t0)
+ t0 = t1
+
+ # show the frame rate
+ lcd.set_pos(2, 9)
+ lcd.write('%.2f fps' % (1000000 / dt))
+
+def test_mandel(lcd):
+ # set orientation and clear screen
+ lcd = get_lcd(lcd)
+ lcd.set_orient(lcd160cr.PORTRAIT)
+ lcd.set_pen(0, 0xffff)
+ lcd.erase()
+
+ # function to compute Mandelbrot pixels
+ def in_set(c):
+ z = 0
+ for i in range(32):
+ z = z * z + c
+ if abs(z) > 100:
+ return i
+ return 0
+
+ # cache width and height of LCD
+ w = lcd.w
+ h = lcd.h
+
+ # create the buffer for each line and set SPI parameters
+ line = bytearray(w * 2)
+ lcd.set_spi_win(0, 0, w, h)
+ spi = lcd.fast_spi()
+
+ # draw the Mandelbrot set line-by-line
+ for v in range(h):
+ for u in range(w):
+ c = in_set((v / ((h - 1) / 3.2) - 2.3) + (u / ((w - 1) / 2.4) - 1.2) * 1j)
+ if c < 16:
+ rgb = c << 12 | c << 6
+ else:
+ rgb = 0xf800 | c << 6
+ line[2 * u] = rgb
+ line[2 * u + 1] = rgb >> 8
+ spi.write(line)
+
+def test_all(lcd):
+ lcd = get_lcd(lcd)
+ test_features(lcd)
+ test_mandel(lcd)
+
+print('To run all tests: test_all(<lcd>)')
+print('Individual tests are: test_features, test_mandel')
+print('<lcd> argument should be a connection, eg "X", or an LCD160CR object')