예제 #1
0
파일: tsd_com.c 프로젝트: Flyagin/BS-MRZV
//------------------------------------------------------------------------------
/// Clears a calibration point from the given buffer.
/// \param pLcdBuffer  LCD buffer to draw on.
/// \param pPoint  Calibration point to clear.
//------------------------------------------------------------------------------
static void ClearCalibrationPoint(
    void *pLcdBuffer,
    const CalibrationPoint *pPoint)
{
    LCDD_DrawRectangle(pLcdBuffer,
                       pPoint->x - POINTS_SIZE / 2,
                       pPoint->y - POINTS_SIZE / 2,
                       POINTS_SIZE,
                       POINTS_SIZE,
                       COLOR_WHITE);
}
예제 #2
0
//clear display box zone with color
void ClearDispBoxZoneColor(unsigned int dispBoxID, unsigned int color)
{
  if(IsDispBoxRegionAvail() && IsDispBoxEnable(dispBoxID)) {

    LCDD_DrawRectangle((void *)BOARD_LCD_BASE, \
                        dispBoxMgr.dispBoxInfo[dispBoxID - 1].dispBoxZone.left,
                        dispBoxMgr.dispBoxInfo[dispBoxID - 1].dispBoxZone.top,
                        dispBoxMgr.dispBoxInfo[dispBoxID - 1].dispBoxZone.width,
                        dispBoxMgr.dispBoxInfo[dispBoxID - 1].dispBoxZone.height,
                        color);
  }
}
예제 #3
0
static void prvLCDTask( void *pvParameters )
{
xLCDMessage xMessage;
unsigned long ulY = 0;
const unsigned long ulX = 5;
const unsigned long ulMaxY = 250, ulYIncrement = 22, ulWidth = 250, ulHeight = 20;;

    /* Initialize LCD. */
    LCDD_Initialize();
    LCDD_Start();
	LCDD_Fill( ( void * ) BOARD_LCD_BASE, COLOR_WHITE );
	LCDD_DrawString( ( void * ) BOARD_LCD_BASE, 1, ulY + 3, "  www.FreeRTOS.org", COLOR_BLACK );

	for( ;; )
	{
		/* Wait for a message from the check function (which is executed in
		the tick hook). */
		xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY );

		/* Clear the space where the old message was. */
        LCDD_DrawRectangle( ( void * ) BOARD_LCD_BASE, 0, ulY, ulWidth, ulHeight, COLOR_WHITE );

		/* Increment to the next drawing position. */
		ulY += ulYIncrement;

		/* Have the Y position moved past the end of the LCD? */
		if( ulY >= ulMaxY )
		{
			ulY = 0;
		}

		/* Draw a new rectangle, in which the message will be written. */
        LCDD_DrawRectangle( ( void * ) BOARD_LCD_BASE, 0, ulY, ulWidth, ulHeight, COLOR_GREEN );

		/* Write the message. */
        LCDD_DrawString( ( void * ) BOARD_LCD_BASE, ulX, ulY + 3, xMessage.pcMessage, COLOR_BLACK );
	}
}
예제 #4
0
//------------------------------------------------------------------------------
/// Draw a string in display box with 'color'
/// \param pBuffer, LCD base address
/// \param dispBoxID, display box ID
/// \param pStr, string to draw
/// \param fontColor, font color
/// \param bgColor, background color
/// \param scrollFlag, idendtify if cleaning display box zone when scrolling back
///                    to display box start position
//------------------------------------------------------------------------------
void DrawStringInDispBox(
    //pointer to LCD base address
    void *pBuffer,
    //display box index
    unsigned int dispBoxID,
    //pointer to string for show
    const char *pStr,
    //display string font color,
    unsigned int fontColor,
    //display string background color, 0xFFFFFFFF means no need to set bgColor
    unsigned int bgColor,
    //flag for scroll way, current only support 'clear or not clear display box'
    //when display string reach end and roll back to show. 
    //0 means clear, 1 means don't clear.
    unsigned int scrollFlag)
{
  unsigned int strWidth = 0;
  unsigned int strHeight = 0;
  extern const Font gFont;
  const char *pString = pStr;
  
  //text direction
  unsigned int dir = 0;
  
  ////////////////////////////////////
  unsigned int width = 0;
  unsigned int height = 0;
  unsigned int left = 0;
  unsigned int top = 0;
  ///////////////////////////////////
  TRACE_DEBUG(" draw string on lcd len is %u\n\r", strlen(pStr));
  
  //no display box or disabled
  if(!IsDispBoxRegionAvail() || !IsDispBoxEnable(dispBoxID)) {
    //then display information on DBGU console;
    printf("\n\r %s", pStr);
    return;
  }
  
#if defined(LCDC_HX8347)
  
  
  if(LCDD_IsBusy()) return;
  
  LCDD_SetBusy();
  
  //a temp way to resolve display direction. Further will be improved based on requirement
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x16, 0x68);//); // MY=1, MX=0, MV=1, BGR=1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x02, 0x00); // Column address start2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x03, 0x00); // Column address start1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x04, 0x01); // Column address end2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x05, 0x3F); // Column address end1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x06, 0x00); // Row address start2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x07, 0x00); // Row address start1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x08, 0x00); // Row address end2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x09, 0xEF); // Row address end1
  
  LCDD_ClearBusy();
