Пример #1
0
int l2415___store(struct descriptor *niddsc, InStoreStruct *setup)
{
  static int polarity_nid;
  static int range_nid;
  static int volt_out_nid;
  static int curr_out_nid;
  static DESCRIPTOR_NID(polarity_dsc,&polarity_nid);
  static DESCRIPTOR_NID(range_dsc,&range_nid);
  static struct descriptor_xd out_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};
  int status=1;
  static short voltage;
  static struct descriptor voltage_dsc = {sizeof(short), DTYPE_W, CLASS_S, (char *)&voltage};
  static DESCRIPTOR(volt_expr, "BUILD_WITH_UNITS($ * $ * ($ == 3500. ? 1. : 2.), 'Volts')");
  static short current;
  static struct descriptor current_dsc = {sizeof(short), DTYPE_W, CLASS_S, (char *)&current};
  static DESCRIPTOR(current_expr, "BUILD_WITH_UNITS($ * ( $ == 3500. ? .0025/4096. : .001/4096.) , 'Amps')");
  polarity_nid = setup->head_nid + L2415_N_POLARITY;
  range_nid = setup->head_nid + L2415_N_RANGE;
  pio(26,0,0);   /* convert output voltage to digital */
  qrep(0,0,1,&voltage); /* read it when we get q back */
  TdiCompile(&volt_expr, &voltage_dsc, &polarity_dsc, &range_dsc, &out_xd MDS_END_ARG);
  volt_out_nid = setup->head_nid + L2415_N_VOLT_OUT;
  return_on_error(TreePutRecord(volt_out_nid, (struct descriptor *)&out_xd, 0), status);
  pio(26,1,0);   /* convert output current to digital */
  qrep(0,0,1,&current); /* read it when we get q back */
  TdiCompile(&current_expr, &current_dsc, &range_dsc, &out_xd MDS_END_ARG);
  curr_out_nid = setup->head_nid + L2415_N_CURR_OUT;
  return_on_error(TreePutRecord(curr_out_nid, (struct descriptor *)&out_xd, 0), status);
  /* turn it off */
