mirror of
https://github.com/Valeh2012/PersonalVotingMachine
synced 2024-11-23 09:41:01 +02:00
236 lines
5.1 KiB
C
236 lines
5.1 KiB
C
|
|
||
|
#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();
|
||
|
}
|