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

Show battery percentage on menu, add battery multiplier to config

parent a72d15cb
No related branches found
No related tags found
1 merge request!12Major update of menu visuals and example programs
esp_default_name = "Open-Cube01"
\ No newline at end of file
esp_default_name = "Open-Cube01"
battery_multiplier = 1
\ No newline at end of file
......@@ -72,7 +72,7 @@ class Color:
WHITE: Color = const(6)
BROWN: Color = const(7)
BAT_VOLTAGE_TURNOFF = 6.2 # Volts
BAT_VOLTAGE_TURNOFF = 6.3 # Volts
BAT_MEASURE_PERIOD = const(1000) # ms
PCF_CHECK_PERIOD = const(50) # ms
......
esp_default_name = "Open-Cube01"
\ No newline at end of file
esp_default_name = "Open-Cube01"
battery_multiplier = 0.8
\ No newline at end of file
import utime
s = utime.ticks_ms()
import os
import sys
import micropython
import gc
print("Import time: ", utime.ticks_ms() - s)
s = utime.ticks_ms()
from lib.robot import Robot
from lib.robot_consts import Button, Port
print("Import time: ", utime.ticks_ms() - s)
s = utime.ticks_ms()
import menu_programs
print("Import time: ", utime.ticks_ms() - s)
s = utime.ticks_ms()
try:
from config import *
from config import esp_default_name, battery_multiplier
except:
from lib.default_config import *
from lib.default_config import esp_default_name, battery_multiplier
print("Import time: ", utime.ticks_ms() - s)
# Allocate exception buffer for interrupt handlers
micropython.alloc_emergency_exception_buf(100)
......@@ -40,7 +44,7 @@ def main():
FILE_SIZE_IDX = 6
MAX_ERROR_LOG_SIZE = 10000
DISPLAY_TITLE_POS = 18
DISPLAY_PROG_POS = 45
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),
......@@ -56,11 +60,18 @@ def main():
# Fill framebuffer with battery voltage
def display_fill_battery(robot, bat_voltage):
robot.display.text('{:.2f}V'.format(bat_voltage), 87, 0, 1)
bat_percentage = int((bat_voltage - 6.5) / (8.4 - 6.5) * 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)
......@@ -128,6 +139,7 @@ def main():
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)
......@@ -242,6 +254,7 @@ def main():
button_values = robot.buttons.pressed()
esp_reset_failed_counter = 0
display_show_startup(robot)
robot.battery.set_multiplier(battery_multiplier)
# Get a list of user programs
program_list = []
......
......@@ -10,6 +10,7 @@
typedef struct {
mp_obj_base_t base;
float last_value;
float multiplier;
alarm_pool_t *timer_pool;
repeating_timer_t timer;
} battery_obj_t;
......@@ -20,7 +21,7 @@ static void battery_print(const mp_print_t *print, mp_obj_t self_in);
void read_voltage(battery_obj_t *self) {
adc_select_input(VBATT_ADC_CHANNEL);
self->last_value = adc_read() * VBATT_SCALE_FACTOR * VBATT_REF_VOLTAGE / VBATT_ADC_MAX_CODE;
self->last_value = adc_read() * VBATT_SCALE_FACTOR * VBATT_REF_VOLTAGE / VBATT_ADC_MAX_CODE * self->multiplier;
}
bool read_voltage_handler(repeating_timer_t *timer) {
......@@ -46,6 +47,13 @@ STATIC mp_obj_t battery_voltage(mp_obj_t self_in) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(battery_voltage_obj, battery_voltage);
STATIC mp_obj_t battery_set_multiplier(mp_obj_t self_in, mp_obj_t multiplier) {
battery_obj_t *self = MP_OBJ_TO_PTR(self_in);
self->multiplier = mp_obj_get_float(multiplier);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(battery_set_multiplier_obj, battery_set_multiplier);
STATIC mp_obj_t battery_deinit(mp_obj_t self_in) {
battery_obj_t *self = MP_OBJ_TO_PTR(self_in);
alarm_pool_cancel_alarm(self->timer_pool, self->timer.alarm_id);
......@@ -57,7 +65,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(battery_deinit_obj, battery_deinit);
STATIC mp_obj_t battery_make_new(const mp_obj_type_t* type, size_t n_args, size_t n_kw, const mp_obj_t* args) {
battery_obj_t *self = m_new_obj_with_finaliser(battery_obj_t);
self->base.type = type;
self->multiplier = 1.0;
// Initialise the ADC peripheral if it's not already running.
// (this check is borrowed from machine_adc.c)
if (!(adc_hw->cs & ADC_CS_EN_BITS))
......@@ -85,6 +93,7 @@ STATIC mp_obj_t battery_make_new(const mp_obj_type_t* type, size_t n_args, size_
STATIC const mp_rom_map_elem_t battery_locals_dict[] = {
{ MP_ROM_QSTR(MP_QSTR_read_voltage), MP_ROM_PTR(&battery_read_voltage_obj) },
{ MP_ROM_QSTR(MP_QSTR_voltage), MP_ROM_PTR(&battery_voltage_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_multiplier), MP_ROM_PTR(&battery_set_multiplier_obj) },
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&battery_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&battery_deinit_obj) },
};
......
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