2  !   OUTPUT 2 USING "#,K";"<lf>INDENT<cr>REN 2,2<cr><lf>RE-STORE ""/RAMBO/DEMO/SGEN_CAL""<cr>"
4     !
6     END
8     !
10    ! PAGE -> 
12    !***********************************************************************
14 Appl_appl:SUB Appl_appl
16     !************************************************************************
18     !* This routine contains all the commons used in the calibration example.
20     !* It is needed by the application loader to handle commons.
22     !************************************************************************
24      COM /Cal_buf_info/ Disp_choices$(1:2,1:63)[20]
26      COM /Cal_data/ REAL Data_header(1:63,1:10),INTEGER Ovld_buffer(1:63)
28      COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(1:63)[20]
30      COM /Cal_plot_xaxis/ REAL Start_freq,Stop_freq,INTEGER Num_freq_points
32      COM /Cal_error/ INTEGER Skip_c1_cal
34     !
36      SUBEXIT
38     !
40    SUBEND
42 !
44 Cal_common:SUB Cal_common
46     !************************************************************************
48     !* This subroutine provides access to common variables.  To do this,
50     !* type in 'CALL CAL_COMMON' from the keyboard.  When through, press
52     !* continue.  Some local variables are provided for convenience.
54     !* Since this subroutine provides no functionality and can be deleted if
56     !* desired.
58     !************************************************************************
60      COM /Cal_buf_info/ Disp_choices$(*)
62      COM /Cal_data/ REAL Data_header(*),INTEGER Ovld_buffer(*)
64      COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(*)
66      COM /Cal_plot_xaxis/ REAL Start_freq,Stop_freq,INTEGER Num_freq_points
68      COM /Cal_error/ INTEGER Skip_c1_cal
70      INTEGER I,J,K,L,M,N
72      REAL A,B,C,D,E,F
74      DIM A$[200],B$[200],C$[200]
76     !
78      PAUSE
80      SUBEXIT
82    SUBEND
84 !
86 Appl_init:SUB Appl_init
88     !***********************************************************************
90     !* This subroutine should be called before running the calibration
92     !* example for the first time or if the configuration has been changed.
94     !***********************************************************************
96      COM /Cal_error/ INTEGER Skip_c1_cal
98     !
100    !Get number of input modules and their names:
102     Cal_get_labels
104    !
106    !Initialize for calibration pass C1.
108     IF NOT Skip_c1_cal THEN 
110       Lib_c1_init
112     END IF
114    !
116     SUBEXIT
118   SUBEND
120!
122 Appl_main:SUB Appl_main(REAL Init)
124    !***********************************************************************
126    !* This subroutine does a simple calibration on all active input modules
128    !* and plots the results.  It can be used as an example of how the
130    !* calibration routines can be accessed.
132    !***********************************************************************
134     COM /Cal_data/ REAL Data_header(*),INTEGER Ovld_buffer(*)
136     COM /Cal_plot_xaxis/ REAL Start_freq,Stop_freq,INTEGER Num_freq_points
138     COM /Cal_error/ INTEGER Skip_c1_cal
140     INTEGER Do_a_cal,Display_changed,Valid_data,Buf_allocated,Replot
142     INTEGER Leave_me,Plot_erased,Axs_interruptus
144    !
146    !Setup up initial softkeys:
148     GOSUB Cal_main_keys
150    !
152     IF Init THEN CALL Appl_init
154     Cal_disp_spread
156     Start_freq=0.
158     Stop_freq=52223.9999   !Hz
160     Num_freq_points=256
162     Cal_update
164    !
166    !Initialize the flags:
168     Do_a_cal=1
170     Display_changed=1
172     Valid_data=0
174     Buf_allocated=0
176     Replot=0
178     Plot_erased=0
180     Axs_interruptus=0
182    !
184     REPEAT
186       IF Display_changed THEN 
188         Cal_update
190        !
192        !Allocate enough memory to do the requested plots:
194         IF Buf_allocated THEN 
196           DEALLOCATE Plot_buffer(*)
198           Buf_allocated=0
200         END IF
202         ALLOCATE REAL Plot_buffer(1:FNDisp_num_plots,0:Num_freq_points-1)
204         Buf_allocated=1
206         IF Valid_data THEN 
208           Disp_plot_axis
210           Axs_interruptus=FNUser_key_press
212           Cal_make_plot(Plot_buffer(*))
214           Replot=1
216           Display_changed=0
218           Plot_erased=0
220         END IF
222       END IF
224      !
226       IF Display_changed OR Plot_erased OR Axs_interruptus THEN 
228         Disp_plot_axis
230         Axs_interruptus=FNUser_key_press
232         IF Valid_data THEN 
234           Replot=1
236         END IF
238         Display_changed=0
240         Plot_erased=0
242       END IF
244      !
246       IF Do_a_cal THEN 
248        !Take away key 7 until calibration is complete:
250         ON KEY 7 LABEL "" GOSUB Cal_dummy
252         Valid_data=0
254         IF NOT Skip_c1_cal THEN 
256           Lib_c1_do_cal(0)
258         END IF
260         Cal_make_plot(Plot_buffer(*))
262         Do_a_cal=0
264         Valid_data=1
266         Replot=1
268        !Put up key 7 again:
270         ON KEY 7 LABEL FNUser_keylabel$("AGAIN") CALL User_key7isr
272       END IF
274      !
276       IF Replot AND Valid_data THEN 
278         Disp_plot_data(Plot_buffer(*),Data_header(*))
280         Replot=0
282       END IF
284      !
286       IF Valid_data THEN 
288         DISP "Calibration Results"
290       END IF
292      !
294       WHILE FNUser_key_press
296         DISP ""
298         Cal_do_main(Do_a_cal,Display_changed,Plot_erased,Leave_me,Axs_interruptus,Plot_buffer(*))
300       END WHILE
302      !
304     UNTIL Leave_me
306     DISP ""
308     SUBEXIT
310    !
312 Cal_dummy:!
314     RETURN 
316    !
318 Cal_main_keys:!
320     ON KEY 0 LABEL "" GOSUB Cal_dummy
322     ON KEY 1 LABEL "" CALL User_key1isr
324     ON KEY 2 LABEL "" CALL User_key2isr
326     ON KEY 3 LABEL FNUser_keylabel$("DISPLAY SETUP") CALL User_key3isr
328     ON KEY 4 LABEL "" CALL User_key4isr
330     ON KEY 5 LABEL FNUser_keylabel$("HELP") CALL User_key5isr
332     ON KEY 6 LABEL FNUser_keylabel$("MARKER") CALL User_key6isr
334     ON KEY 7 LABEL "" GOSUB Cal_dummy
336     ON KEY 8 LABEL FNUser_keylabel$("EXIT") CALL User_key8isr
338     ON KEY 9 LABEL "" GOSUB Cal_dummy
340     RETURN 
342    !
344   SUBEND
346!
348 Cal_update:SUB Cal_update
350   !***********************************************************************
352   !* This subroutine initializes the grids for the plot routines.  This
354   !* routine should also be called if different plots have been selected
356   !* in the display spreadsheet.
358   !***********************************************************************
360     COM /Cal_buf_info/ Disp_choices$(*)
362     COM /Cal_data/ REAL Data_header(*),INTEGER Ovld_buffer(*)
364     COM /Cal_plot_xaxis/ REAL Start_freq,Stop_freq,INTEGER Num_freq_points
366     COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(*)
368     COM /Cal_error/ INTEGER Skip_c1_cal
370     INTEGER Plot_num,Num_plots,Buffer_num
372     DIM Type$[20]
374    !
376    !Allocate memory for plot setups:
378     Num_plots=FNDisp_num_plots
380     ALLOCATE REAL Plot_to_buf(1:Num_plots)
382     ALLOCATE X_units$(1:Num_plots)[10],Y_units$(1:Num_plots)[10]
384     ALLOCATE REAL Start_x(1:Num_plots),Per_bin_x(1:Num_plots)
386     ALLOCATE REAL Start_bin(1:Num_plots),Num_bins(1:Num_plots)
388     ALLOCATE REAL Y_def_max(1:Num_plots),Y_def_min(1:Num_plots)
390    !
392     MAT Data_header= (0)
394    !
396    !All x-axis units are usually the same:
398     MAT X_units$= ("Hz")
400     MAT Start_x= (Start_freq)
402     MAT Per_bin_x= ((Stop_freq-Start_freq)/(Num_freq_points-1))
404     MAT Start_bin= (0.)      !Start plotting at bin 0.
406     MAT Num_bins= (Num_freq_points)
408    !
410    !Set up plot-specific stuff:
412     FOR Plot_num=1 TO Num_plots
414       Input_num=FNDisp_choice((Plot_num),1)
416       Plot_to_buf(Plot_num)=Plot_num
418       Type$=Disp_choices$(2,FNDisp_choice((Plot_num),2))
420       IF Input_num>Num_inputs OR Skip_c1_cal THEN 
422        !Digital filter correction plot requested:
424         SELECT Type$
426         CASE "Phase"
428           Y_units$(Plot_num)="Deg"
430           Y_def_min(Plot_num)=-350
432           Y_def_max(Plot_num)=0
434         CASE ELSE
436           Y_units$(Plot_num)="dB"
438           Y_def_min(Plot_num)=-.35
440           Y_def_max(Plot_num)=.05
442         END SELECT
444         Start_x(Plot_num)=0.
446         Per_bin_x(Plot_num)=(2.^16)/256.
448         Start_bin(Plot_num)=0.     !Start plotting at bin 0.
450         Num_bins(Plot_num)=256.
452        !
454       ELSE
456        !Anti-alias filter cal plot requested:
458         SELECT Type$
460         CASE "Phase"
462           Y_units$(Plot_num)="Deg"
464           Y_def_min(Plot_num)=-40
466           Y_def_max(Plot_num)=90
468         CASE ELSE
470           Y_units$(Plot_num)="dB"
472           Y_def_min(Plot_num)=-.4
474           Y_def_max(Plot_num)=.4
476         END SELECT
478       END IF
480      !
482       Data_header(Plot_num,1)=0      !Data offset.
484       Data_header(Plot_num,2)=1.     !Data scale factor.
486     NEXT Plot_num
488    !
490     Disp_plot_set(Plot_to_buf(*),X_units$(*),Y_units$(*),Start_x(*),Per_bin_x(*),Start_bin(*),Num_bins(*),Y_def_max(*),Y_def_min(*))
492    !
494     SUBEXIT
496   SUBEND
498!
500 Cal_do_main:SUB Cal_do_main(INTEGER Do_a_cal,Disp_modified,Plot_erased,Leave_me,Axs_interruptus,REAL Plot_buffer(*))
502    !*********************************************************************
504    !* This subroutine handles the main softkeys.
506    !*
508    !* The following variable is an input to this routine:
510    !*     Axs_interruptus: true if axis generation was interrupted.
512    !*
514    !* The following variables are returned:
516    !*            Do_a_cal: true if another calibration cycle is requested.
518    !*       Disp_modified: true if a change requires a different display.
520    !*         Plot_erased: true if plots were erased by a spreadsheet or ?.
522    !*            Leave_me: true if exit key pressed.
524    !*     Axs_interruptus: true if axis generation was interrupted.
526    !*********************************************************************
528     COM /Cal_data/ REAL Data_header(*),INTEGER Ovld_buffer(*)
530     REAL Dummy_any_mod,Dummy_major_mod
532     INTEGER Any_mod,Major_mod,Minor_mod,Key_num
534    !
536     Key_num=FNUser_get_key
538    !
540     SELECT Key_num
542     CASE 3
544       ON KEY Key_num LABEL FNUser_keylabel$("MAIN") CALL User_key3isr
546       CALL Disp_spread(Dummy_any_mod,Dummy_major_mod)
548       OFF KEY Key_num
550       Any_mod=Dummy_any_mod
552       Major_mod=Dummy_major_mod
554       Minor_mod=Any_mod AND NOT Major_mod
556       Disp_modified=Major_mod
558      !
560      !Y-axis change only; don't need to re-compute plot data;
562      !just need to call Disp_plot_set again:
564       IF Minor_mod THEN CALL Cal_update
566      !
568       Plot_erased=1
570     CASE 5
572       Cal_help
574       Plot_erased=1
576     CASE 6
578       ON KEY Key_num LABEL FNUser_keylabel$("MAIN") CALL User_key6isr
580       ON KEY 5 LABEL "" CALL Cal_do_naught
582       IF Axs_interruptus THEN 
584         Disp_plot_axis
586         Axs_interruptus=FNUser_key_press
588       END IF
590       CALL Disp_do_mkr(Plot_buffer(*),Data_header(*),0)
592       OFF KEY Key_num
594     CASE 7
596       Do_a_cal=1
598     CASE 8
600       Leave_me=1
602     END SELECT
604    !
606     IF FNUser_key_press THEN 
608       IF FNUser_check_key=Key_num THEN Key_num=FNUser_get_key
610     END IF
612    !
614     SUBEXIT
616   SUBEND
618!
620 Cal_make_plot:SUB Cal_make_plot(REAL Plot_buffer(*))
622    !**********************************************************************
624    !* This subroutine creates a plot array and fills it with appropriate
626    !* data as selected in the display spreadsheet.
628    !**********************************************************************
630     COM /Cal_buf_info/ Disp_choices$(*)
632     COM /Cal_data/ REAL Data_header(*),INTEGER Ovld_buffer(*)
634     COM /Cal_plot_xaxis/ REAL Start_freq,Stop_freq,INTEGER Num_freq_points
636     COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(*)
638     COM /Cal_error/ INTEGER Skip_c1_cal
640     INTEGER Num_plots,Plot_num,I,Input_num,Zoom
642     REAL Span,Y
644     DIM Type$[20]
646    !
648     Span=51200.     !Hz
650     Zoom=0          !Zoom off.
652    !
654    !Find out how many plot to do:
656     Num_plots=FNDisp_num_plots
658    !
660    !Allocate a temporary array:
662     Df_block_size=INT((LGT(Num_freq_points)/LGT(2.))+.5)
664     ALLOCATE Temp(0:Num_freq_points-1)
666     ALLOCATE Df_temp(0:255)
668    !
670    !Get the C1 calibration overload buffer array:
672     Lib_c1_gme_ovld(Ovld_buffer(*))
674    !
676    !Fill the plot buffer:
678     FOR Plot_num=1 TO Num_plots
680       Input_num=FNDisp_choice((Plot_num),1)
682       Type$=Disp_choices$(2,FNDisp_choice((Plot_num),2))
684      !
686       IF Input_num>Num_inputs OR Skip_c1_cal THEN 
688        !
690        !Digital filter correction plot requested:
692         SELECT Type$
694         CASE "Phase"
696           DISP "Doing phase interpolation for digital filter . . ."
698           Lib_df_phase((Span),Df_temp(*),(Zoom))
700           DISP ""
702           FOR I=0 TO 255
704             Plot_buffer(Plot_num,I)=Df_temp(I)
706           NEXT I
708         CASE ELSE
710           DISP "Doing magnitude interpolation for digital filter . . ."
712           Lib_df_mag((Span),Df_temp(*),(Zoom))
714           DISP ""
716           FOR I=0 TO 255
718             Y=Df_temp(I)
720             IF Y<1.E-10 THEN Y=1.E-10
722             Plot_buffer(Plot_num,I)=10.*LGT(Y)
724           NEXT I
726         END SELECT
728        !Clear overflow flag if set for this plot:
730         Data_header(Plot_num,3)=0.
732       ELSE
734        !
736        !Anti-alias filter cal plot requested:
738         SELECT Type$
740         CASE "Phase"
742           DISP "Doing phase interpolation for "&Input_labels$(Input_num)&" . . ."
744           Lib_c1_make_pha(Temp(*),Start_freq,Stop_freq,Input_num)
746           DISP ""
748           FOR I=0 TO Num_freq_points-1
750             Plot_buffer(Plot_num,I)=Temp(I)
752           NEXT I
754         CASE ELSE
756           DISP "Doing magnitude interpolation for "&Input_labels$(Input_num)&" . . ."
758           Lib_c1_make_mag(Temp(*),Start_freq,Stop_freq,Input_num)
760           DISP ""
762           FOR I=0 TO Num_freq_points-1
764             Y=Temp(I)
766             IF Y<1.E-10 THEN Y=1.E-10
768             Plot_buffer(Plot_num,I)=10.*LGT(Y)
770           NEXT I
772         END SELECT
774        !Set overload flags so that plot routine knows to display 'OVLD':
776         Data_header(Plot_num,3)=BIT(Ovld_buffer(Input_num),7)
778       END IF
780     NEXT Plot_num
782    !
784     SUBEXIT
786   SUBEND
788!
790 Cal_disp_spread:SUB Cal_disp_spread
792   !***********************************************************************
794   !* This subroutine initializes the display spreadsheet for the
796   !* calibration example plot selection.
798   !***********************************************************************
800     COM /Cal_buf_info/ Disp_choices$(*)
802     COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(*)
804     COM /Cal_error/ INTEGER Skip_c1_cal
806    !
808     INTEGER Module_index,Num_cols
810    !
812    !Setup display routines with input labels:
814     Num_cols=2
816     ALLOCATE Disp_titles$(1:Num_cols,1:2)[20]
818     ALLOCATE Disp_prompt$(1:Num_cols)[80]
820     ALLOCATE Disp_width(1:Num_cols)
822    !
824     MAT Disp_titles$= ("")
826     Disp_titles$(1,1)="Correction"
828     Disp_titles$(1,2)="For"
830     Disp_titles$(2,1)="Trace"
832     Disp_titles$(2,2)="Type"
834     Disp_prompt$(1)="Enter module label or 'Digital Filter'"
836     Disp_prompt$(2)="Enter trace type: Magnitude or Phase"
838     Disp_width(1)=20
840     Disp_width(2)=11
842     MAT Disp_choices$= ("")
844    !
846     IF Skip_c1_cal THEN 
848       Disp_choices$(1,1)="Digital Filter"
850     ELSE
852       FOR Module_index=1 TO Num_inputs
854         Disp_choices$(1,Module_index)=Input_labels$(Module_index)
856       NEXT Module_index
858       Disp_choices$(1,Num_inputs+1)="Digital Filter"
860     END IF
862    !
864     Disp_choices$(2,1)="Magnitude"
866     Disp_choices$(2,2)="Phase"
868    !
870    !Initialize display spreadsheet:
872     Disp_spread_set(Disp_titles$(*),Disp_prompt$(*),Disp_width(*),Disp_choices$(*))
874     !
876     SUBEXIT
878   SUBEND
880 !
882 Cal_get_labels:SUB Cal_get_labels
884    !***********************************************************************
886    !* This subroutine sets up the Input_labels$ array with the names of all
888    !* the active input channels as set up in the configuration spreadsheet;
890    !* Num_inputs is set to the number of active inputs.
892    !***********************************************************************
894     COM /Cal_input_info/ INTEGER Num_inputs,Input_labels$(*)
896     COM /Cal_error/ INTEGER Skip_c1_cal
898     INTEGER Num_sources
900     REAL Dummy
902    !
904     Skip_c1_cal=0
906    !
908    !Get number of SOURCE modules:
910     Cnfg_labels("ALL SOURCE",Input_labels$(*),Dummy)
912     Num_sources=Dummy
914     IF Num_sources<1 THEN 
916       User_error("Warning: No active source modules found; can't calibrate AA filters.")
918       Skip_c1_cal=1
920     END IF
922    !
924    !Get number of INPUT modules and their names:
926     Cnfg_labels("ALL INPUT",Input_labels$(*),Dummy)
928     Num_inputs=Dummy
930     IF Num_inputs<1 THEN 
932       User_error("Warning: There are no active inputs to calibrate.")
934       Skip_c1_cal=1
936     END IF
938    !
940     SUBEXIT
942   SUBEND
944 !
946 Cal_do_naught:SUB Cal_do_naught
948    !*********************************************************************
950    !* This subroutine is self-documenting.
952    !*********************************************************************
954     SUBEXIT
956   SUBEND
958!
960 Dummy:SUB Dummy
962   SUBEND
964 !
966 Cal_help:SUB Cal_help
968    !*********************************************************************
970    !* This subroutine prints out the 'help' message for the calibration
972    !* example.
974    !*********************************************************************
976    !
978     DIM A$[160]
980     RESTORE Ds_help_page1
982     GOSUB Ds_show_page
984     RESTORE Ds_help_page2
986     GOSUB Ds_show_page
988     RESTORE Ds_help_page3
990     GOSUB Ds_show_page
992     RESTORE Ds_help_page4
994     GOSUB Ds_show_page
996     SUBEXIT
998 Ds_show_page:READ A$
1000    User_clr_scr
1002    WHILE A$<>"***END***"
1004      OUTPUT CRT;A$
1006      READ A$
1008    END WHILE
1010    OUTPUT KBD USING "#,K";"ÿ#Yÿ<"
1012    INPUT "Type 'Y' to continue, anything else to leave...",A$
1014    IF UPC$(A$[1;1])<>"Y" THEN SUBEXIT
1016    RETURN 
1018 Ds_help_page1: !
1020    DATA "            Help for Calibration Example"
1022    DATA ""
1024    DATA "The Calibration examples uses the library calibration routines to"
1026    DATA "do a simple calibration of the 'null path' range of the input"
1028    DATA "channels.  It then calls interpolation routines to generate "
1030    DATA "correction traces and plots them.  The correction trace plots are"
1032    DATA "in large part the anti-alias filter responses.  It is also possible"
1034    DATA "to show a plot of the digitial filter correction trace."
1036    DATA ""
1038    DATA "   DISPLAY SETUP  calls up the spreadsheet to select plots"
1040    DATA "   HELP  calls up this message"
1042    DATA "   MARKER  enters a mode that allows reading plot data values"
1044    DATA "   AGAIN  executes the calibration measurements again"
1046    DATA "   EXIT  leaves the Calibration Example"
1048    DATA ""
1050    DATA "***END***"
1052 Ds_help_page2: !
1054    DATA "         Help for Calibration Example - Page 2"
1056    DATA ""
1058    DATA "DISPLAY softkey and spreadsheet:"
1060    DATA "   RESET  sets plot selections and scaling to their defaults"
1062    DATA "   PREV, NEXT  can be used instead of keyboard entry"
1064    DATA ""
1066    DATA "This spreadsheet allows the number of plots and plot scaling"
1068    DATA "to be changed for the Calibration Example displays."
1070    DATA "   CORRECTION FOR  input channel label or 'Digital Filter'"
1072    DATA "   TRACE TYPE  magnitude or phase"
1074    DATA "   Y AXIS MIN, MAX  allows changes in Y axis scaling"
1076    DATA "   RECALL TRACE 1,2  recalls stored traces (see MARKER softkey)"
1078    DATA ""
1080    DATA "The input channels are referred to by a label.  To change the"
1082    DATA "default label assigments, press the EXIT softkey and press the"
1084    DATA "CNFG softkey to bring up the configuration spreadsheet."
1086    DATA "***END***"
1088 Ds_help_page3: !
1090    DATA "         Help for Calibration Example - Page 3"
1092    DATA ""
1094    DATA "MARKER softkey:"
1096    DATA "This softkeys puts a cursor up on the plots allowing the "
1098    DATA "direct readout of plot data values.  It also calls up another"
1100    DATA "set of softkeys:"
1102    DATA ""
1104    DATA "   MARKER TO X  enter the x-axis value of the cursor"
1106    DATA "   MARKER TO MIN  puts the cursor on the smallest Y value"
1108    DATA "   MARKER TO MAX  puts the cursor on the largest Y value"
1110    DATA "   STORE TRACE  stores the trace the cursor is on to a file"
1112    DATA "      (Recall them with the DISPLAY SETUP spreadsheet)"
1114    DATA "   MAIN  returns to plot level of Digital Scope"
1116    DATA "   PREVIOUS, NEXT TRACE  moves cursor to the desired trace"
1118    DATA ""
1120    DATA "Use the arrow keys, knob or mouse to move the cursor around."
1122    DATA "***END***"
1124 Ds_help_page4: !
1126    DATA "         Help for Calibration Example - Page 4"
1128    DATA ""
1130    DATA "EXIT softkey:"
1132    DATA "Use this softkey to leave the Calibration Example before running"
1134    DATA "another application."
1136    DATA ""
1138    DATA "Also, use this softkey to gain access to the CNFG spreadsheet to"
1140    DATA "change the labels associated with any of the hardware modules."
1142    DATA "***END***"
1144  SUBEND
1146 Meas_meas:SUB Meas_meas
1148   !*********************************************************************
1150   !* Calibration example has no measurement spreadsheet.  This
1152   !* subroutine is still needed for the application loader, though.
1154   !*********************************************************************
1156   !
1158    SUBEXIT
1160  SUBEND
1162!
1164 Meas_init:SUB Meas_init
1166   !*********************************************************************
1168   !* Calibration example has no measurement spreadsheet.  This
1170   !* subroutine is still needed for the application loader, though.
1172   !*********************************************************************
1174   !
1176    SUBEXIT
1178  SUBEND
1180!
1182 Meas_save:SUB Meas_save(@File,REAL Ok)
1184   !*********************************************************************
1186   !* Calibration example has no measurement spreadsheet.  This
1188   !* subroutine is still needed for the application loader, though.
1190   !*********************************************************************
1192   !
1194    SUBEXIT
1196  SUBEND
1198!
1200 Meas_load:SUB Meas_load(@File,REAL Ok)
1202   !*********************************************************************
1204   !* Calibration example has no measurement spreadsheet.  This
1206   !* subroutine is still needed for the application loader, though.
1208   !*********************************************************************
1210   !
1212    SUBEXIT
1214  SUBEND
1216!