temporarily disabled drawing interruption
authorb <rowerynaksiezycu@gmail.com>
Thu, 2 Jan 2025 15:57:30 +0000 (16:57 +0100)
committerb <rowerynaksiezycu@gmail.com>
Thu, 2 Jan 2025 15:57:30 +0000 (16:57 +0100)
aix.c
aix.h
lcd.c
lcd.h

diff --git a/aix.c b/aix.c
index 821e28507a159998a8d142b797834a5c055c5a77..e2c9c5be002f699a29d3f3885521955fd33437b6 100644 (file)
--- 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 fda74e3ef9b2ac995c9e39406c616dd2f2f6411e..9efe1eb9ac0e1e109cce3d50ac1df6859297c3b8 100644 (file)
--- 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 634ccbe61a08dc112a23beb8904cd0eb87f74942..c47fa55b1b8071532eb8d5dce13d85ab6e514803 100644 (file)
--- 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<HALFSCREEN_PIXELS; ++i)
        {
                for(j=0; j<=y; ++j)
                {
@@ -443,33 +444,16 @@ void lcd_clear_screen (const uint8_t mode)
        }
 }
 
-void lcd_draw_wave (const uint8_t * const data)
+inline void lcd_draw_wave (const uint8_t * const data)
 {
-       if (draw_buffer_high)
-       {
-               memcpy(draw_buffer, data, HALFSCREEN_PIXELS);
-               draw_wave_low = 1;
-       }
-       else
-       {
-               memcpy(draw_buffer + FULLSCREEN_PIXELS, data, HALFSCREEN_PIXELS);
-               draw_wave_high = 1;
-       }
+       draw_wave_data = data;
+       draw_wave_request = 1;
 }
 
-void lcd_draw_adsr (const uint8_t * const data)
+inline void lcd_draw_adsr (const uint8_t * const data)
 {
-       
-       if (draw_buffer_high)
-       {
-               memcpy(draw_buffer + HALFSCREEN_PIXELS, data, HALFSCREEN_PIXELS);
-               draw_adsr_low = 1;
-       }
-       else
-       {
-               memcpy(draw_buffer + FULLSCREEN_PIXELS + HALFSCREEN_PIXELS, data, HALFSCREEN_PIXELS);
-               draw_adsr_high = 1;
-       }
+       draw_adsr_data = data;
+       draw_adsr_request = 1;
 }
 
 void lcd_subdraw_button (
@@ -503,7 +487,7 @@ void lcd_subdraw_button (
        
        for(i=0; i<margin_l; ++i) // left margin
        {
-               if (*x >= 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<N; ++i)
                {
-                       if (*x >= 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<N; ++i)
                {
-                       if (*x >= 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<N; ++i)
                {
-                       if (*x >= 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<N; ++i)
                {
-                       if (*x >= 256)
+                       if (*x >= HALFSCREEN_PIXELS)
                                chip = LCD_MASTER;
                        if(!(i&0x7))
                        {
@@ -628,7 +612,7 @@ void lcd_subdraw_button (
        }
        for(i=0; i<margin_r; ++i) // right margin
        {
-               if (*x >= 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<margin_l; ++i) // left margin
        {
-               if (*x >= 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<N; ++i) // single text line; 8 font
        {
-               if (*x >= 256)
+               if (*x >= HALFSCREEN_PIXELS)
                        chip = LCD_MASTER;
                if(!(i&0x7))
                {
@@ -693,7 +677,7 @@ void lcd_subdraw_lowbutton8 (
 
        for(i=0; i<margin_r; ++i) // right margin
        {
-               if (*x >= 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<margin_l; ++i) // left margin
        {
-               if (*x >= 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<N; ++i) // single text line; 16px font
        {
-               if (*x >= 256)
+               if (*x >= HALFSCREEN_PIXELS)
                        chip = LCD_MASTER;
                if(!(i&0x7))
                {
@@ -752,7 +736,7 @@ void lcd_subdraw_lowbutton16 (
 
        for(i=0; i<margin_r; ++i) // right margin
        {
-               if (*x >= 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<margin_l; ++i) // left margin
        {
-               if (x >= 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<N; ++i) // underline
        {
-               if (x >= 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<margin_r; ++i) // right margin
        {
-               if (x >= 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<x+8; ++i, j+=1)
        {
-               if (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<x+8; ++i)
        {
-               if (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 c82b70e071f30a5dfb5a9469ea4e0bfc2867e91e..a01b84db5ca53b0ebc5dc87077a49fa7e287ce14 100644 (file)
--- 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,