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; }
static unsigned int Input(InStoreStruct *setup,int code) { int status; unsigned short i; AccessTraq(setup,code,16,0,0); DevWait((float).005); pio(0,0,&i); return i; }
static int ReadChannel(InStoreStruct *setup, int chunk,int samples,unsigned short *buffer,int *samples_read,int *nid,float *calib) { int chunk_address = 0x0B000 | chunk; int points_to_read; int status=1; int tries; for (points_to_read = chunksize; status & 1 && points_to_read; points_to_read = chunksize) { struct { unsigned short status; unsigned short bytcnt; unsigned int dummy;} iosb = {0,0}; int try; static DESCRIPTOR_A(calib_a, sizeof(*calib), DTYPE_NATIVE_FLOAT, 0, 2*sizeof(*calib)); static DESCRIPTOR_NID(nid_dsc,0); void *arglist[] = {0,&nid_dsc,&calib_a MDS_END_ARG}; calib_a.pointer = (char *)calib; nid_dsc.pointer = (char *)nid; arglist[0] = (void *)(sizeof(arglist)/sizeof(arglist[0])); AccessTraq(setup,chunk_address,24,arglist,TdiData); pio(8,0,0); for (try = 0;(try < 20) && (!(CamQ(0)&1)) && (status & 1);try++) {pio(8,0,0);} pio(10,0,0); return_on_error(DevCamChk(CamQstopw(setup->name,0,2,points_to_read,buffer + *samples_read,16,(short *)&iosb),&one,0),status); status = status & 1 ? iosb.status : status; *samples_read += iosb.bytcnt/2; if (iosb.bytcnt/2 != points_to_read) break; chunk_address += max_chunks_per_io; } return status; } static int AccessTraq(InStoreStruct *setup, int data,int memsize,void *arglist,int (*routine)()) { int try; int status; int called = 0; if (max_time > 0) { if ((time(0)-start_time) > max_time) { printf("T4012 AccessTraq timeout, data=%d\n",data); return DEV$_BAD_MODE; } } piomem(17,0,&data,memsize); for (try = 0;(try < 30) && (!(CamQ(0)&1)) && (status &1);try++) { if (arglist && !called) { called = 1; LibCallg(arglist,routine); } else DevWait((float).001); piomem(17,0,&data,memsize); } if (try == 30) status = DEV$_CAM_NOSQ; if (arglist &&!called) LibCallg(arglist,routine); return status; } int t4012__dw_setup( struct descriptor *niddsc, struct descriptor *methoddsc, Widget parent) { static String uids[] = {"T4012.uid"}; static int nid; static MrmRegisterArg uilnames[] = {{"nid",(XtPointer)0},{"Load",(XtPointer)Load}}; static NCI_ITM nci[] = {{4, NciCONGLOMERATE_NIDS, (unsigned char *)&nid, 0}, {0, NciEND_OF_LIST, 0, 0}}; TreeGetNci(*(int *)niddsc->pointer, nci); uilnames[0].value = (char *)0+nid; return XmdsDeviceSetup(parent, (int *)niddsc->pointer, uids, XtNumber(uids), "T4012", uilnames, XtNumber(uilnames), 0); } static void Load(Widget w) { char *t4012name; char dignam[512]; int i; XtPointer user_data; int nid; int found = False; XtVaGetValues(w, XmNuserData, &user_data, NULL); nid = (intptr_t)user_data; t4012name = TreeGetPath(nid); strcpy(dignam,t4012name); strcat(dignam,":T28%%_"); TreeFree(t4012name); XmListDeleteAllItems(w); for (i=1;i<17;i++) { int dig_nid; int status; XmString item; int len = strlen(dignam); dignam[len++]=i<10 ? '0' : '1'; dignam[len++]='0'+(i % 10); dignam[len++]=0; status = TreeFindNode(dignam,&dig_nid); if (status & 1) { NCI_ITM itmlst[] = {{512,NciNODE_NAME,0,0},{0,0,0,0}}; itmlst[0].pointer = dignam; TreeGetNci(dig_nid,itmlst); item = XmStringCreateSimple(dignam); XmListAddItem(w, item, 0); XmStringFree(item); found = True; } else break; } if (!found) { XmString item = XmStringCreateSimple("Add T28xx_01"); XmListAddItem(w, item, 0); XmStringFree(item); } }
int t4012___store(int *niddsc, InStoreStruct *setup) { int channels; int pts; int memPerChannel; int channels_read; int dig; int dig_nid; static int memsize=0; static unsigned short *mem; int idxmin; int idxmax; char digname[512]; char *nodename; int chan_nid = 0; struct _t4012_status { unsigned sampling : 1; unsigned calibrate : 1; unsigned master_armed : 1; unsigned master_enabled : 1; unsigned stop_received : 1; unsigned triggered : 1; unsigned t4012p : 1; unsigned cal_mem : 1; unsigned : 24; } dig_status; int status; static short offset; static float coefficient; static float f[2]; static DESCRIPTOR_A_BOUNDS(raw,sizeof(short),DTYPE_W,0,1,0); static int *lbound = &raw.bounds[0].l; static int *ubound = &raw.bounds[0].u; static unsigned int *acoef = &raw.m[0]; static DESCRIPTOR_A(f2_d,sizeof(f[0]),DTYPE_NATIVE_FLOAT,f,8); static DESCRIPTOR(counts_str,"counts"); static DESCRIPTOR(volts_str,"volts"); static DESCRIPTOR(seconds_str,"seconds"); static DESCRIPTOR_LONG(start_d,&raw.bounds[0].l); static DESCRIPTOR_LONG(end_d,&raw.bounds[0].u); static int trigger_nid; static DESCRIPTOR_NID(stop_d,&trigger_nid); static int switch_trig_nid; static DESCRIPTOR_NID(swi_d,&switch_trig_nid); static int extern_clock_nid; static DESCRIPTOR_NID(ext_clock_d,&extern_clock_nid); static struct descriptor offset_d = {2,DTYPE_W, CLASS_S, (char *)&offset}; static DESCRIPTOR_FLOAT(coef_d,&coefficient); static DESCRIPTOR_FLOAT(f1_d,f); static int _roprand = 32768; static DESCRIPTOR_FLOAT(roprand,&_roprand); static FUNCTION(1) value = {2,DTYPE_FUNCTION,CLASS_R,(unsigned char *)&OpcValue,0,0}; static DESCRIPTOR_FUNCTION_2(subtract_exp,(unsigned char *)&OpcSubtract,&value,&offset_d); static DESCRIPTOR_FUNCTION_2(mult_exp,(unsigned char *)&OpcMultiply,&coef_d,&subtract_exp); static DESCRIPTOR_WITH_UNITS(counts,&raw,&counts_str); static DESCRIPTOR_WITH_UNITS(volts,&mult_exp,&volts_str); static DESCRIPTOR_FUNCTION_2(rangesub,(unsigned char *)&OpcSubtract,0,&f1_d); static DESCRIPTOR_WINDOW(window,&start_d,&end_d,&stop_d); static struct descriptor *begin_ptrs[] = {&roprand,0}; static struct descriptor *end_ptrs[] = {(struct descriptor *)&rangesub,&roprand}; static DESCRIPTOR_APD(begin_apd,0,begin_ptrs,2); static DESCRIPTOR_APD(end_apd,0,end_ptrs,2); static DESCRIPTOR_RANGE(int_clock1_d,0,0,&f1_d); static DESCRIPTOR_RANGE(int_clock2_d,&begin_apd,&end_apd,&f2_d); static int clock_out_nid; static DESCRIPTOR_NID(clock_out_d,&clock_out_nid); static DESCRIPTOR_DIMENSION(dimension,&window,&clock_out_d); static DESCRIPTOR_WITH_UNITS(seconds,&dimension,&seconds_str); static DESCRIPTOR_SIGNAL_1(signal,&volts,&counts,&seconds); void *ctx = 0; max_time=-1; trigger_nid = setup->head_nid + T4012_N_TRIGGER; switch_trig_nid = setup->head_nid + T4012_N_SWITCH_TRIG; extern_clock_nid = setup->head_nid + T4012_N_EXTERN_CLOCK; clock_out_nid = setup->head_nid + T4012_N_CLOCK_OUT; pio(8,0,0); status = Input(setup,14); dig_status = *(struct _t4012_status *)&status; if (dig_status.sampling) { return DEV$_NOT_TRIGGERED; } channels = Input(setup,1); pts = Input(setup,2); memPerChannel = Input(setup,3) * 1024; if (Input(setup,7) == 1) TreePutRecord(clock_out_nid,(struct descriptor *)&ext_clock_d,0); else { int shift = Input(setup,6); f[0] = freqs[Input(setup,4)]; if (shift) { f[1] = freqs[Input(setup,5)]; rangesub.arguments[0] = begin_ptrs[1] = (shift == 1) ? &swi_d : &stop_d; TreePutRecord(clock_out_nid,(struct descriptor *)&int_clock2_d,0); } else TreePutRecord(clock_out_nid,(struct descriptor *)&int_clock1_d,0); } idxmin = (pts - 8.)/8. * memPerChannel; idxmax = idxmin + memPerChannel - 1; if (memsize < (memPerChannel * 2)) { if (memsize) free(mem); memsize = memPerChannel * 2; mem = malloc(memsize); } return_on_error(AccessTraq(setup,0x8001,16,0,0),status); /* Remote control */ nodename = TreeGetPath(setup->head_nid); strcpy(digname,nodename); TreeFree(nodename); strcat(digname,":T28%%_%%"); status = TreeFindNodeWild(digname,&dig_nid,&ctx,1 << TreeUSAGE_DEVICE); for (dig=1,channels_read=0;(channels_read < channels) && (status & 1);dig++) { static int dig_nids[1+8*T28XX_K_NODES_PER_INP]; static int nidlen; static NCI_ITM itmlst[] = {{sizeof(dig_nids),NciCONGLOMERATE_NIDS,(unsigned char *)&dig_nids,&nidlen}, {0,NciEND_OF_LIST,0,0}}; if (status & 1) { int i; int digchannels; status = TreeGetNci(dig_nid,itmlst); digchannels = (nidlen/sizeof(dig_nid)-1)/T28XX_K_NODES_PER_INP; for (i=0;i<digchannels && (status & 1) && channels_read < channels;i++) { if (TreeIsOn(CNID(i,HEAD))&1) { int channel_select = 0x0A000 | (channels_read + 1); AccessTraq(setup,channel_select,24,0,0); if (chan_nid && (*acoef > 1)) { return_on_error(TreePutRecord(chan_nid,(struct descriptor *)&signal,0),status); chan_nid = 0; } else DevWait((float).005); chan_nid = CNID(i,HEAD); *lbound = (DevLong(&CNID(i,STARTIDX),(int *)lbound) & 1) ? min(idxmax,max(idxmin,*lbound)) : idxmin; *ubound = (DevLong(&CNID(i,ENDIDX), (int *)ubound) & 1) ? min(idxmax,max(idxmin,*ubound)) : idxmax; *acoef = *ubound - *lbound + 1; if (*acoef > 0) { int points_read = 0; int first_sample_offset = *lbound-idxmin; int chunk = first_sample_offset/1024; int chunk_offset = first_sample_offset % 1024; float calib[]={0,0}; status = ReadChannel(setup, chunk,*acoef+chunk_offset,mem,&points_read,&CNID(i,CALIBRATION),calib); if (status & 1) { offset = calib[0]; if (calib[0] == calib[1]) coefficient = (offset > 1000) ? 10./4096 : 5./4096.; else coefficient = calib[1]; raw.pointer = (char *)(mem + chunk_offset); raw.a0 = raw.pointer - *lbound * sizeof(*mem); *ubound = (points_read - chunk_offset) + *lbound - 1; *acoef = (points_read - chunk_offset); raw.arsize = *acoef * 2; } } } channels_read++; } } if (channels_read < channels && (status & 1)) status = TreeFindNodeWild(digname,&dig_nid,&ctx,1 << TreeUSAGE_DEVICE); } TreeFindNodeEnd(&ctx); if (chan_nid && (*acoef > 1)) return_on_error(TreePutRecord(chan_nid,(struct descriptor *)&signal,0),status); return status; }
int l8210___store(struct descriptor *niddsc_ptr, InStoreStruct *setup) { static DESCRIPTOR_A_BOUNDS(raw,sizeof(short),DTYPE_W,0,1,0); static DESCRIPTOR(counts_str,"counts"); static DESCRIPTOR_WITH_UNITS(counts,&raw,&counts_str); static DESCRIPTOR_LONG(start_d,&raw.bounds[0].l); static DESCRIPTOR_LONG(end_d,&raw.bounds[0].u); static int stop_trig_nid; static DESCRIPTOR_NID(trigger_d,&stop_trig_nid); static float frequency; static DESCRIPTOR_FLOAT(frequency_d,&frequency); static DESCRIPTOR_RANGE(int_clock_d,0,0,&frequency_d); static int ext_clock_in_nid; static DESCRIPTOR_NID(ext_clock_d,&ext_clock_in_nid); static float coefficient = 10.0/1024; static DESCRIPTOR_FLOAT(coef_d,&coefficient); static short offset = -512; static struct descriptor offset_d = {2,DTYPE_W,CLASS_S,(char *)&offset}; #define DESCRIPTOR_VALUE(name)\ struct descriptor_function_0 { RECORD_HEAD } name =\ {2, DTYPE_FUNCTION, CLASS_R, (unsigned char *)&OpcValue, 0} static DESCRIPTOR_VALUE(value); static DESCRIPTOR_FUNCTION_2(add_exp,(unsigned char *)&OpcAdd,&offset_d,&value); static DESCRIPTOR_FUNCTION_2(mult_exp,(unsigned char *)&OpcMultiply,&coef_d,&add_exp); static DESCRIPTOR(volts_str,"volts"); static DESCRIPTOR_WITH_UNITS(volts,&mult_exp,&volts_str); static DESCRIPTOR_WINDOW(window,&start_d,&end_d,&trigger_d); static int clock_out_nid; static DESCRIPTOR_NID(clock_out,&clock_out_nid); static DESCRIPTOR_DIMENSION(dimension,&window,&clock_out); static DESCRIPTOR(time_str,"seconds"); static DESCRIPTOR_WITH_UNITS(time,&dimension,&time_str); static DESCRIPTOR_SIGNAL_1(signal,&volts,&counts,&time); int samples_per_channel; int min_idx; int max_idx; int num_chans; int vm_size; short *channel_data_ptr; int status; int chan; int samples_to_read; int i; float wait_time; stop_trig_nid = setup->head_nid + L8210_N_STOP_TRIG; ext_clock_in_nid = setup->head_nid + L8210_N_EXT_CLOCK_IN; clock_out_nid = setup->head_nid + L8210_N_CLOCK_OUT; pio(26,0,0); wait_time = setup->memories*30E-3; DevWait(wait_time); pio(8,0,0); if ((CamXandQ(0)&1) == 0) return DEV$_NOT_TRIGGERED; return_on_error(ReadSetup(setup, &setup->memories, setup->header, &samples_per_channel, &min_idx, &max_idx, &frequency, &num_chans), status); channel_data_ptr = malloc(samples_per_channel * sizeof(short)); status = TreePutRecord(clock_out_nid, (struct descriptor *)(frequency == 0.0) ? &ext_clock_d : (struct descriptor *)(&int_clock_d),0); for (chan=0;((chan<num_chans) && (status & 1));chan++) { int channel_nid = setup->head_nid + L8210_N_INPUT_1 + chan * (L8210_N_INPUT_2 - L8210_N_INPUT_1); int usetimes_nid = channel_nid + L8210_N_INPUT_1_USETIMES - L8210_N_INPUT_1; int startidx_nid = channel_nid + L8210_N_INPUT_1_STARTIDX - L8210_N_INPUT_1; int endidx_nid = channel_nid + L8210_N_INPUT_1_ENDIDX - L8210_N_INPUT_1; if (TreeIsOn(channel_nid) & 1) { int use_times = 0; DevLong(&usetimes_nid,&use_times); if(use_times) { float start_time, end_time; raw.bounds[0].l = min_idx; raw.bounds[0].u = max_idx; status = DevFloat(&startidx_nid,&start_time); if (~status&1) start_time = -1; status = DevFloat(&endidx_nid,&end_time); if (~status&1) end_time = -1; status = DevXToI(start_time, end_time, &dimension, min_idx, max_idx, &raw.bounds[0].l, &raw.bounds[0].u); if (~status&1) { raw.bounds[0].l = min_idx; raw.bounds[0].u = max_idx; } } else { status = DevLong(&startidx_nid,(int *)&raw.bounds[0].l); if (status&1) raw.bounds[0].l = min(max_idx,max(min_idx,raw.bounds[0].l)); else raw.bounds[0].l = min_idx; status = DevLong(&endidx_nid, (int *)&raw.bounds[0].u); if (status&1) raw.bounds[0].u = min(max_idx,max(min_idx,raw.bounds[0].u)); else raw.bounds[0].u = max_idx; } raw.m[0] = raw.bounds[0].u - raw.bounds[0].l + 1; if (raw.m[0] > 0) { samples_to_read = raw.bounds[0].u - min_idx + 1; status = ReadChannel(setup,&samples_per_channel,chan,&samples_to_read,channel_data_ptr); if (status & 1) { raw.pointer = (char *)(channel_data_ptr + (raw.bounds[0].l - min_idx)); raw.a0 = raw.pointer - raw.bounds[0].l * sizeof(*channel_data_ptr); raw.arsize = raw.m[0] * 2; status = TreePutRecord(channel_nid,(struct descriptor *)&signal,0); } } } } free(channel_data_ptr); return status; }