/*
  pio(16,0,0)
  pio(16,1,0)
*/
  return 1;
}
Пример #2
0
static char *MdsGetString(char *in)
{
    char *out = NULL;
    int status;
    struct descriptor in_d = {0,DTYPE_T,CLASS_S,0};
    EMPTYXD(xd);

    in_d.length = strlen(in);
    in_d.pointer = in;
    status = TdiCompile(&in_d, &xd MDS_END_ARG);
    if(status & 1)
		status = TdiData(&xd, &xd MDS_END_ARG);
    if(!(status & 1))
    {
    	strncpy(error_message, MdsGetMsg(status), 512);
		return NULL;
    }
    if(!xd.pointer)
    {
		strcpy(error_message, "Missing data");
		return NULL;
    }
    if(xd.pointer->dtype != DTYPE_T)
    { 
		MdsFree1Dx(&xd, NULL);
		strcpy(error_message, "Not a string");
		return NULL;
    }
    out = (char *)malloc(xd.pointer->length + 1);
    memcpy(out, xd.pointer->pointer, xd.pointer->length);
    out[xd.pointer->length] = 0;
    MdsFree1Dx(&xd, NULL);
    error_message[0] = 0;
    return out;
}
Пример #3
0
int joerger_adcp___store(struct descriptor *nid_dsc, InStoreStruct *setup)
{
  int status;
  int chan;
  static int c_nids[JOERGER_ADCP_K_CONG_NODES];
  static DESCRIPTOR(output_expr, "$*$");
  static short int buffer[16];
  static DESCRIPTOR_A(buffer_dsc, sizeof(short int), DTYPE_W, &buffer, sizeof(buffer));
  static float coef;
  static DESCRIPTOR_FLOAT(coef_dsc, &coef);
  static struct descriptor_xd output_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};
  static float coefs[] = {20.48/4096, 10.24/4096, 10.24/4096, 5.12/4096};
  struct _op_mode {
    unsigned int mode:2;
    unsigned int coef:2;
    unsigned int cont:1;
    unsigned int :11;
  } operating_mode;

  return_on_error(DevNids(nid_dsc,sizeof(c_nids),c_nids));
  if (setup->no_trig) {
    float wait = 10E-6*16;
    pio(26, 0, 0);
    return_on_error(DevWait(wait));
  }
  for (chan=0; chan<16; chan++)
    pio(0,chan,&buffer[chan]);
  pio(1,15, (short *)&operating_mode);
  coef = coefs[operating_mode.coef];
  return_on_error(TdiCompile(&output_expr, &buffer_dsc, &coef_dsc, &output_xd MDS_END_ARG));
  status = TreePutRecord(c_nids[JOERGER_ADCP_N_INPUTS], (struct descriptor *)&output_xd,0);  
  return status;
}
Пример #4
0
JNIEXPORT void JNICALL Java_LocalDataProvider_SetEnvironmentSpecific(JNIEnv *env, jobject obj, 
																	 jstring in, jstring jdefNode)
{
	int status, nid;
    const char *in_char = (*env)->GetStringUTFChars(env, in, 0);
	const char *defNode;
    struct descriptor in_d = {0,DTYPE_T,CLASS_S,0};
    EMPTYXD(xd);
	error_message[0] = 0;
	if(in_char && *in_char)
	{
		in_d.length = strlen(in_char);
		in_d.pointer = (char *)in_char;
		status = TdiCompile(&in_d, &xd MDS_END_ARG);
		if(status & 1)
    		status = TdiData(&xd, &xd MDS_END_ARG);
		if(!(status & 1))
   			strncpy(error_message, MdsGetMsg(status), 512);
		MdsFree1Dx(&xd, NULL);
		(*env)->ReleaseStringUTFChars(env, in, in_char);
    }
	if(jdefNode)
	{
		defNode = (*env)->GetStringUTFChars(env, jdefNode, 0);
		status = TreeFindNode((char *)defNode, &nid);
		if(status & 1)
			TreeSetDefaultNid(nid);
		(*env)->ReleaseStringUTFChars(env, jdefNode, defNode);
	}

}
Пример #5
0
static float MdsGetFloat(char *in)
{
    float ris = 0;
    int status;
    struct descriptor in_d = {0,DTYPE_T,CLASS_S,0};
    EMPTYXD(xd);

    in_d.length = strlen(in);
    in_d.pointer = in;
    status = TdiCompile(&in_d, &xd MDS_END_ARG);
    if(status & 1)
    	status = TdiData(&xd, &xd MDS_END_ARG);
    if(status & 1)
    	status = TdiFloat(&xd, &xd MDS_END_ARG);
    if(!(status & 1))
    {
    	strncpy(error_message, MdsGetMsg(status), 512);
	    return 0;
    }
    if(!xd.pointer)
    {
		strcpy(error_message, "Missing data");
		return 0;
    }
    if(xd.pointer->class != CLASS_S)
    {
		strcpy(error_message, "Not a scalar");
		return 0;
    }
    switch(xd.pointer->dtype) {
	case DTYPE_BU:
	case DTYPE_B : ris = (float)(*(char *)xd.pointer->pointer); break;
	case DTYPE_WU:
	case DTYPE_W : ris = (float)(*(short *)xd.pointer->pointer); break;
	case DTYPE_LU:
	case DTYPE_L : ris = (float)(*(int *)xd.pointer->pointer); break;
	case DTYPE_F : ris = *(float *)xd.pointer->pointer; break;
	case DTYPE_FS: ris = *(float *)xd.pointer->pointer; break;
	case DTYPE_D :
	case DTYPE_G : ris = *(float *)xd.pointer->pointer; break; 
	default:	sprintf(error_message, "Not a supported type %d", xd.pointer->dtype);
			return 0;
    }
    MdsFree1Dx(&xd, NULL);
    error_message[0] = 0;
    return ris;
}
Пример #6
0
int ec727___store(struct descriptor *niddsc_ptr, InStoreStruct *setup)
{
  static DESCRIPTOR(sigdef,"BUILD_SIGNAL(BUILD_WITH_UNITS($,'counts'),*,$[ $ : $ ])");
  static DESCRIPTOR_A_BOUNDS(raw,sizeof(int),DTYPE_L,0,1,0);
  static DESCRIPTOR_LONG(start_d,&raw.bounds[0].l);
  static DESCRIPTOR_LONG(end_d,&raw.bounds[0].u);
  static EMPTYXD(signal);
  static int xfer_in;
  static DESCRIPTOR_NID(xfer_in_d,&xfer_in);
  int data[1024][32];
  int cdata[1024];
  int *dptr = (int *)data;
  int status;
  int i;
  int chan;
  xfer_in = setup->head_nid + EC727_N_XFER_IN;
  pio(17,0);
  for (i=0;i<4;i++,dptr += 8192) stop(0,0,8192,dptr);
  for (chan=0;((chan < 32) && (status & 1));chan++)
  {
    int c_nid = setup->head_nid + EC727_N_INPUT_01 + chan * (EC727_N_INPUT_02 - EC727_N_INPUT_01);
    int s_nid = c_nid + EC727_N_INPUT_01_STARTIDX - EC727_N_INPUT_01;
    int e_nid = c_nid + EC727_N_INPUT_01_ENDIDX - EC727_N_INPUT_01;
    if (TreeIsOn(c_nid) & 1)
    {
      status = DevLong(&s_nid,(int *)&raw.bounds[0].l);
      if (status&1) raw.bounds[0].l = min(1023,max(0,raw.bounds[0].l));
      else raw.bounds[0].l = 0;

      status = DevLong(&e_nid, (int *)&raw.bounds[0].u);
      if (status&1) raw.bounds[0].u = min(1023,max(0,raw.bounds[0].u));
      else raw.bounds[0].u = 1023;

      raw.m[0] = raw.bounds[0].u - raw.bounds[0].l + 1;
      if (raw.m[0] > 0)
      {
        for (i=0;i<1024;i++) cdata[i] = data[i][chan];
        raw.pointer = (char *)(cdata + (raw.bounds[0].l));
        raw.a0 = (char *)cdata;
        raw.arsize = raw.m[0] * 4;
        TdiCompile(&sigdef,&raw,&xfer_in_d,&start_d,&end_d,&signal MDS_END_ARG);
        status = TreePutRecord(c_nid,(struct descriptor *)signal.pointer,0);
      }
    }
  }
  return status;
}
Пример #7
0
int joerger_adc___store(int *niddsc, InStoreStruct *setup)
{ 
  int status;
  int data_nid = setup->head_nid + JOERGER_ADC_N_DATA;
  if (TreeIsOn(data_nid)&1)
  {
    static short raw[64];
    static ARRAY_BOUNDS(short,1) raw_d = {4,DTYPE_W,CLASS_A,raw,0,0,{0,0,1,1,1},1,sizeof(raw),raw-1,32,1,32};
    static int vstrap_nid;
    static DESCRIPTOR_NID(vstrap_d,&vstrap_nid);
    static EMPTYXD(xd);
    static DESCRIPTOR(expr,"BUILD_WITH_UNITS($ * $/4095,'VOLTS'");
    int bytcnt;
    vstrap_nid = setup->head_nid + JOERGER_ADC_N_VSTRAP;
    return_on_error(DevCamChk(CamQstopw(setup->name,0,2,64,&raw,16,0),&one,0),status);
    bytcnt = CamBytcnt(0);
    raw_d.arsize = bytcnt;
    raw_d.m[0] = raw_d.bounds[0].u = bytcnt/2;
    TdiCompile(expr,&raw_d,&vstrap_d,&xd MDS_END_ARG);
    status = TreePutRecord(data_nid,(struct descriptor *)&xd,0);
  }
  return status;
}
Пример #8
0
static int Put(unsigned short int *buffer, int pts_per_chan, int chans, int clock_nid, int nid)
{
  DESCRIPTOR_A_COEFF_2 (a_dsc, sizeof(short), DTYPE_W, (char *)0, 0, 0, 0);
  DESCRIPTOR(expr, "BUILD_SIGNAL(BUILD_WITH_UNITS($VALUE*.25E-12,'Coulombs'), build_with_units($,'counts'), $, \
                           build_with_units(0 : $ : 1, 'Channel'))");
  struct descriptor_s clock_nid_dsc = {sizeof(int), DTYPE_NID, CLASS_S, (char *)0};
  int max_chan_num = chans-1;
  struct descriptor_s num_dsc = {sizeof(int), DTYPE_L, CLASS_S, (char *)0};
  static struct descriptor_xd output_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};
  int status;
  a_dsc.pointer = (char *)buffer;
  a_dsc.arsize = pts_per_chan*chans*sizeof(short);
  a_dsc.m[0] = pts_per_chan;
  a_dsc.m[1] = chans;
  clock_nid_dsc.pointer = (char *)&clock_nid;
  num_dsc.pointer = (char *)&max_chan_num;
  status = TdiCompile(&expr, &a_dsc, &clock_nid_dsc, &num_dsc, &output_xd MDS_END_ARG);
  if (status&1) {
    status = TreePutRecord(nid, (struct descriptor *)&output_xd,0);
    MdsFree1Dx(&output_xd,0);
  }
  return status;
}  
Пример #9
0
	/****************************************************************
	 * TclDoMethod:
	 ****************************************************************/
