78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
|
#!/opt/bin/lv_micropython -i
|
||
|
import utime as time
|
||
|
import lvgl as lv
|
||
|
import display_driver
|
||
|
|
||
|
def draw_event_cb(e):
|
||
|
dsc = e.get_draw_part_dsc()
|
||
|
if dsc.part == lv.PART.ITEMS:
|
||
|
obj = e.get_target()
|
||
|
ser = obj.get_series_next(None)
|
||
|
cnt = obj.get_point_count()
|
||
|
# print("cnt: ",cnt)
|
||
|
# Make older value more transparent
|
||
|
dsc.rect_dsc.bg_opa = (lv.OPA.COVER * dsc.id) // (cnt - 1)
|
||
|
|
||
|
# Make smaller values blue, higher values red
|
||
|
# x_array = chart.get_x_array(ser)
|
||
|
# y_array = chart.get_y_array(ser)
|
||
|
# dsc->id is the tells drawing order, but we need the ID of the point being drawn.
|
||
|
start_point = chart.get_x_start_point(ser)
|
||
|
# print("start point: ",start_point)
|
||
|
p_act = (start_point + dsc.id) % cnt # Consider start point to get the index of the array
|
||
|
# print("p_act", p_act)
|
||
|
x_opa = (x_array[p_act] * lv.OPA._50) // 200
|
||
|
y_opa = (y_array[p_act] * lv.OPA._50) // 1000
|
||
|
|
||
|
dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED).color_mix(
|
||
|
lv.palette_main(lv.PALETTE.BLUE),
|
||
|
x_opa + y_opa)
|
||
|
|
||
|
def add_data(timer,chart):
|
||
|
# print("add_data")
|
||
|
x = lv.rand(0,200)
|
||
|
y = lv.rand(0,1000)
|
||
|
chart.set_next_value2(ser, x, y)
|
||
|
# chart.set_next_value2(chart.gx, y)
|
||
|
x_array.pop(0)
|
||
|
x_array.append(x)
|
||
|
y_array.pop(0)
|
||
|
y_array.append(y)
|
||
|
|
||
|
#
|
||
|
# A scatter chart
|
||
|
#
|
||
|
|
||
|
chart = lv.chart(lv.scr_act())
|
||
|
chart.set_size(200, 150)
|
||
|
chart.align(lv.ALIGN.CENTER, 0, 0)
|
||
|
chart.add_event_cb(draw_event_cb, lv.EVENT.DRAW_PART_BEGIN, None)
|
||
|
chart.set_style_line_width(0, lv.PART.ITEMS) # Remove the lines
|
||
|
|
||
|
chart.set_type(lv.chart.TYPE.SCATTER)
|
||
|
|
||
|
chart.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 5, 5, 5, 1, True, 30)
|
||
|
chart.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 10, 5, 6, 5, True, 50)
|
||
|
|
||
|
chart.set_range(lv.chart.AXIS.PRIMARY_X, 0, 200)
|
||
|
chart.set_range(lv.chart.AXIS.PRIMARY_Y, 0, 1000)
|
||
|
|
||
|
chart.set_point_count(50)
|
||
|
|
||
|
ser = chart.add_series(lv.palette_main(lv.PALETTE.RED), lv.chart.AXIS.PRIMARY_Y)
|
||
|
|
||
|
x_array = []
|
||
|
y_array = []
|
||
|
for i in range(50):
|
||
|
x_array.append(lv.rand(0, 200))
|
||
|
y_array.append(lv.rand(0, 1000))
|
||
|
|
||
|
ser.x_points = x_array
|
||
|
ser.y_points = y_array
|
||
|
|
||
|
# Create an `lv_timer` to update the chart.
|
||
|
|
||
|
timer = lv.timer_create_basic()
|
||
|
timer.set_period(100)
|
||
|
timer.set_cb(lambda src: add_data(timer,chart))
|