Skip to content

Commit 2f825c0

Browse files
committed
1 parent a7b694e commit 2f825c0

12 files changed

+63283
-62998
lines changed

modular-psu-firmware.eez-project

+105
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,24 @@
27422742
"name": "channel_ocp_trip_level_info",
27432743
"type": "string",
27442744
"defaultValue": "Trip level = 99.9% of Iset"
2745+
},
2746+
{
2747+
"name": "function_generator_preview_period",
2748+
"type": "float",
2749+
"defaultValue": "500 ms"
2750+
},
2751+
{
2752+
"name": "function_generator_preview_overlay"
2753+
},
2754+
{
2755+
"name": "function_generator_preview_period_zoom_out_enabled",
2756+
"type": "boolean",
2757+
"defaultValue": "0"
2758+
},
2759+
{
2760+
"name": "function_generator_preview_period_zoom_in_enabled",
2761+
"type": "boolean",
2762+
"defaultValue": "1"
27452763
}
27462764
],
27472765
"actions": [
@@ -4120,6 +4138,16 @@
41204138
"components": [],
41214139
"connectionLines": [],
41224140
"name": "trigger_toggle_initiate_all"
4141+
},
4142+
{
4143+
"components": [],
4144+
"connectionLines": [],
4145+
"name": "function_generator_preview_period_zoom_in"
4146+
},
4147+
{
4148+
"components": [],
4149+
"connectionLines": [],
4150+
"name": "function_generator_preview_period_zoom_out"
41234151
}
41244152
],
41254153
"pages": [
@@ -32450,6 +32478,83 @@
3245032478
]
3245132479
}
3245232480
]
32481+
},
32482+
{
32483+
"type": "Container",
32484+
"left": 171,
32485+
"top": 2,
32486+
"width": 134,
32487+
"height": 33,
32488+
"wireID": "6e9ee58d-defa-47dc-ff9e-2a43a488bc7b",
32489+
"data": "",
32490+
"action": "",
32491+
"style": {
32492+
"inheritFrom": "overlay",
32493+
"opacity": 208
32494+
},
32495+
"name": "Preview period",
32496+
"widgets": [
32497+
{
32498+
"type": "DisplayData",
32499+
"left": 1,
32500+
"top": 1,
32501+
"width": 50,
32502+
"height": 31,
32503+
"wireID": "512a2b04-f7a5-43cf-c6d4-56489429943e",
32504+
"data": "function_generator_preview_period",
32505+
"action": "edit",
32506+
"style": {
32507+
"inheritFrom": "encoder_cursor_14_enabled",
32508+
"font": "RobotoCondensed-Regular",
32509+
"padding": "0 5"
32510+
},
32511+
"displayOption": 0
32512+
},
32513+
{
32514+
"type": "Button",
32515+
"left": 93,
32516+
"top": 1,
32517+
"width": 40,
32518+
"height": 31,
32519+
"wireID": "6ba78286-334b-42ad-9cb9-dae723801749",
32520+
"action": "function_generator_preview_period_zoom_out",
32521+
"style": {
32522+
"inheritFrom": "encoder_cursor_14_enabled",
32523+
"font": "Oswald14"
32524+
},
32525+
"text": "\\u00b8",
32526+
"enabled": "function_generator_preview_period_zoom_out_enabled",
32527+
"disabledStyle": {
32528+
"inheritFrom": "encoder_cursor_14_enabled",
32529+
"color": "text_regular",
32530+
"backgroundColor": "text_enable_background",
32531+
"activeColor": "text_enable_background",
32532+
"activeBackgroundColor": "text_regular"
32533+
}
32534+
},
32535+
{
32536+
"type": "Button",
32537+
"left": 52,
32538+
"top": 1,
32539+
"width": 40,
32540+
"height": 31,
32541+
"wireID": "a6a1e2e8-a6ed-4c36-a5eb-175a231a56f8",
32542+
"action": "function_generator_preview_period_zoom_in",
32543+
"style": {
32544+
"inheritFrom": "encoder_cursor_14_enabled",
32545+
"font": "Oswald14"
32546+
},
32547+
"text": "\\u00b9",
32548+
"enabled": "function_generator_preview_period_zoom_in_enabled",
32549+
"disabledStyle": {
32550+
"inheritFrom": "encoder_cursor_14_enabled",
32551+
"color": "text_regular",
32552+
"activeBackgroundColor": "text_regular"
32553+
}
32554+
}
32555+
],
32556+
"overlay": "function_generator_preview_overlay",
32557+
"shadow": true
3245332558
}
3245432559
],
3245532560
"connectionLines": [],

