fix "wiggle" name mode; break out rotate for possible future use in other modes

This commit is contained in:
true 2024-10-26 19:44:34 -07:00
parent 279c7d3c68
commit 2eda3f2ebb
2 changed files with 33 additions and 25 deletions

View File

@ -29,7 +29,7 @@ void menu_tick()
if ((menu == &menu_6) && (menu_idx == 5)) { // about > accelerometer
// accelerometer page never flips
ssd1306_set_flipmirror(0);
} else if (menu != &menu_none) { // nametag
} else if (menu != &menu_none) { // not nametag
if (sysflags & SYS_OLED_ROTATE_X) {
ssd1306_set_flipmirror(1);
} else {

View File

@ -102,6 +102,35 @@ static void menu_none_print_error(uint8_t *err1, uint8_t *err2, uint8_t *err3)
return;
}
__HIGH_CODE
static int8_t rotate_copy(int8_t top, int8_t left, int8_t rot, uint8_t font_idx, uint8_t *txt)
{
int8_t o, w;
// set target buffer, need to do this before width calc
// as this will have the halfwidth bit set appropriately
ssd1306fb_set_target(&rotsrc);
// get left drawing position, so the character is rendered centered
o = ssd1306fb_get_str_width(font_table[font_idx].font, txt, 1, 0);
w = ((rotsrc.width >> 1) - (o >> 1));
// clear buffers before work
ssd1306_cls(&rotdst);
ssd1306_cls(&rotsrc);
// render and rotate
ssd1306fb_set_cursor(w, top);
ssd1306fb_draw_str(font_table[uconf.font_idx].font, txt, 0);
ssd1306fb_rotate(&rotsrc, &rotdst, rot);
// copy dst buffer to oled buffer in correct position
ssd1306fb_set_target(&oled);
ssd1306fb_copy(left - w, 0, ROTATE_TARGET_WIDTH, ROTATE_TARGET_HEIGHT, rotdst.fb);
return o;
}
__HIGH_CODE
void menu_none_disp(uint8_t idx)
{
@ -117,7 +146,7 @@ void menu_none_disp(uint8_t idx)
uint8_t disp_mode;
char txt[6];
char txt[6] = {0};
menu_none_init();
@ -202,13 +231,11 @@ MENU_0_DISP_CHAR_ROTATE:
ssd1306fb_set_color(SSD1306_STATE_SET_PIXEL);
menu_none_set_halfwidth(&rotsrc);
txt[1] = 0;
for (i = 0; i < strlen(uconf.name); i++) {
j = i;
// change character order
if (uconf.nameconf & UCONF_NAME_DISP_MASK) {
if ((uconf.nameconf & UCONF_NAME_DISP_MASK) == UCONF_NAME_DISP_CHAR_ROTATE) {
// this method is a bit jumpy, but works for now
if (sysflags & SYS_OLED_REVERSE_CHARS) {
j = strlen(uconf.name) - i - 1;
@ -217,26 +244,7 @@ MENU_0_DISP_CHAR_ROTATE:
txt[0] = uconf.name[j];
// set target buffer, need to do this before width calc
// as this will have the halfwidth bit set appropriately
ssd1306fb_set_target(&rotsrc);
// get left drawing position, so the character is rendered centered
o = ssd1306fb_get_str_width(font_table[uconf.font_idx].font, txt, 1, 0);
w = ((rotsrc.width >> 1) - (o >> 1));
// clear buffers before work
ssd1306_cls(&rotdst);
ssd1306_cls(&rotsrc);
// render and rotate
ssd1306fb_set_cursor(w, top);
ssd1306fb_draw_str(font_table[uconf.font_idx].font, txt, 0);
ssd1306fb_rotate(&rotsrc, &rotdst, rot);
// copy dst buffer to oled buffer in correct position
ssd1306fb_set_target(&oled);
ssd1306fb_copy(left - w, 0, ROTATE_TARGET_WIDTH, ROTATE_TARGET_HEIGHT, rotdst.fb);
o = rotate_copy(top, left, rot, uconf.font_idx, txt);
// update position of character based on spacing
left += o + uconf.char_spacing;