int TclDoMethod()
   {
    int   i;
    int   argc;
    int   sts;
    unsigned char  do_it;
    struct descriptor_xd xdarg[255];
    static int   nid;
    static unsigned short boolVal;
    static struct descriptor_s bool_dsc =
                    {sizeof(boolVal), DTYPE_W, CLASS_S, (char *)&boolVal};
    static struct descriptor nid_dsc = {4,DTYPE_NID,CLASS_S,(char *)&nid};
    static struct descriptor_xd empty_xd = {0,DTYPE_DSC,CLASS_XD,0,0};
    static DYNAMIC_DESCRIPTOR(arg);
    static DYNAMIC_DESCRIPTOR(if_clause);
    static DYNAMIC_DESCRIPTOR(method);
    static DYNAMIC_DESCRIPTOR(object);
    static void  *arglist[256] = {(void *)2,&nid_dsc,&method};

    cli_get_value("OBJECT",&object);
    sts = TreeFindNode(object.dscA_pointer,&nid);
    if (sts & 1)
       {
        do_it = (TreeIsOn(nid) | cli_present("OVERRIDE")) & 1;
        if (cli_present("IF") & 1)
           {
            cli_get_value("IF",&if_clause);
            sts = TdiExecute(&if_clause,&bool_dsc MDS_END_ARG);
            if (sts & 1)
                do_it = do_it && boolVal;
            else
                do_it = 0;
           }
        if (do_it)
           {
            int dometh_stat;
            DESCRIPTOR_LONG(dometh_stat_d,0);
            cli_get_value("METHOD",&method);
            argc = 0;
            if (cli_present("ARGUMENT") & 1)
               {
                while (cli_get_value("ARGUMENT",&arg) & 1)
                   {
                    xdarg[argc] = empty_xd;
                    sts = TdiCompile(&arg,&xdarg[argc] MDS_END_ARG);
                    if (sts & 1)
                       {
                        arglist[argc + 3] = xdarg[argc].dscA_pointer;
                        argc++;
                       }
                    else
                        break;
                   }
               }
            if (sts & 1)
               {
#ifdef vms
                arglist[0] = (void *)(argc + 2);
#else
                dometh_stat_d.dscA_pointer = (char *)&dometh_stat;
                arglist[argc+3] = &dometh_stat_d;
                arglist[argc+4] = MdsEND_ARG;
                arglist[0] = (argc + 4)+(char *)0;
#endif

		sts = (char *)LibCallg(arglist,TreeDoMethod)-(char *)0;
                if (sts & 1) sts = dometh_stat;
               }
            str_free1_dx(&arg);
            str_free1_dx(&method);
            for (i = 0; i < argc; i++)
                MdsFree1Dx(&xdarg[i],NULL);
           }
       }
    str_free1_dx(&object);
#ifdef vms
    if (!(sts & 1)) lib$signal(sts,0);
#else
	if (!(sts & 1))
	{
		char msg[512];
		sprintf(msg,"Error executing method - %s",MdsGetMsg(sts));
		TclTextOut(msg);
	}
#endif
    return sts;
   }
