15 #include <sys/types.h>
110 #define S_DT5720_ODB_STR "\
112 software_trigger_mode = BYTE : 0\n\
113 hardware_trigger_mode = BYTE : 0\n\
114 self_trigger_mode = BYTE : 0\n\
115 trigger_positive_edge = BOOL : y\n\
116 max_events_per_block = DWORD : 1024\n\
117 event_aligned_readout = BOOL : y\n\
118 logic_level = STRING : [4] NIM\n\
119 post_trigger_size = BYTE : 20\n\
120 gpi_acquisition_mode = BOOL : n\n\
121 zero_suppression_mode = BYTE : 0\n\
122 event_packing = BOOL : n\n\
123 ext_clock = BOOL : n\n\
124 waveform length = DWORD : 64\n\
128 offset = FLOAT : 0\n\
129 self_trigger_threshhold = FLOAT : 0\n\
133 offset = FLOAT : 0\n\
134 self_trigger_threshhold = FLOAT : 0\n\
138 offset = FLOAT : 0\n\
139 self_trigger_threshhold = FLOAT : 0\n\
143 offset = FLOAT : 0\n\
144 self_trigger_threshhold = FLOAT : 0\
152 printf(
"Opening CAEN USB interface ...");
170 if(
is_caen_error(ret,__LINE__-1,
"dt5720_init"))
return FE_ERR_HW;
174 if(
is_caen_error(ret,__LINE__-1,
"dt5720_init"))
return FE_ERR_HW;
175 printf(
"\nConnected to CAEN Desktop Digitizer Model %s\n",BoardInfo.
ModelName);
181 if(
is_caen_error(ret,__LINE__-1,
"dt5720_init"))
return FE_ERR_HW;
188 if(status==DB_NO_KEY || status==DB_STRUCT_MISMATCH)
191 printf(
"Creating key with status: %d \n",status);
193 else if (status==DB_INVALID_HANDLE)
195 printf(
"Error: Cannot connect to database to setup CAEN DT5720.");
198 status = db_find_key(
hDB,0,str,&hKey);
199 status = db_open_record(
hDB,hKey,&S_DT5720_ODB,
sizeof(S_DT5720_ODB),MODE_READ,NULL,NULL);
204 printf(
"Using external clock\n");
206 if(
is_caen_error(ret,__LINE__-1,
"dt5720_init"))
return FE_ERR_HW;
210 printf(
"Using internal clock\n");
233 if(
is_caen_error(ret,__LINE__-1,
"dt5720_bor"))
return FE_ERR_HW;
235 if(
is_caen_error(ret,__LINE__-1,
"dt5720_bor"))
return FE_ERR_HW;
243 if(
is_caen_error(ret,__LINE__-1,
"dt5720_bor"))
return FE_ERR_HW;
248 if(
is_caen_error(ret,__LINE__-1,
"dt5720_bor"))
return FE_ERR_HW;
261 if(
is_caen_error(ret,__LINE__-1,
"dt5720_bor"))
return FE_ERR_HW;
264 if(
is_caen_error(ret,__LINE__-1,
"dt5720_eor"))
return FE_ERR_HW;
288 bk_create(pevent, bk_name, TID_BYTE, &pdata);
291 cm_msg(MERROR,
"dt5720_read",
"Event size is too large. Truncating data...\n");
296 bk_close(pevent, pdata);
307 uint32_t caen_data_size;
314 if(caen_data_size > 0)
355 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid software trigger mode. Set to DISABLED. (%i)",(
int)S_DT5720_ODB.
software_trigger_mode);
358 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
376 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid hardware trigger mode. Set to DISABLED.");
379 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
381 uint32_t caen_self_trigger_mask = 0b1111;
398 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid channel self trigger mode. Set to DISABLED. (%i)",(
int)S_DT5720_ODB.
self_trigger_mode);
401 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
419 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
428 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid max block size. Set to 1024.");
430 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
434 else if(strcmp(S_DT5720_ODB.
logic_level,
"TTL") == 0)
439 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid logic level. Set to NIM.");
441 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
450 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid post trigger size. Set to 80 percent.");
452 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
462 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
477 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid zero suppression mode. Set to none.");
480 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
491 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
494 uint32_t caen_channel_mask = 0;
496 caen_channel_mask |= (1 << 0);
498 caen_channel_mask |= (1 << 1);
500 caen_channel_mask |= (1 << 2);
502 caen_channel_mask |= (1 << 3);
508 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
512 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
516 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
520 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
525 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
529 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
533 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
537 if(
is_caen_error(ret,__LINE__,
"dt5720_update_digitizer"))
return false;
545 cm_msg(MERROR,
"dt5720_update_digitizer",
"Cannot SetRecordLength. Error 0x%08x\n",ret);
554 if(
is_caen_error(ret,__LINE__-1,
"dt5720_update_digitizer"))
return FE_ERR_HW;
561 if(
is_caen_error(ret,__LINE__-1,
"dt5720_update_digitizer"))
return FE_ERR_HW;
572 static const uint32_t adcmax = 65535;
573 static const uint32_t adcmin = 0;
574 static const float analogmax = 1.;
575 static const float analogmin = -1.;
576 static const float slope = (float)(adcmax-adcmin)/(analogmax-analogmin);
592 default:
return 0x8000;
597 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid voltage offset. Set to 1V.");
602 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid voltage offset. Set to -1V.");
608 uint32_t dac = slope*v;
609 printf(
"DAC offset: channel %i DAC %i\n",ch, dac);
617 static const float dynamicrange = 2.;
618 static const uint32_t adcmax = 4095;
620 static const uint32_t adcmin = 0;
621 static const float slope = (adcmax-adcmin)/dynamicrange;
644 return (adcmax-adcmin)/2;
647 if(v<vmin || v>(vmin+dynamicrange))
649 v = vmin+dynamicrange/2.;
650 cm_msg(MINFO,
"dt5720_update_digitizer",
"Invalid self trigger threshold. Set to center.");
653 uint32_t dac = (v-vmin)*slope;
654 printf(
"Trigger threshold: channel %i DAC %i DAC\n",ch,dac);
667 static char* f = __FILE__;
675 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Communication error.");
678 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Generic (unspecified) error.");
681 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid parameter error.");
684 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid LinkType.");
687 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid handle.");
690 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Too many devices.");
693 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Operation not allowed on this model.");
696 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid interrupt level.");
699 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid event number.");
702 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Unable to read from registry.");
705 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Unable to write to registry.");
708 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid channel number.");
711 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Channel is busy.");
714 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid FPIO (?) mode.");
717 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid acquisition mode.");
720 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Module does not support this function.");
723 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Communication timed out.");
726 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Invalid buffer (readout or event).");
729 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Unable to find event.");
732 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Event is invalid.");
735 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Memory has run out.");
738 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Calibration failed.");
741 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Unable to locate digitizer.");
744 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Digitizer is already open.");
747 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Digitizer not ready.");
750 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Interrupts not configured.");
753 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Flash memory corrupted.");
756 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Firmware not supported by these libraries.");
759 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Function not yet implemented.");
762 cm_msg(MT_ERROR,f,l,r,
"CAEN DT5720 Unknown error.");