src/eez/action_impl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1135,8 +1135,8 @@ void action_user_switch_clicked() {
11351135
if (getActivePageId() == INTERNAL_PAGE_ID_TOAST_MESSAGE && !((ToastMessagePage *)getActivePage())->hasAction()) {
11361136
popPage();
11371137
}
1138-
11391138
psu::gui::edit_mode_step::switchToNextEncoderMode();
1139+
refreshScreen();
11401140
}
11411141
#endif
11421142
break;

src/eez/function_generator.cpp

+132-20
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ FunctionGeneratorOptions g_options = {
180180
1, /* isAmpl */
181181
};
182182

183+
static const float PREVIEW_PERIOD_MAX = 100.0f;
184+
static const float PREVIEW_PERIOD_MIN = 0.001f;
185+
static const float PREVIEW_PERIOD_DEF = 0.2f;
186+
float g_previewPeriod = PREVIEW_PERIOD_DEF;
187+
183188
WaveformFunction g_waveFormFuncU[CH_MAX];
184189
float g_phiU[CH_MAX];
185190
float g_dphiU[CH_MAX];
@@ -216,7 +221,7 @@ float sineHalfRectifiedf(float t) {
216221
}
217222

218223
float sineFullRectifiedf(float t) {
219-
return 2.0f * sinf(t / 2);
224+
return 2.0f * sinf(t / 2.0f);
220225
}
221226

222227
float trianglef(float t) {
@@ -386,8 +391,6 @@ class FunctionGeneratorPage : public SetPage {
386391
const Style* style = getStyle(widget->style);
387392
drawRectangle(widgetCursor.x, widgetCursor.y, (int)widget->w, (int)widget->h, style, false, false, true);
388393

389-
float T = FLT_MIN;
390-
391394
float minU = FLT_MAX;
392395
float maxU = -FLT_MAX;
393396

@@ -427,17 +430,6 @@ class FunctionGeneratorPage : public SetPage {
427430
}
428431
}
429432
}
430-
431-
if (waveformParameters.waveform != WAVEFORM_DC) {
432-
float t = 2 * (1 / waveformParameters.frequency);
433-
if (t > T) {
434-
T = t;
435-
}
436-
}
437-
}
438-
439-
if (T == FLT_MIN) {
440-
T = 1.0f;
441433
}
442434

443435
float dU = maxU - minU;
@@ -474,14 +466,14 @@ class FunctionGeneratorPage : public SetPage {
474466
digitalWaveformParameters.offset = ((numDigital - digitalIndex - 1) + 0.5f) / numDigital;
475467
digitalWaveformParameters.amplitude = 1.0f / numDigital - 4.0f / 118.0f;
476468

477-
drawWaveform(widgetCursor, digitalWaveformParameters, T, 0, 1.0f);
469+
drawWaveform(widgetCursor, digitalWaveformParameters, g_previewPeriod, 0, 1.0f);
478470

479471
digitalIndex++;
480472
} else {
481473
float min = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? minU : minI;
482474
float max = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? maxU : maxI;
483475

484-
drawWaveform(widgetCursor, waveformParameters, T, min, max);
476+
drawWaveform(widgetCursor, waveformParameters, g_previewPeriod, min, max);
485477
}
486478
}
487479

@@ -493,13 +485,13 @@ class FunctionGeneratorPage : public SetPage {
493485
digitalWaveformParameters.offset = ((numDigital - selectedItemDigitalIndex - 1) + 0.5f) / numDigital;
494486
digitalWaveformParameters.amplitude = 1.0f / numDigital - 4.0f / 118.0f;
495487

496-
drawWaveform(widgetCursor, digitalWaveformParameters, T, 0, 1.0f, true);
497-
drawWaveform(widgetCursor, digitalWaveformParameters, T, 0, 1.0f, true, 1);
488+
drawWaveform(widgetCursor, digitalWaveformParameters, g_previewPeriod, 0, 1.0f, true);
489+
drawWaveform(widgetCursor, digitalWaveformParameters, g_previewPeriod, 0, 1.0f, true, 1);
498490
} else {
499491
float min = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? minU : minI;
500492
float max = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? maxU : maxI;
501-
drawWaveform(widgetCursor, waveformParameters, T, min, max, true);
502-
drawWaveform(widgetCursor, waveformParameters, T, min, max, true, 1);
493+
drawWaveform(widgetCursor, waveformParameters, g_previewPeriod, min, max, true);
494+
drawWaveform(widgetCursor, waveformParameters, g_previewPeriod, min, max, true, 1);
503495
}
504496
}
505497

