#include "lcd.h"
#include "main.h"
#include "debug.h"
+#include "gui.h"
#include "font.h"
volatile uint16_t lcdpwm_high;
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;
+
inline void lcd_brightness (const uint16_t value)
{
}
-
// interrupt to generate brightness PWM.
// FOR SOME REASON IT IS ON A PIN WITH TIMER OUTPUT BUT WITHOUT PWM :<
inline void int_lcd_pwm (void)
lcd_write(chip, LCD_COMMAND, LCD_DisplayMode);
lcd_write(chip, LCD_DATA, mode);
}
- if ((lcd_x0[chip] != x0)||(lcd_x1[chip] != x1))
+ if ((lcd_x0[chip] != x0) || (lcd_x1[chip] != x1))
{
lcd_x0[chip] = x0;
lcd_x1[chip] = x1;
lcd_write(chip, LCD_DATA, x0);
lcd_write(chip, LCD_DATA, x1);
}
- if ((lcd_y0[chip] != y0)||(lcd_y1[chip] != y1))
+ if ((lcd_y0[chip] != y0) || (lcd_y1[chip] != y1))
{
lcd_y0[chip] = y0;
lcd_y1[chip] = y1;
)
{
uint16_t x;
+
+ if (mode != LCD_GRAY)
+ {
+ draw_adsr_low = 0;
+ draw_adsr_high = 0;
+ draw_wave_low = 0;
+ draw_wave_high = 0;
+ draw_x = 0;
+ }
+
if(x0 < 256)
{
x = (x1>255) ? 255 : x1;
}
-
void lcd_clear_screen (const uint8_t mode)
{
uint8_t y;
void lcd_draw_wave (const uint8_t * const data)
{
- uint16_t i;
- uint8_t col[10];
- uint8_t x;
-
- lcd_setup_drawing(LCD_GRAY, 0, 255, 0, 9);
-
- // convert shape to bit patterns & then draw
- for (i=0; i<256; ++i)
+ if (draw_buffer_high)
{
- memset(col, 0, 10);
- x = data[i];
-
- if (x < WAVE_LOWER_0)
- {
- col[4] = WAVE_LOWER_START;
- if (x < WAVE_LOWER_1)
- {
- col[5] = 0xff;
- if (x < WAVE_LOWER_2)
- {
- col[6] = 0xff;
- if (x < WAVE_LOWER_3)
- {
- col[7] = 0xff;
- if (x < WAVE_LOWER_4)
- {
- col[8] = 0xff;
- col[9] = wave_lower[x-WAVE_LOWER_5];
- }
- else
- col[8] = wave_lower[x-WAVE_LOWER_4];
- }
- else
- col[7] = wave_lower[x-WAVE_LOWER_3];
- }
- else
- col[6] = wave_lower[x-WAVE_LOWER_2];
- }
- else
- col[5] = wave_lower[x-WAVE_LOWER_1];
- }
- else if (x >= WAVE_UPPER_0)
- {
- col[4] = WAVE_UPPER_START;
- if (x >= WAVE_UPPER_1)
- {
- col[3] = 0xff;
- if (x >= WAVE_UPPER_2)
- {
- col[2] = 0xff;
- if (x >= WAVE_UPPER_3)
- {
- col[1] = 0xff;
- col[0] = wave_upper[x-WAVE_UPPER_3];
- }
- else
- col[1] = wave_upper[x-WAVE_UPPER_2];
- }
- else
- col[2] = wave_upper[x-WAVE_UPPER_1];
- }
- else
- col[3] = wave_upper[x-WAVE_UPPER_0];
- }
- else
- {
- col[4] = wave_middle[x-WAVE_LOWER_0];
- }
-
- lcd_write(LCD_SLAVE, LCD_DATA, col[0]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[1]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[2]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[3]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[4]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[5]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[6]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[7]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[8]);
- lcd_write(LCD_SLAVE, LCD_DATA, col[9]);
+ memcpy(draw_buffer, data, HALFSCREEN_PIXELS);
+ draw_wave_low = 1;
+ }
+ else
+ {
+ memcpy(draw_buffer + FULLSCREEN_PIXELS, data, HALFSCREEN_PIXELS);
+ draw_wave_high = 1;
}
}
void lcd_draw_adsr (const uint8_t * const data)
{
- uint16_t i;
- uint8_t col[10];
- uint8_t x;
-
- lcd_setup_drawing(LCD_GRAY, 256, 511, 0, 9);
- // convert shape to bit patterns & then draw
- for (i=0; i<256; ++i)
+ if (draw_buffer_high)
{
- memset(col, 0, 10);
- x = data[i];
-
- if (x >= ADSR_UPPER_1)
- {
- col[9] = 0xff;
- if (x >= ADSR_UPPER_2)
- {
- col[8] = 0xff;
- if (x >= ADSR_UPPER_3)
- {
- col[7] = 0xff;
- if (x >= ADSR_UPPER_4)
- {
- col[6] = 0xff;
- if (x >= ADSR_UPPER_5)
- {
- col[5] = 0xff;
- if (x >= ADSR_UPPER_6)
- {
- col[4] = 0xff;
- if (x >= ADSR_UPPER_7)
- {
- col[3] = 0xff;
- if (x >= ADSR_UPPER_8)
- {
- col[2] = 0xff;
- if (x >= ADSR_UPPER_9)
- {
- col[1] = 0xff;
- col[0] = wave_upper[x-ADSR_UPPER_9];
- }
- else
- col[1] = wave_upper[x-ADSR_UPPER_8];
- }
- else
- col[2] = wave_upper[x-ADSR_UPPER_7];
- }
- else
- col[3] = wave_upper[x-ADSR_UPPER_6];
- }
- else
- col[4] = wave_upper[x-ADSR_UPPER_5];
- }
- else
- col[5] = wave_upper[x-ADSR_UPPER_4];
- }
- else
- col[6] = wave_upper[x-ADSR_UPPER_3];
- }
- else
- col[7] = wave_upper[x-ADSR_UPPER_2];
- }
- else
- col[8] = wave_upper[x-ADSR_UPPER_1];
- }
- else
- col[9] = wave_upper[x-ADSR_UPPER_0];
-
- lcd_write(LCD_MASTER, LCD_DATA, col[0]);
- lcd_write(LCD_MASTER, LCD_DATA, col[1]);
- lcd_write(LCD_MASTER, LCD_DATA, col[2]);
- lcd_write(LCD_MASTER, LCD_DATA, col[3]);
- lcd_write(LCD_MASTER, LCD_DATA, col[4]);
- lcd_write(LCD_MASTER, LCD_DATA, col[5]);
- lcd_write(LCD_MASTER, LCD_DATA, col[6]);
- lcd_write(LCD_MASTER, LCD_DATA, col[7]);
- lcd_write(LCD_MASTER, LCD_DATA, col[8]);
- lcd_write(LCD_MASTER, LCD_DATA, col[9]);
+ 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;
}
}
lcd_draw_name_cursor(cursor);
}
+
+
+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
+ {
+ buffer = draw_buffer;
+ draw_adsr = &draw_adsr_low;
+ draw_wave = &draw_wave_low;
+ }
+
+ if (draw_x < HALFSCREEN_PIXELS)
+ {
+ if (*draw_wave)
+ lcd_setup_drawing(LCD_GRAY, draw_x, HALFSCREEN_PIXELS-1, 0, 9);
+ while (*draw_wave)
+ {
+ memset(col, 0, 10);
+ x = convert_wave((int8_t)buffer[draw_x]);
+
+ if (x < WAVE_LOWER_0)
+ {
+ col[4] = WAVE_LOWER_START;
+ if (x < WAVE_LOWER_1)
+ {
+ col[5] = 0xff;
+ if (x < WAVE_LOWER_2)
+ {
+ col[6] = 0xff;
+ if (x < WAVE_LOWER_3)
+ {
+ col[7] = 0xff;
+ if (x < WAVE_LOWER_4)
+ {
+ col[8] = 0xff;
+ col[9] = wave_lower[x-WAVE_LOWER_5];
+ }
+ else
+ col[8] = wave_lower[x-WAVE_LOWER_4];
+ }
+ else
+ col[7] = wave_lower[x-WAVE_LOWER_3];
+ }
+ else
+ col[6] = wave_lower[x-WAVE_LOWER_2];
+ }
+ else
+ col[5] = wave_lower[x-WAVE_LOWER_1];
+ }
+ else if (x >= WAVE_UPPER_0)
+ {
+ col[4] = WAVE_UPPER_START;
+ if (x >= WAVE_UPPER_1)
+ {
+ col[3] = 0xff;
+ if (x >= WAVE_UPPER_2)
+ {
+ col[2] = 0xff;
+ if (x >= WAVE_UPPER_3)
+ {
+ col[1] = 0xff;
+ col[0] = wave_upper[x-WAVE_UPPER_3];
+ }
+ else
+ col[1] = wave_upper[x-WAVE_UPPER_2];
+ }
+ else
+ col[2] = wave_upper[x-WAVE_UPPER_1];
+ }
+ else
+ col[3] = wave_upper[x-WAVE_UPPER_0];
+ }
+ else
+ {
+ col[4] = wave_middle[x-WAVE_LOWER_0];
+ }
+
+ lcd_write(LCD_SLAVE, LCD_DATA, col[0]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[1]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[2]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[3]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[4]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[5]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[6]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[7]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[8]);
+ lcd_write(LCD_SLAVE, LCD_DATA, col[9]);
+
+ ++draw_x;
+ // finished
+ if (draw_x >= HALFSCREEN_PIXELS)
+ {
+ *draw_wave = 0;
+ draw_x = HALFSCREEN_PIXELS;
+ return;
+ }
+ // interrupt drawing to handle communication every 8 pixels
+ if (!(draw_x & 0x07))
+ return;
+ }
+ draw_x = HALFSCREEN_PIXELS;
+ }
+
+ if (draw_x >= HALFSCREEN_PIXELS)
+ {
+ if (*draw_adsr)
+ lcd_setup_drawing(LCD_GRAY, draw_x, FULLSCREEN_PIXELS-1, 0, 9);
+ while (*draw_adsr)
+ {
+ memset(col, 0, 10);
+ x = buffer[draw_x];
+
+ if (x >= ADSR_UPPER_1)
+ {
+ col[9] = 0xff;
+ if (x >= ADSR_UPPER_2)
+ {
+ col[8] = 0xff;
+ if (x >= ADSR_UPPER_3)
+ {
+ col[7] = 0xff;
+ if (x >= ADSR_UPPER_4)
+ {
+ col[6] = 0xff;
+ if (x >= ADSR_UPPER_5)
+ {
+ col[5] = 0xff;
+ if (x >= ADSR_UPPER_6)
+ {
+ col[4] = 0xff;
+ if (x >= ADSR_UPPER_7)
+ {
+ col[3] = 0xff;
+ if (x >= ADSR_UPPER_8)
+ {
+ col[2] = 0xff;
+ if (x >= ADSR_UPPER_9)
+ {
+ col[1] = 0xff;
+ col[0] = wave_upper[x-ADSR_UPPER_9];
+ }
+ else
+ col[1] = wave_upper[x-ADSR_UPPER_8];
+ }
+ else
+ col[2] = wave_upper[x-ADSR_UPPER_7];
+ }
+ else
+ col[3] = wave_upper[x-ADSR_UPPER_6];
+ }
+ else
+ col[4] = wave_upper[x-ADSR_UPPER_5];
+ }
+ else
+ col[5] = wave_upper[x-ADSR_UPPER_4];
+ }
+ else
+ col[6] = wave_upper[x-ADSR_UPPER_3];
+ }
+ else
+ col[7] = wave_upper[x-ADSR_UPPER_2];
+ }
+ else
+ col[8] = wave_upper[x-ADSR_UPPER_1];
+ }
+ else
+ col[9] = wave_upper[x-ADSR_UPPER_0];
+
+ lcd_write(LCD_MASTER, LCD_DATA, col[0]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[1]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[2]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[3]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[4]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[5]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[6]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[7]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[8]);
+ lcd_write(LCD_MASTER, LCD_DATA, col[9]);
+
+ ++draw_x;
+ // finished
+ if (draw_x >= FULLSCREEN_PIXELS)
+ {
+ *draw_adsr = 0;
+ draw_x = 0;
+ return;
+ }
+ // interrupt drawing to handle communication every 16 pixels
+ if (!(draw_x & 0x0F))
+ return;
+ }
+ draw_x = 0;
+ }
+}
\ No newline at end of file