Функция рисования графика перенесена в gfx_lib и автоматизирована
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user