[wip] working on display graph

This commit is contained in:
2023-04-30 07:27:59 +02:00
parent 0f8a5ca047
commit b4dd5c789c
15 changed files with 663 additions and 141 deletions

View File

@@ -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);