Skip to content
Snippets Groups Projects
Commit 6b2dcf8d authored by Václav Jelínek's avatar Václav Jelínek
Browse files

Move menu display functions to a separate file, include libraries after showing startup message

parent 1f3308e9
No related branches found
No related tags found
1 merge request!12Major update of menu visuals and example programs
import micropython
DISPLAY_TITLE_POS = 18
DISPLAY_PROG_POS = 42
DISPLAY_ARROW_GAP = 10
ESP_MAX_RESET_FAILED = 5
class Menu:
PROGRAM: Menu = micropython.const(0)
MOT_TEST: Menu = micropython.const(1)
SEN_TEST: Menu = micropython.const(2)
CUBE_TEST: Menu = micropython.const(3)
BT: Menu = micropython.const(4)
COUNT: Menu = micropython.const(5)
SEN_TEST_PROGRAM: Menu = micropython.const(0)
SEN_TEST_PORT: Menu = micropython.const(1)
# Fill fr
# amebuffer with battery voltage
def display_fill_battery(robot, bat_voltage):
bat_percentage = int((bat_voltage - 6.4) / (8.4 - 6.4) * 20) * 5
bat_percentage = 100 if bat_percentage > 100 else 0 if bat_percentage < 0 else bat_percentage
robot.display.line(0, 13, 128, 13, 1)
robot.display.text('{:3d}%'.format(bat_percentage), 3, 3, 1)
robot.display.centered_text('acc', 3, 1)
robot.display.text('{:.2f}V'.format(bat_voltage), 84, 3, 1)
# Fill framebuffer with programs menu
def display_fill_programs(robot, program_list, current_program):
robot.display.fill(0)
robot.display.rect(0, 0, 128, 64, 1)
robot.display.centered_text('< Programs >', DISPLAY_TITLE_POS, 1)
if len(program_list) > 0:
robot.display.centered_text(program_list[current_program][0][:-3], DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
else:
robot.display.centered_text("cube is empty", DISPLAY_PROG_POS, 1)
# Fill framebuffer with bt menu
def display_fill_bt_menu(robot, esp_default_name, esp_reset_failed_counter):
robot.display.fill(0)
robot.display.centered_text('< BT pair >', DISPLAY_TITLE_POS, 1)
if esp_reset_failed_counter > ESP_MAX_RESET_FAILED:
robot.display.centered_text('ESP', DISPLAY_PROG_POS-12, 1)
robot.display.centered_text('not responding', DISPLAY_PROG_POS-4, 1)
robot.display.centered_text('restart cube', DISPLAY_PROG_POS+4, 1)
else:
robot.display.centered_text(esp_default_name, DISPLAY_PROG_POS, 1)
# Add bt connecting window to framebuffer
def display_fill_bt_pin(robot, pin, connecting):
robot.display.rect(6,6,116,52, 1)
robot.display.rect(7,7,114,50, 1)
robot.display.fill_rect(8,8,112,48, 0)
if connecting:
robot.display.centered_text('connecting', 25, 1)
else:
robot.display.centered_text('pair with', 10, 1)
##robot.display.text('device', 10, 30, 1)
robot.display.centered_text(f'{pin:06d}', 20, 1)
robot.display.centered_text('?', 30, 1)
robot.display.text('no', 10, 44, 1)
robot.display.centered_text('ok', 44, 1)
# Fill framebuffer with motor test menu
def display_fill_mot_test(robot, current_motor_test):
robot.display.fill(0)
robot.display.centered_text('< Motor test >', DISPLAY_TITLE_POS, 1)
robot.display.centered_text('M{}'.format(current_motor_test+1), DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
# Fill framebuffer with sensor test menu
def display_fill_sen_test(robot, current_sen_test, sensor_test_menu, sensor_test_menu_stype, sensor_test_name):
robot.display.fill(0)
if sensor_test_menu == Menu.SEN_TEST_PROGRAM:
robot.display.centered_text('< Sensor test >', DISPLAY_TITLE_POS, 1)
robot.display.centered_text(sensor_test_name, DISPLAY_PROG_POS, 1)
else:
robot.display.centered_text('< Sensor port', DISPLAY_TITLE_POS, 1)
robot.display.centered_text('S{}'.format(current_sen_test+1), DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
# Fill framebuffer with cube test menu
def display_fill_cube_test(robot, current_oth_test):
robot.display.fill(0)
robot.display.centered_text('< Cube test >', DISPLAY_TITLE_POS, 1)
if current_oth_test == 0:
test_name = "Gyro Acc"
elif current_oth_test == 1:
test_name = "Utility"
elif current_oth_test == 2:
test_name = "Wifi webserver"
robot.display.centered_text(test_name, DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
def display_fill_arrows(robot):
robot.display.centered_text('^', DISPLAY_PROG_POS - DISPLAY_ARROW_GAP, 1)
robot.display.centered_text('v', DISPLAY_PROG_POS + DISPLAY_ARROW_GAP, 1)
# Show program error on display
def display_show_error(robot):
robot.display.fill(0)
robot.display.text('Program', 35, 20, 1)
robot.display.text('error!', 40, 30, 1)
robot.display.show()
def display_show_startup(robot):
robot.display.fill(0)
robot.display.text('Turning', 35, 20, 1)
robot.display.text('on', 40, 30, 1)
robot.display.show()
def display_show_program(robot):
robot.display.fill(0)
robot.display.text('Program', 35, 20, 1)
robot.display.text('running', 40, 30, 1)
robot.display.show()
\ No newline at end of file
......@@ -72,7 +72,7 @@ class Color:
WHITE: Color = const(6)
BROWN: Color = const(7)
BAT_VOLTAGE_TURNOFF = 6.5 # Volts
BAT_VOLTAGE_TURNOFF = 6.3 # Volts
BAT_MEASURE_PERIOD = const(1000) # ms
PCF_CHECK_PERIOD = const(50) # ms
......
from lib.robot import Robot
from lib.menu_display import display_show_startup
# Initialize global robot object
robot = Robot()
display_show_startup(robot)
import utime
import os
import sys
import micropython
import gc
import menu_programs
from lib.robot import Robot
from lib.robot_consts import Button, Port
import menu_programs
from lib.menu_display import *
try:
from config import esp_default_name, battery_multiplier
except:
......@@ -15,32 +22,13 @@ except:
# Allocate exception buffer for interrupt handlers
micropython.alloc_emergency_exception_buf(100)
# Initialize global robot object
robot = Robot()
def main():
class Menu:
PROGRAM: Menu = micropython.const(0)
MOT_TEST: Menu = micropython.const(1)
SEN_TEST: Menu = micropython.const(2)
CUBE_TEST: Menu = micropython.const(3)
BT: Menu = micropython.const(4)
COUNT: Menu = micropython.const(5)
SEN_TEST_PROGRAM: Menu = micropython.const(0)
SEN_TEST_PORT: Menu = micropython.const(1)
# File and directory constants for browsing user programs
FILE = 0x8000
DIRECTORY = 0x4000
FILE_SIZE_IDX = 6
MAX_ERROR_LOG_SIZE = 10000
DISPLAY_TITLE_POS = 18
DISPLAY_PROG_POS = 42
DISPLAY_ARROW_GAP = 10
ESP_MAX_RESET_FAILED = 5
menu_programs_functions = (('NXT Light', menu_programs.nxt_light_run), ('NXT Sound', menu_programs.nxt_sound_run),
('NXT Touch', menu_programs.nxt_touch_run), ('NXT Ultrasonic', menu_programs.nxt_ultra_run),
('OC Color', menu_programs.oc_color_run), ('OC AHRS', menu_programs.oc_gyro_run),
......@@ -50,108 +38,7 @@ def main():
menu_list = [0, 0, 0, 0, 0, 0]
MENU_CUBE_TESTS = 3
menu_list_size = [0, Port.M_COUNT, menu_programs_functions_size, MENU_CUBE_TESTS, 1, Port.S_COUNT]
SENSOR_TEST_MENU_PORT_IDX = 5
# Fill framebuffer with battery voltage
def display_fill_battery(robot, bat_voltage):
bat_percentage = int((bat_voltage - 6.4) / (8.4 - 6.4) * 20) * 5
bat_percentage = 100 if bat_percentage > 100 else 0 if bat_percentage < 0 else bat_percentage
robot.display.line(0, 13, 128, 13, 1)
robot.display.text('{:3d}%'.format(bat_percentage), 3, 3, 1)
robot.display.centered_text('acc', 3, 1)
robot.display.text('{:.2f}V'.format(bat_voltage), 84, 3, 1)
# Fill framebuffer with programs menu
def display_fill_programs(robot, program_list, current_program):
robot.display.fill(0)
robot.display.rect(0, 0, 128, 64, 1)
robot.display.centered_text('< Programs >', DISPLAY_TITLE_POS, 1)
if len(program_list) > 0:
robot.display.centered_text(program_list[current_program][0][:-3], DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
else:
robot.display.centered_text("cube is empty", DISPLAY_PROG_POS, 1)
# Fill framebuffer with bt menu
def display_fill_bt_menu(robot, esp_default_name, esp_reset_failed_counter):
robot.display.fill(0)
robot.display.centered_text('< BT pair >', DISPLAY_TITLE_POS, 1)
if esp_reset_failed_counter > ESP_MAX_RESET_FAILED:
robot.display.centered_text('ESP', DISPLAY_PROG_POS-12, 1)
robot.display.centered_text('not responding', DISPLAY_PROG_POS-4, 1)
robot.display.centered_text('restart cube', DISPLAY_PROG_POS+4, 1)
else:
robot.display.centered_text(esp_default_name, DISPLAY_PROG_POS, 1)
# Add bt connecting window to framebuffer
def display_fill_bt_pin(robot, pin, connecting):
robot.display.rect(6,6,116,52, 1)
robot.display.rect(7,7,114,50, 1)
robot.display.fill_rect(8,8,112,48, 0)
if connecting:
robot.display.centered_text('connecting', 25, 1)
else:
robot.display.centered_text('pair with', 10, 1)
##robot.display.text('device', 10, 30, 1)
robot.display.centered_text(f'{pin:06d}', 20, 1)
robot.display.centered_text('?', 30, 1)
robot.display.text('no', 10, 44, 1)
robot.display.centered_text('ok', 44, 1)
# Fill framebuffer with motor test menu
def display_fill_mot_test(robot, current_motor_test):
robot.display.fill(0)
robot.display.centered_text('< Motor test >', DISPLAY_TITLE_POS, 1)
robot.display.centered_text('M{}'.format(current_motor_test+1), DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
# Fill framebuffer with sensor test menu
def display_fill_sen_test(robot, current_sen_test, sensor_test_menu, sensor_test_menu_stype):
robot.display.fill(0)
if sensor_test_menu == Menu.SEN_TEST_PROGRAM:
robot.display.centered_text('< Sensor test >', DISPLAY_TITLE_POS, 1)
robot.display.centered_text(menu_programs_functions[sensor_test_menu_stype][0], DISPLAY_PROG_POS, 1)
else:
robot.display.centered_text('< Sensor port', DISPLAY_TITLE_POS, 1)
robot.display.centered_text('S{}'.format(current_sen_test+1), DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
# Fill framebuffer with cube test menu
def display_fill_cube_test(robot, current_oth_test):
robot.display.fill(0)
robot.display.centered_text('< Cube test >', DISPLAY_TITLE_POS, 1)
if current_oth_test == 0:
test_name = "Gyro Acc"
elif current_oth_test == 1:
test_name = "Utility"
elif current_oth_test == 2:
test_name = "Wifi webserver"
robot.display.centered_text(test_name, DISPLAY_PROG_POS, 1)
display_fill_arrows(robot)
def display_fill_arrows(robot):
robot.display.centered_text('^', DISPLAY_PROG_POS - DISPLAY_ARROW_GAP, 1)
robot.display.centered_text('v', DISPLAY_PROG_POS + DISPLAY_ARROW_GAP, 1)
# Show program error on display
def display_show_error(robot):
robot.display.fill(0)
robot.display.text('Program', 35, 20, 1)
robot.display.text('error!', 40, 30, 1)
robot.display.show()
def display_show_startup(robot):
robot.display.fill(0)
robot.display.text('Turning', 35, 20, 1)
robot.display.text('on', 40, 30, 1)
robot.display.show()
def display_show_program(robot):
robot.display.fill(0)
robot.display.text('Program', 35, 20, 1)
robot.display.text('running', 40, 30, 1)
robot.display.show()
SENSOR_TEST_MENU_PORT_IDX = 5
def log_error(e):
# Write error to error log file
......@@ -363,7 +250,9 @@ def main():
elif current_menu == Menu.SEN_TEST:
sensor_test_menu_stype = menu_list[current_menu]
display_fill_sen_test(robot, sensor_test_menu_port, sensor_test_menu, sensor_test_menu_stype)
display_fill_sen_test(robot, sensor_test_menu_port, sensor_test_menu,
sensor_test_menu_stype,
menu_programs_functions[sensor_test_menu_stype][0])
if ok_pressed:
if sensor_test_menu == Menu.SEN_TEST_PROGRAM:
if sensor_test_menu_stype == MENU_PROGRAM_NXT_UTZ_IDX:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment