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