File indexing completed on 2025-08-02 08:21:01
0001
0002
0003 #include <iostream>
0004
0005 #include <daq_device_random.h>
0006
0007 using namespace std;
0008
0009 daq_device_random::daq_device_random(const int eventtype
0010 , const int subeventid
0011 , const int n_words
0012 , const int low
0013 , const int high
0014 , const int trigger_enabled)
0015 {
0016
0017 m_eventType = eventtype;
0018 m_subeventid = subeventid;
0019 number_of_words = n_words;
0020 low_range = low;
0021 high_range = high;
0022 rfp = fopen("/dev/urandom","r");
0023 if (trigger_enabled)
0024 {
0025 th = new pulserTriggerHandler(m_eventType);
0026 registerTriggerHandler(th);
0027 }
0028 else
0029 {
0030 th = 0;
0031 }
0032 }
0033
0034 daq_device_random::~daq_device_random()
0035 {
0036 if ( rfp) fclose( rfp);
0037 if ( th)
0038 {
0039 clearTriggerHandler();
0040 delete th;
0041 }
0042 }
0043
0044
0045
0046
0047
0048 int daq_device_random::put_data(const int etype, int * adr, const int length )
0049 {
0050
0051 int len = 0;
0052
0053 if (etype != m_eventType )
0054 {
0055 return 0;
0056 }
0057
0058 if ( !rfp) return 0;
0059
0060 if ( daq_getEventFormat() )
0061 {
0062
0063 formatPacketHdr(adr);
0064 packetdata_ptr sevt = (packetdata_ptr) adr;
0065
0066 sevt->sub_id = m_subeventid;
0067 sevt->sub_type = 4;
0068 sevt->sub_decoding = 30000+ID4EVT;
0069
0070 int *d = (int *) &sevt->data;
0071
0072 int ia;
0073 int data;
0074
0075 for ( ia = 0; ia < number_of_words; ia++)
0076 {
0077 int l = fread ( &data, 4, 1, rfp);
0078 if ( l == 1 )
0079 {
0080 data &= 0x7fffffff;
0081 double x = data;
0082 x /= ( 1024. * 1024.);
0083 x *= ( high_range - low_range);
0084 x /= ( 2. * 1024.);
0085 *d++ = x + low_range;
0086 len++;
0087 }
0088 }
0089
0090 int padding = len%2;
0091 sevt->structureinfo += padding;
0092 len = len + padding;
0093 sevt->sub_length += len;
0094 return sevt->sub_length;
0095 }
0096
0097 else
0098 {
0099 sevt = (subevtdata_ptr) adr;
0100
0101 sevt->sub_length = SEVTHEADERLENGTH;
0102
0103
0104 sevt->sub_id = m_subeventid;
0105 sevt->sub_type=4;
0106 sevt->sub_decoding = ID4EVT;
0107 sevt->reserved[0] = 0;
0108 sevt->reserved[1] = 0;
0109
0110 unsigned int data;
0111
0112 int *d = (int *) &sevt->data;
0113
0114 int ia;
0115
0116 for ( ia = 0; ia < number_of_words; ia++)
0117 {
0118 int l = fread ( &data, 4, 1, rfp);
0119 if ( l == 1 )
0120 {
0121 data &= 0x7fffffff;
0122 double x = data;
0123 x /= ( 1024. * 1024.);
0124 x *= ( high_range - low_range);
0125 x /= ( 2. * 1024.);
0126 *d++ = x + low_range;
0127 len++;
0128 }
0129 }
0130
0131 sevt->sub_padding = len%2;
0132 len = len + (len%2);
0133 sevt->sub_length += len;
0134 return sevt->sub_length;
0135 }
0136 }
0137
0138
0139 void daq_device_random::identify(std::ostream& os) const
0140 {
0141
0142 os << "Random Device Event Type: " << m_eventType << " Subevent id: " << m_subeventid
0143 << " n_words: " << number_of_words
0144 << " range: " << low_range << " - " << high_range;
0145
0146 if (th)
0147 {
0148 os << " ** Trigger enabled";
0149 }
0150
0151 os << endl;
0152
0153 }
0154
0155 int daq_device_random::max_length(const int etype) const
0156 {
0157 if (etype != m_eventType) return 0;
0158 return (number_of_words + SEVTHEADERLENGTH);
0159 }
0160
0161 int daq_device_random::init()
0162 {
0163
0164 return 0;
0165 }
0166
0167
0168 int daq_device_random::rearm(const int etype)
0169 {
0170 if (etype != m_eventType) return 0;
0171 return 0;
0172 }
0173