From a355a5b094dad60e0e86e7ce3ab22bf31f7cbacd Mon Sep 17 00:00:00 2001 From: b Date: Thu, 2 Jan 2025 16:57:30 +0100 Subject: [PATCH] temporarily disabled drawing interruption --- aix.c | 2 +- aix.h | 5 +- lcd.c | 198 ++++++++++++++++++++++++---------------------------------- lcd.h | 4 +- 4 files changed, 88 insertions(+), 121 deletions(-) diff --git a/aix.c b/aix.c index 821e285..e2c9c5b 100644 --- a/aix.c +++ b/aix.c @@ -117,7 +117,7 @@ void handle_aix (void) uint8_t data; int16_t diff; - if (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_BUFFER)) // data waiting in buffer + while (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_BUFFER)) // data waiting in buffer { // get data; advance pointer data = aix_buffer[aix_buffer_r]; diff --git a/aix.h b/aix.h index fda74e3..9efe1eb 100644 --- a/aix.h +++ b/aix.h @@ -1,6 +1,6 @@ /* ANALOG INPUT EXPANDER */ /* -Copyright 2021 Balthasar Szczepański +Copyright 2021, 2025 Balthasar Szczepański Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -94,3 +94,6 @@ inline void setup_aix(void); void debug_aix (const uint8_t blocking); // print AIX state extern uint16_t aix_data[N_AIX_DATA]; + +extern volatile uint8_t aix_buffer_r; +extern volatile uint8_t aix_buffer_w; diff --git a/lcd.c b/lcd.c index 634ccbe..c47fa55 100644 --- a/lcd.c +++ b/lcd.c @@ -17,6 +17,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND #include "main.h" #include "debug.h" #include "gui.h" +#include "aix.h" #include "font.h" volatile uint16_t lcdpwm_high; @@ -41,13 +42,13 @@ const uint16_t button_chars [N_BUTTONTYPES] = BUTTON_CHARS; const uint16_t button_lmargin[N_BUTTONTYPES] = BUTTON_LMARGIN; const uint16_t button_rmargin[N_BUTTONTYPES] = BUTTON_RMARGIN; -uint8_t draw_buffer[FULLSCREEN_PIXELS * 2]; -uint8_t draw_buffer_high = 0; -uint8_t draw_adsr_low = 0; -uint8_t draw_adsr_high = 0; -uint8_t draw_wave_low = 0; -uint8_t draw_wave_high = 0; -uint16_t draw_x = 0; +const uint8_t *draw_adsr_data; +const uint8_t *draw_wave_data; + uint8_t draw_adsr_request = 0; + uint8_t draw_wave_request = 0; + uint8_t draw_adsr_active = 0; + uint8_t draw_wave_active = 0; + uint16_t draw_x = 0; inline void lcd_brightness (const uint16_t value) @@ -212,7 +213,7 @@ inline void init_lcd (void) // Column Address Setting lcd_write(LCD_SLAVE, LCD_COMMAND, LCD_SetColumnAddress); lcd_write(LCD_SLAVE, LCD_DATA, 0); - lcd_write(LCD_SLAVE, LCD_DATA, 255); + lcd_write(LCD_SLAVE, LCD_DATA, HALFSCREEN_PIXELS-1); // Display On lcd_write(LCD_SLAVE, LCD_COMMAND, LCD_DisplayOn); @@ -290,7 +291,7 @@ inline void init_lcd (void) // Column Address Setting lcd_write(LCD_MASTER, LCD_COMMAND, LCD_SetColumnAddress); lcd_write(LCD_MASTER, LCD_DATA, 0); - lcd_write(LCD_MASTER, LCD_DATA, 255); + lcd_write(LCD_MASTER, LCD_DATA, HALFSCREEN_PIXELS-1); // Internal Power Supply lcd_write(LCD_MASTER, LCD_COMMAND, LCD_ExtCommand2); @@ -403,23 +404,23 @@ void lcd_setup_drawing ( // setup drawing area and color depth if (mode != LCD_GRAY) { - draw_adsr_low = 0; - draw_adsr_high = 0; - draw_wave_low = 0; - draw_wave_high = 0; + draw_adsr_active = 0; + draw_adsr_request = 0; + draw_wave_active = 0; + draw_wave_request = 0; draw_x = 0; } - if(x0 < 256) + if (x0 < HALFSCREEN_PIXELS) { - x = (x1>255) ? 255 : x1; + x = (x1 > (HALFSCREEN_PIXELS-1)) ? HALFSCREEN_PIXELS-1 : x1; lcd_set_mode(LCD_SLAVE, mode, x0, x, y0, y1); lcd_write(LCD_SLAVE, LCD_COMMAND, LCD_WriteDataToDDRAM); } - if(x1 >= 256) + if (x1 >= HALFSCREEN_PIXELS) { - x = (x0<256) ? 0 : (x0-256); - lcd_set_mode(LCD_MASTER, mode, x, x1-256, y0, y1); + x = (x0 < HALFSCREEN_PIXELS) ? 0 : (x0-HALFSCREEN_PIXELS); + lcd_set_mode(LCD_MASTER, mode, x, x1-HALFSCREEN_PIXELS, y0, y1); lcd_write(LCD_MASTER, LCD_COMMAND, LCD_WriteDataToDDRAM); } } @@ -432,8 +433,8 @@ void lcd_clear_screen (const uint8_t mode) y = (mode == LCD_GRAY) ? 9 : 4; - lcd_setup_drawing(mode, 0, 511, 0, y); - for(i=0; i<=255; ++i) + lcd_setup_drawing(mode, 0, FULLSCREEN_PIXELS-1, 0, y); + for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -517,7 +501,7 @@ void lcd_subdraw_button ( { for (i=0, i0=-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -541,7 +525,7 @@ void lcd_subdraw_button ( { for (i=0, i0=-1, i1=line1-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -569,7 +553,7 @@ void lcd_subdraw_button ( { for (i=0, i0=-1, i1=line1-1, i2=line2-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -598,7 +582,7 @@ void lcd_subdraw_button ( { for (i=0, i0=-1, i1=line1-1, i2=line2-1, i3=line3-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -628,7 +612,7 @@ void lcd_subdraw_button ( } for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -666,7 +650,7 @@ void lcd_subdraw_lowbutton8 ( for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -675,7 +659,7 @@ void lcd_subdraw_lowbutton8 ( for (i=0, i0=-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -693,7 +677,7 @@ void lcd_subdraw_lowbutton8 ( for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -724,7 +708,7 @@ void lcd_subdraw_lowbutton16 ( for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -733,7 +717,7 @@ void lcd_subdraw_lowbutton16 ( for (i=0, i0=-1; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; if(!(i&0x7)) { @@ -752,7 +736,7 @@ void lcd_subdraw_lowbutton16 ( for(i=0; i= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); lcd_write(chip, LCD_DATA, 0x00); @@ -764,7 +748,7 @@ void lcd_subdraw_divider (uint16_t * const x) { uint8_t chip = LCD_SLAVE; - if (*x >= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x55); @@ -780,7 +764,7 @@ void lcd_subdraw_lowdivider (uint16_t * const x) { uint8_t chip = LCD_SLAVE; - if (*x >= 256) + if (*x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x55); @@ -803,7 +787,7 @@ void lcd_draw_menu ( ){ uint16_t x=0; - lcd_setup_drawing(LCD_MONO, 0, 511, 0, 4); + lcd_setup_drawing(LCD_MONO, 0, FULLSCREEN_PIXELS-1, 0, 4); lcd_subdraw_button (&x, FULLTEXT - buttons, title, 0); switch (buttons) @@ -887,7 +871,7 @@ void lcd_select_button ( for(i=0; i= 256) + if (x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); ++x; @@ -895,7 +879,7 @@ void lcd_select_button ( for (i=0; i= 256) + if (x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, underline); ++x; @@ -903,7 +887,7 @@ void lcd_select_button ( for(i=0; i= 256) + if (x >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); ++x; @@ -920,7 +904,7 @@ void lcd_draw_name_cursor (const uint8_t pos) for (i=x, j='^'<<3; i=256) + if (i >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, font8[j]); } @@ -936,7 +920,7 @@ void lcd_erase_name_cursor (const uint8_t pos) for (i=x; i=256) + if (i >= HALFSCREEN_PIXELS) chip = LCD_MASTER; lcd_write(chip, LCD_DATA, 0x00); } @@ -947,7 +931,7 @@ void lcd_draw_name_list (const uint8_t * const list) uint16_t x; x = TITLE_6B_PIXELS + 1; - lcd_setup_drawing(LCD_MONO, x, 511, 0, 1); + lcd_setup_drawing(LCD_MONO, x, FULLSCREEN_PIXELS-1, 0, 1); lcd_subdraw_lowbutton16(&x, BUTTON_6X, list); } @@ -974,7 +958,7 @@ void lcd_draw_name_menu ( lcd_subdraw_button (&x, BUTTON_1X, name, 0); lcd_subdraw_divider(&x); - lcd_setup_drawing(LCD_MONO, x, 511, 3, 4); + lcd_setup_drawing(LCD_MONO, x, FULLSCREEN_PIXELS-1, 3, 4); lcd_subdraw_lowbutton8(&x, BUTTON_1X, button_A, selected == 0); lcd_subdraw_lowdivider(&x); @@ -996,51 +980,32 @@ void lcd_draw_name_menu ( void handle_lcd (void) { - uint8_t *buffer; - uint8_t *draw_adsr; - uint8_t *draw_wave; - uint8_t col[10]; uint8_t x; - if (draw_buffer_high) - { - if ( - !draw_adsr_high && !draw_wave_high && - (draw_adsr_low || draw_wave_low) - ) - draw_buffer_high = 0; - } - else - { - if ( - !draw_adsr_low && !draw_wave_low && - (draw_adsr_high || draw_wave_high) - ) - draw_buffer_high = 1; - } - - if (draw_buffer_high) - { - buffer = draw_buffer + FULLSCREEN_PIXELS; - draw_adsr = &draw_adsr_high; - draw_wave = &draw_wave_high; - } - else + if (!draw_wave_active & !draw_adsr_active) { - buffer = draw_buffer; - draw_adsr = &draw_adsr_low; - draw_wave = &draw_wave_low; + if (draw_wave_request) + { + draw_x = 0; + draw_wave_active = 1; + draw_wave_request = 0; + } + else if (draw_adsr_request) + { + draw_x = 0; + draw_adsr_active = 1; + draw_adsr_request = 0; + } } - if (draw_x < HALFSCREEN_PIXELS) + if (draw_wave_active) { - if (*draw_wave) - lcd_setup_drawing(LCD_GRAY, draw_x, HALFSCREEN_PIXELS-1, 0, 9); - while (*draw_wave) + lcd_setup_drawing(LCD_GRAY, draw_x, HALFSCREEN_PIXELS-1, 0, 9); + while (draw_wave_active) { memset(col, 0, 10); - x = convert_wave((int8_t)buffer[draw_x]); + x = convert_wave((int8_t)draw_wave_data[draw_x]); if (x < WAVE_LOWER_0) { @@ -1114,25 +1079,24 @@ void handle_lcd (void) // finished if (draw_x >= HALFSCREEN_PIXELS) { - *draw_wave = 0; - draw_x = HALFSCREEN_PIXELS; + draw_wave_active = 0; + draw_x = 0; return; } - // interrupt drawing to handle communication every 8 pixels - if (!(draw_x & 0x07)) - return; + // // interrupt drawing to handle AIX communication + // if (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_DATA)) + // return; } - draw_x = HALFSCREEN_PIXELS; + draw_x = 0; } - if (draw_x >= HALFSCREEN_PIXELS) + else if (draw_adsr_active) { - if (*draw_adsr) - lcd_setup_drawing(LCD_GRAY, draw_x, FULLSCREEN_PIXELS-1, 0, 9); - while (*draw_adsr) + lcd_setup_drawing(LCD_GRAY, HALFSCREEN_PIXELS+draw_x, FULLSCREEN_PIXELS-1, 0, 9); + while (draw_adsr_active) { memset(col, 0, 10); - x = buffer[draw_x]; + x = draw_adsr_data[draw_x]; if (x >= ADSR_UPPER_1) { @@ -1203,15 +1167,15 @@ void handle_lcd (void) ++draw_x; // finished - if (draw_x >= FULLSCREEN_PIXELS) + if (draw_x >= HALFSCREEN_PIXELS) { - *draw_adsr = 0; + draw_adsr_active = 0; draw_x = 0; return; } - // interrupt drawing to handle communication every 16 pixels - if (!(draw_x & 0x0F)) - return; + // // interrupt drawing to handle communication + // if (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_DATA)) + // return; } draw_x = 0; } diff --git a/lcd.h b/lcd.h index c82b70e..a01b84d 100644 --- a/lcd.h +++ b/lcd.h @@ -426,8 +426,8 @@ void lcd_setup_drawing ( // setup drawing area and color depth ); void lcd_clear_screen (const uint8_t mode); -void lcd_draw_wave (const uint8_t * const data); -void lcd_draw_adsr (const uint8_t * const data); +inline void lcd_draw_wave (const uint8_t * const data); +inline void lcd_draw_adsr (const uint8_t * const data); void lcd_subdraw_button ( uint16_t * const x, const uint8_t type, -- 2.30.2