diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h index 2338b89..9dc33bf 100644 --- a/firmware/shared_libs/controllers/ctrl_app.h +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -7,7 +7,7 @@ typedef struct { uint32_t frequency; uint16_t amplitude; - uint16_t offset; + int16_t offset; uint16_t phase; uint8_t duty; uint8_t enabled; @@ -17,7 +17,7 @@ typedef struct { uint32_t frequency; uint16_t amplitude; - uint16_t offset; + int16_t offset; uint16_t phase; uint8_t wave; uint8_t enabled; diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 418cd5b..575f3d3 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -5,6 +5,8 @@ #include "disp_layout.h" +#define abs(x) ((x) < 0 ? -(x) : (x)) + #define FREQ_MAX_DIGIT 7 #define AMPL_MAX_DIGIT 3 @@ -34,10 +36,10 @@ static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl, uint8_t pos_y) DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawOffsValue(GFX_display_t *disp, uint16_t offs, uint8_t pos_y) +static void _drawOffsValue(GFX_display_t *disp, int16_t offs, uint8_t pos_y) { uint8_t data[8]; - snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, offs % 100); + snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, abs(offs) % 100); DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } @@ -98,6 +100,7 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) static uint8_t _calcMarkePos(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 _sizeOfCharArray(char *array) @@ -138,11 +141,11 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } -static void _drawOffsValueHelper(GFX_display_t *disp, uint32_t offs, uint8_t focus_digit) +static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focus_digit) { DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL); - _drawAmplValue(disp, offs, 20); + _drawOffsValue(disp, offs, 20); DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } @@ -150,7 +153,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); - _drawAmplValue(disp, phase, 20); + _drawPhasValue(disp, phase, 20); DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } @@ -168,8 +171,9 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) _drawMeterHelper(disp, "0V", "5V", _calcMarkePos(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, 500)); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100 + 250, 500 + 250)); break; case LAY_PHAS: _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit);