Skip to content
Snippets Groups Projects
Commit 177f5c2a authored by moon2's avatar moon2 :speech_balloon:
Browse files

display: bring back optional scope mode

this is somewhat hacky and definitely a temporary solution before we have a proper compositor.
implemented this mostly for making demos, but if people are down we wouldn't mind merging it
into main until we have a better system to manage this.
parent 9fe4c4db
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
Ctx *the_ctx = NULL; Ctx *the_ctx = NULL;
uint8_t scope_active = 0;
uint16_t *pixels; uint16_t *pixels;
typedef struct leds_cfg { typedef struct leds_cfg {
...@@ -24,28 +26,13 @@ typedef struct leds_cfg { ...@@ -24,28 +26,13 @@ typedef struct leds_cfg {
} display_cfg_t; } display_cfg_t;
static QueueHandle_t display_queue = NULL; static QueueHandle_t display_queue = NULL;
static void display_task(TimerHandle_t aaaaa); static void display_task(TimerHandle_t dummy);
//static void display_task(void* arg); static TimerHandle_t display_animation_timer;
static void _display_init() { static void _display_init() {
GC9A01_Init(); GC9A01_Init();
// GC9A01_Screen_Load(0,0,240,240,pixels);
GC9A01_Update(); GC9A01_Update();
display_animation_timer = xTimerCreate("display animation timer", pdMS_TO_TICKS(100), pdTRUE, (void *) 0, *display_task);
/*
display_queue = xQueueCreate(1, sizeof(display_cfg_t));
TaskHandle_t handle;
xTaskCreate(&display_task, "Display", 4096, NULL, configMAX_PRIORITIES - 3, &handle);
*/
/* SCOPE TASK
TimerHandle_t aa = xTimerCreate("Display", pdMS_TO_TICKS(100), pdTRUE, (void *) 0, *display_task);
if( xTimerStart(aa, 0 ) != pdPASS )
{
}
*/
} }
...@@ -63,6 +50,7 @@ void display_ctx_init() { ...@@ -63,6 +50,7 @@ void display_ctx_init() {
} }
void display_update(){ void display_update(){
if(scope_active) return;
GC9A01_Update(); GC9A01_Update();
} }
...@@ -79,29 +67,18 @@ void display_fill(uint16_t col){ ...@@ -79,29 +67,18 @@ void display_fill(uint16_t col){
} }
void display_draw_scope(){ void display_draw_scope(){
//display_cfg_t display_;
uint16_t line[240]; uint16_t line[240];
/*
printf("waiting...\n");
xQueueReceive(display_queue, &display_, portMAX_DELAY);
printf("go...\n");
*/
//uint32_t t0 = esp_log_timestamp();
begin_scope_read(); begin_scope_read();
for(int y=0; y<240; y++){ for(int y=0; y<240; y++){
read_line_from_scope(&(line[0]), y); read_line_from_scope(&(line[0]), y);
memcpy(&ScreenBuff[y * 240], line, sizeof(line)); memcpy(&ScreenBuff[y * 240], line, sizeof(line));
} }
end_scope_read(); end_scope_read();
GC9A01_Update();
//uint32_t td = esp_log_timestamp() - t0;
// printf("it took %lu\n", td);
display_update();
} }
//static void display_task(void* arg) { //static void display_task(void* arg) {
static void display_task(TimerHandle_t aaaaa) { static void display_task(TimerHandle_t dummy) {
display_draw_scope(); display_draw_scope();
} }
...@@ -110,3 +87,20 @@ void display_init() { ...@@ -110,3 +87,20 @@ void display_init() {
display_ctx_init(); display_ctx_init();
} }
void display_scope_start(){
scope_active = 1;
vTaskDelay(pdMS_TO_TICKS(100)); //hack: wait until last display update has stopped
if(xTimerStart(display_animation_timer, pdMS_TO_TICKS(100)) != pdPASS)
{ // timer startup has failed
scope_active = 0;
}
}
void display_scope_stop(){
if(!scope_active) return; //nothing to do
if(xTimerStop(display_animation_timer, pdMS_TO_TICKS(1000)) != pdPASS)
{
// not sure how to handle this, any ideas? just repeat query? throw error?
}
scope_active = 0;
}
...@@ -8,6 +8,8 @@ void display_init(); ...@@ -8,6 +8,8 @@ void display_init();
void display_ctx_init(); void display_ctx_init();
void display_draw_scope(); void display_draw_scope();
void display_update(); void display_update();
void display_scope_start();
void display_scope_stop();
void display_draw_pixel(uint8_t x, uint8_t y, uint16_t col); void display_draw_pixel(uint8_t x, uint8_t y, uint16_t col);
uint16_t display_get_pixel(uint8_t x, uint8_t y); uint16_t display_get_pixel(uint8_t x, uint8_t y);
void display_fill(uint16_t col); void display_fill(uint16_t col);
......
...@@ -94,6 +94,7 @@ def main(): ...@@ -94,6 +94,7 @@ def main():
if(get_button(0) == 2): if(get_button(0) == 2):
if CURRENT_APP_RUN != run_menu: if CURRENT_APP_RUN != run_menu:
CURRENT_APP_RUN = run_menu CURRENT_APP_RUN = run_menu
display_scope_stop()
foreground_menu() foreground_menu()
else: else:
if(get_button(0) == 1): if(get_button(0) == 1):
......
...@@ -65,3 +65,4 @@ def init(): ...@@ -65,3 +65,4 @@ def init():
def foreground(): def foreground():
adjust_playing_field_to_octave() adjust_playing_field_to_octave()
display_scope_start()
...@@ -33,6 +33,18 @@ STATIC mp_obj_t mp_display_update(size_t n_args, const mp_obj_t *args) { ...@@ -33,6 +33,18 @@ STATIC mp_obj_t mp_display_update(size_t n_args, const mp_obj_t *args) {
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_update_obj, 0, 1, mp_display_update); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_update_obj, 0, 1, mp_display_update);
STATIC mp_obj_t mp_display_scope_start(size_t n_args, const mp_obj_t *args) {
display_scope_start();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_scope_start_obj, 0, 1, mp_display_scope_start);
STATIC mp_obj_t mp_display_scope_stop(size_t n_args, const mp_obj_t *args) {
display_scope_stop();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_display_scope_stop_obj, 0, 1, mp_display_scope_stop);
STATIC mp_obj_t mp_display_draw_pixel(size_t n_args, const mp_obj_t *args) { STATIC mp_obj_t mp_display_draw_pixel(size_t n_args, const mp_obj_t *args) {
uint16_t x = mp_obj_get_int(args[0]); uint16_t x = mp_obj_get_int(args[0]);
uint16_t y = mp_obj_get_int(args[1]); uint16_t y = mp_obj_get_int(args[1]);
...@@ -161,6 +173,8 @@ STATIC const mp_rom_map_elem_t mp_module_hardware_globals_table[] = { ...@@ -161,6 +173,8 @@ STATIC const mp_rom_map_elem_t mp_module_hardware_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_set_led_hsv), MP_ROM_PTR(&mp_set_led_hsv_obj) }, { MP_ROM_QSTR(MP_QSTR_set_led_hsv), MP_ROM_PTR(&mp_set_led_hsv_obj) },
{ MP_ROM_QSTR(MP_QSTR_update_leds), MP_ROM_PTR(&mp_update_leds_obj) }, { MP_ROM_QSTR(MP_QSTR_update_leds), MP_ROM_PTR(&mp_update_leds_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_update), MP_ROM_PTR(&mp_display_update_obj) }, { MP_ROM_QSTR(MP_QSTR_display_update), MP_ROM_PTR(&mp_display_update_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_scope_start), MP_ROM_PTR(&mp_display_scope_start_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_scope_stop), MP_ROM_PTR(&mp_display_scope_stop_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_draw_pixel), MP_ROM_PTR(&mp_display_draw_pixel_obj) }, { MP_ROM_QSTR(MP_QSTR_display_draw_pixel), MP_ROM_PTR(&mp_display_draw_pixel_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_get_pixel), MP_ROM_PTR(&mp_display_get_pixel_obj) }, { MP_ROM_QSTR(MP_QSTR_display_get_pixel), MP_ROM_PTR(&mp_display_get_pixel_obj) },
{ MP_ROM_QSTR(MP_QSTR_display_fill), MP_ROM_PTR(&mp_display_fill_obj) }, { MP_ROM_QSTR(MP_QSTR_display_fill), MP_ROM_PTR(&mp_display_fill_obj) },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment