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.
425 lines
9.4 KiB
425 lines
9.4 KiB
/* |
|
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); |
|
}
|
|
|