00001
00002
00013 #include "eformat/write/ROBFragment.h"
00014 #include "eformat/write/ROSFragment.h"
00015 #include "eformat/HeaderMarker.h"
00016 #include "eformat/Status.h"
00017 #include <cstring>
00018 #include "ers/StreamFactory.h"
00019
00020 eformat::write::ROBFragment::ROBFragment
00021 (uint32_t source_id,
00022 uint32_t run_no,
00023 uint32_t lvl1_id,
00024 uint32_t bc_id,
00025 uint32_t lvl1_type,
00026 uint32_t detev_type,
00027 uint32_t ndata, const uint32_t* data, uint32_t status_position)
00028 : m_parent(0),
00029 m_next(0)
00030 {
00031 m_header[0] = eformat::ROB;
00032 m_header[1] = 21 + ndata;
00033 m_header[2] = 8;
00034 m_header[3] = eformat::DEFAULT_VERSION;
00035 m_header[4] = source_id;
00036 m_header[5] = 1;
00037 m_header[6] = 0;
00038 m_rod_header[0] = eformat::ROD;
00039 m_rod_header[1] = 9;
00040 m_rod_header[2] = eformat::DEFAULT_VERSION;
00041 m_rod_header[3] = source_id;
00042 m_rod_header[4] = run_no;
00043 m_rod_header[5] = lvl1_id;
00044 m_rod_header[6] = bc_id;
00045 m_rod_header[7] = lvl1_type;
00046 m_rod_header[8] = detev_type;
00047 m_rod_trailer[0] = 1;
00048 m_rod_trailer[1] = ndata;
00049 m_rod_trailer[2] = status_position;
00050
00051
00052 set(m_node[0], m_header, 6, &m_node[1]);
00053 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00054 set(m_node[2], &m_header[6], 1, &m_node[3]);
00055 if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00056 set(m_node[3], m_rod_header, 9, &m_node[4]);
00057 set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5]);
00058 set(m_node[5], data, ndata, &m_node[6]);
00059 }
00060 else {
00061 set(m_node[3], m_rod_header, 9, &m_node[5]);
00062 set(m_node[5], data, ndata, &m_node[4]);
00063 set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6]);
00064 }
00065 set(m_node[6], m_rod_trailer, 3, 0);
00066 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00067 "Built (write) rob/rod fragment from scratch, with",
00068 ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00069 }
00070
00071 eformat::write::ROBFragment::ROBFragment ()
00072 : m_parent(0),
00073 m_next(0)
00074 {
00075 m_header[0] = eformat::ROB;
00076 m_header[1] = 21;
00077 m_header[2] = 8;
00078 m_header[3] = eformat::DEFAULT_VERSION;
00079 m_header[4] = 0;
00080 m_header[5] = 1;
00081 m_header[6] = 0;
00082 m_rod_header[0] = eformat::ROD;
00083 m_rod_header[1] = 9;
00084 m_rod_header[2] = eformat::DEFAULT_VERSION;
00085 m_rod_header[3] = 0;
00086 m_rod_header[4] = 0;
00087 m_rod_header[5] = 0;
00088 m_rod_header[6] = 0;
00089 m_rod_header[7] = 0;
00090 m_rod_header[8] = 0;
00091 m_rod_trailer[0] = 1;
00092 m_rod_trailer[1] = 0;
00093 m_rod_trailer[2] = eformat::STATUS_FRONT;
00094
00095
00096 set(m_node[0], m_header, 6, &m_node[1]);
00097 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00098 set(m_node[2], &m_header[6], 1, &m_node[3]);
00099 if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00100 set(m_node[3], m_rod_header, 9, &m_node[4]);
00101 set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5]);
00102 set(m_node[5], 0, 0, &m_node[6]);
00103 }
00104 else {
00105 set(m_node[3], m_rod_header, 9, &m_node[5]);
00106 set(m_node[5], 0, 0, &m_node[4]);
00107 set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6]);
00108 }
00109 set(m_node[6], m_rod_trailer, 3, 0);
00110 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00111 "Built (write) empty rob/rod fragment, with",
00112 ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00113 }
00114
00115 eformat::write::ROBFragment::ROBFragment
00116 (const eformat::write::ROBFragment& other)
00117 : m_parent(0),
00118 m_next(0)
00119 {
00120 *this = other;
00121 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00122 "Built new (write) rob/rod fragment from copy, with",
00123 ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00124 }
00125
00126 eformat::write::ROBFragment::ROBFragment (uint32_t* rod, uint32_t size_word)
00127 : m_parent(0),
00128 m_next(0)
00129 {
00130 m_header[0] = eformat::ROB;
00131 m_header[1] = 8 + size_word;
00132 m_header[2] = 8;
00133 m_header[3] = eformat::DEFAULT_VERSION;
00134 m_header[4] = rod[3];
00135 m_header[5] = 1;
00136 m_header[6] = 0;
00137
00138
00139 set(m_node[0], m_header, 6, &m_node[1]);
00140 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00141 set(m_node[2], &m_header[6], 1, &m_node[3]);
00142 set(m_node[6], &rod[size_word-3], 3, 0);
00143 if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00144 set(m_node[3], rod, 9, &m_node[4]);
00145 set(m_node[4], &rod[9], m_node[6].base[0], &m_node[5]);
00146 set(m_node[5], &rod[9+m_node[6].base[0]], m_node[6].base[1], &m_node[6]);
00147 }
00148 else {
00149 set(m_node[3], rod, 9, &m_node[5]);
00150 set(m_node[4], &rod[9+m_node[6].base[1]], m_node[6].base[0], &m_node[6]);
00151 set(m_node[5], &rod[9], m_node[6].base[1], &m_node[4]);
00152 }
00153 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00154 "Built (write) rob/rod fragment from rod on memory, with",
00155 source_id(), rod_lvl1_id(), rod_run_no());
00156 }
00157
00158 eformat::write::ROBFragment::ROBFragment (uint32_t* rob)
00159 : m_parent(0),
00160 m_next(0)
00161 {
00162
00163 set(m_node[0], rob, 6, &m_node[1]);
00164 set(m_node[1], &rob[6], rob[5], &m_node[2]);
00165 set(m_node[2], &rob[6+rob[5]], 1, &m_node[3]);
00166 set(m_node[6], &rob[rob[1]-3], 3, 0);
00167 if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00168 set(m_node[3], &rob[rob[2]], 9, &m_node[4]);
00169 set(m_node[4], &rob[rob[2]+9], m_node[6].base[0], &m_node[5]);
00170 set(m_node[5], &rob[rob[2]+9+m_node[6].base[0]], m_node[6].base[1],
00171 &m_node[6]);
00172 }
00173 else {
00174 set(m_node[3], &rob[rob[2]], 9, &m_node[5]);
00175 set(m_node[4], &rob[rob[2]+9+m_node[6].base[1]], m_node[6].base[0],
00176 &m_node[6]);
00177 set(m_node[5], &rob[rob[2]+9], m_node[6].base[1], &m_node[4]);
00178 }
00179 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00180 "Built (write) rob/rod fragment from cont. memory, with",
00181 source_id(), rod_lvl1_id(), rod_run_no());
00182 }
00183
00184 eformat::write::ROBFragment& eformat::write::ROBFragment::operator=
00185 (const eformat::write::ROBFragment& other)
00186 {
00187
00188 memcpy(reinterpret_cast<void*>(m_header),
00189 reinterpret_cast<const void*>(other.m_node[0].base),
00190 6*sizeof(uint32_t));
00191 m_header[6] = other.m_node[2].base[0];
00192 memcpy(reinterpret_cast<void*>(m_rod_header),
00193 reinterpret_cast<const void*>(other.m_node[3].base),
00194 9*sizeof(uint32_t));
00195 memcpy(reinterpret_cast<void*>(m_rod_trailer),
00196 reinterpret_cast<const void*>(other.m_node[6].base),
00197 3*sizeof(uint32_t));
00198
00199
00200 set(m_node[0], m_header, 6, &m_node[1]);
00201 set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
00202 set(m_node[2], &m_header[6], 1, &m_node[3]);
00203 if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00204 set(m_node[3], m_rod_header, 9, &m_node[4]);
00205 set(m_node[4], other.m_node[4].base,
00206 other.m_node[4].size_word, &m_node[5]);
00207 set(m_node[5], other.m_node[5].base,
00208 other.m_node[5].size_word, &m_node[6]);
00209 }
00210 else {
00211 set(m_node[3], m_rod_header, 9, &m_node[5]);
00212 set(m_node[5], other.m_node[5].base,
00213 other.m_node[5].size_word, &m_node[4]);
00214 set(m_node[4], other.m_node[4].base,
00215 other.m_node[4].size_word, &m_node[6]);
00216 }
00217 set(m_node[6], m_rod_trailer, 3, 0);
00218 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00219 "Copied (write) rob/rod fragment with",
00220 ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00221
00222 return *this;
00223 }
00224
00225 void eformat::write::ROBFragment::status (uint32_t n, const uint32_t* status)
00226 {
00227 if (m_parent) m_parent->size_change(m_node[0].base[1],
00228 m_node[0].base[1]-m_node[0].base[5]+n);
00229 m_node[0].base[1] -= m_node[0].base[5];
00230 m_node[0].base[2] -= m_node[0].base[5];
00231 m_node[1].size_word = m_node[0].base[5] = n;
00232 m_node[0].base[1] += n;
00233 m_node[0].base[2] += n;
00234 m_node[1].base = const_cast<uint32_t*>(status);
00235 }
00236
00237 void eformat::write::ROBFragment::rod_status (uint32_t n,
00238 const uint32_t* status)
00239 {
00240 if (m_parent) m_parent->size_change(m_node[0].base[1],
00241 m_node[0].base[1]-m_node[6].base[0]+n);
00242 m_node[0].base[1] -= m_node[6].base[0];
00243 m_node[4].size_word = m_node[6].base[0] = n;
00244 m_node[0].base[1] += n;
00245 m_node[4].base = const_cast<uint32_t*>(status);
00246 }
00247
00248 void eformat::write::ROBFragment::status_position (uint32_t v)
00249 {
00250 if (v == m_node[6].base[2]) return;
00251 m_node[6].base[2] = v;
00252 if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00253 m_node[3].next = &m_node[4];
00254 m_node[4].next = &m_node[5];
00255 m_node[5].next = &m_node[6];
00256 }
00257 else {
00258 m_node[3].next = &m_node[5];
00259 m_node[5].next = &m_node[4];
00260 m_node[4].next = &m_node[6];
00261 }
00262 }
00263
00264 void eformat::write::ROBFragment::rod_data (uint32_t n, const uint32_t* data)
00265 {
00266 if (m_parent) m_parent->size_change(m_node[0].base[1],
00267 m_node[0].base[1]-m_node[6].base[1]+n);
00268
00269
00270 m_node[0].base[1] -= m_node[6].base[1];
00271 m_node[5].size_word = m_node[6].base[1] = n;
00272 m_node[0].base[1] += n;
00273 m_node[5].base = const_cast<uint32_t*>(data);
00274 }