You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
426 lines
9.4 KiB
426 lines
9.4 KiB
6 years ago
|
/*
|
||
|
u8x8_d_sdl_128x64.c
|
||
|
*/
|
||
|
|
||
|
#include "u8g2.h"
|
||
|
#ifndef NO_SDL
|
||
|
#include "SDL.h"
|
||
|
#endif
|
||
|
#include <assert.h>
|
||
|
|
||
|
//#define HEIGHT (64)
|
||
|
//#define WIDTH 128
|
||
|
|
||
|
#define W(x,w) (((x)*(w))/100)
|
||
|
|
||
|
#ifndef NO_SDL
|
||
|
SDL_Window *u8g_sdl_window;
|
||
|
SDL_Surface *u8g_sdl_screen;
|
||
|
#endif
|
||
|
|
||
|
int u8g_sdl_multiple = 3;
|
||
|
uint32_t u8g_sdl_color[256];
|
||
|
int u8g_sdl_height, u8g_sdl_width;
|
||
|
|
||
|
|
||
|
|
||
|
static void u8g_sdl_set_pixel(int x, int y, int idx)
|
||
|
{
|
||
|
uint32_t *ptr;
|
||
|
uint32_t offset;
|
||
|
int i, j;
|
||
|
|
||
|
if ( y >= u8g_sdl_height )
|
||
|
return;
|
||
|
if ( y < 0 )
|
||
|
return;
|
||
|
if ( x >= u8g_sdl_width )
|
||
|
return;
|
||
|
if ( x < 0 )
|
||
|
return;
|
||
|
|
||
|
for( i = 0; i < u8g_sdl_multiple; i++ )
|
||
|
for( j = 0; j < u8g_sdl_multiple; j++ )
|
||
|
{
|
||
|
#ifndef NO_SDL
|
||
|
offset = (
|
||
|
((y * u8g_sdl_multiple) + i) * (u8g_sdl_width * u8g_sdl_multiple) +
|
||
|
((x * u8g_sdl_multiple) + j)) * u8g_sdl_screen->format->BytesPerPixel;
|
||
|
|
||
|
assert( offset < (Uint32)(u8g_sdl_width * u8g_sdl_multiple * u8g_sdl_height * u8g_sdl_multiple * u8g_sdl_screen->format->BytesPerPixel) );
|
||
|
|
||
|
ptr = u8g_sdl_screen->pixels + offset;
|
||
|
*ptr = u8g_sdl_color[idx];
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void u8g_sdl_set_8pixel(int x, int y, uint8_t pixel)
|
||
|
{
|
||
|
int cnt = 8;
|
||
|
int bg = 0;
|
||
|
if ( (x/8 + y/8) & 1 )
|
||
|
bg = 4;
|
||
|
while( cnt > 0 )
|
||
|
{
|
||
|
if ( (pixel & 1) == 0 )
|
||
|
{
|
||
|
u8g_sdl_set_pixel(x,y,bg);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
u8g_sdl_set_pixel(x,y,3);
|
||
|
}
|
||
|
pixel >>= 1;
|
||
|
y++;
|
||
|
cnt--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void u8g_sdl_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel)
|
||
|
{
|
||
|
uint8_t b;
|
||
|
while( cnt > 0 )
|
||
|
{
|
||
|
b = *pixel;
|
||
|
u8g_sdl_set_8pixel(x, y, b);
|
||
|
x++;
|
||
|
pixel++;
|
||
|
cnt--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void u8g_sdl_init(int width, int height)
|
||
|
{
|
||
|
u8g_sdl_height = height;
|
||
|
u8g_sdl_width = width;
|
||
|
|
||
|
#ifndef NO_SDL
|
||
|
|
||
|
if (SDL_Init(SDL_INIT_VIDEO) != 0)
|
||
|
{
|
||
|
printf("Unable to initialize SDL: %s\n", SDL_GetError());
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
u8g_sdl_window = SDL_CreateWindow("U8g2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, u8g_sdl_width * u8g_sdl_multiple, u8g_sdl_height * u8g_sdl_multiple, 0);
|
||
|
|
||
|
if ( u8g_sdl_window == NULL )
|
||
|
{
|
||
|
printf("Couldn't create window: %s\n", SDL_GetError());
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
u8g_sdl_screen = SDL_GetWindowSurface(u8g_sdl_window);
|
||
|
|
||
|
if ( u8g_sdl_screen == NULL )
|
||
|
{
|
||
|
printf("Couldn't create screen: %s\n", SDL_GetError());
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
printf("%d bits-per-pixel mode\n", u8g_sdl_screen->format->BitsPerPixel);
|
||
|
printf("%d bytes-per-pixel mode\n", u8g_sdl_screen->format->BytesPerPixel);
|
||
|
|
||
|
u8g_sdl_color[0] = SDL_MapRGB( u8g_sdl_screen->format, 0, 0, 0 );
|
||
|
u8g_sdl_color[1] = SDL_MapRGB( u8g_sdl_screen->format, W(100, 50), W(255,50), 0 );
|
||
|
u8g_sdl_color[2] = SDL_MapRGB( u8g_sdl_screen->format, W(100, 80), W(255,80), 0 );
|
||
|
u8g_sdl_color[3] = SDL_MapRGB( u8g_sdl_screen->format, 100, 255, 0 );
|
||
|
u8g_sdl_color[4] = SDL_MapRGB( u8g_sdl_screen->format, 30, 30, 30 );
|
||
|
|
||
|
/*
|
||
|
u8g_sdl_set_pixel(0,0);
|
||
|
u8g_sdl_set_pixel(1,1);
|
||
|
u8g_sdl_set_pixel(2,2);
|
||
|
*/
|
||
|
|
||
|
/* update all */
|
||
|
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||
|
|
||
|
atexit(SDL_Quit);
|
||
|
#endif
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
void main(void)
|
||
|
{
|
||
|
u8g_sdl_init();
|
||
|
u8g_sdl_set_pixel(0,0,3);
|
||
|
u8g_sdl_set_pixel(0,1,3);
|
||
|
u8g_sdl_set_pixel(0,2,3);
|
||
|
u8g_sdl_set_pixel(1,1,3);
|
||
|
u8g_sdl_set_pixel(2,2,3);
|
||
|
while( u8g_sdl_get_key() < 0 )
|
||
|
;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
static const u8x8_display_info_t u8x8_sdl_128x64_info =
|
||
|
{
|
||
|
/* chip_enable_level = */ 0,
|
||
|
/* chip_disable_level = */ 1,
|
||
|
|
||
|
/* post_chip_enable_wait_ns = */ 0,
|
||
|
/* pre_chip_disable_wait_ns = */ 0,
|
||
|
/* reset_pulse_width_ms = */ 0,
|
||
|
/* post_reset_wait_ms = */ 0,
|
||
|
/* sda_setup_time_ns = */ 0,
|
||
|
/* sck_pulse_width_ns = */ 0,
|
||
|
/* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
|
||
|
/* spi_mode = */ 1,
|
||
|
/* i2c_bus_clock_100kHz = */ 0,
|
||
|
/* data_setup_time_ns = */ 0,
|
||
|
/* write_pulse_width_ns = */ 0,
|
||
|
/* tile_width = */ 16,
|
||
|
/* tile_hight = */ 8,
|
||
|
/* default_x_offset = */ 0,
|
||
|
/* flipmode_x_offset = */ 0,
|
||
|
/* pixel_width = */ 128,
|
||
|
/* pixel_height = */ 64
|
||
|
};
|
||
|
|
||
|
static const u8x8_display_info_t u8x8_sdl_240x160_info =
|
||
|
{
|
||
|
/* chip_enable_level = */ 0,
|
||
|
/* chip_disable_level = */ 1,
|
||
|
|
||
|
/* post_chip_enable_wait_ns = */ 0,
|
||
|
/* pre_chip_disable_wait_ns = */ 0,
|
||
|
/* reset_pulse_width_ms = */ 0,
|
||
|
/* post_reset_wait_ms = */ 0,
|
||
|
/* sda_setup_time_ns = */ 0,
|
||
|
/* sck_pulse_width_ns = */ 0,
|
||
|
/* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
|
||
|
/* spi_mode = */ 1,
|
||
|
/* i2c_bus_clock_100kHz = */ 0,
|
||
|
/* data_setup_time_ns = */ 0,
|
||
|
/* write_pulse_width_ns = */ 0,
|
||
|
/* tile_width = */ 30, /* width of 30*8=240 pixel */
|
||
|
/* tile_hight = */ 20, /* height: 160 pixel */
|
||
|
/* default_x_offset = */ 0,
|
||
|
/* flipmode_x_offset = */ 0,
|
||
|
/* pixel_width = */ 240,
|
||
|
/* pixel_height = */ 160
|
||
|
};
|
||
|
|
||
|
|
||
|
static uint8_t u8x8_d_sdl_gpio(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
|
||
|
{
|
||
|
static int debounce_cnt = 0;
|
||
|
static int curr_msg = 0;
|
||
|
static int db_cnt = 10;
|
||
|
int event;
|
||
|
|
||
|
if ( curr_msg > 0 )
|
||
|
{
|
||
|
if ( msg == curr_msg )
|
||
|
{
|
||
|
u8x8_SetGPIOResult(u8x8, 0);
|
||
|
if ( debounce_cnt == 0 )
|
||
|
curr_msg = 0;
|
||
|
else
|
||
|
debounce_cnt--;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
event = u8g_sdl_get_key();
|
||
|
|
||
|
switch(event)
|
||
|
{
|
||
|
case 273:
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_UP;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
case 274:
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_DOWN;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
case 275:
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_NEXT;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
case 276:
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_PREV;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
case 's':
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_SELECT;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
case 'q':
|
||
|
curr_msg = U8X8_MSG_GPIO_MENU_HOME;
|
||
|
debounce_cnt = db_cnt;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
u8x8_SetGPIOResult(u8x8, 1);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
uint8_t u8x8_d_sdl_128x64(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
|
||
|
{
|
||
|
uint8_t x, y, c;
|
||
|
uint8_t *ptr;
|
||
|
switch(msg)
|
||
|
{
|
||
|
case U8X8_MSG_DISPLAY_SETUP_MEMORY:
|
||
|
u8x8_d_helper_display_setup_memory(u8g2, &u8x8_sdl_128x64_info);
|
||
|
u8g_sdl_init(128, 64);
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_INIT:
|
||
|
u8x8_d_helper_display_init(u8g2);
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_CONTRAST:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_DRAW_TILE:
|
||
|
x = ((u8x8_tile_t *)arg_ptr)->x_pos;
|
||
|
x *= 8;
|
||
|
x += u8g2->x_offset;
|
||
|
|
||
|
y = ((u8x8_tile_t *)arg_ptr)->y_pos;
|
||
|
y *= 8;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
c = ((u8x8_tile_t *)arg_ptr)->cnt;
|
||
|
ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
|
||
|
u8g_sdl_set_multiple_8pixel(x, y, c*8, ptr);
|
||
|
arg_int--;
|
||
|
x+=c*8;
|
||
|
} while( arg_int > 0 );
|
||
|
|
||
|
/* update all */
|
||
|
#ifndef NO_SDL
|
||
|
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||
|
#endif
|
||
|
break;
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
uint8_t u8x8_d_sdl_240x160(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
|
||
|
{
|
||
|
uint8_t x, y, c;
|
||
|
uint8_t *ptr;
|
||
|
switch(msg)
|
||
|
{
|
||
|
case U8X8_MSG_DISPLAY_SETUP_MEMORY:
|
||
|
u8x8_d_helper_display_setup_memory(u8g2, &u8x8_sdl_240x160_info);
|
||
|
u8g_sdl_init(240, 160);
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_INIT:
|
||
|
u8x8_d_helper_display_init(u8g2);
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_SET_CONTRAST:
|
||
|
break;
|
||
|
case U8X8_MSG_DISPLAY_DRAW_TILE:
|
||
|
x = ((u8x8_tile_t *)arg_ptr)->x_pos;
|
||
|
x *= 8;
|
||
|
x += u8g2->x_offset;
|
||
|
|
||
|
y = ((u8x8_tile_t *)arg_ptr)->y_pos;
|
||
|
y *= 8;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
c = ((u8x8_tile_t *)arg_ptr)->cnt;
|
||
|
ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
|
||
|
u8g_sdl_set_multiple_8pixel(x, y, c*8, ptr);
|
||
|
arg_int--;
|
||
|
} while( arg_int > 0 );
|
||
|
|
||
|
#ifndef NO_SDL
|
||
|
/* update all */
|
||
|
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||
|
#endif
|
||
|
|
||
|
break;
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
void u8x8_Setup_SDL_128x64(u8x8_t *u8x8)
|
||
|
{
|
||
|
/* setup defaults */
|
||
|
u8x8_SetupDefaults(u8x8);
|
||
|
|
||
|
/* setup specific callbacks */
|
||
|
u8x8->display_cb = u8x8_d_sdl_128x64;
|
||
|
|
||
|
u8x8->gpio_and_delay_cb = u8x8_d_sdl_gpio;
|
||
|
|
||
|
/* setup display info */
|
||
|
u8x8_SetupMemory(u8x8);
|
||
|
}
|
||
|
|
||
|
void u8g2_SetupBuffer_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb)
|
||
|
{
|
||
|
|
||
|
static uint8_t buf[128*8];
|
||
|
|
||
|
u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2));
|
||
|
u8g2_SetupBuffer(u8g2, buf, 8, u8g2_ll_hvline_vertical_top_lsb, u8g2_cb);
|
||
|
}
|
||
|
|
||
|
|
||
|
void u8g2_SetupBuffer_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb)
|
||
|
{
|
||
|
|
||
|
static uint8_t buf[128*3];
|
||
|
|
||
|
u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2));
|
||
|
u8g2_SetupBuffer(u8g2, buf, 3, u8g2_ll_hvline_vertical_top_lsb, u8g2_cb);
|
||
|
}
|
||
|
|
||
|
void u8g2_SetupBuffer_SDL_128x64_1(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb)
|
||
|
{
|
||
|
|
||
|
static uint8_t buf[128];
|
||
|
|
||
|
u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2));
|
||
|
u8g2_SetupBuffer(u8g2, buf, 1, u8g2_ll_hvline_vertical_top_lsb, u8g2_cb);
|
||
|
}
|
||
|
|
||
|
|
||
|
void u8x8_Setup_SDL_240x160(u8x8_t *u8x8)
|
||
|
{
|
||
|
/* setup defaults */
|
||
|
u8x8_SetupDefaults(u8x8);
|
||
|
|
||
|
/* setup specific callbacks */
|
||
|
u8x8->display_cb = u8x8_d_sdl_240x160;
|
||
|
|
||
|
u8x8->gpio_and_delay_cb = u8x8_d_sdl_gpio;
|
||
|
|
||
|
/* setup display info */
|
||
|
u8x8_SetupMemory(u8x8);
|
||
|
}
|
||
|
|
||
|
void u8g2_SetupBuffer_SDL_240x160(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb)
|
||
|
{
|
||
|
|
||
|
static uint8_t buf[240*20];
|
||
|
|
||
|
u8x8_Setup_SDL_240x160(u8g2_GetU8x8(u8g2));
|
||
|
u8g2_SetupBuffer(u8g2, buf, 20, u8g2_ll_hvline_vertical_top_lsb, u8g2_cb);
|
||
|
}
|