@@ -180,6 +180,11 @@ FunctionGeneratorOptions g_options = {
180
180
1 , /* isAmpl */
181
181
};
182
182
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
+
183
188
WaveformFunction g_waveFormFuncU[CH_MAX];
184
189
float g_phiU[CH_MAX];
185
190
float g_dphiU[CH_MAX];
@@ -216,7 +221,7 @@ float sineHalfRectifiedf(float t) {
216
221
}
217
222
218
223
float sineFullRectifiedf (float t) {
219
- return 2 .0f * sinf (t / 2 );
224
+ return 2 .0f * sinf (t / 2 . 0f );
220
225
}
221
226
222
227
float trianglef (float t) {
@@ -386,8 +391,6 @@ class FunctionGeneratorPage : public SetPage {
386
391
const Style * style = getStyle (widget->style );
387
392
drawRectangle (widgetCursor.x , widgetCursor.y , (int )widget->w , (int )widget->h , style, false , false , true );
388
393
389
- float T = FLT_MIN;
390
-
391
394
float minU = FLT_MAX;
392
395
float maxU = -FLT_MAX;
393
396
@@ -427,17 +430,6 @@ class FunctionGeneratorPage : public SetPage {
427
430
}
428
431
}
429
432
}
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 ;
441
433
}
442
434
443
435
float dU = maxU - minU;
@@ -474,14 +466,14 @@ class FunctionGeneratorPage : public SetPage {
474
466
digitalWaveformParameters.offset = ((numDigital - digitalIndex - 1 ) + 0 .5f ) / numDigital;
475
467
digitalWaveformParameters.amplitude = 1 .0f / numDigital - 4 .0f / 118 .0f ;
476
468
477
- drawWaveform (widgetCursor, digitalWaveformParameters, T , 0 , 1 .0f );
469
+ drawWaveform (widgetCursor, digitalWaveformParameters, g_previewPeriod , 0 , 1 .0f );
478
470
479
471
digitalIndex++;
480
472
} else {
481
473
float min = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? minU : minI;
482
474
float max = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? maxU : maxI;
483
475
484
- drawWaveform (widgetCursor, waveformParameters, T , min, max);
476
+ drawWaveform (widgetCursor, waveformParameters, g_previewPeriod , min, max);
485
477
}
486
478
}
487
479
@@ -493,13 +485,13 @@ class FunctionGeneratorPage : public SetPage {
493
485
digitalWaveformParameters.offset = ((numDigital - selectedItemDigitalIndex - 1 ) + 0 .5f ) / numDigital;
494
486
digitalWaveformParameters.amplitude = 1 .0f / numDigital - 4 .0f / 118 .0f ;
495
487
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 );
498
490
} else {
499
491
float min = waveformParameters.resourceType == FUNCTION_GENERATOR_RESOURCE_TYPE_U ? minU : minI;
500
492
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 );
503
495
}
504
496
}
505
497
@@ -795,8 +787,18 @@ WaveformParameters *getWaveformParameters(int slotIndex, int subchannelIndex, in
795
787
796
788
// //////////////////////////////////////////////////////////////////////////////
797
789
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
+
798
799
void getProfileParameters (psu::profile::Parameters &profileParams) {
799
800
profileParams.functionGeneratorParameters .options = g_options;
801
+ profileParams.functionGeneratorParameters .previewPeriod = g_previewPeriod;
800
802
801
803
for (int i = 0 ; i < MAX_NUM_WAVEFORMS; i++) {
802
804
if (i < g_selectedResources.m_numResources ) {
@@ -831,6 +833,7 @@ void getProfileParameters(psu::profile::Parameters &profileParams) {
831
833
832
834
void setProfileParameters (const psu::profile::Parameters &profileParams) {
833
835
g_options = profileParams.functionGeneratorParameters .options ;
836
+ g_previewPeriod = profileParams.functionGeneratorParameters .previewPeriod ;
834
837
835
838
int j = 0 ;
836
839
@@ -900,6 +903,7 @@ bool writeProfileProperties(psu::profile::WriteContext &ctx, const psu::profile:
900
903
ctx.group (" funcgen_options" );
901
904
WRITE_PROPERTY (" isFreq" , profileParams.functionGeneratorParameters .options .isFreq );
902
905
WRITE_PROPERTY (" isAmpl" , profileParams.functionGeneratorParameters .options .isAmpl );
906
+ WRITE_PROPERTY (" previewPeriod" , profileParams.functionGeneratorParameters .previewPeriod );
903
907
904
908
for (int i = 0 ; i < MAX_NUM_WAVEFORMS; i++) {
905
909
auto &profileWaveformParameters = profileParams.functionGeneratorParameters .waveformParameters [i];
@@ -933,6 +937,7 @@ bool readProfileProperties(psu::profile::ReadContext &ctx, psu::profile::Paramet
933
937
if (ctx.matchGroup (" funcgen_options" )) {
934
938
READ_FLAG (" isFreq" , profileParams.functionGeneratorParameters .options .isFreq );
935
939
READ_FLAG (" isAmpl" , profileParams.functionGeneratorParameters .options .isAmpl );
940
+ READ_PROPERTY (" previewPeriod" , profileParams.functionGeneratorParameters .previewPeriod );
936
941
}
937
942
938
943
int i;
@@ -1526,6 +1531,7 @@ void reset() {
1526
1531
AllResources::reset ();
1527
1532
g_options.isFreq = 1 ;
1528
1533
g_options.isAmpl = 1 ;
1534
+ g_previewPeriod = PREVIEW_PERIOD_DEF;
1529
1535
removeAllChannels ();
1530
1536
}
1531
1537
@@ -2708,7 +2714,113 @@ void action_function_generator_show_previous_page() {
2708
2714
}
2709
2715
}
2710
2716
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 };
2711
2761
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
+ }
2712
2824
2713
2825
} // namespace gui
2714
2826
} // namespace eez
0 commit comments