/** * @brief Draws an ellipse on LCD. * @param Xpos: X position * @param Ypos: Y position * @param XRadius: Ellipse X radius * @param YRadius: Ellipse Y radius * @retval None */ void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius) { int x = 0, y = -YRadius, err = 2-2*XRadius, e2; float K = 0, rad1 = 0, rad2 = 0; rad1 = XRadius; rad2 = YRadius; K = (float)(rad2/rad1); do { BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/K)), (Ypos+y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/K)), (Ypos+y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/K)), (Ypos-y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/K)), (Ypos-y), DrawProp.TextColor); e2 = err; if (e2 <= x) { err += ++x*2+1; if (-y == x && e2 <= y) e2 = 0; } if (e2 > y) err += ++y*2+1; } while (y <= 0); }
/** * @brief Displays a circle. * @param Xpos: the X position * @param Ypos: the Y position * @param Radius: the circle radius */ void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) { int32_t d;/* Decision Variable */ uint32_t curx;/* Current X Value */ uint32_t cury;/* Current Y Value */ d = 3 - (Radius << 1); curx = 0; cury = Radius; while (curx <= cury) { BSP_LCD_DrawPixel((Xpos + curx), (Ypos - cury), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - curx), (Ypos - cury), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + cury), (Ypos - curx), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - cury), (Ypos - curx), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + curx), (Ypos + cury), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - curx), (Ypos + cury), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + cury), (Ypos + curx), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - cury), (Ypos + curx), DrawProp[ActiveLayer].TextColor); if (d < 0) { d += (curx << 2) + 6; } else { d += ((curx - cury) << 2) + 10; cury--; } curx++; } }
/** * @brief Draws a character on LCD. * @param Xpos: Line where to display the character shape * @param Ypos: Start column address * @param c: Pointer to the character data * @retval None */ static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c) { uint32_t i = 0, j = 0; uint16_t height, width; uint8_t offset; uint8_t *pchar; uint32_t line; height = DrawProp[ActiveLayer].pFont->Height; width = DrawProp[ActiveLayer].pFont->Width; offset = 8 *((width + 7)/8) - width ; for(i = 0; i < height; i++) { pchar = ((uint8_t *)c + (width + 7)/8 * i); switch(((width + 7)/8)) { case 1: line = pchar[0]; break; case 2: line = (pchar[0]<< 8) | pchar[1]; break; case 3: default: line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2]; break; } for (j = 0; j < width; j++) { if(line & (1 << (width- j + offset- 1))) { BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor); } else { BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor); } } Ypos++; } }
void display_samples(uint32_t *samples) { uint32_t trigger_point = find_trigger_point(samples); //to synchronize BSP_LCD_Clear(LCD_COLOR_BLACK); for(uint32_t i = trigger_point+2; i < SIZE; i += 2) { BSP_LCD_DrawPixel(scale(samples[i]),i-trigger_point,LCD_COLOR_WHITE); } }
/** * @brief Draws a vertical line. * @param Xpos: X position * @param Ypos: Y position * @param Length: Line length * @retval None */ void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length) { uint32_t index = 0; if(lcd_drv->DrawVLine != NULL) { lcd_drv->DrawVLine(DrawProp.TextColor, Xpos, Ypos, Length); } else { for(index = 0; index < Length; index++) { BSP_LCD_DrawPixel(Xpos, Ypos + index, DrawProp.TextColor); } } }
/** * @brief Draws a circle. * @param Xpos: X position * @param Ypos: Y position * @param Radius: Circle radius * @retval None */ void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) { int32_t D; /* Decision Variable */ uint32_t CurX; /* Current X Value */ uint32_t CurY; /* Current Y Value */ D = 3 - (Radius << 1); CurX = 0; CurY = Radius; while (CurX <= CurY) { BSP_LCD_DrawPixel((Xpos + CurX), (Ypos - CurY), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - CurX), (Ypos - CurY), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + CurY), (Ypos - CurX), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - CurY), (Ypos - CurX), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + CurX), (Ypos + CurY), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - CurX), (Ypos + CurY), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + CurY), (Ypos + CurX), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - CurY), (Ypos + CurX), DrawProp.TextColor); /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); if (D < 0) { D += (CurX << 2) + 6; } else { D += ((CurX - CurY) << 2) + 10; CurY--; } CurX++; } }
/** * @brief Draws a circle. * @param Xpos: X position * @param Ypos: Y position * @param Radius: Circle radius * @retval None */ void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) { int32_t decision; /* Decision Variable */ uint32_t current_x; /* Current X Value */ uint32_t current_y; /* Current Y Value */ decision = 3 - (Radius << 1); current_x = 0; current_y = Radius; while (current_x <= current_y) { BSP_LCD_DrawPixel((Xpos + current_x), (Ypos - current_y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp.TextColor); BSP_LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp.TextColor); /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); if (decision < 0) { decision += (current_x << 2) + 6; } else { decision += ((current_x - current_y) << 2) + 10; current_y--; } current_x++; } }
/** * @brief Draws a circle. * @param Xpos: X position * @param Ypos: Y position * @param Radius: Circle radius * @retval None */ void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) { int32_t D; /* Decision Variable */ uint32_t CurX; /* Current X Value */ uint32_t CurY; /* Current Y Value */ D = 3 - (Radius << 1); CurX = 0; CurY = Radius; while (CurX <= CurY) { BSP_LCD_DrawPixel((Xpos + CurX), (Ypos - CurY), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - CurX), (Ypos - CurY), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + CurY), (Ypos - CurX), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - CurY), (Ypos - CurX), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + CurX), (Ypos + CurY), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - CurX), (Ypos + CurY), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos + CurY), (Ypos + CurX), DrawProp[ActiveLayer].TextColor); BSP_LCD_DrawPixel((Xpos - CurY), (Ypos + CurX), DrawProp[ActiveLayer].TextColor); if (D < 0) { D += (CurX << 2) + 6; } else { D += ((CurX - CurY) << 2) + 10; CurY--; } CurX++; } }
/** * @brief Open a file and draw each pixel of the corresponding file * @param xpos: x position for the image * @param xpos: y position for the image * @param BmpName : file name * @retval err: Error status (0=> success, 1=> fail) */ STORAGE_RETURN kStorage_OpenFileDrawPixel(uint16_t xpos, uint16_t ypos, uint8_t *BmpName) { uint32_t index, size, width, height; #if 0 uint32_t x; uint16_t color; #endif uint32_t bmpaddress, bit_pixel; unsigned int BytesRead; FIL file1; uint8_t *kstorage_tmpbuffer = NULL; if(f_open(&file1, (char *)BmpName, FA_READ) != FR_OK) { return KSTORAGE_ERROR_OPEN; } /* Memory allocation for the BMP header */ kstorage_tmpbuffer = malloc(sizeof(uint8_t)*30); if(kstorage_tmpbuffer==NULL) { f_close(&file1); return KSTORAGE_ERROR_MALLOC; } /* Read BMP header */ if(f_read(&file1, (char *)kstorage_tmpbuffer, 30, &BytesRead) != FR_OK) { free(kstorage_tmpbuffer); f_close(&file1); return KSTORAGE_ERROR_READ; } /* get the bmpadress */ bmpaddress = (uint32_t)kstorage_tmpbuffer; /* Read bitmap size */ size = *(uint16_t *) (bmpaddress + 2); size |= (*(uint16_t *) (bmpaddress + 4)) << 16; /* Get bitmap data address offset */ index = *(uint16_t *) (bmpaddress + 10); index |= (*(uint16_t *) (bmpaddress + 12)) << 16; /* Read bitmap width */ width = *(uint16_t *) (bmpaddress + 18); width |= (*(uint16_t *) (bmpaddress + 20)) << 16; /* Read bitmap height */ height = *(uint16_t *) (bmpaddress + 22); height |= (*(uint16_t *) (bmpaddress + 24)) << 16; /* Read bit/pixel */ bit_pixel = (*(uint16_t *) (bmpaddress + 28)) / 8; // bit_pixel = bit_pixel/8; size = (size - index); xpos = xpos + height - 1; /* Synchronize f_read right in front of the image data */ f_close (&file1); /* Memory allocation for the BMP data line */ free(kstorage_tmpbuffer); kstorage_tmpbuffer = malloc(sizeof(uint8_t)*width*bit_pixel); if(kstorage_tmpbuffer==NULL) { return KSTORAGE_ERROR_OPEN; } f_open (&file1, (TCHAR const*)BmpName, FA_READ); f_read(&file1, kstorage_tmpbuffer, index, &BytesRead); do { /* read a line */ f_read(&file1, kstorage_tmpbuffer, width*bit_pixel, &BytesRead); size -= width*bit_pixel; #if 0 /* display each pixel of the line */ for (x = 0; x < width; x++) { color = (kstorage_tmpbuffer[ 2*x+1] << 8) | kstorage_tmpbuffer[ 2 * x]; BSP_LCD_DrawPixel(xpos, ypos + x, color); } #else extern void hx8347d_SetCursor(uint16_t Xpos, uint16_t Ypos); //void LCD_IO_WriteMultipleData(uint8_t *pData, uint32_t Size); //void LCD_IO_WriteReg(uint8_t Reg); // hx8347d_WriteReg(LCD_REG_22, 0xA0); /* Set Cursor */ hx8347d_SetCursor(xpos, ypos); /* Prepare to write GRAM */ LCD_IO_WriteReg(LCD_REG_34); /* Write 16-bit GRAM Reg */ LCD_IO_WriteMultipleData(kstorage_tmpbuffer, width*bit_pixel); #endif xpos--; } while (size != 0); /* Exit : free memory, close the file */ free(kstorage_tmpbuffer); f_close(&file1); return KSTORAGE_NOERROR; }
/** * @brief Draws an uni-line (between two points). * @param x1: Point 1 X position * @param y1: Point 1 Y position * @param x2: Point 2 X position * @param y2: Point 2 Y position * @retval None */ void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0, curpixel = 0; deltax = ABS(x2 - x1); /* The difference between the x's */ deltay = ABS(y2 - y1); /* The difference between the y's */ x = x1; /* Start x off at the first pixel */ y = y1; /* Start y off at the first pixel */ if (x2 >= x1) /* The x-values are increasing */ { xinc1 = 1; xinc2 = 1; } else /* The x-values are decreasing */ { xinc1 = -1; xinc2 = -1; } if (y2 >= y1) /* The y-values are increasing */ { yinc1 = 1; yinc2 = 1; } else /* The y-values are decreasing */ { yinc1 = -1; yinc2 = -1; } if (deltax >= deltay) /* There is at least one x-value for every y-value */ { xinc1 = 0; /* Don't change the x when numerator >= denominator */ yinc2 = 0; /* Don't change the y for every iteration */ den = deltax; num = deltax / 2; numadd = deltay; numpixels = deltax; /* There are more x-values than y-values */ } else /* There is at least one y-value for every x-value */ { xinc2 = 0; /* Don't change the x for every iteration */ yinc1 = 0; /* Don't change the y when numerator >= denominator */ den = deltay; num = deltay / 2; numadd = deltax; numpixels = deltay; /* There are more y-values than x-values */ } for (curpixel = 0; curpixel <= numpixels; curpixel++) { BSP_LCD_DrawPixel(x, y, DrawProp.TextColor); /* Draw the current pixel */ num += numadd; /* Increase the numerator by the top of the fraction */ if (num >= den) /* Check if numerator >= denominator */ { num -= den; /* Calculate the new numerator value */ x += xinc1; /* Change the x as appropriate */ y += yinc1; /* Change the y as appropriate */ } x += xinc2; /* Change the x as appropriate */ y += yinc2; /* Change the y as appropriate */ } }
/** * @brief Open a file and copy its content to a buffer * @param Xpoz: X position * @param Ypoz: Y position * @param BmpName: A pointer to the Bmp file name * @retval err: Error status (0=> success, 1=> fail) */ uint32_t Storage_OpenReadFile(uint8_t Xpoz, uint16_t Ypoz, const char *BmpName) { uint32_t index = 0, size = 0, width = 0, height = 0, i1 = 0, x = 0, y = 159; uint32_t bmpaddress, bit_pixel = 0; FIL file1; uint16_t color = 0; f_open(&file1, BmpName, FA_READ); f_read(&file1, aBuffer, 30, &BytesRead); bmpaddress = (uint32_t)aBuffer; /* Read bitmap size */ size = *(uint16_t *) (bmpaddress + 2); size |= (*(uint16_t *) (bmpaddress + 4)) << 16; /* Get bitmap data address offset */ index = *(uint16_t *) (bmpaddress + 10); index |= (*(uint16_t *) (bmpaddress + 12)) << 16; /* Read bitmap width */ width = *(uint16_t *) (bmpaddress + 18); width |= (*(uint16_t *) (bmpaddress + 20)) << 16; /* Read bitmap height */ height = *(uint16_t *) (bmpaddress + 22); height |= (*(uint16_t *) (bmpaddress + 24)) << 16; /* Read bit/pixel */ bit_pixel = *(uint16_t *) (bmpaddress + 28); bit_pixel = bit_pixel/8; size = (size - index); /* Synchronize f_read right in front of the image data */ f_close (&file1); f_open (&file1, (TCHAR const*)BmpName, FA_READ); f_read(&file1, aBuffer, index, &BytesRead); do { if(size < 512) { i1 = size; } else { i1 = 512; } size -= i1; f_read(&file1, aBuffer, i1, (UINT *)&BytesRead); for (index = 0; index < (i1/bit_pixel); index++) { if( index%bit_pixel == 0) { color = (aBuffer[ index + 1] << 8) | aBuffer[ index]; } x = index/bit_pixel; BSP_LCD_DrawPixel(x, y, color); } y--; for (index = (i1/bit_pixel); index < i1; index++) { if( index%bit_pixel == 0) { color = (aBuffer[ index + 1] << 8) | aBuffer[ index]; } x = index/bit_pixel - width; BSP_LCD_DrawPixel(x, y, color); } y--; } while (size > 0); f_close(&file1); return 1; }
void LCD_DISCO_F469NI::DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code) { BSP_LCD_DrawPixel(Xpos, Ypos, RGB_Code); }