/* @(#)GNC Version 1.4: : HP8590 */
/******************************************************************************
 *
 * The following define statements are used to declare the names to be used
 * for the dset tables.   
 *
 * NOTE: The dsets are referenced by the entries in the command table.
 *
 ******************************************************************************/

#defineDSET_AI devAiHP8590LGpib
#defineDSET_AO devAoHP8590LGpib
#defineDSET_BI devBiHP8590LGpib
#defineDSET_BO devBoHP8590LGpib
#defineDSET_SI devSiHP8590LGpib
#defineDSET_SO devSoHP8590LGpib
#defineDSET_LI devLiHP8590LGpib
#defineDSET_LO devLoHP8590LGpib
#defineDSET_MBBI devMbbiHP8590LGpib
#defineDSET_MBBO devMbboHP8590LGpib
#defineDSET_WF devWfHP8590LGpib
#include <devGpib.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <devCommonGpib.h> #include <errlog.h> #include <menuFtype.h> #include <epicsStdio.h> #define STATIC static
STATIC longinit_dev_sup(), report();
#defineTIMEOUT5
#define TIMEWINDOW 1 static int rd_data(char wav[], float temp[]); static int rd_wf_data(struct gpibDpvt *pdpvt, int p1, int p2, char **p3); /* static int mySrqHandler(struct hwpvt *phwpvt, int srqStatus); */
staticstruct devGpibParmBlock devSupParms;
/****************************************************************************** * * Define all the dset's. * * Note that the dset names are provided via the #define lines at the top of * this file. * * Other than for the debugging flag(s), these DSETs are the only items that * will appear in the global name space within the IOC. * * The last 3 items in the DSET structure are used to point to the parm * structure, the work functions used for each record type, and the srq * handler for each record type. * ******************************************************************************/ /****************************************************************************** * * Debugging flags that can be accessed from the shell. * ******************************************************************************/ int HP8590Debug = 0;
extern int ibSrqDebug;/* declared in the GPIB driver */
/****************************************************************************** * * Use the TIME_WINDOW defn to indicate how long commands should be ignored * for a given device after it times out. The ignored commands will be * returned as errors to device support. * * Use the DMA_TIME to define how long you wish to wait for an I/O operation * to complete once started. * * These are to be declared in 60ths of a second. * ******************************************************************************/ /****************************************************************************** * * Strings used by the init routines to fill in the znam, onam, ... * fields in BI and BO record types. * ******************************************************************************/ static unsigned long GDL_BinaryNameVal[] = { 0 ,1 }; static char *CoupleList[] = { "AC", "DC" }; static struct devGpibNames Couple = { 2, CoupleList, GDL_BinaryNameVal, 1 }; static char *GratList[] = { "ON", "OFF" }; static struct devGpibNames Grat = { 2, GratList, GDL_BinaryNameVal, 1 }; static char *MkfcnameList[] = { "OFF", "ON" }; static struct devGpibNames Mkfcname = { 2, MkfcnameList, GDL_BinaryNameVal, 1 }; /****************************************************************************** * * Structures used by the init routines to fill in the onst, twst,... and the * onvl, twvl,... fields in MBBI and MBBO record types. * * Note that the intExtSsBm and intExtSsBmStop structures use the same * intExtSsBmStopList and intExtSsBmStopVal lists but have a different number * of elements in them that they use... The intExtSsBm structure only represents * 4 elements, while the intExtSsBmStop structure represents 5. * ******************************************************************************/ static char *ViewNameList[] = { "A" ,"B" ,"C" }; static unsigned long ViewNameVal[] = { 0 ,1 ,2 }; static struct devGpibNames ViewName = { 3, ViewNameList, ViewNameVal, 2 }; /****************************************************************************** * * String arrays for EFAST operations. Note that the last entry must be * NULL. * * On input operations, only as many bytes as are found in the string array * elements are compared. If there are more bytes than that in the input * message, they are ignored. The first matching string found (starting * from the 0'th element) will be used as a match. * * NOTE: For the input operations, the strings are compared literally! This * can cause problems if the instrument is returning things like \r and \n * characters. You must take care when defining input strings so you include * them as well. * ******************************************************************************/ static char *(CoupleMode[])={"COUPLE AC;\r\n","COUPLE DC;\r\n",NULL}; static char *(CoupleRead[])={"AC\r\n","DC\r\n",NULL}; static char *(GratMode[])={"GRAT ON;\r\n","GRAT OFF;\r\n",NULL}; static char *(Mkfcmode[])={"MKFC OFF;\r\n","MKFC ON;\r\n",NULL}; static char *(ViewMode[])={"VIEW TRA;\r\n","VIEW TRB;\r\n","VIEW TRC;\r\n",NULL}; /****************************************************************************** * * Array of structures that define all GPIB messages * supported for this type of instrument. * ******************************************************************************/ #define EOSLN NULL static struct gpibCmd gpibCmds[] = { /* CMMAND 0 set_center_freq */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CF %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 1 set_center_freq_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CF UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 2 set_center_freq_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CF DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 3 get_center_freq */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "CF?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 4 set_start_freq */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FA %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 5 set_start_freq_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FA UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 6 set_start_freq_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FA DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 7 get_start_freq */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "FA?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 8 set_stop_freq */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FB %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 9 set_stop_freq_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FB UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 10 set_stop_freq_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FB DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 11 get_stop_freq */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "FB?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 12 set_center_freq_step */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SS %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 13 set_center_freq_step_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SS UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 14 set_center_freq_step_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SS DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 15 set_center_freq_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SS AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 16 get_center_freq_step */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "SS?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 17 set_span */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SP %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 18 set_span_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SP UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 19 set_sapn_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SP DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 20 get_span */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "SP?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 21 set_rbw */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RB %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 22 set_rbw_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RB UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 23 set_rbw_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RB DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 24 set_rbw_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RB AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 25 get_rbw */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "RB?\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 26 set_vbw */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "FB %lfHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 27 set_vbw_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "VB UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 28 set_vbw_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "VB DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 29 set_vbw_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "VB AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 30 get_vbw */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "VB?\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 31 set_sweep */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "ST %lfSC;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 32 set_sweep_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "ST UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 33 set_sweep_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "ST DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 34 set_sweep_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "ST AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 35 get_sweep */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "ST?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 36 set_attenuation */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "AT %lfDB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 37 set_attenuation_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "AT UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 38 set_attenuation_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "AT DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 39 set_attenuation_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "AT AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 40 get_attenuation */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "AT?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 41 set_couple */ {&DSET_MBBO, GPIBEFASTO, IB_Q_LOW, NULL, NULL, 0, 32, NULL, 0, 0, CoupleMode, &Couple, EOSLN }, /* CMMAND 42 get_couple */ {&DSET_MBBI, GPIBEFASTI, IB_Q_LOW, NULL, NULL, 0, 32, NULL, 0, 0, CoupleRead, &Couple, EOSLN }, /* CMMAND 43 set_log_scale */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "LG %lfDB;", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 44 set_log_scale_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "LG UP;", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 45 set_log_scale_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "LG DN;", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 46 get_log_scale */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "LG?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 47 set_linear */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "LN;", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 48 set_reference_level */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RL %lfDB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 49 set_reference_level_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RL UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 50 set_reference_level_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RL DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 51 get_reference_level */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "RL?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 52 set_srcat */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCAT %lfDB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 53 set_srcat_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCAT UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 54 set_srcat_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCAT DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 55 set_srcat_auto */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCAT AUTO;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 56 get_srcat */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "SRCAT?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 57 set_srcpwr */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCPWR %lfDB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 58 set_srcpwr_up */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCPWR UP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 59 set_srcpwr_dn */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCPWR DN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 60 set_srcpwr_on */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCPWR ON;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 61 set_srcpwr_off */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCPWR OFF;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 62 get_srcpwr */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "SRCPWR?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 63 set_srctkpk */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SRCTKPK;", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 64 set_grat */ {&DSET_MBBO, GPIBEFASTO, IB_Q_LOW, NULL, NULL, 0, 32, NULL, 0, 0, GratMode, &Grat, EOSLN }, /* CMMAND 65 set_title */ {&DSET_SO, GPIBWRITE, IB_Q_LOW, NULL, "TITLE :%s:;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 66 get_trace_a */ {&DSET_WF, GPIBREADW, IB_Q_LOW, "SNGLS;TDF P;AUNITS DBM;RQS 4;TS;TA;\r\n", NULL, 0, 819100, rd_wf_data, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 67 get_trace_b */ {&DSET_WF, GPIBREAD, IB_Q_LOW, "TDF P;AUNITS DBM;TB;\r\n", NULL, 0, 8191, rd_wf_data, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 68 get_trace_aeos */ {&DSET_WF, GPIBREAD, IB_Q_LOW, "ONEOS!TDF P; AUNITS DBM;TA;!\r\n", NULL, 0, 8191, rd_wf_data, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 69 set_trigger_single */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "SNGLS;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 70 set_trigger_start */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "TS;\r\n", 0, 256, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 71 set_trace_a_clrw */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CLRW TRA;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 72 set_trace_b_clrw */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CLRW TRB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 73 set_marker_peak_eos */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "ONEOS!MKPK HI;!\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 74 set_marker_peak_nh */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKPK NH;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 75 set_marker_peak_nr */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKPK NR;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 76 set_marker_peak_nl */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKPK NL;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 77 set_marker_delta */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKD;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 78 set_marker_normal */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKN;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 79 get_marker_freq */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "TDF P;MKREAD FRQ;MKF?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 80 get_marker_amp */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "TDF P;AUNITS DBM;MKA?;\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 81 set_marker_act */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "MKACT %d;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 82 get_marker_act */ {&DSET_LI, GPIBREAD, IB_Q_LOW, "MKACT?\r\n", "%d\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 83 set_marker_center */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKCF;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 84 set_marker_counter */ {&DSET_MBBO, GPIBEFASTO, IB_Q_LOW, NULL, NULL, 0, 32, NULL, 0, 0, Mkfcmode, &Mkfcname, EOSLN }, /* CMMAND 85 set_marker_fc_res */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "MKFCR %dHZ;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 86 get_marker_fc_res */ {&DSET_LI, GPIBREAD, IB_Q_LOW, "MKFCR?;\r\n", "%d\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 87 set_maker_off */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKOFF ALL;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 88 get_maker_xpos */ {&DSET_LI, GPIBREAD, IB_Q_LOW, "MKP?;\r\n", "%d\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 89 set_view_trace */ {&DSET_MBBO, GPIBEFASTO, IB_Q_LOW, NULL, NULL, 0, 32, NULL, 0, 0, ViewMode, &ViewName, EOSLN }, /* CMMAND 90 set_sa_init */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "IP;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 91 set_cont_sweep */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RQS 0;CONTS;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 92 set_marker_peak */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MKPK HI;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 93 dispose_all */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "DISPOSE ALL;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 94 dispose_oneos */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "DISPOSE ONEOS;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 95 set_trace_maxhold_a */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MXMH TRA;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 96 set_trace_maxhold_b */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "MXMH TRB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 97 set_trace_vavg */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "VAVG %d;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 98 set_trace_vavg_on */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "VAVG ON;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 99 set_trace_vavg_off */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "VAVG OFF;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 100 set_trace_clrw_a */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CLRW TRA;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 101 set_trace_clrw_b */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CLRW TRB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 102 set_trace_clrw_c */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "CLRW TRB;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 103 get_trace_eos_peak */ {&DSET_AI, GPIBREAD, IB_Q_LOW, "ONEOS!MKPK HI;TDF P;MKREAD FRQ;MKF?;!\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 104 get_marker_eos */ {&DSET_AI, GPIBREADW, IB_Q_LOW, "ONEOS!MKPK HI;TDF P;MKREAD FRQ;MKF?;!\r\n", "%lf\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 105 set_srq */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RQS 4;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 106 rel_srq */ {&DSET_AO, GPIBWRITE, IB_Q_LOW, NULL, "RQS 0;\r\n", 0, 64, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 107 get_stb */ {&DSET_LI, GPIBREAD, IB_Q_LOW, "STB?;\r\n", "%d\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 108 UNSolicited_SRQ */ {&DSET_LI, GPIBSRQHANDLER, IB_Q_LOW, "CLS;\r\n", NULL, 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 109 set_srctk */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "SRCTK %d;\r\n", 0, 32, NULL, 0, 0, NULL, NULL, EOSLN }, /* CMMAND 110 get_srctk */ {&DSET_LI, GPIBREAD, IB_Q_LOW, "SRCTK?;\r\n", "%d\r\n", 0, 511, NULL, 0, 0, NULL, NULL, EOSLN } }; /* The following is the number of elements in the command array above. */
#define NUMPARAMSsizeof(gpibCmds)/sizeof(struct gpibCmd)
/****************************************************************************** * * Structure containing the user's functions and operating parameters needed * by the gpib library functions. * * The magic SRQ parm is the parm number that, if specified on a passive * record, will cause the record to be processed automatically when an * unsolicited SRQ interrupt is detected from the device. * * If the parm is specified on a non-passive record, it will NOT be processed * when an unsolicited SRQ is detected. * * In the future, the magic SRQ parm records will be processed as "I/O event * scanned"... not passive. * ******************************************************************************/ static long init_ai(int parm) { if(parm==0) { devSupParms.name = "devHP8590LGpib"; devSupParms.gpibCmds = gpibCmds; devSupParms.numparams = NUMPARAMS; devSupParms.timeout = TIMEOUT; devSupParms.timeWindow = TIMEWINDOW; devSupParms.respond2Writes = -1.0; } return(0); } /****************************************************************************** * * Initialization for device support * This is called one time before any records are initialized with a parm * value of 0. And then again AFTER all record-level init is complete * with a param value of 1. * ******************************************************************************/ /****************************************************************************** * * Print a report of operating statistics for all devices supported by this * module. * * This function will no longer be required after epics 3.3 is released * ******************************************************************************/ /****************************************************************************** * * c code * *****************************************************************************/
#defineHP8590_GOODBITS0x3E
#define HP8590_ILLCOM0x20
#define HP8590_COMMAND 0x10#define HP8590_HARD 0x08 #define HP8590_SWEEP 0x04 #define HP8590_USER 0x02 static int rd_data(char wav[], float data[]) { int i; char wa1[32767]; strcpy(wa1,strtok(wav,"\r\n")); data[0]= (float) atof(wa1); for (i=1; i<399; i++) { strcpy(wa1,strtok(NULL,"\r\n"));
/*printf("wa1=%s\n",wa1); */
data[i] = (float) atof(wa1); } return 0; } STATIC int rd_wf_data(struct gpibDpvt *pdpvt, int p1, int p2, char **p3) { struct waveformRecord *pwf = (struct waveformRecord *) (pdpvt->precord);
char*craw;
float*temparray;
float temp[500],*ptemp;
intok_flag;
unsigned longnumElem;
temparray = (float *) pwf->bptr; craw = pdpvt->msg;
/*logMsg("craw = %s\n",craw);
printf("craw -- end\n");*/
/* craw = strtok(craw,"\r\n"); if (craw == NULL) { devGpibLib_setPvSevr(pwf, READ_ALARM, INVALID_ALARM); logMsg("null data in HP8590\n"); return(ERROR); } */ ok_flag = rd_data(craw,temp); if (ok_flag != 0) { /* devGpibLib_setPvSevr(pwf,READ_ALARM, INVALID_ALARM); */ printf("Not OK HP8594\n"); return(-1); } numElem = 399; if (numElem > pwf->nelm) numElem = pwf->nelm; pwf->nord = numElem;
ptemp=temp;
while (numElem--) { /* logMsg( "\n%d-th data: %f",numElem, *ptemp); */ *temparray++ = (float) *ptemp++; } /* logMsg( "\nread_wf end normally\n"); */ return(0); } /* STATIC int mySrqHandler(struct hwpvt *phwpvt, int srqStatus) { int status = IDLE; int rqsBit,errorBit,busyBit; CALLBACK *pcallback; rqsBit =srqStatus & HP8590_COMMAND; switch (srqStatus & HP8590_GOODBITS) { default: if (phwpvt->unsolicitedDpvt != NULL){ pcallback=&(phwpvt->unsolicitedDpvt->head.callback); callbackSetCallback(devGpibLib_processCallback, pcallback); callbackSetPriority(priorityHigh, pcallback); callbackSetUser((void*)phwpvt->unsolicitedDpvt, pcallback); callbackRequest(pcallback); } else{ printf("HP8590 UNKNOWN SRQ\n"); } } return(status); } */