#include "IOCTL.h"
#include "SharedBuffer.h"

#include <cstring>
#include <linux/ioctl.h>

#include "mxcfb.h"

int
handleIOCTL(unsigned long request, char* ptr) {
  if (request == FBIOGET_VSCREENINFO) {

    fb_var_screeninfo* screeninfo = (fb_var_screeninfo*)ptr;
    screeninfo->xres = fb_width;
    screeninfo->yres = fb_height;
    screeninfo->grayscale = 0;
    screeninfo->bits_per_pixel = 8 * fb_pixel_size;
    screeninfo->xres_virtual = fb_width;
    screeninfo->yres_virtual = fb_height;

    // set to RGB565
    screeninfo->red.offset = 11;
    screeninfo->red.length = 5;
    screeninfo->green.offset = 5;
    screeninfo->green.length = 6;
    screeninfo->blue.offset = 0;
    screeninfo->blue.length = 5;

    return 0;
  } else if (request == FBIOGET_FSCREENINFO) {

    fb_fix_screeninfo* screeninfo = (fb_fix_screeninfo*)ptr;
    screeninfo->smem_len = fb_size;
    screeninfo->smem_start = (unsigned long)0x1000;
    screeninfo->line_length = fb_width * fb_pixel_size;
    constexpr char fb_id[] = "mxcfb";
    std::memcpy(screeninfo->id, fb_id, sizeof(fb_id));

    return 0;
  } else {
    return 0;
  }
}