00001
00002
00013 #include "eformat/write/ROSFragment.h"
00014 #include "eformat/write/SubDetectorFragment.h"
00015 #include "eformat/HeaderMarker.h"
00016 #include "eformat/Status.h"
00017 #include "ers/StreamFactory.h"
00018 #include <cstring>
00019 eformat::write::ROSFragment::ROSFragment
00020 (uint32_t source_id, uint32_t run_no, uint32_t lvl1_id, uint32_t bc_id)
00021 : m_parent(0),
00022 m_child(0),
00023 m_last(0),
00024 m_next(0),
00025 m_extra_count(0)
00026 {
00027 m_header[0] = eformat::ROS;
00028 m_header[1] = 11;
00029 m_header[2] = 11;
00030 m_header[3] = eformat::DEFAULT_VERSION;
00031 m_header[4] = source_id;
00032 m_header[5] = 1;
00033 m_header[6] = 3;
00034 m_header[7] = run_no;
00035 m_header[8] = lvl1_id;
00036 m_header[9] = bc_id;
00037
00038
00039 set(m_node[0], m_header, 6, &m_node[1]);
00040 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00041 set(m_node[2], &m_header[6], 4, 0);
00042 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00043 "Built (write) ros fragment from scratch, with",
00044 ROSFragment::source_id(), ROSFragment::lvl1_id(),
00045 ROSFragment::run_no());
00046 }
00047
00048 eformat::write::ROSFragment::ROSFragment (uint32_t* ros)
00049 : m_parent(0),
00050 m_child(0),
00051 m_last(0),
00052 m_next(0),
00053 m_extra_count(0)
00054 {
00055
00056 set(m_node[0], ros, 6, &m_node[1]);
00057 set(m_node[1], &ros[6], ros[5], &m_node[2]);
00058 set(m_node[2], &ros[6+ros[5]], 4, &m_extra);
00059 eformat::write::set(m_extra, &ros[10+ros[5]], ros[1]-ros[2]);
00060 ++m_extra_count;
00061 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00062 "Built (write) ros fragment from contiguous memory, with",
00063 source_id(), lvl1_id(), run_no());
00064 }
00065
00066 eformat::write::ROSFragment::ROSFragment (eformat::write::node_t* ros)
00067 : m_parent(0),
00068 m_child(0),
00069 m_last(0),
00070 m_next(0),
00071 m_extra_count(0)
00072 {
00073
00074 set(m_node[0], ros->base, 6, &m_node[1]);
00075 set(m_node[1], &ros->base[6], ros->base[5], &m_node[2]);
00076 set(m_node[2], &ros->base[6+ros->base[5]], 4, &m_extra);
00077 eformat::write::set(m_extra, &ros->base[10+ros->base[5]],
00078 ros->size_word - ros->base[2], ros->next);
00079 m_extra_count += eformat::write::count(m_extra);
00080 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00081 "Built (write) ros fragment from paged memory, with",
00082 source_id(), lvl1_id(), run_no());
00083 }
00084
00085 eformat::write::ROSFragment::ROSFragment ()
00086 : m_parent(0),
00087 m_child(0),
00088 m_last(0),
00089 m_next(0),
00090 m_extra_count(0)
00091 {
00092 m_header[0] = eformat::ROS;
00093 m_header[1] = 11;
00094 m_header[2] = 11;
00095 m_header[3] = eformat::DEFAULT_VERSION;
00096 m_header[4] = 0;
00097 m_header[5] = 1;
00098 m_header[6] = 3;
00099 m_header[7] = 0;
00100 m_header[8] = 0;
00101 m_header[9] = 0;
00102
00103
00104 set(m_node[0], m_header, 6, &m_node[1]);
00105 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00106 set(m_node[2], &m_header[6], 4, 0);
00107 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00108 "Built empty (write) ros fragment from scratch, with",
00109 ROSFragment::source_id(), ROSFragment::lvl1_id(),
00110 ROSFragment::run_no());
00111 }
00112
00113 eformat::write::ROSFragment::ROSFragment
00114 (const eformat::write::ROSFragment& other)
00115 : m_parent(0),
00116 m_child(0),
00117 m_last(0),
00118 m_next(0),
00119 m_extra_count(0)
00120 {
00121 *this = other;
00122 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00123 "Built (write) ros fragment from copy, with",
00124 ROSFragment::source_id(), ROSFragment::lvl1_id(),
00125 ROSFragment::run_no());
00126 }
00127
00128 eformat::write::ROSFragment& eformat::write::ROSFragment::operator=
00129 (const eformat::write::ROSFragment& other)
00130 {
00131 memcpy(reinterpret_cast<void*>(m_header),
00132 reinterpret_cast<const void*>(other.m_node[0].base),
00133 6*sizeof(uint32_t));
00134 memcpy(reinterpret_cast<void*>(m_header+6),
00135 reinterpret_cast<const void*>(other.m_node[2].base),
00136 4*sizeof(uint32_t));
00137
00138
00139 set(m_node[0], m_header, 6, &m_node[1]);
00140 set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
00141 set(m_node[2], &m_header[6], 4, 0);
00142 ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00143 "Copied (write) ros fragment, with",
00144 ROSFragment::source_id(), ROSFragment::lvl1_id(),
00145 ROSFragment::run_no());
00146 return *this;
00147 }
00148
00149 void eformat::write::ROSFragment::status (uint32_t n, const uint32_t* status)
00150 {
00151 if (m_parent) m_parent->size_change(m_node[0].base[1],
00152 m_node[0].base[1]-m_node[0].base[5]+n);
00153 m_node[0].base[1] -= m_node[0].base[5];
00154 m_node[0].base[2] -= m_node[0].base[5];
00155 m_node[1].size_word = m_node[0].base[5] = n;
00156 m_node[0].base[1] += n;
00157 m_node[0].base[2] += n;
00158 m_node[1].base = const_cast<uint32_t*>(status);
00159 }
00160
00161 void eformat::write::ROSFragment::size_change (uint32_t o, uint32_t n)
00162 {
00163 uint32_t old_size = m_node[0].base[1];
00164 m_node[0].base[1] -= o;
00165 m_node[0].base[1] += n;
00166 if (m_parent) m_parent->size_change(old_size, m_node[0].base[1]);
00167 }
00168
00169 void eformat::write::ROSFragment::append (eformat::write::ROBFragment* rob)
00170 {
00171 ERS_DEBUG_3("%s Source Id. = 0x%x to ros fragment with Source Id. = 0x%x",
00172 "Appending rob fragment with",
00173 rob->source_id(), source_id());
00174 rob->parent(this);
00175 uint32_t old_size = m_node[0].base[1];
00176 m_node[0].base[1] += rob->size_word();
00177
00178
00179 if (m_last) m_last->next(rob);
00180 else m_child = rob;
00181 m_last = rob;
00182
00183
00184 if (m_parent) m_parent->size_change(old_size, m_node[0].base[1]);
00185 }
00186
00187 uint32_t eformat::write::ROSFragment::page_count (void) const
00188 {
00189 uint32_t retval = 3 + m_extra_count;
00190 for (const ROBFragment* curr = m_child; curr; curr = curr->next())
00191 retval += curr->page_count();
00192 return retval;
00193 }
00194
00195 const eformat::write::node_t* eformat::write::ROSFragment::bind (void)
00196 {
00197
00198 eformat::write::node_t* last = &m_node[2];
00199 if (m_extra_count) {
00200 last = &m_extra;
00201 while (last->next) last = last->next;
00202 }
00203 for (const ROBFragment* curr = m_child; curr; curr = curr->next()) {
00204 last->next = const_cast<eformat::write::node_t*>(curr->bind());
00205 while (last->next) last = last->next;
00206 }
00207 return m_node;
00208 }