From 07a0b22424cd10bf5113ac08ac48b5ad94f8b888 Mon Sep 17 00:00:00 2001 From: koalo <koalo@koalo.de> Date: Tue, 20 Aug 2019 12:07:12 +0200 Subject: [PATCH] epicardium: BLE opt in --- epicardium/main.c | 62 ++++++++++++++++++++++++----- epicardium/modules/buttons.c | 2 +- preload/ble.py | 77 ++++++++++++++++++++++++++++++++++++ pycardium/modules/os.c | 10 +++++ pycardium/modules/qstrdefs.h | 1 + 5 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 preload/ble.py diff --git a/epicardium/main.c b/epicardium/main.c index d0e15ff9..016f3095 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -1,16 +1,58 @@ #include "modules/modules.h" #include "modules/log.h" +#include "modules/filesystem.h" #include "card10-version.h" #include "FreeRTOS.h" #include "task.h" #include <stdlib.h> +#include <string.h> TaskHandle_t dispatcher_task_id; void vBleTask(void *pvParameters); +#define BLEMAXCFGBYTES 100 +int bleShallStart(void) +{ + int bleConfigFile = epic_file_open("ble.txt", "r"); + if (bleConfigFile < 0) { + LOG_INFO( + "startup", + "can not open ble.txt -> BLE is not started" + ); + epic_file_close(bleConfigFile); + return 0; + } + + char cfgBuf[BLEMAXCFGBYTES + 1]; + int readNum = epic_file_read(bleConfigFile, cfgBuf, BLEMAXCFGBYTES); + epic_file_close(bleConfigFile); + if (readNum < 0) { + LOG_INFO( + "startup", + "can not read ble.txt -> BLE is not started" + ); + return 0; + } + cfgBuf[readNum] = '\0'; + + char bleActiveStr[] = "active=true"; + cfgBuf[sizeof(bleActiveStr) - 1] = '\0'; + + if (strcmp(cfgBuf, "active=true") != 0) { + LOG_INFO( + "startup", + "ble.txt is not \"active=true\" -> BLE is not started" + ); + return 0; + } + + LOG_INFO("startup", "ble.txt is \"active=true\" -> BLE is starting"); + return 1; +} + int main(void) { LOG_INFO("startup", "Epicardium startup ..."); @@ -62,15 +104,17 @@ int main(void) } /* BLE */ - if (xTaskCreate( - vBleTask, - (const char *)"BLE", - configMINIMAL_STACK_SIZE * 10, - NULL, - tskIDLE_PRIORITY + 1, - NULL) != pdPASS) { - LOG_CRIT("startup", "Failed to create %s task!", "BLE"); - abort(); + if (bleShallStart()) { + if (xTaskCreate( + vBleTask, + (const char *)"BLE", + configMINIMAL_STACK_SIZE * 10, + NULL, + tskIDLE_PRIORITY + 1, + NULL) != pdPASS) { + LOG_CRIT("startup", "Failed to create %s task!", "BLE"); + abort(); + } } /* Lifecycle */ diff --git a/epicardium/modules/buttons.c b/epicardium/modules/buttons.c index 8364e725..539d6e5c 100644 --- a/epicardium/modules/buttons.c +++ b/epicardium/modules/buttons.c @@ -14,7 +14,7 @@ static const uint8_t pin_mask[] = { uint8_t epic_buttons_read(uint8_t mask) { uint8_t ret = 0; - if (portexpander_detected() && (mask & 0x3)) { + if (portexpander_detected() && (mask & 0x7)) { /* * Not using PB_Get() here as that performs one I2C transcation * per button. diff --git a/preload/ble.py b/preload/ble.py new file mode 100644 index 00000000..f12562e3 --- /dev/null +++ b/preload/ble.py @@ -0,0 +1,77 @@ +import os +import display +import utime +import buttons + +CONFIG_NAME = "ble.txt" +ACTIVE_STRING = "active=true" +INACTIVE_STRING = "active=false" + + +def init(): + if CONFIG_NAME not in os.listdir("."): + with open(CONFIG_NAME, "w") as f: + f.write(INACTIVE_STRING) + + +def triangle(disp, x, y, left): + yf = 1 if left else -1 + scale = 6 + disp.line(x - scale * yf, int(y + scale / 2), x, y) + disp.line(x, y, x, y + scale) + disp.line(x, y + scale, x - scale * yf, y + int(scale / 2)) + + +def toggle(): + content = INACTIVE_STRING if is_active() else ACTIVE_STRING + with open(CONFIG_NAME, "w") as f: + f.write(content) + + disp.clear() + disp.print("resetting", posy=0, fg=[0, 255, 255]) + disp.print("to toggle", posy=20, fg=[0, 255, 255]) + disp.print("BLE state", posy=40, fg=[0, 255, 255]) + disp.update() + os.reset() + + +def is_active(): + with open(CONFIG_NAME, "r") as f: + state = f.readlines()[0] + if len(state) < len(ACTIVE_STRING): + return False + state = state[0 : len(ACTIVE_STRING)] + return state == ACTIVE_STRING + + +def headline(): + disp.print("BLE", posy=0, fg=[0, 255, 255]) + if is_active(): + disp.print("active", posy=20, fg=[0, 255, 255]) + else: + disp.print("inactive", posy=20, fg=[0, 255, 255]) + + +def selector(): + triangle(disp, 148, 46, False) + disp.print("toggle", posx=25, posy=40, fg=[0, 255, 0]) + + +disp = display.open() +button_pressed = True +init() + +while True: + disp.clear() + headline() + v = buttons.read(buttons.TOP_RIGHT) + if v == 0: + button_pressed = False + + if not button_pressed and v & buttons.TOP_RIGHT != 0: + button_pressed = True + toggle() + + selector() + disp.update() + utime.sleep(0.1) diff --git a/pycardium/modules/os.c b/pycardium/modules/os.c index 99af67cb..d2a4ec55 100644 --- a/pycardium/modules/os.c +++ b/pycardium/modules/os.c @@ -19,6 +19,15 @@ static mp_obj_t mp_os_exit(size_t n_args, const mp_obj_t *args) } static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(exit_obj, 0, 1, mp_os_exit); +static mp_obj_t mp_os_reset(void) +{ + epic_system_reset(); + + /* unreachable */ + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_0(reset_obj, mp_os_reset); + static mp_obj_t mp_os_exec(mp_obj_t name_in) { const char *name_ptr; @@ -117,6 +126,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(rename_obj, mp_os_rename); static const mp_rom_map_elem_t os_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) }, { MP_ROM_QSTR(MP_QSTR_exit), MP_ROM_PTR(&exit_obj) }, + { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&reset_obj) }, { MP_ROM_QSTR(MP_QSTR_exec), MP_ROM_PTR(&exec_obj) }, { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&listdir_obj) }, { MP_ROM_QSTR(MP_QSTR_unlink), MP_ROM_PTR(&unlink_obj) }, diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 4315a839..33009070 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -97,6 +97,7 @@ Q(write) /* os */ Q(os) Q(exit) +Q(reset) Q(exec) Q(listdir) Q(unlink) -- GitLab