Mercurial > hg > fxanalyse
diff Plot.c @ 0:d9aae7d7f2c6
Import
author | Daniele Nicolodi <daniele.nicolodi@obspm.fr> |
---|---|
date | Tue, 03 Jul 2012 10:38:59 +0200 |
parents | |
children | 381da7b34cd8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plot.c Tue Jul 03 10:38:59 2012 +0200 @@ -0,0 +1,325 @@ + +#include <ansi_c.h> +#include <userint.h> + +#include "YLCStuff.h" +#include "FXAnalyse.h" + +#include "FXPlot.h" // Auto generated panel definitions and protypes +#include "Plot.h" // My own .h file, containing prototypes and definitions for the class Plot... + + + +// ******************* Member functions : constructor and destructor ********************** + +int Plot_InitPanel(Plot_Data * Instance, char * title, double PlotMin, double PlotMax, void (*OnCloseFunc)(int) ) { + + if ((Instance->PlotPanel = LoadPanel (0, "FXPlot.uir", PLOTPANEL)) < 0) + return -1; + SetPanelAttribute(Instance->PlotPanel, ATTR_TITLE, title) ; + SetPanelAttribute (Instance->PlotPanel, ATTR_CALLBACK_DATA, (void *)Instance); // the panel callback therefore knows which data structure it is associated to + Instance->OnClosePanel = OnCloseFunc ; + Instance->IndexPoint = 0 ; + Instance->Mean = 0 ; + Instance->Slope = 0; + Instance->ADev = 0 ; + Instance->Frequencies = calloc(MAXPOINTSNUMBER, sizeof(double)) ; + DisplayPanel (Instance->PlotPanel); + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_MIN, PlotMin) ; + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_MAX, PlotMax) ; + SetAxisScalingMode(Instance->PlotPanel, PLOTPANEL_FREQPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, PlotMin, PlotMax) ; + return 0 ; + } + + + +int Plot_ClosePanel(Plot_Data * Instance) { + free(Instance->Frequencies) ; + Instance->OnClosePanel(Instance->PlotPanel) ; + DiscardPanel (Instance->PlotPanel); + return 0; + } + + + +// ******************** Member functions, callbacks (private) ******************************* + +int CVICALLBACK CB_PlotEvent(int panel, int event, void *callbackData, int eventData1, int eventData2) { + + int VirtualKeyCode ; + int StepIndex ; + double Step ; + + Plot_Data * Instance = NULL; + void (*truc)(void); + + switch (event) + { + case EVENT_CLOSE: + GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance); + Plot_ClosePanel(Instance) ; + break; + + case EVENT_KEYPRESS: + VirtualKeyCode = GetKeyPressEventVirtualKey(eventData2); + switch (VirtualKeyCode) + { + case 2304: //ie right arrow + GetCtrlIndex(panel, PLOTPANEL_SCALINGSTEP, &StepIndex); + if (StepIndex<10){ + SetCtrlIndex(panel, PLOTPANEL_SCALINGSTEP, ++StepIndex) ; + GetCtrlVal(panel, PLOTPANEL_SCALINGSTEP, &Step); + SetCtrlAttribute(panel, PLOTPANEL_MIN, ATTR_INCR_VALUE, Step) ; + SetCtrlAttribute(panel, PLOTPANEL_MAX, ATTR_INCR_VALUE, Step) ; + }; + break; + case 2048: //ie left arrow + GetCtrlIndex(panel, PLOTPANEL_SCALINGSTEP, &StepIndex); + if (StepIndex>0){ + SetCtrlIndex(panel, PLOTPANEL_SCALINGSTEP, --StepIndex) ; + GetCtrlVal(panel, PLOTPANEL_SCALINGSTEP, &Step); + SetCtrlAttribute(panel, PLOTPANEL_MIN, ATTR_INCR_VALUE, Step) ; + SetCtrlAttribute(panel, PLOTPANEL_MAX, ATTR_INCR_VALUE, Step) ; + }; + break; + }; + break; + } + return 0; +} + +int CVICALLBACK Plot_CB_ChangeMax (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + double YMin, YMax ; + + switch (event) + { + case EVENT_COMMIT: + GetCtrlVal(panel, PLOTPANEL_MIN, &YMin) ; + GetCtrlVal(panel, PLOTPANEL_MAX, &YMax) ; + if (YMin<YMax) { + SetAxisScalingMode(panel, PLOTPANEL_FREQPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, YMin, YMax) ; + SetCtrlVal(panel, PLOTPANEL_CHECKBOX_AUTOSCALE, FALSE) ; + } ; + break; + case EVENT_RIGHT_CLICK: + + break; + } + return 0; +} + +int CVICALLBACK Plot_CB_ChangeMin (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + double YMin, YMax ; + + switch (event) + { + case EVENT_COMMIT: + GetCtrlVal(panel, PLOTPANEL_MIN, &YMin) ; + GetCtrlVal(panel, PLOTPANEL_MAX, &YMax) ; + if (YMin<YMax ) { + SetAxisScalingMode(panel, PLOTPANEL_FREQPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, YMin, YMax) ; + SetCtrlVal(panel, PLOTPANEL_CHECKBOX_AUTOSCALE, FALSE) ; + } ; + break; + case EVENT_RIGHT_CLICK: + + break; + } + return 0; +} + + +int CVICALLBACK Plot_CB_ChangeAutoScale (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + bool AutoScale = FALSE; + int NotCare = 20000000 ; + double YMin = 10000000 , YMax = 64000000 ; + + switch (event) + { + case EVENT_COMMIT: + GetCtrlVal(panel, PLOTPANEL_CHECKBOX_AUTOSCALE, &AutoScale) ; + if (AutoScale) { + SetAxisScalingMode(panel, PLOTPANEL_FREQPLOT, VAL_LEFT_YAXIS, VAL_AUTOSCALE, YMin, YMax) ; + GetAxisScalingMode(panel, PLOTPANEL_FREQPLOT,VAL_LEFT_YAXIS, &NotCare, &YMin, &YMax ) ; + SetCtrlVal(panel, PLOTPANEL_MIN, YMin); + SetCtrlVal(panel, PLOTPANEL_MAX, YMax); + } + else { + GetCtrlVal(panel, PLOTPANEL_MIN, &YMin); + GetCtrlVal(panel, PLOTPANEL_MAX, &YMax); + SetAxisScalingMode(panel, PLOTPANEL_FREQPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, YMin, YMax) ; + } ; + break; + case EVENT_RIGHT_CLICK: + + break; + } + return 0; +} + +int CVICALLBACK Plot_CB_ChangeScalingStep(int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + double ScalingStep ; + + switch (event) + { + case EVENT_COMMIT: + GetCtrlVal(panel, PLOTPANEL_SCALINGSTEP, &ScalingStep) ; + SetCtrlAttribute(panel, PLOTPANEL_MIN, ATTR_INCR_VALUE, ScalingStep) ; + SetCtrlAttribute(panel, PLOTPANEL_MAX, ATTR_INCR_VALUE, ScalingStep) ; + break; + case EVENT_RIGHT_CLICK: + break; + } + return 0; +} + + +// ******************** Member functions, public ******************************************* + +int Plot_AddFrequency(Plot_Data * Instance, double Freq) { + + double YMin = 10000000, YMax = 64000000, Mean = 0, ADev = 0 , Slope = 0 , Drift = 0 ; + bool AutoScale, DeDrift ; + int N = 0, NotCare ; + + // Retrieve previous values for mean, adev and slope + Mean = Instance->Mean ; + Slope = Instance->Slope; + ADev = Instance->ADev; + + // Correct Freq with drift (feed forward) if dedrift is on + GetCtrlVal(Instance->PlotPanel, PLOTPANEL_CHECKBOX_DEDRIFT, &DeDrift) ; + if(DeDrift) { + GetCtrlVal(Instance->PlotPanel, PLOTPANEL_DEDRIFT, &Drift) ; + Freq -= ((double) Instance->IndexPoint)*Drift ; + } ; + + // Add Freq to graph plot + Instance->Frequencies[Instance->IndexPoint++] = Freq ; + N = Instance->IndexPoint ; // N is now the new number of points in the graph + + + if (N > 1) { // ADEV and SLOPE need at least 2 values ! + Instance->Slope = (Slope*(N-2) + 6*(Freq-Mean)/N)/(N+1) ; + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_SLOPE, Instance->Slope ) ; + Instance->ADev = sqrt( ( ADev*ADev*(N-2) + 0.5*pow(Freq-Instance->Frequencies[N-2],2) ) / (N-1) ) ; + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_ADEV, Instance->ADev ) ; + } ; + Instance->Mean = (Mean*(N-1)+Freq)/N ; + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_MEAN, Instance->Mean); + + if (N > MAXPOINTSNUMBER - 2) { // If too many points recorded, restart new plot with new values of Mean, Slope and Adev + Instance->IndexPoint = 0; + Instance->Mean = 0; + Instance->Slope = 0; + Instance->ADev = 0; + SetCtrlVal(Instance->PlotPanel,PLOTPANEL_MEAN, 0.) ; + SetCtrlVal(Instance->PlotPanel,PLOTPANEL_SLOPE, 0.) ; + SetCtrlVal(Instance->PlotPanel,PLOTPANEL_ADEV, 0.) ; + } ; + + DeleteGraphPlot(Instance->PlotPanel, PLOTPANEL_FREQPLOT, -1,VAL_IMMEDIATE_DRAW) ; + PlotY(Instance->PlotPanel, PLOTPANEL_FREQPLOT, Instance->Frequencies, Instance->IndexPoint, VAL_DOUBLE, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE) ; + GetCtrlVal(Instance->PlotPanel, PLOTPANEL_CHECKBOX_AUTOSCALE, &AutoScale) ; + if (AutoScale) { + GetAxisScalingMode(Instance->PlotPanel, PLOTPANEL_FREQPLOT,VAL_LEFT_YAXIS, &NotCare, &YMin, &YMax ) ; + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_MIN, YMin); + SetCtrlVal(Instance->PlotPanel, PLOTPANEL_MAX, YMax); + } ; + return 0 ; + } + + + + +int CVICALLBACK Plot_CB_Reset (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + Plot_Data * Instance = NULL; + + switch (event) + { + case EVENT_COMMIT: + GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance); + Instance->IndexPoint = 0 ; + Instance->Mean = 0 ; + Instance->Slope = 0; + Instance->ADev = 0 ; + + break; + } + return 0; +} + + +int CVICALLBACK Plot_CB_GetDrift (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + Plot_Data * Instance = NULL; + bool DeDrift ; + double Drift ; + + switch (event) + { + case EVENT_COMMIT: + + //Instance = ThisPlot(panel) ; + GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance); + GetCtrlVal(panel, PLOTPANEL_CHECKBOX_DEDRIFT, &DeDrift) ; + + if (!DeDrift) { + SetCtrlVal(panel,PLOTPANEL_DEDRIFT,Instance->Slope) ; + } + else { + GetCtrlVal(panel, PLOTPANEL_DEDRIFT, &Drift) ; + Drift += Instance->Slope ; + SetCtrlVal(panel, PLOTPANEL_DEDRIFT, Drift) ; + + Instance->IndexPoint = 0 ; + Instance->Mean = 0 ; + Instance->Slope = 0 ; + Instance->ADev = 0 ; + + } ; + + + break; + } + return 0; +} + +int CVICALLBACK Plot_CB_ChangeDrift (int panel, int control, int event, + void *callbackData, int eventData1, int eventData2) +{ + bool DeDrift ; + Plot_Data * Instance = NULL; + + switch (event) + { + case EVENT_COMMIT: + GetCtrlVal(panel, PLOTPANEL_CHECKBOX_DEDRIFT, &DeDrift) ; + if(DeDrift) { + + //Instance = ThisPlot(panel) ; + GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance); + + Instance->IndexPoint = 0 ; + Instance->Mean = 0 ; + Instance->Slope = 0 ; + Instance->ADev = 0 ; + + } ; + + break; + } + return 0; +} +