@@ -795,8 +787,18 @@ WaveformParameters *getWaveformParameters(int slotIndex, int subchannelIndex, in
795787

796788
////////////////////////////////////////////////////////////////////////////////
797789

790+
void resetProfileParameters(psu::profile::Parameters &profileParams) {
791+
profileParams.functionGeneratorParameters.options.isAmpl = 1;
792+
profileParams.functionGeneratorParameters.options.isFreq = 1;
793+
profileParams.functionGeneratorParameters.previewPeriod = PREVIEW_PERIOD_DEF;
794+
for (int i = 0; i < MAX_NUM_WAVEFORMS; i++) {
795+
profileParams.functionGeneratorParameters.waveformParameters[i].moduleType = MODULE_TYPE_NONE;
796+
}
797+
}
798+
798799
void getProfileParameters(psu::profile::Parameters &profileParams) {
799800
profileParams.functionGeneratorParameters.options = g_options;
801+
profileParams.functionGeneratorParameters.previewPeriod = g_previewPeriod;
800802

801803
for (int i = 0; i < MAX_NUM_WAVEFORMS; i++) {
802804
if (i < g_selectedResources.m_numResources) {
@@ -831,6 +833,7 @@ void getProfileParameters(psu::profile::Parameters &profileParams) {
831833

832834
void setProfileParameters(const psu::profile::Parameters &profileParams) {
833835
g_options = profileParams.functionGeneratorParameters.options;
836+
g_previewPeriod = profileParams.functionGeneratorParameters.previewPeriod;
834837

835838
int j = 0;
836839

@@ -900,6 +903,7 @@ bool writeProfileProperties(psu::profile::WriteContext &ctx, const psu::profile:
900903
ctx.group("funcgen_options");
901904
WRITE_PROPERTY("isFreq", profileParams.functionGeneratorParameters.options.isFreq);
902905
WRITE_PROPERTY("isAmpl", profileParams.functionGeneratorParameters.options.isAmpl);
906+
WRITE_PROPERTY("previewPeriod", profileParams.functionGeneratorParameters.previewPeriod);
903907

904908
for (int i = 0; i < MAX_NUM_WAVEFORMS; i++) {
905909
auto &profileWaveformParameters = profileParams.functionGeneratorParameters.waveformParameters[i];
@@ -933,6 +937,7 @@ bool readProfileProperties(psu::profile::ReadContext &ctx, psu::profile::Paramet
933937
if (ctx.matchGroup("funcgen_options")) {
934938
READ_FLAG("isFreq", profileParams.functionGeneratorParameters.options.isFreq);
935939
READ_FLAG("isAmpl", profileParams.functionGeneratorParameters.options.isAmpl);
940+
READ_PROPERTY("previewPeriod", profileParams.functionGeneratorParameters.previewPeriod);
936941
}
937942

938943
int i;
@@ -1526,6 +1531,7 @@ void reset() {
15261531
AllResources::reset();
15271532
g_options.isFreq = 1;
15281533
g_options.isAmpl = 1;
1534+
g_previewPeriod = PREVIEW_PERIOD_DEF;
15291535
removeAllChannels();
15301536
}
15311537

@@ -2708,7 +2714,113 @@ void action_function_generator_show_previous_page() {
27082714
}
27092715
}
27102716

2717+
void data_function_generator_preview_overlay(DataOperationEnum operation, Cursor cursor, Value &value) {
2718+
static Overlay overlay;
2719+
2720+
if (operation == DATA_OPERATION_GET_OVERLAY_DATA) {
2721+
value = Value(&overlay, VALUE_TYPE_POINTER);
2722+
} else if (operation == DATA_OPERATION_UPDATE_OVERLAY_DATA) {
2723+
overlay.state = g_selectedResources.m_numResources > 0;
2724+
2725+
WidgetCursor &widgetCursor = *(WidgetCursor *)value.getVoidPointer();
2726+
overlay.width = widgetCursor.widget->w;
2727+
overlay.height = widgetCursor.widget->h;
2728+
2729+
overlay.x = widgetCursor.widget->x;
2730+
overlay.y = widgetCursor.widget->y;
2731+
2732+
value = Value(&overlay, VALUE_TYPE_POINTER);
2733+
}
2734+
}
2735+
2736+
void data_function_generator_preview_period(DataOperationEnum operation, Cursor cursor, Value &value) {
2737+
if (operation == DATA_OPERATION_GET) {
2738+
bool focused = g_focusCursor == cursor && g_focusDataId == DATA_ID_FUNCTION_GENERATOR_PHASE_SHIFT;
2739+
if (focused && g_focusEditValue.getType() != VALUE_TYPE_NONE) {
2740+
value = g_focusEditValue;
2741+
} else if (focused && getActivePageId() == PAGE_ID_EDIT_MODE_KEYPAD && edit_mode_keypad::g_keypad->isEditing()) {
2742+
data_keypad_text(operation, cursor, value);
2743+
} else {
2744+
value = MakeValue(g_previewPeriod, UNIT_SECOND);
2745+
}
2746+
} else if (operation == DATA_OPERATION_GET_ALLOW_ZERO) {
2747+
value = 0;
2748+
} else if (operation == DATA_OPERATION_GET_MIN) {
2749+
value = MakeValue(PREVIEW_PERIOD_MIN, UNIT_SECOND);
2750+
} else if (operation == DATA_OPERATION_GET_MAX) {
2751+
value = MakeValue(PREVIEW_PERIOD_MAX, UNIT_SECOND);
2752+
} else if (operation == DATA_OPERATION_GET_NAME) {
2753+
value = "Preview period";
2754+
} else if (operation == DATA_OPERATION_GET_UNIT) {
2755+
value = UNIT_SECOND;
2756+
} else if (operation == DATA_OPERATION_GET_ENCODER_STEP_VALUES) {
2757+
StepValues *stepValues = value.getStepValues();
2758+
2759+
if (g_options.isFreq) {
2760+
static float g_values[] = { PREVIEW_PERIOD_MIN, PREVIEW_PERIOD_MIN * 10.0f, PREVIEW_PERIOD_MIN * 100.0f, PREVIEW_PERIOD_MIN * 1000.0f };
27112761

2762+
stepValues->values = g_values;
2763+
stepValues->count = sizeof(g_values) / sizeof(float);
2764+
stepValues->unit = UNIT_SECOND;
2765+
2766+
stepValues->encoderSettings.accelerationEnabled = true;
2767+
2768+
stepValues->encoderSettings.range = 1000.0f * PREVIEW_PERIOD_MIN;
2769+
stepValues->encoderSettings.step = PREVIEW_PERIOD_MIN;
2770+
} else {
2771+
getPhaseShiftStepValues(stepValues);
2772+
}
2773+
2774+
stepValues->encoderSettings.mode = eez::psu::gui::edit_mode_step::g_functionGeneratorPreviewPeriodEncoderMode;
2775+
2776+
value = 1;
2777+
} else if (operation == DATA_OPERATION_SET_ENCODER_MODE) {
2778+
eez::psu::gui::edit_mode_step::g_functionGeneratorPreviewPeriodEncoderMode = (EncoderMode)value.getInt();
2779+
} else if (operation == DATA_OPERATION_SET) {
2780+
g_previewPeriod = value.getFloat();
2781+
refreshScreen();
2782+
}
2783+
}
2784+
2785+
static const float g_previewPeriodZoomLevels[] = {
2786+
0.001f, 0.002f, 0.005f,
2787+
0.01f, 0.02f, 0.05f,
2788+
0.1f, 0.2f, 0.5f,
2789+
1.0f, 2.0f, 5.0f,
2790+
10.0f, 20.0f, 50.0f, 100.0f
2791+
};
2792+
2793+
void data_function_generator_preview_period_zoom_in_enabled(DataOperationEnum operation, Cursor cursor, Value &value) {
2794+
if (operation == DATA_OPERATION_GET) {
2795+
value = g_previewPeriod > g_previewPeriodZoomLevels[0];
2796+
}
2797+
}
2798+
2799+
void data_function_generator_preview_period_zoom_out_enabled(DataOperationEnum operation, Cursor cursor, Value &value) {
2800+
if (operation == DATA_OPERATION_GET) {
2801+
value = g_previewPeriod < g_previewPeriodZoomLevels[sizeof(g_previewPeriodZoomLevels) / sizeof(float) - 1];
2802+
}
2803+
}
2804+
2805+
void action_function_generator_preview_period_zoom_in() {
2806+
for (unsigned i = sizeof(g_previewPeriodZoomLevels) / sizeof(float) - 1; i >= 0; i--) {
2807+
if (g_previewPeriod > g_previewPeriodZoomLevels[i]) {
2808+
g_previewPeriod = g_previewPeriodZoomLevels[i];
2809+
refreshScreen();
2810+
break;
2811+
}
2812+
}
2813+
}
2814+
2815+
void action_function_generator_preview_period_zoom_out() {
2816+
for (unsigned i = 0; i < sizeof(g_previewPeriodZoomLevels) / sizeof(float); i++) {
2817+
if (g_previewPeriod < g_previewPeriodZoomLevels[i]) {
2818+
g_previewPeriod = g_previewPeriodZoomLevels[i];
2819+
refreshScreen();
2820+
break;
2821+
}
2822+
}
2823+
}
27122824

27132825
} // namespace gui
27142826
} // namespace eez

src/eez/function_generator.h

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct WaveformParameters {
5555

5656
WaveformParameters *getWaveformParameters(int slotIndex, int subchannelIndex, int resourceIndex);
5757

58+
void resetProfileParameters(psu::profile::Parameters &profileParams);
5859
void getProfileParameters(psu::profile::Parameters &profileParams);
5960
void setProfileParameters(const psu::profile::Parameters &profileParams);
6061
bool writeProfileProperties(psu::profile::WriteContext &ctx, const psu::profile::Parameters &profileParams);

0 commit comments

Comments
 (0)