00001
00002
00013 #ifndef EFORMAT_WRITE_ROBFRAGMENT_H
00014 #define EFORMAT_WRITE_ROBFRAGMENT_H
00015
00016 #include "eformat/write/node.h"
00017 #include "eformat/Version.h"
00018
00019 namespace eformat {
00020
00021 namespace write {
00022
00023 class ROSFragment;
00024
00028 class ROBFragment {
00029
00030 public:
00031
00048 ROBFragment (uint32_t source_id,
00049 uint32_t run_no,
00050 uint32_t lvl1_id,
00051 uint32_t bc_id,
00052 uint32_t lvl1_type,
00053 uint32_t detev_type,
00054 uint32_t ndata,
00055 const uint32_t* data,
00056 uint32_t status_position);
00057
00065 ROBFragment ();
00066
00080 ROBFragment (const ROBFragment& other);
00081
00090 ROBFragment (uint32_t* rod, uint32_t size_word);
00091
00102 ROBFragment (uint32_t* rob);
00103
00107 virtual ~ROBFragment () {}
00108
00121 ROBFragment& operator= (const ROBFragment& other);
00122
00131 void status (uint32_t n, const uint32_t* status);
00132
00136 inline uint32_t nstatus (void) const { return m_node[0].base[5]; }
00137
00141 inline const uint32_t* status (void) const { return m_node[1].base; }
00142
00148 inline void minor_version (uint16_t v)
00149 { m_node[0].base[3] = eformat::DEFAULT_VERSION | v; }
00150
00154 inline uint16_t minor_version (void) const
00155 { return 0xffff & m_node[0].base[3]; }
00156
00165 void rod_status (uint32_t n, const uint32_t* status);
00166
00170 inline uint32_t rod_nstatus (void) const { return m_node[6].base[0]; }
00171
00176 inline const uint32_t* rod_status (void) const { return m_node[4].base; }
00177
00184 void status_position (uint32_t v);
00185
00189 inline uint32_t status_position (void) const
00190 { return m_node[6].base[2]; }
00191
00197 inline void rod_minor_version (uint16_t v)
00198 { m_node[3].base[2] = eformat::DEFAULT_VERSION | v; }
00199
00208 void rod_data (uint32_t n, const uint32_t* data);
00209
00213 inline uint32_t rod_ndata (void) const { return m_node[6].base[1]; }
00214
00218 inline const uint32_t* rod_data (void) const { return m_node[5].base; }
00219
00225 inline void source_id (uint32_t s)
00226 { m_node[0].base[4] = m_node[3].base[3] = s; }
00227
00231 inline uint32_t source_id (void) const
00232 { return m_node[0].base[4]; }
00233
00239 inline void rod_run_no (uint32_t s)
00240 { m_node[3].base[4] = s; }
00241
00245 inline uint32_t rod_run_no (void) const
00246 { return m_node[3].base[4]; }
00247
00253 inline void rod_lvl1_id (uint32_t s)
00254 { m_node[3].base[5] = s; }
00255
00259 inline uint32_t rod_lvl1_id (void) const
00260 { return m_node[3].base[5]; }
00261
00267 inline void rod_bc_id (uint32_t s)
00268 { m_node[3].base[6] = s; }
00269
00273 inline uint32_t rod_bc_id (void) const
00274 { return m_node[3].base[6]; }
00275
00281 inline void rod_lvl1_type (uint32_t s)
00282 { m_node[3].base[7] = s; }
00283
00287 inline uint32_t rod_lvl1_type (void) const
00288 { return m_node[3].base[7]; }
00289
00295 inline void rod_detev_type (uint32_t s)
00296 { m_node[3].base[8] = s; }
00297
00301 inline uint32_t rod_detev_type (void) const
00302 { return m_node[3].base[8]; }
00303
00309 inline uint32_t meta_size_word (void) const
00310 { return 7 + m_node[0].base[5] + 12 + m_node[6].base[0]; }
00311
00315 inline uint32_t size_word (void) const
00316 { return meta_size_word() + m_node[6].base[1]; }
00317
00321 inline uint32_t page_count (void) const { return 7; }
00322
00327 inline const eformat::write::node_t* bind (void) const
00328 { return m_node; }
00329
00335 inline void parent (eformat::write::ROSFragment* ros)
00336 { m_parent = ros; }
00337
00341 inline const ROSFragment* parent (void) const { return m_parent; }
00342
00348 inline void next (const ROBFragment* n) { m_next = n; }
00349
00353 inline const ROBFragment* next (void) const { return m_next; }
00354
00355 private:
00356
00357 uint32_t m_header[7];
00358 uint32_t m_rod_header[9];
00359 uint32_t m_rod_trailer[3];
00360 eformat::write::node_t m_node[7];
00361 eformat::write::ROSFragment* m_parent;
00362 const eformat::write::ROBFragment* m_next;
00363
00364 };
00365
00366 }
00367
00368 }
00369
00370 #endif