Пример #10
0
int mit_clock__get_setup(Dptr niddsc_ptr, Dptr method, DecoderSetup *setup, EventMask *event_mask, Dptr *output)
{
  int status;
  InGet_setupStruct s;
  status = mit_clock___get_setup(niddsc_ptr,&s);
  if (status & 1)
  {
    float duty_cycle;
    int invert = 0;
    static float frequency[2];
    float max_period;
    float period;
    static float dt;
    DESCRIPTOR_FLOAT(dt_dsc,&dt);
    int pulses;
    int clock_source;
    static DESCRIPTOR(expr, "* : * : $");
    static EMPTYXD(out);
    DESCRIPTOR_A(frequency_a,sizeof(float),DTYPE_NATIVE_FLOAT,(char *)frequency,sizeof(frequency));
    memset(event_mask,0,sizeof(EventMask));
    status = TdiData(s.frequency,(struct descriptor *)&frequency_a MDS_END_ARG);
    if (!(status & 1))
    {
      status = TIMING$_INVCLKFRQ;
      goto error;
    }
    if (frequency[1] == frequency[0])
      duty_cycle = .5;
    else if (frequency[1] < 0.0)
    {
      invert = 1;
      duty_cycle = -frequency[1];
    }
    else if (frequency[1] > 0.0)
      duty_cycle = frequency[1];
    if ( (frequency[0] <= 0.0) || (duty_cycle <= 0.0) || (duty_cycle >= 1.0) )   
    {
      status = TIMING$_INVCLKFRQ;
      goto error;
    }
    max_period = 1/frequency[0];
    for (clock_source = EXT_1MHZ, period = 1E-6;
       period * 65534 < max_period && clock_source <= EXT_100HZ; clock_source++, period *= 10);
    if (clock_source > EXT_100HZ)
    {
      status = TIMING$_INVCLKFRQ;
      goto error;
    }
    setup->output_control = TOGGLE;
    setup->start_high = 0;
    setup->count_up = 0;
    setup->bcd_count = 0;
    setup->repeat_count = 1;
    setup->double_load = 1;
    setup->special_gate = 0;
    setup->clock_source = clock_source;
    setup->falling_edge = 0;
    setup->gating = GATE_NONE;
    pulses = max_period/period + .4999;
    setup->load = pulses * duty_cycle + .4999;
    setup->hold = pulses - setup->load;
    if (setup->load == 0)
    {
      setup->load++;
      setup->hold--;
    }
    if (setup->hold == 0)
    {
      setup->load--;
      setup->hold++;
    }
    dt = period*(setup->load + setup->hold);
    if (invert)
    {
      int tmp = setup->load;
      setup->load = setup->hold;
      setup->hold = tmp;
      setup->start_high = 1;
    }
    status = TdiCompile(&expr, &dt_dsc, &out MDS_END_ARG);
    if (status&1) {
      static int output_nid;
      static DESCRIPTOR_NID(output_dsc,(char *)&output_nid);
      output_nid = s.head_nid + MIT_CLOCK_N_OUTPUT;
      status = TreePutRecord(output_nid, (struct descriptor *)&out,0);
      if (status&1) *output = &output_dsc; else *output=0;
    }
    else
      *output = 0;
    GenDeviceFree(&s);
  }
  return status;
error:
  GenDeviceFree(&s);
  return status;
}
Пример #11
0
int b2408___store(struct descriptor *niddsc, InStoreStruct *setup)
{
  int i;
  int j;
  int npts;
  int status = 1;
  static int trig_nid;
  static DESCRIPTOR_NID(trig_dsc, &trig_nid);
  static int ext_clock_nid;
  static DESCRIPTOR_NID(clock_dsc, &ext_clock_nid);
  static int buffer[2048];
  static DESCRIPTOR_A(buffer_dsc, sizeof(int), DTYPE_L, buffer, 0);
  static float clock_mult;
  static DESCRIPTOR_FLOAT(clock_mult_dsc, &clock_mult);
  static struct descriptor_xd xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};
  static DESCRIPTOR(expr, "BUILD_SIGNAL(BUILD_WITH_UNITS(SLOPE_OF($)*$*$VALUE+$,\"Seconds\"), $, *)");
  static DESCRIPTOR(int_clock_expr, "BUILD_SIGNAL(BUILD_WITH_UNITS(1E-6*$*$VALUE+$,\"Seconds\"), $, *)");
  static float multipliers[] = {1, 10, 100, 1000};
  static int zero = 0;
  int output_nid = setup->head_nid+B2408_N_TIMEBASE;
  StatusReg status_reg;

  ext_clock_nid = setup->head_nid+B2408_N_EXT_CLOCK;
  trig_nid = setup->head_nid+B2408_N_TRIGGER;
  if (XmdsIsOn(output_nid)) {
    pio(24,0,0,16);
    pio(1,0,(int *)&status_reg,24);
    npts = status_reg.npts;
    clock_mult = multipliers[status_reg.freq];
    if (npts > 0) {
      int ok,tries;
      for (ok=0,tries=0;tries < 100 && !ok; tries++) {
        pio(16,0,&zero,16);
        stop(2,0,npts,buffer);
        ok = 1;
        for (j=1;j<npts;j++) {
          if (buffer[j-1] > buffer[j]) {
            ok = 0;
            break;
          }
        }
      }
      if (tries > 1) {
        char comment_c[80];
        struct descriptor comment={0,DTYPE_T,CLASS_S,0};
        int comment_nid = setup->head_nid+B2408_N_COMMENT;
        sprintf(comment_c,"Increasing times %sobtained after %d attempts",ok ? "" : "not ",tries);
        comment.length = strlen(comment_c);
        comment.pointer = comment_c;
        TreePutRecord(comment_nid, (struct descriptor *)&comment,0);
      }
    } else
      return DEV$_NOT_TRIGGERED;

    buffer_dsc.arsize = npts*sizeof(int);
/*    if (status_reg.ext_clk) { */
    if (1) {
      return_on_error(TdiCompile(&expr, &clock_dsc, &clock_mult_dsc, &trig_dsc, &buffer_dsc, (struct descriptor *)&xd MDS_END_ARG),status);
    }
    else {
      return_on_error(TdiCompile(&int_clock_expr, &clock_mult_dsc, &trig_dsc, &buffer_dsc, (struct descriptor *)&xd MDS_END_ARG),status);
    }
    return_on_error(TreePutRecord(output_nid, (struct descriptor *)&xd,0), status);
  }  
