st7789_mpy icon indicating copy to clipboard operation
st7789_mpy copied to clipboard

Rotation not supported

Open FxIII opened this issue 5 years ago • 1 comments

I'm using this library with the DSTIKE ESP32 Watch DevKit TFT here. It works like a charm (put python into a watch was my secret dream). Alas the screen is rotated 90° cw, I added a function to set rotation :

STATIC mp_obj_t st7789_ST7789_set_rotation(mp_obj_t self_in, mp_obj_t value) {
    st7789_ST7789_obj_t *self = MP_OBJ_TO_PTR(self_in);
    mp_int_t m = mp_obj_get_int(value);
    uint8_t madctl[] = {ST7789_MADCTL_RGB};
    switch (m) {
    case 0:
      madctl[0] =  ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB ;
      write_cmd(self, ST7789_MADCTL, madctl, 1);
      break;
    case 1:
      madctl[0] =  ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB ;
      write_cmd(self, ST7789_MADCTL, madctl, 1);
      break;
    case 2:
      madctl[0] =  ST7789_MADCTL_RGB ;
      write_cmd(self, ST7789_MADCTL, madctl, 1);
      break;
    case 3:
      madctl[0] =  ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB ;
      write_cmd(self, ST7789_MADCTL, madctl, 1);
      break;
    default:
      break;
    }
    return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(st7789_ST7789_set_rotation_obj, st7789_ST7789_set_rotation);

But when setting in mode 1 there is like an offset of 80 pixels (the fill function leaves a vertical band on the right)

No clues of what next (I'm remapping everything in sw right now). Any Idea?

FxIII avatar Oct 21 '20 17:10 FxIII

Look at this fork https://github.com/russhughes/st7789_mpy

rotation argument and method ST7789.rotation(r)

STATIC void set_rotation(st7789_ST7789_obj_t *self) {
    uint8_t madctl_value = ST7789_MADCTL_RGB;

    if (self->rotation == 0) {              // Portrait
        self->width = self->display_width;
        self->height = self->display_height;
        if (self->display_height == 320 || self->display_width == 240) {
            self->xstart = 0;
            self->ystart = 0;
        }
        else if (self->display_width == 135) {
                self->xstart = 52;
                self->ystart = 40;
        }
    }
    else if (self->rotation == 1) {         // Landscape
        madctl_value |= ST7789_MADCTL_MX | ST7789_MADCTL_MV;
        self->width = self->display_height;
        self->height = self->display_width;
        if (self->display_height == 320 || self->display_width == 240) {
            self->xstart = 0;
            self->ystart = 0;
        } else if (self->display_width == 135) {
            self->xstart = 40;
            self->ystart = 53;
        }
    }
    else if (self->rotation == 2) {        // Inverted Portrait
        madctl_value |= ST7789_MADCTL_MX | ST7789_MADCTL_MY;
        self->width = self->display_width;
        self->height = self->display_height;
        if (self->display_height == 320) {
            self->xstart = 0;
            self->ystart = 0;
        } else if (self->display_width == 135) {
            self->xstart = 53;
            self->ystart = 40;
        }
        else if (self->display_width == 240) {
            self->xstart = 0;
            self->ystart = 80;
        }

    }
    else if (self->rotation == 3) {         // Inverted Landscape
        madctl_value |= ST7789_MADCTL_MV | ST7789_MADCTL_MY;
        self->width = self->display_height;
        self->height = self->display_width;
        if (self->display_height == 320) {
            self->xstart = 0;
            self->ystart = 0;
        } else if (self->display_width == 135) {
            self->xstart = 40;
            self->ystart = 52;
        }
        else if (self->display_width == 240) {
            self->xstart = 80;
            self->ystart = 0;
        }
    }
    const uint8_t madctl[] = { madctl_value };
    write_cmd(self, ST7789_MADCTL, madctl, 1);
}

jej avatar Dec 30 '20 08:12 jej