00001 #ifndef artdaq_ots_Overlays_UDPFragmentWriter_hh
00002 #define artdaq_ots_Overlays_UDPFragmentWriter_hh
00003
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017 #include "artdaq-core/Data/Fragment.hh"
00018 #include "artdaq-ots/Overlays/UDPFragment.hh"
00019
00020 #include <iostream>
00021
00022 namespace ots {
00023 class UDPFragmentWriter;
00024 }
00025
00026
00027 class ots::UDPFragmentWriter: public ots::UDPFragment {
00028 public:
00029
00030
00031 UDPFragmentWriter(artdaq::Fragment & f);
00032
00033
00034
00035
00036 uint8_t * dataBegin();
00037 uint8_t * dataEnd();
00038
00039
00040
00041
00042 Header * header_() {
00043 assert(artdaq_Fragment_.dataSizeBytes() >= sizeof(Header) );
00044 return reinterpret_cast<Header *>( artdaq_Fragment_.dataBeginBytes());
00045 }
00046
00047 void set_hdr_type(Header::data_type_t dataType) {
00048 header_()->type = dataType & 0xF;
00049 }
00050
00051 void resize(size_t nBytes);
00052
00053 private:
00054 size_t calc_event_size_words_(size_t nBytes);
00055
00056 static size_t bytes_to_words_(size_t nBytes);
00057
00058
00059 artdaq::Fragment & artdaq_Fragment_;
00060 };
00061
00062
00063
00064
00065
00066 ots::UDPFragmentWriter::UDPFragmentWriter(artdaq::Fragment& f ) :
00067 UDPFragment(f), artdaq_Fragment_(f) {
00068
00069 if ( ! f.hasMetadata() || f.dataSizeBytes() > 0 ) {
00070 throw cet::exception("Error in UDPFragmentWriter: Raw artdaq::Fragment object does not appear to consist of (and only of) its own header + the UDPFragment::Metadata object");
00071 }
00072
00073
00074 artdaq_Fragment_.resizeBytes( sizeof(Header) );
00075 }
00076
00077
00078 inline uint8_t * ots::UDPFragmentWriter::dataBegin() {
00079
00080 assert(artdaq_Fragment_.dataSizeBytes() >= sizeof(Header) + sizeof(artdaq::Fragment::value_type) );
00081 return reinterpret_cast<uint8_t *>(header_() + 1);
00082 }
00083
00084 inline uint8_t * ots::UDPFragmentWriter::dataEnd() {
00085 return dataBegin() + udp_data_words();
00086 }
00087
00088
00089 inline void ots::UDPFragmentWriter::resize(size_t nBytes) {
00090
00091 artdaq_Fragment_.resizeBytes(sizeof(Header::data_t) * calc_event_size_words_(nBytes) );
00092 header_()->event_size = calc_event_size_words_(nBytes);
00093 }
00094
00095 inline size_t ots::UDPFragmentWriter::calc_event_size_words_(size_t nBytes) {
00096 return bytes_to_words_(nBytes) + hdr_size_words();
00097 }
00098
00099 inline size_t ots::UDPFragmentWriter::bytes_to_words_(size_t nBytes) {
00100 auto mod(nBytes % bytes_per_word_());
00101 return (mod == 0) ?
00102 nBytes / bytes_per_word_() :
00103 nBytes / bytes_per_word_() + 1;
00104 }
00105
00106 #endif