/*  return (status_reg.overflow) ? B2408$_OVERFLOW : (status_reg.trig_lim) ? B2408$_TRIG_LIM : 1; */
  return (status_reg.overflow) ? B2408$_OVERFLOW : 1;
}
Пример #12
0
static void *MdsGetArray(char *in, int *out_dim, int is_float, int is_byte, int is_double)
{
    float *float_ris = NULL;
    double *double_ris = NULL;
    int *int_ris = NULL;
	char *byte_ris = NULL;
    int status, dim, i;
    struct descriptor in_d = {0,DTYPE_T,CLASS_S,0};
    EMPTYXD(xd);
    struct descriptor_a *arr_ptr;
	char *expanded_in;

    error_message[0] = 0;
    *out_dim = 0;
	if(is_float)
	{
		expanded_in = malloc(strlen(in) + 16);
		sprintf(expanded_in, "fs_float((%s))", in);
		in_d.length = strlen(expanded_in);
		in_d.pointer = expanded_in;
	}
	else if(is_double)
	{
		expanded_in = malloc(strlen(in) + 16);
		sprintf(expanded_in, "ft_float((%s))", in);
		in_d.length = strlen(expanded_in);
		in_d.pointer = expanded_in;
	}
	else
	{
		expanded_in = malloc(strlen(in) + 16);
		sprintf(expanded_in, "long((%s))", in);
		in_d.length = strlen(expanded_in);
		in_d.pointer = expanded_in;
/*		in_d.length = strlen(in);
		in_d.pointer = in;*/
	}
    status = TdiCompile(&in_d, &xd MDS_END_ARG);
	if(is_float) free(expanded_in);
    if(status & 1)
    	status = TdiData(&xd, &xd MDS_END_ARG);
    if(!(status & 1))
    {
    	strncpy(error_message, MdsGetMsg(status), 512);
		return 0;
    }
    if(!xd.pointer)
    {
		strcpy(error_message, "Missing data");
		return 0;
    }
    if(xd.pointer->class != CLASS_A)
    {
		if(!is_float && !is_double) /*Legal only if used to retrieve the shot number*/
		{
			int_ris = malloc(sizeof(int));
			switch(xd.pointer->dtype)
			{
				case DTYPE_BU:
				case DTYPE_B : int_ris[0] = *((char *)xd.pointer->pointer); break;
				case DTYPE_WU:
				case DTYPE_W : int_ris[0] = *((short *)xd.pointer->pointer); break;
				case DTYPE_LU:
				case DTYPE_L : int_ris[0] = *((int *)xd.pointer->pointer); break;
				case DTYPE_F : 
				case DTYPE_FS : int_ris[0] = *((int *)xd.pointer->pointer); break;
			}
			*out_dim = 1;
			return int_ris;
		}
		strcpy(error_message, "Not an array");
		return 0;
	}
 	arr_ptr = (struct descriptor_a *)xd.pointer;
/*	if(arr_ptr->dtype == DTYPE_F || 
		arr_ptr->dtype == DTYPE_D ||
		arr_ptr->dtype == DTYPE_G ||
		arr_ptr->dtype == DTYPE_H) 
	{
		status = TdiFloat(&xd, &xd MDS_END_ARG);
		arr_ptr = (struct descriptor_a *)xd.pointer;
	}
	*/
	*out_dim = dim = arr_ptr->arsize/arr_ptr->length;
    if(is_float)
        float_ris = (float *)malloc(sizeof(float) * dim);
	else if(is_double)
		double_ris = (double *)malloc(sizeof(double) * dim);
    else if(is_byte)
		byte_ris = malloc(dim);
	else
        int_ris = (int *)malloc(sizeof(int) * dim);
    switch(arr_ptr->dtype) {
	case DTYPE_BU:
	case DTYPE_B : 
		for(i = 0; i < dim; i++)
		    if(is_float)
		    	float_ris[i] = ((char *)arr_ptr->pointer)[i];
			else if(is_double)
				double_ris[i] = ((char *)arr_ptr->pointer)[i];
		    else if(is_byte)
		    	byte_ris[i] = ((char *)arr_ptr->pointer)[i];
			else
		    	int_ris[i] = ((char *)arr_ptr->pointer)[i];
		break;
	case DTYPE_WU:
	case DTYPE_W : 
		for(i = 0; i < dim; i++)
		    if(is_float)
		    	float_ris[i] = ((short *)arr_ptr->pointer)[i];
			else if(is_double)
				double_ris[i] = ((char *)arr_ptr->pointer)[i];
		    else if(is_byte)
		    	byte_ris[i] = (char)(((short *)arr_ptr->pointer)[i]);
			else
				int_ris[i] = ((short *)arr_ptr->pointer)[i];
		break;
	case DTYPE_LU:
	case DTYPE_L : 
		for(i = 0; i < dim; i++)
		    if(is_float)
		    	float_ris[i] = (float)(((int *)arr_ptr->pointer)[i]);
			if(is_double)
		    	double_ris[i] = (double)(((int *)arr_ptr->pointer)[i]);
		    else if(is_byte)
		    	byte_ris[i] = ((int *)arr_ptr->pointer)[i];
			else
		    	int_ris[i] = ((int *)arr_ptr->pointer)[i];
		break;
	case DTYPE_F : 
	case DTYPE_FS :
		for(i = 0; i < dim; i++)
		    if(is_float)
		    	float_ris[i] = ((float *)arr_ptr->pointer)[i];
			else if(is_double)
		    	double_ris[i] = (double)((float *)arr_ptr->pointer)[i];
		    else if(is_byte)
		    	byte_ris[i] = (char)(((float *)arr_ptr->pointer)[i]);
			else
		    	int_ris[i] = (int)(((float *)arr_ptr->pointer)[i]);
		break;
	case DTYPE_FT :
		for(i = 0; i < dim; i++)
		    if(is_float)
		    	float_ris[i] = (float)((double *)arr_ptr->pointer)[i];
			else if(is_double)
			{
		    	double_ris[i] = ((double *)arr_ptr->pointer)[i];
			}
		    else if(is_byte)
		    	byte_ris[i] = (char)(((double *)arr_ptr->pointer)[i]);
			else
		    	int_ris[i] = (int)(((double *)arr_ptr->pointer)[i]);
		break;

	case DTYPE_D :
	case DTYPE_G :
	default:	strcpy(error_message, "Not a supported type");
			return NULL;
    }
    MdsFree1Dx(&xd, NULL);
    error_message[0] = 0;
    if(is_float)
    	return float_ris;
	else if(is_double)
		return double_ris;
    else if(is_byte) 
		return byte_ris;
	return int_ris;
}
Пример #13
0
int hv1440___store(struct descriptor *niddsc, InStoreStruct *setup)
{
  int count;
  int need_pod=0;
  int status = 1;
  int pod;
  int ind;
  int i;
  int j;
  float volt;
  int vmax;
  int vfmax=0;
  int nfmax=0;
  int pods[HV1440_K_MAX_PODS];
  int f2;

  static int settings[HV1440_K_MAX_CHANNELS];
  static float f_settings[HV1440_K_MAX_CHANNELS];
  static DESCRIPTOR(out_dsc, "BUILD_WITH_UNITS($, 'Volts')");
  static DESCRIPTOR_A(settings_dsc, sizeof(float), DTYPE_F, f_settings, sizeof(f_settings));
  static struct descriptor_xd out_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};

  vmax = ((setup->range == 1.0) || 
       (setup->range == .625)) ? 2500 : (setup->range == .5) ? 2046 : (setup->range == .375) ? 1534 : 0;
  if (! vmax) return HV1440$_BAD_RANGE;

  for (pod=0,ind=0; pod<HV1440_K_MAX_PODS; pod++, ind+= HV1440_K_CHANS_PER_POD)  
    pods[pod] = GetPodSettings(setup->head_nid + HV1440_N_POD_01 + pod, &settings[ind]);

  for (i=0; i<HV1440_K_MAX_CHANNELS; i++) {
    int abset = abs(settings[i]);
    if (abset > vmax) return HV1440$_OUTRNG;
    if (abset > vfmax) {
      vfmax  = abset;
      nfmax = i;
    }
  }
  pio(9,0,0);
  pio(10,0,0);
  pio(26,1,0);
  f2 = setup->frame*2;
  send_hv(0, nfmax, f2, 0);
  for (i=0; i<HV1440_K_MAX_PODS; i++) {
    if (pods[i]) {
      need_pod = i+1;
      for(j=0; j<HV1440_K_CHANS_PER_POD; j++) {
        struct v_read {
	  unsigned tag : 3;
          unsigned voltage : 12;
          unsigned sign_bit : 1;
        } voltage; 
        int i0 = i*HV1440_K_CHANS_PER_POD+j;
        send_hv(0, i0, 8, 3);
        for (voltage.tag=0, count = 0; ((count < 25) && (voltage.tag != 2)); count++) {
          static float time = .1;
          LibWait(&time);
          pio(2, 0, (short *)&voltage);
        }
        if (count > 1) printf("Readback took %d tries\n", count);
        if (count == 25) return HV1440$_STUCK;
        f_settings[i*HV1440_K_CHANS_PER_POD+j] = voltage.voltage*setup->range* (voltage.sign_bit ? 1. : -1.);
      }
    }
    else 
      for(j=0; j < HV1440_K_CHANS_PER_POD; j++)
        f_settings[i*HV1440_K_CHANS_PER_POD+j] = 0;
  }
  settings_dsc.arsize = sizeof(float)*need_pod*HV1440_K_CHANS_PER_POD;
  if (need_pod) {
    int readout_nid = setup->head_nid + HV1440_N_READOUT;
    return_on_error(TdiCompile(&out_dsc, &settings_dsc, &out_xd MDS_END_ARG), status);
    return_on_error(TreePutRecord(readout_nid, (struct descriptor *)&out_xd, 0), status);
    MdsFree1Dx(&out_xd,0);
  }
  return 1;
}
Пример #14
0
int hm650___init(struct descriptor *niddsc, InInitStruct *setup)
{
  int status = 1;
  int dly_status = 1;
  int put_status = 1;
  unsigned short int_threshold;
  int i;
  float delays[8];
  int zero=0;

  pio(21,0,&zero,16);
  
  int_threshold = (setup->threshold+2.5)/5. * 4095;
  int_threshold = (min(max(int_threshold, 0), 4095));
  pio(17,0,&int_threshold,16);

  delays[0] = setup->delay_0;
  delays[1] = setup->delay_1;
  delays[2] = setup->delay_2;
  delays[3] = setup->delay_3;
  delays[4] = setup->delay_4;
  delays[5] = setup->delay_5;
  delays[6] = setup->delay_6;
  delays[7] = setup->delay_7;
  for (i=0; i<8; i++) {
    unsigned short ndelay;
    static float delay;
    static DESCRIPTOR(expr, "BUILD_WITH_UNITS($ + $/1E-9, S)");
    static DESCRIPTOR_FLOAT(delay_dsc,&delay);
    static DESCRIPTOR_NID(trig_dsc,0);
    delay = delays[i];
    if (delay < 20.) {
      delay = 20;
      dly_status = HM650$_DLYCHNG;
    }
    if (delay <= 102.375)
      ndelay = (int)(delay/102.4*4096);
    else if (delay <= 1023.74)
      ndelay = ((int)(delay/1024.*4096)) | (1<<12);
    else if (delay <= 10237.5)
      ndelay = ((int)(delay/10240.*4096)) | (2<<12);
    else if (delay <= 102375.)
      ndelay = ((int)(delay/102400.*4096)) | (3<<12);
    else {
      dly_status = HM650$_DLYCHNG;     
      ndelay = 0xFFFF;
    }
    pio(16,i,&ndelay,16);
    if (status&1)
    {
      static struct descriptor_xd out_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};
      int trig_in = setup->head_nid + HM650_N_TRIG_IN_0 + i;
      int trig_out = setup->head_nid + HM650_N_TRIG_OUT_0 + i;
      delay = (ndelay | 0xFFF)/4096.*102.4;
      switch (ndelay >> 12) {
        case 1: delay *= 10; break;
        case 2: delay *= 100.; break;
        case 3: delay *= 1000.; break;
      }
      trig_dsc.pointer = (char *)&trig_in;
      put_status = TdiCompile(&expr, &trig_dsc, &delay_dsc MDS_END_ARG);
      if (put_status&2)
        put_status = TreePutRecord(trig_out, (struct descriptor *)&out_xd,0);
    }
  }

  pio(21, 0, &zero, 16);

  if ((status&1) == 0) return status;
  else if ((dly_status&1) == 0) return dly_status;
  else if ((put_status&1) == 0) return put_status;
  else return 1;
}