#endif
  ////////////////////////////////////////////
  
  if(gDir < 3 && gDir > 0)
    //if(gDir >= 3 || gDir == 0)
  {
    // the protrait view,coordinates was changed after loading
    //the Y is mirrored and x-y changed
    height = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.width;
    //the width is to meet the algorithm calculating string lines
    
    width  = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.height;
    //it's strange but useful
    left = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.left + height;
    top = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.top ;
    
    
    //for vertical 
    dir = 1;
    
    
  }
  else
  {
    width = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.width;
    height = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.height;
    top = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.top;
    left = dispBoxMgr.dispBoxInfo[dispBoxID-1].dispBoxZone.left;
    
    dir = 0;
    
  }
  //count lines the string will use
  ////////////////////////////////////////////
  //back from start of display box, then clear dispbox zone
  
  
  if(\
    (dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor == \
      left + DISPMARGIN) \
        && \
          (dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor == \
            top + LINEDISTANCE)\
              )
  {            
    ClearDispBoxZoneDefault(dispBoxID);
  }
  
  if(dir)
  {
    if(\
      (dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor == \
        left - DISPMARGIN) \
          && \
            (dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor == \
              top + LINEDISTANCE)\
                )
    {            
      ClearDispBoxZoneDefault(dispBoxID);
    }
  }
  
  LCDD_GetStringSize(pString, &strWidth, &strHeight);
  
  TRACE_DEBUG(" string width and height in pixel is %u, %u\n\r", strWidth, strHeight);
  
  //count lines the string will use
  unsigned int linecnt = \
    (strWidth + CHARDISTANCE) \
      / (width - DISPMARGIN) + 1;
  
  //get how many chars the dispbox width can show
  //to be consistent with lib API, a char width is gFont.width + CHARDISTANCE
  unsigned int numCharLine = (width - DISPMARGIN) \
    / (gFont.width + CHARDISTANCE) - 1;
  
  //if line count larger than current position to bottom of dispbox, clear dispbox area,
  //reinit x,y to start of dispbox
  if( linecnt * (gFont.height + LINEDISTANCE) \
    > \
      (height - \
        (dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor - \
          top - LINEDISTANCE))\
            ) 
  {
    if(scrollFlag == 0) {
      LCDD_DrawRectangle((void *)BOARD_LCD_BASE, 
                         left,
                         top,
                         width,
                         height,
                         dispBoxMgr.dispBoxInfo[dispBoxID-1].bgColor);
    }
    
    dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor = \
      left + DISPMARGIN;
    dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor = \
      top + LINEDISTANCE;    
  }
  
  if(dir)
  {
    if( linecnt * (gFont.height + LINEDISTANCE) \
      > \
        (height - \
          (left - dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor  \
            - LINEDISTANCE))\
              ) 
    {
      if(scrollFlag == 0) {
        //      LCDD_DrawRectangle((void *)BOARD_LCD_BASE, 
        //                         left,
        //                         top,
        //                         width,
        //                         height,
        //                         dispBoxMgr.dispBoxInfo[dispBoxID-1].bgColor);
        ClearDispBoxZoneDefault(dispBoxID);
      }
      
      dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor = \
        left - DISPMARGIN;
      dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor = \
        top + LINEDISTANCE;    
    }
  }
  
  //if whole string show height larger than dispbox height, then only show the content 
  //inside dispbox, the rest is not shown any more
  if((linecnt * (gFont.height + LINEDISTANCE) > \
    height)) {
      linecnt  = height / (gFont.height+LINEDISTANCE);
      //shrink string to a full dispbox size.
      strWidth = linecnt * numCharLine * (gFont.width+CHARDISTANCE);
    }
  
  TRACE_DEBUG(" numcharline is %u, linecnt is %u\n\r", numCharLine, linecnt);
  
  unsigned int i;
  for(i = 0; i < linecnt; ++i) {
    char stringline[80];
    if(i == linecnt - 1) {
      //the last char doesn't have additional CHARDISTANCE, to meet API in lib
      memcpy(stringline, pString, (strWidth+CHARDISTANCE) / (gFont.width+CHARDISTANCE) + 1);
      stringline[(strWidth+CHARDISTANCE)/(gFont.width+CHARDISTANCE)] = '\0';
    } else {
      memcpy(stringline, pString, numCharLine);
      stringline[numCharLine] = '\0';
      strWidth -= numCharLine * (gFont.width+CHARDISTANCE);
    }
    
    //forward pString to next line
    pString += numCharLine;
    
    //draw string
    if(bgColor == 0xFFFFFFFF) {
      LCDD_DrawStringEx((void *)BOARD_LCD_BASE,
                        dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor,
                        dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor,
                        stringline,
                        fontColor,dir);
    }else {
      LCDD_DrawStringWithBGColorEx((void *)BOARD_LCD_BASE,
                                   dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor,
                                   dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor,
                                   stringline,
                                   fontColor,
                                   bgColor,dir);
    }
    
    //move x, y to next line, to be consistent with lib api, height is gFont.height + 2
    if(dir)
    {
      // xCursor is vertical to the direction of text,along with the lines of text
      dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor -=  (gFont.height + LINEDISTANCE);
      dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor = \
        top + DISPMARGIN;
      
    }
    else
    {
      dispBoxMgr.dispBoxInfo[dispBoxID-1].xCursor = \
        left + DISPMARGIN;
      dispBoxMgr.dispBoxInfo[dispBoxID-1].yCursor += gFont.height + LINEDISTANCE;
    }
    
  }
  
#if defined(LCDC_HX8347)  
  
  if(LCDD_IsBusy()) return;
  
  LCDD_SetBusy();
  
  //restore previous direction setting
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x16, 0xC8);//); // MY=1, MX=1, MV=0, BGR=1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x02, 0x00); // Column address start2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x03, 0x00); // Column address start1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x04, 0x00); // Column address end2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x05, 0xEF); // Column address end1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x06, 0x00); // Row address start2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x07, 0x00); // Row address start1
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x08, 0x01); // Row address end2
  LCD_WriteReg((void *)BOARD_LCD_BASE, 0x09, 0x3F); // Row address end1
  
  LCDD_ClearBusy();
#endif
}