| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #include "u8g2.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define CHGR_WIDTH 96
- //#define CHGR_WIDTH 102
- //#define CHGR_HEIGHT 32
- #define CHGR_HEIGHT 68
- unsigned char chgr_bitmap[CHGR_HEIGHT/2][CHGR_WIDTH/2];
- unsigned char *chgr_bitmap_pos(unsigned x, unsigned y)
- {
- if ( x >= CHGR_WIDTH )
- return NULL;
- if ( y >= CHGR_HEIGHT )
- return NULL;
- return &(chgr_bitmap[y/2][x/2]);
- }
- void chgr_set_pixel(unsigned x, unsigned y)
- {
- unsigned char *p;
- p = chgr_bitmap_pos(x, y);
- if ( p == NULL )
- return;
- *p |= 1<<(((y&1)<<1) + (1-(x&1)));
- //printf("x=%d y=%d *p=%d\n", x, y, *p);
- }
- void chgr_clr_pixel(unsigned x, unsigned y)
- {
- unsigned char *p;
- p = chgr_bitmap_pos(x, y);
- if ( p == NULL )
- return;
- *p &= ~ (1<<(((y&1)<<1) + (1-(x&1))));
- //printf("x=%d y=%d *p=%d\n", x, y, *p);
- }
- void chgr_clear(void)
- {
- unsigned x, y;
- for( y = 0; y < CHGR_HEIGHT/2; y++)
- {
- for( x = 0; x < CHGR_WIDTH/2; x++)
- {
- chgr_bitmap[y][x] = 0;
- }
- }
- }
- const char *chgr_to_str(unsigned v)
- {
- switch(v)
- {
- case 0: return " "; //
- //case 0: return "\xE2\x96\x91"; // light shade
- case 1: return "\xE2\x96\x9d"; // QUADRANT UPPER RIGHT
- case 2: return "\xE2\x96\x98"; // QUADRANT UPPER LEFT
- case 3: return "\xE2\x96\x80"; // UPPER HALF
- case 4: return "\xE2\x96\x97"; // QUADRANT LOWER RIGHT
- case 5: return "\xE2\x96\x90"; // RIGHT BAR
- case 6: return "\xE2\x96\x9A"; //
- case 7: return "\xE2\x96\x9C"; //
- case 8: return "\xE2\x96\x96"; // QUADRANT LOWER LEFT
- case 9: return "\xE2\x96\x9E"; //
- case 10: return "\xE2\x96\x8B"; //
- case 11: return "\xE2\x96\x9B"; //
- case 12: return "\xE2\x96\x84"; // LOWER HALF
- case 13: return "\xE2\x96\x9F"; //
- case 14: return "\xE2\x96\x99"; //
- case 15: return "\xE2\x96\x88"; //
- }
- return "\xE2\x96\x88 "; // full block
- }
- void chgr_show(void)
- {
- unsigned x, y;
- for( y = 0; y < CHGR_HEIGHT/2; y++)
- {
- printf("%02d|", y*2);
- for( x = 0; x < CHGR_WIDTH/2; x++)
- {
- //printf("%x", chgr_bitmap[y][x]);
- printf("%s", chgr_to_str(chgr_bitmap[y][x]));
- }
- printf("|\n");
- }
- }
- void chgr_set_8pixel(unsigned x, unsigned y, uint8_t pixel, uint16_t f)
- {
- int cnt = 8;
- while( cnt > 0 )
- {
- if ( (pixel & 1) != 0 )
- {
- chgr_set_pixel(x,y);
- }
- else
- {
- chgr_clr_pixel(x,y);
- }
- pixel >>= 1;
- y+=f;
- cnt--;
- }
- }
- void chgr_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel, uint16_t f)
- {
- uint8_t b;
- while( cnt > 0 )
- {
- b = *pixel;
- chgr_set_8pixel(x, y, b, f);
- x+=f;
- pixel++;
- cnt--;
- }
- }
- /*==========================================*/
- /* tga description procedures */
- static const u8x8_display_info_t u8x8_utf8_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 = */ (CHGR_WIDTH+7)/8,
- /* tile_hight = */ (CHGR_HEIGHT+7)/8,
- /* default_x_offset = */ 0,
- /* flipmode_x_offset = */ 0,
- /* pixel_width = */ CHGR_WIDTH,
- /* pixel_height = */ CHGR_HEIGHT
- };
- uint8_t u8x8_d_utf8(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
- {
- u8g2_uint_t x, y, c;
- uint8_t *ptr;
- switch(msg)
- {
- case U8X8_MSG_DISPLAY_SETUP_MEMORY:
- u8x8_d_helper_display_setup_memory(u8g2, &u8x8_utf8_info);
- break;
- case U8X8_MSG_DISPLAY_INIT:
- u8x8_d_helper_display_init(u8g2);
- chgr_clear();
- 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;
- //printf("U8X8_MSG_DISPLAY_DRAW_TILE x=%d, ", x);
- x *= 8;
- x += u8g2->x_offset;
-
- y = ((u8x8_tile_t *)arg_ptr)->y_pos;
- //printf("y=%d, c=%d\n", y, ((u8x8_tile_t *)arg_ptr)->cnt);
- y *= 8;
-
- do
- {
- c = ((u8x8_tile_t *)arg_ptr)->cnt;
- ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
- chgr_set_multiple_8pixel(x, y, c*8, ptr, 1);
- arg_int--;
- x += c*8;
- } while( arg_int > 0 );
- break;
- default:
- return 0;
- }
- return 1;
- }
- void u8x8_Setup_Utf8(u8x8_t *u8x8)
- {
- /* setup defaults */
- u8x8_SetupDefaults(u8x8);
-
- /* setup specific callbacks */
- u8x8->display_cb = u8x8_d_utf8;
- /* setup display info */
- u8x8_SetupMemory(u8x8);
- }
- void u8g2_SetupBuffer_Utf8(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb)
- {
- static uint8_t buf[CHGR_WIDTH*8]; // i guess this is to big. it should be (CHGR_WIDTH+7)/8
-
- u8x8_Setup_Utf8(u8g2_GetU8x8(u8g2));
- // u8g2_ll_hvline_vertical_top_lsb
- // u8g2_ll_hvline_horizontal_right_lsb
-
- u8g2_SetupBuffer(u8g2, buf, 1, u8g2_ll_hvline_vertical_top_lsb, u8g2_cb);
- }
- void utf8_show(void)
- {
- chgr_show();
- }
|