Device-Chip-SSD1306

 view release on metacpan or  search on metacpan

lib/Device/Chip/SSD1306.xs  view on Meta::CPAN

   * contigouous rows. All data is concatenated in one big byte buffer
   */
  U8 *pixels;
};

MODULE = Device::Chip::SSD1306    PACKAGE = Device::Chip::SSD1306

void
_framebuffer_new(SV *fbsv, U8 rows, U8 columns)
  CODE:
    struct SSD1306FrameBuffer *fb;
    Newx(fb, 1, struct SSD1306FrameBuffer);

    fb->rows    = rows;
    fb->columns = columns;

    U8 pages = (rows + 7) / 8;
    Newx(fb->pixels, pages * columns, char);
    Zero(fb->pixels, pages * columns, char);

    fb->dirty_pages = 0;
    fb->dirty_xlo   = columns;
    fb->dirty_xhi   = 0xFF;

    sv_setuv(fbsv, PTR2UV(fb));

void
_framebuffer_free(SV *fbsv)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    Safefree(fb->pixels);
    Safefree(fb);

void
_framebuffer_cleaned(SV *fbsv)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    fb->dirty_pages = 0;
    fb->dirty_xlo   = fb->columns;
    fb->dirty_xhi   = 0xFF;

SV *
_framebuffer_pagedata(SV *fbsv, U8 page, U8 xlo, U8 xhi)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    if(xlo >= fb->columns || xhi >= fb->columns)
      XSRETURN_UNDEF;

    if(xlo >= xhi)
      RETVAL = newSVpvs("");
    else
      RETVAL = newSVpvn(&fb->pixels[page*fb->columns + xlo], xhi - xlo + 1);
  OUTPUT:
    RETVAL

void
_framebuffer_dirty_xlohi(SV *fbsv)
  PPCODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    EXTEND(SP, 2);
    mPUSHi(fb->dirty_xlo);
    mPUSHi(fb->dirty_xhi);
    XSRETURN(2);

bool
_framebuffer_is_dirty_page(SV *fbsv, U8 page)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));
    RETVAL = (fb->dirty_pages & (1 << page));
  OUTPUT:
    RETVAL

void
_framebuffer_clear(SV *fbsv)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    U8 pages = (fb->rows + 7) / 8;
    Zero(fb->pixels, pages * fb->columns, char);

    fb->dirty_pages = (1 << fb->rows/8) - 1;
    fb->dirty_xlo = 0;
    fb->dirty_xhi = fb->columns - 1;

void
_framebuffer_draw_pixel(SV *fbsv, U8 x, U8 y, U8 val)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    if(x >= fb->columns || y >= fb->rows)
      return;

    U8 page = (y / 8); y %= 8;
    if(val)
      fb->pixels[page*fb->columns + x] |=  (1 << y);
    else
      fb->pixels[page*fb->columns + x] &= ~(1 << y);

    fb->dirty_pages |= (1 << page);
    if(fb->dirty_xlo > x) fb->dirty_xlo = x;
    if(fb->dirty_xhi == 0xFF || fb->dirty_xhi < x) fb->dirty_xhi = x;

void
_framebuffer_draw_hline(SV *fbsv, U8 x1, U8 x2, U8 y, U8 val)
  CODE:
    struct SSD1306FrameBuffer *fb = INT2PTR(struct SSD1306FrameBuffer *, SvUV(fbsv));

    if(x1 >= fb->columns || y >= fb->rows)
      return;

    U8 page = (y / 8); y %= 8;
    for(U8 x = x1; x <= x2; x++) {
      if(x >= fb->columns)
        break;

      if(val)
        fb->pixels[page*fb->columns + x] |=  (1 << y);



( run in 0.461 second using v1.01-cache-2.11-cpan-71847e10f99 )