示例#1
0
文件: camera.c 项目: z80/stm32f429
/**
  * @brief  Camera line event callback when no camera image rotation is required
  * @param  None
  * @retval None
  */
static void Camera_LineEventCallbackNoRotation(void)
{
  uint32_t LcdResX = BSP_LCD_GetXSize();
  uint32_t LcdResY = BSP_LCD_GetYSize();

  if (refresh_authorized)
  {
    if ((offset_lcd == 0) && (CameraResX <= LcdResX) && (CameraResY <= LcdResY))
    {
      /* If Camera resolution is lower than LCD resolution, set display in the middle of the screen */
      offset_lcd =   ((((LcdResY - CameraResY) / 2) * LcdResX)   /* Middle of the screen on Y axis */
                      +   ((LcdResX - CameraResX) / 2))             /* Middle of the screen on X axis */
                     * sizeof(uint32_t);

      if ((CameraResY == CAMERA_QQVGA_RES_Y) || (CameraResIndex == CAMERA_R480x272))
      { /* Add offset for QQVGA */
        offset_lcd += 40 * LcdResX * sizeof(uint32_t);
      }
    }

    if (display_line_counter < CameraResY)
    {
      if (display_line_counter < LcdResY)
      {
        if (CameraResX < LcdResX)
        {
          ConvertCameraLineRgb565ToLcdLineARGB8888((uint32_t *)(CAMERA_FB_START_ADDR + offset_cam),
                                                   (uint32_t *)(LCD_FB_START_ADDRESS + offset_lcd),
                                                   CameraResX);
        }
        else
        {
          ConvertCameraLineRgb565ToLcdLineARGB8888((uint32_t *)(CAMERA_FB_START_ADDR + offset_cam),
                                                   (uint32_t *)(LCD_FB_START_ADDRESS + offset_lcd),
                                                   LcdResX);
        }

        offset_cam  = offset_cam + (CameraResX * sizeof(uint16_t));
        offset_lcd  = offset_lcd + (LcdResX * sizeof(uint32_t));
      }

      display_line_counter++;
    }
    else
    {
      offset_cam = 0;
      offset_lcd = 0;
      display_line_counter = 0;
    }
  }
}
示例#2
0
/**
  * @brief  Camera line event callback
  * @param  None
  * @retval None
  */
void BSP_CAMERA_LineEventCallback(void)
{
  uint32_t LcdResX = BSP_LCD_GetXSize();
  uint32_t LcdResY = BSP_LCD_GetYSize();
#if 0
  uint32_t           bgr, i, sizex;
  uint32_t           *ptr;
#endif

  if (Camera_AllowDma2dCopyCamFrmBuffToLcdFrmBuff)
  {
    if ((offset_lcd == 0) && (CameraResX < LcdResX) && (CameraResY < LcdResY))
    {
      /* If Camera resolution is lower than LCD resolution, set display in the middle of the screen */
      offset_lcd =   ((((LcdResY - CameraResY) / 2) * LcdResX)   /* Middle of the screen on Y axis */
                      +   ((LcdResX - CameraResX) / 2))             /* Middle of the screen on X axis */
                     * sizeof(uint32_t);

      if (CameraResY == CAMERA_QQVGA_RES_Y)
      { /* Add offset for QQVGA */
        offset_lcd += 40 * LcdResX * sizeof(uint32_t);
      }
    }

    if (display_line_counter < CameraResY)
    {
      if (display_line_counter < LcdResY)
      {
        if (CameraResX < LcdResX)
        {
          ConvertCameraLineRgb565ToLcdLineARGB8888((uint32_t *)(CAMERA_FRAME_BUFFER + offset_cam),
                                                   (uint32_t *)(LCD_FRAME_BUFFER + offset_lcd),
                                                   CameraResX);
        }
        else
        {
          ConvertCameraLineRgb565ToLcdLineARGB8888((uint32_t *)(CAMERA_FRAME_BUFFER + offset_cam),
                                                   (uint32_t *)(LCD_FRAME_BUFFER + offset_lcd),
                                                   LcdResX);
        }

#if 0
        /* Convert RGB -> BGR */
        ptr = (uint32_t*)(LCD_FRAME_BUFFER + offset_lcd);
        if (CameraResX < LcdResX)
          sizex = CameraResX;
        else
          sizex = LcdResX;

        for (i = 0; i < sizex; i++)
        {
          bgr = ptr[i] & 0xFF00FF00;  /* Alpha and green */
          bgr |= (ptr[i] & 0x00FF0000) >> 16 ; /* blue */
          bgr |= (ptr[i] & 0x000000FF) << 16 ; /* red  */
          ptr[i] = bgr;
        }
#endif
        offset_cam  = offset_cam + (CameraResX * sizeof(uint16_t));
        offset_lcd  = offset_lcd + (LcdResX * sizeof(uint32_t));
      }
      display_line_counter++;
    }
    else
    {
      offset_cam = 0;
      offset_lcd = 0;
      display_line_counter = 0;
    }
  }