Функция рисования графика перенесена в gfx_lib и автоматизирована

This commit is contained in:
2025-02-21 12:19:14 +03:00
parent 411b9c2cf0
commit d58273fe41
9 changed files with 461 additions and 187 deletions

View File

@@ -17,13 +17,35 @@
uint8_t chSpacing = 0; //межсимвольный интервал в px
/* функция очистки буфера кадра */
void GFX_Clean_Buffer_Frame(uint8_t *Buffer_Frame, uint32_t Buffer_Frame_Size)
void GFX_Clean_Buffer_Frame(uint8_t *Buffer_Frame)
{
if(Buffer_Frame == NULL)
return;
memset(Buffer_Frame, 0x00, Buffer_Frame_Size);
memset(Buffer_Frame, 0x00, GFX_BufferHeight*GFX_BufferWidth/8);
}
/* Функция очистки прямоугольной области */
void GFX_Clean_Area(uint8_t *Buffer_Frame, uint16_t xPos_Start, uint16_t yPos_Start, uint16_t width, uint16_t height)
{
if(Buffer_Frame == NULL)
return;
if ((xPos_Start+width > GFX_BufferWidth)||(xPos_Start < 0)||(yPos_Start+ height> GFX_BufferHeight)||(yPos_Start < 0))
{
//если значения по x и y больше пределов то выходим из функции
return;
}
for (uint16_t xPos = xPos_Start; xPos < xPos_Start + width; xPos++)
{
for(uint16_t yPos = yPos_Start; yPos < yPos_Start + height; yPos++)
{
uint16_t arrayPos = xPos + ((yPos/8)*GFX_BufferWidth);
Buffer_Frame[arrayPos] &= ~(1 << (yPos % 8)); // Очищаем бит, отвечающий за пиксель
}
}
}
/* функция прорисовки пикселя */
void GFX_Draw_Pixel(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t pxColor)
{
@@ -377,6 +399,17 @@ void GFX_Draw_Triangle(uint8_t *Buffer_Frame, GFX_TriangleHandleTypeDef *hTriang
__GFX_Draw_Line(Buffer_Frame, xPos2, yPos2, xPos3, yPos3, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos3, yPos3, xPos1, yPos1, pxColor);
}
/* функция рисования стрелки */
void GFX_Draw_Arrow(uint8_t *Buffer_Frame, GFX_ArrowHandleTypeDef *hArrow)
{
uint8_t xPos = hArrow->xPos;
uint8_t yPos = hArrow->yPos;
uint8_t size = hArrow->size;
uint16_t angle = hArrow->angle;
uint8_t pxColor = hArrow->pxColor;
__GFX_Draw_Arrow(Buffer_Frame, xPos, yPos, size, angle, pxColor);
}
/* Функция рисования дуги (четверти окружности) */
void GFX_Draw_Arc(uint8_t *Buffer_Frame, GFX_ArcHandleTypeDef *hArc)
@@ -401,6 +434,116 @@ void GFX_Draw_Arc(uint8_t *Buffer_Frame, GFX_ArcHandleTypeDef *hArc)
}
}
/* Функция вывода графика */
void GFX_Draw_Plotter(uint8_t *Buffer_Frame, GFX_PlotterFloatHandleTypeDef *hPlot)
{
if((Buffer_Frame == NULL) || (hPlot == NULL))
return;
if((hPlot->plotHeight == NULL) || (hPlot->plotWidth == NULL))
return;
if((hPlot->yPos + hPlot->plotHeight == NULL) || (hPlot->xPos + hPlot->plotWidth == NULL))
return;
if(hPlot->__initialized == 0)
{
hPlot->__initialized = 1;
hPlot->plotInd = 0;
GFX_Clean_Buffer_Frame(Buffer_Frame);
if(hPlot->plotXAxis)
{
__GFX_Draw_Line(Buffer_Frame, hPlot->xPos, hPlot->yPos+hPlot->plotHeight/2, hPlot->xPos+hPlot->plotWidth-1, hPlot->yPos+hPlot->plotHeight/2, 1);
__GFX_Draw_Arrow(Buffer_Frame, hPlot->xPos+hPlot->plotWidth-1, hPlot->yPos+hPlot->plotHeight/2, 2, 0, 1);
}
if(hPlot->plotYAxis)
{
__GFX_Draw_Line(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->xPos, hPlot->yPos+hPlot->plotHeight-1, 1);
__GFX_Draw_Arrow(Buffer_Frame, hPlot->xPos, hPlot->yPos, 2, 90, 1);
}
if(hPlot->plotFrame)
{
__GFX_Draw_Rectangle(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->plotWidth-1, hPlot->plotHeight-1, 1);
}
}
/* Подготовка к выводу графика */
if((hPlot->pixX < hPlot->xPos) || (hPlot->pixX >= hPlot->plotWidth))
{
hPlot->pixX = hPlot->xPos;
GFX_Clean_Area(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->plotWidth, hPlot->plotHeight);
if(hPlot->plotXAxis)
{
__GFX_Draw_Line(Buffer_Frame, hPlot->xPos, hPlot->yPos+hPlot->plotHeight/2, hPlot->xPos+hPlot->plotWidth-1, hPlot->yPos+hPlot->plotHeight/2, 1);
__GFX_Draw_Arrow(Buffer_Frame, hPlot->xPos+hPlot->plotWidth-1, hPlot->yPos+hPlot->plotHeight/2, 2, 0, 1);
}
if(hPlot->plotYAxis)
{
__GFX_Draw_Line(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->xPos, hPlot->yPos+hPlot->plotHeight-1, 1);
__GFX_Draw_Arrow(Buffer_Frame, hPlot->xPos, hPlot->yPos, 2, 90, 1);
}
if(hPlot->plotFrame)
{
__GFX_Draw_Rectangle(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->plotWidth-1, hPlot->plotHeight-1, 1);
}
}
/* Расчет позиции пикселя */
float pix_y_float = (hPlot->pDataPtr[(int)hPlot->plotInd]);
// масштабирование под размеры графика
hPlot->pixY = (pix_y_float/hPlot->dataMax)*(hPlot->plotHeight);
// если график должен быть знаковым, то уменьшаем машстаб еще в два раза
if(hPlot->signedData)
hPlot->pixY = (hPlot->pixY + hPlot->plotHeight)/2;
// инвертирование y потому что он считается сверху вниз
uint8_t plot_y_down = hPlot->yPos + hPlot->plotHeight;
hPlot->pixY = plot_y_down - hPlot->pixY;
// Сдвиг графика
hPlot->pixY += hPlot->plotShift;
/* Вывод пикселя позиции пикселя */
// Передний фронт
if(hPlot->pixY - hPlot->prevPixY > 0)
{
/* Цикл для заполнения пикселей по вертикали, когда фронт очень резкий */
for(int y = hPlot->prevPixY+1; y <= hPlot->pixY; y++)
{
if((y<=hPlot->yPos+hPlot->plotHeight) && (y>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->pixX, y, 1);
}
}// Задний фронт
else if (hPlot->pixY - hPlot->prevPixY < 0)
{
/* Цикл для заполнения пикселей по вертикали, когда фронт очень резкий */
for(int y = hPlot->prevPixY-1; y >= hPlot->pixY; y--)
{
if((y<=hPlot->yPos+hPlot->plotHeight) && (y>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->pixX, y, 1);
}
}// Плато
else
{
if((hPlot->pixY<=hPlot->yPos+hPlot->plotHeight) && (hPlot->pixY>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->pixX, hPlot->pixY, 1);
}
/* Смещение графика далее */
hPlot->pixX++;
hPlot->plotInd += hPlot->plotSpeed;
if(hPlot->plotInd >= hPlot->dataSize)
hPlot->plotInd -= hPlot->dataSize;
if(hPlot->plotInd < 0)
hPlot->plotInd += hPlot->dataSize;
hPlot->prevPixY = hPlot->pixY;
}
/* Функция инвертирования прямоугольной области */
void GFX_Invertion_Display(uint8_t *Buffer_Frame)
{
@@ -547,6 +690,66 @@ void __GFX_Draw_Triangle(uint8_t *Buffer_Frame,
__GFX_Draw_Line(Buffer_Frame, xPos3, yPos3, xPos1, yPos1, pxColor);
}
/* функция рисования стрелки */
void __GFX_Draw_Arrow(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t size, uint16_t angle, uint8_t pxColor)
{
int16_t x1, y1, x2, y2, x3, y3;
if(angle == 0) // >
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos - size;
x3 = xPos - size;
y3 = yPos + size;
}
else if(angle == 180) // <
{
x1 = xPos;
y1 = yPos;
x2 = xPos + size;
y2 = yPos - size;
x3 = xPos + size;
y3 = yPos + size;
}
else if(angle == 270) // ^
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos - size;
x3 = xPos + size;
y3 = yPos - size;
}
else if(angle == 90) // v
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos + size;
x3 = xPos + size;
y3 = yPos + size;
}
if(x1 < 0)
x1 = 0;
if(x2 < 0)
x2 = 0;
if(x3 < 0)
x3 = 0;
if(y1 < 0)
y1 = 0;
if(y2 < 0)
y2 = 0;
if(y3 < 0)
y3 = 0;
__GFX_Draw_Line(Buffer_Frame, x1, y1, x2, y2, pxColor);
__GFX_Draw_Line(Buffer_Frame, x1, y1, x3, y3, pxColor);
}
/* Функция рисования дуги (четверти окружности) */
void __GFX_Draw_Arc(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t radius, uint16_t startAngle, uint16_t endAngle, uint8_t pxColor)
{