[wip] working on display graph
This commit is contained in:
57
firmware/shared_libs/bitmaps/bitmap_wave.c
Normal file
57
firmware/shared_libs/bitmaps/bitmap_wave.c
Normal file
@@ -0,0 +1,57 @@
|
||||
#include "main.h"
|
||||
|
||||
#include "bitmap_wave.h"
|
||||
|
||||
// clang-format off
|
||||
const uint8_t wave_sin[] = {
|
||||
// res: 48x25(32) - 192 bytes
|
||||
0x00,0x00,0x80,0x60,0x10,0x08,0x04,0x04,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02,
|
||||
0x04,0x04,0x08,0x10,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x18,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x18,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x40,
|
||||
0x80,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
};
|
||||
|
||||
const uint8_t wave_tri[] = {
|
||||
// res: 48x25(32) - 192 bytes
|
||||
0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,
|
||||
0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,
|
||||
0x10,0x20,0x40,0x80,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
};
|
||||
const uint8_t wave_sqr[] = {
|
||||
// res: 48x25(32) - 192 bytes
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||
};
|
||||
|
||||
const GFX_bitmap_t wave[WAVE_MAX] = {
|
||||
{48, 25, wave_sin},
|
||||
{48, 25, wave_tri},
|
||||
{48, 25, wave_sqr},
|
||||
};
|
||||
13
firmware/shared_libs/bitmaps/bitmap_wave.h
Normal file
13
firmware/shared_libs/bitmaps/bitmap_wave.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "display_gfx.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
WAVE_SIN,
|
||||
WAVE_TRI,
|
||||
WAVE_SQR,
|
||||
WAVE_MAX
|
||||
} BITMAP_wave_t;
|
||||
|
||||
extern const GFX_bitmap_t wave[WAVE_MAX];
|
||||
@@ -113,6 +113,7 @@ static void _backToMain(void)
|
||||
_app_data->isButtonChange = 1;
|
||||
_app_data->isGraphChange = 1;
|
||||
_app_data->isValueChange = 1;
|
||||
_app_data->isGraphChange = 1;
|
||||
}
|
||||
|
||||
static void _blockFocusAtMaxAndMin(void)
|
||||
|
||||
@@ -18,6 +18,14 @@ typedef enum
|
||||
CHANNEL_MAX
|
||||
} GEN_channel_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GEN_SIN,
|
||||
GEN_TRI,
|
||||
GEN_SQR,
|
||||
GEN_WAVE_MAX,
|
||||
} GEN_wave_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LAY_MAIN,
|
||||
@@ -53,4 +61,4 @@ typedef enum
|
||||
DISP_BTN_4,
|
||||
DISP_BTN_5,
|
||||
DISP_BTN_MAX,
|
||||
} LAY_dispBtn_t;
|
||||
} LAY_dispBtn_t;
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
#include "printf.h"
|
||||
#include "bitmap_fonts.h"
|
||||
#include "bitmap_disp_buttons.h"
|
||||
#include "bitmap_wave.h"
|
||||
#include "tim.h"
|
||||
#include "SEGGER_RTT.h"
|
||||
|
||||
#include "disp_layout.h"
|
||||
|
||||
@@ -15,7 +18,8 @@ const uint8_t marker_freq_pos_x[FREQ_MAX_DIGIT] = {76, 84, 90, 96, 105, 111, 118
|
||||
const uint8_t marker_ampl_pos_x[AMPL_MAX_DIGIT] = {82, 94, 100};
|
||||
|
||||
// clang-format off
|
||||
const GFX_bitmap_t marker = {05, 03, (uint8_t[]){0xF9,0xFB,0xFF,0xFB,0xF9,}};
|
||||
const GFX_bitmap_t marker_down = {05, 03, (uint8_t[]){0x01,0x03,0x07,0x03,0x01}};// res: 5x3(8) - 5 bytes
|
||||
const GFX_bitmap_t marker_up = {05, 03, (uint8_t[]){0x04,0x06,0x07,0x06,0x04}}; // res: 5x3(8) - 5 bytes
|
||||
|
||||
// clang-format on
|
||||
|
||||
@@ -97,12 +101,22 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data)
|
||||
app_data->isButtonChange = 0;
|
||||
}
|
||||
|
||||
static uint8_t _calcMarkePos(uint32_t value, uint32_t max)
|
||||
static uint8_t _calcMarkerPos(uint32_t value, uint32_t max)
|
||||
{
|
||||
return ((62 * value) + (max / 2)) / max;
|
||||
// return (value < 0) ? ((62 * value) - (max / 2)) / max : ((62 * value) + (max / 2)) / max;
|
||||
}
|
||||
|
||||
static uint8_t _calcPhaseShiftInPxl(uint32_t value, uint32_t max)
|
||||
{
|
||||
return ((48 * value) + (max / 2)) / max;
|
||||
}
|
||||
|
||||
static int32_t _calcVerticalShiftInPxl(int16_t value, int16_t max)
|
||||
{
|
||||
return (value < 0) ? ((12 * value) - (max / 2)) / max : ((12 * value) + (max / 2)) / max;
|
||||
}
|
||||
|
||||
static uint8_t _sizeOfCharArray(char *array)
|
||||
{
|
||||
uint8_t size = 0;
|
||||
@@ -122,7 +136,7 @@ static void _drawMeterHelper(GFX_display_t *disp, char *min, char *max, uint8_t
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)min, 62, 43, BM_NORMAL);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)max, 127 - (6 * max_size), 43, BM_NORMAL);
|
||||
// marker 0% - 62, 100% - 123
|
||||
DISP_drawBitmap(disp, &marker, 62 + pos, 35, BM_NORMAL);
|
||||
DISP_drawBitmap(disp, &marker_down, 62 + pos, 35, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t focus_digit)
|
||||
@@ -130,7 +144,7 @@ static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t foc
|
||||
DISP_clearRegion(disp, 64, 13, 66, 40);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 20, BM_NORMAL);
|
||||
_drawFreqValue(disp, freq, 20);
|
||||
DISP_drawBitmap(disp, &marker, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
DISP_drawBitmap(disp, &marker_down, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t focus_digit)
|
||||
@@ -138,7 +152,7 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc
|
||||
DISP_clearRegion(disp, 64, 13, 66, 40);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 20, BM_NORMAL);
|
||||
_drawAmplValue(disp, ampl, 20);
|
||||
DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focus_digit)
|
||||
@@ -146,7 +160,7 @@ static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focu
|
||||
DISP_clearRegion(disp, 64, 13, 66, 40);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL);
|
||||
_drawOffsValue(disp, offs, 20);
|
||||
DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t focus_digit)
|
||||
@@ -154,7 +168,7 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f
|
||||
DISP_clearRegion(disp, 64, 13, 66, 40);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL);
|
||||
_drawPhasValue(disp, phase, 20);
|
||||
DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data)
|
||||
@@ -164,20 +178,19 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data)
|
||||
{
|
||||
case LAY_FREQ:
|
||||
_drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit);
|
||||
_drawMeterHelper(disp, "1", "1M", _calcMarkePos(990000, 1000000));
|
||||
_drawMeterHelper(disp, "1", "1M", _calcMarkerPos(990000, 1000000));
|
||||
break;
|
||||
case LAY_AMPL:
|
||||
_drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit);
|
||||
_drawMeterHelper(disp, "0V", "5V", _calcMarkePos(100, 500));
|
||||
_drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(100, 500));
|
||||
break;
|
||||
case LAY_OFFS:
|
||||
fun_gen->offset = -123;
|
||||
_drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit);
|
||||
_drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100 + 250, 500 + 250));
|
||||
_drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(100 + 250, 500 + 250));
|
||||
break;
|
||||
case LAY_PHAS:
|
||||
_drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit);
|
||||
_drawMeterHelper(disp, "0", "360", _calcMarkePos(100, 500));
|
||||
_drawMeterHelper(disp, "0", "360", _calcMarkerPos(100, 500));
|
||||
break;
|
||||
case LAY_MAIN:
|
||||
DISP_clearRegion(disp, 62, 13, 66, 40);
|
||||
@@ -222,11 +235,74 @@ static void _drawValues(GFX_display_t *disp, APP_data_t *app_data)
|
||||
app_data->isValueChange = 0;
|
||||
}
|
||||
|
||||
static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl)
|
||||
{
|
||||
int8_t offs_shift = _calcVerticalShiftInPxl(offs, ampl);
|
||||
|
||||
if (offs_shift > 20)
|
||||
{
|
||||
offs_shift = 20;
|
||||
}
|
||||
if (offs_shift < -19)
|
||||
{
|
||||
offs_shift = -19;
|
||||
}
|
||||
|
||||
DISP_drawHorizontalLine(disp, 2, 31 + offs_shift, 57, GFX_WHITE);
|
||||
}
|
||||
|
||||
static void _drawMaxAmpLine(GFX_display_t *disp, int16_t offs, uint32_t ampl)
|
||||
{
|
||||
DISP_drawHorizontalLine(disp, 2, 12, 57, GFX_WHITE);
|
||||
DISP_drawBitmap(disp, &marker_up, 0, 13, BM_NORMAL);
|
||||
|
||||
DISP_drawHorizontalLine(disp, 2, 51, 57, GFX_WHITE);
|
||||
DISP_drawBitmap(disp, &marker_down, 0, 48, BM_NORMAL);
|
||||
}
|
||||
|
||||
static void _drawFunGenGraph(GFX_display_t *disp, APP_data_t *app_data)
|
||||
{
|
||||
GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator;
|
||||
|
||||
switch (fun_gen->wave)
|
||||
{
|
||||
case GEN_SIN:
|
||||
DISP_drawBitmapShift(disp, &wave[WAVE_SIN], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL);
|
||||
break;
|
||||
case GEN_TRI:
|
||||
DISP_drawBitmapShift(disp, &wave[WAVE_TRI], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL);
|
||||
break;
|
||||
case GEN_SQR:
|
||||
DISP_drawBitmapShift(disp, &wave[WAVE_SQR], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_drawOffsetLine(disp, fun_gen->offset, fun_gen->amplitude);
|
||||
// _drawMaxAmpLine(disp, fun_gen->offset, fun_gen->amplitude);
|
||||
}
|
||||
static void _drawPwmGenGraph(GFX_display_t *disp, APP_data_t *app_data)
|
||||
{
|
||||
}
|
||||
|
||||
static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data)
|
||||
{
|
||||
// input: graph type(sin, triangle, squere, pwm), frequency(info), amplitiude(value), offset(value), phase(value), invert(pwm),
|
||||
// DISP_drawSin(disp, 4, 32, 16, 0, 0);
|
||||
DISP_drawHorizontalLine(disp, 2, 32, 56, GFX_WHITE);
|
||||
DISP_drawVerticalLine(disp, 2, 12, 40, GFX_WHITE);
|
||||
|
||||
switch (app_data->curr_gen_type)
|
||||
{
|
||||
case GEN_FG_TYPE:
|
||||
_drawFunGenGraph(disp, app_data);
|
||||
break;
|
||||
case GEN_PWM_TYPE:
|
||||
_drawPwmGenGraph(disp, app_data);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
app_data->isGraphChange = 0;
|
||||
}
|
||||
@@ -234,7 +310,7 @@ static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data)
|
||||
static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data)
|
||||
{
|
||||
// input: active channel
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 2, CHANNEL1 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 1, CHANNEL1 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH2", 23, 2, CHANNEL2 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH3", 44, 2, CHANNEL3 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL);
|
||||
DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH4", 65, 2, CHANNEL4 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL);
|
||||
@@ -250,12 +326,12 @@ void LAY_drawDisplayLayout(GFX_display_t *disp, APP_data_t *app_data)
|
||||
if (app_data->isChannelChange)
|
||||
_drawChannels(disp, app_data);
|
||||
|
||||
if (app_data->isGraphChange)
|
||||
_drawGraph(disp, app_data);
|
||||
|
||||
if (app_data->isValueChange)
|
||||
_drawValues(disp, app_data);
|
||||
|
||||
if (app_data->isGraphChange)
|
||||
_drawGraph(disp, app_data);
|
||||
|
||||
if (app_data->isButtonChange)
|
||||
_drawButtons(disp, app_data);
|
||||
|
||||
|
||||
@@ -44,6 +44,31 @@ void DISP_drawPixel(GFX_display_t *disp, uint8_t x, uint8_t y, GFX_Color_t color
|
||||
break;
|
||||
}
|
||||
}
|
||||
void DISP_drawBitmapSlow(GFX_display_t *disp, const GFX_bitmap_t *bitmap, uint8_t x, uint8_t y)
|
||||
{
|
||||
uint8_t row_div_by_8 = 0;
|
||||
uint8_t mask = 0;
|
||||
uint8_t bitmap_byte = 0;
|
||||
|
||||
for (uint8_t row = 0; row < bitmap->height; row++)
|
||||
{
|
||||
row_div_by_8 = row / 8;
|
||||
mask = (row % 8);
|
||||
for (uint8_t col = 0; col < bitmap->width; col++)
|
||||
{
|
||||
|
||||
bitmap_byte = bitmap->bitmap[row_div_by_8 * bitmap->width + col];
|
||||
if (bitmap_byte & (1 << mask))
|
||||
{
|
||||
DISP_drawPixel(disp, col + x, row + y, GFX_WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
DISP_drawPixel(disp, col + x, row + y, GFX_BLACK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Draw a vertical line.
|
||||
@@ -97,7 +122,7 @@ void DISP_drawSlashLine(GFX_display_t *disp, int16_t x0, int16_t y0, int16_t x1,
|
||||
/**
|
||||
* @brief Write a perfectly vertical line
|
||||
* @param disp A pointer to display struct
|
||||
* @param x Top-most x coordinate
|
||||
* @param x Left-most x coordinate
|
||||
* @param y Top-most y coordinate
|
||||
* @param height Height in pixels
|
||||
* @param color Color of pixel WHITE(0), BLACK(1) or INVERSE(2)
|
||||
@@ -114,11 +139,11 @@ void DISP_drawVerticalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t he
|
||||
@brief Write a perfectly horizontal line
|
||||
@param disp A pointer to display struct
|
||||
@param x Left-most x coordinate
|
||||
@param y Left-most y coordinate
|
||||
@param y Top-most y coordinate
|
||||
@param width Width in pixels
|
||||
@param color Color of pixel WHITE(0), BLACK(1) or INVERSE(2)
|
||||
*/
|
||||
void DISP_drawHorizontalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, GFX_Color_t color)
|
||||
void DISP_drawHorizontalLine(GFX_display_t *disp, uint8_t x, uint8_t y, uint8_t width, GFX_Color_t color)
|
||||
{
|
||||
for (int16_t i = x; i < x + width; i++)
|
||||
{
|
||||
@@ -396,6 +421,56 @@ void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos
|
||||
}
|
||||
}
|
||||
|
||||
void DISP_drawBitmapShift(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, uint8_t shift_left, GFX_BitmapColor_t color)
|
||||
{
|
||||
if (bitmap->width + pos_x < 0 || bitmap->height + pos_y < 0)
|
||||
return;
|
||||
|
||||
uint16_t tmp_buf16, bitmap_idx, buf_idx;
|
||||
uint8_t tmp_bitmap, bitmap_row;
|
||||
|
||||
buf_bitmap_boundry_t b;
|
||||
_getBoundry(disp, &b, bitmap->width, bitmap->height, pos_x, pos_y);
|
||||
|
||||
b.bitmap_col = (b.bitmap_col + shift_left) % bitmap->width;
|
||||
for (uint8_t col = b.buf_col_first; col < b.buf_col_last; col++, b.bitmap_col = (b.bitmap_col + 1) % bitmap->width)
|
||||
{
|
||||
tmp_buf16 = 0;
|
||||
bitmap_row = b.bitmap_row_first;
|
||||
|
||||
if (b.bitmap_row_first > 0)
|
||||
{
|
||||
tmp_buf16 = _getBitmapByte(bitmap->bitmap, bitmap->width * (b.bitmap_row_first - 1) + b.bitmap_col, color) >> (8 - b.bitmap_shift);
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_buf16 = disp->buffor[b.buf_row_first * disp->width + col] & b.buf_mask_top;
|
||||
}
|
||||
|
||||
for (uint8_t buf_row = b.buf_row_first; buf_row < b.buf_row_last; buf_row++, bitmap_row++)
|
||||
{
|
||||
bitmap_idx = bitmap->width * bitmap_row + b.bitmap_col;
|
||||
buf_idx = buf_row * disp->width + col;
|
||||
|
||||
if (bitmap_idx < b.bitmap_max_idx)
|
||||
{
|
||||
tmp_bitmap = _getBitmapByte(bitmap->bitmap, bitmap_idx, color);
|
||||
tmp_buf16 |= tmp_bitmap << b.bitmap_shift;
|
||||
}
|
||||
|
||||
if (b.bitmap_row_last == buf_row)
|
||||
{
|
||||
disp->buffor[buf_idx] = (disp->buffor[buf_idx] & b.buf_mask_bottom) | (tmp_buf16 & ~(b.buf_mask_bottom));
|
||||
}
|
||||
else
|
||||
{
|
||||
disp->buffor[buf_idx] = (uint8_t)tmp_buf16;
|
||||
}
|
||||
tmp_buf16 = tmp_buf16 >> 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DISP_drawFillRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height)
|
||||
{
|
||||
GFX_bitmap_t area = {
|
||||
|
||||
@@ -51,7 +51,7 @@ typedef struct
|
||||
|
||||
void DISP_drawPixel(GFX_display_t *disp, uint8_t x, uint8_t y, GFX_Color_t color);
|
||||
void DISP_drawVerticalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t height, GFX_Color_t color);
|
||||
void DISP_drawHorizontalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, GFX_Color_t color);
|
||||
void DISP_drawHorizontalLine(GFX_display_t *disp, uint8_t x, uint8_t y, uint8_t width, GFX_Color_t color);
|
||||
void DISP_drawSlashLine(GFX_display_t *disp, int16_t x0, int16_t y0, int16_t x1, int16_t y1, GFX_Color_t color);
|
||||
void DISP_drawRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height, GFX_Color_t color);
|
||||
void DISP_drawFillRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height);
|
||||
@@ -59,5 +59,8 @@ void DISP_drawCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius
|
||||
void DISP_drawQuarterCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius, GFX_CircCorners_t corner, GFX_Color_t color);
|
||||
void DISP_drawRoundRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height, int16_t radius, GFX_Color_t color);
|
||||
void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color);
|
||||
void DISP_drawBitmapShift(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, uint8_t shift_left, GFX_BitmapColor_t color);
|
||||
void DISP_clearRegion(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height);
|
||||
void DISP_clearScreen(GFX_display_t *disp);
|
||||
|
||||
void DISP_drawBitmapSlow(GFX_display_t *disp, const GFX_bitmap_t *bitmap, uint8_t x, uint8_t y);
|
||||
|
||||
Reference in New Issue
Block a user