ROOT logo
#ifndef HTRB3TDCMESSAGE_H
#define HTRB3TDCMESSAGE_H

#include "Rtypes.h"

#include <stdint.h>
#include <stdio.h>

enum TdcMessageKind {
   tdckind_Reserved = 0x00000000,
   tdckind_Header   = 0x20000000,
   tdckind_Debug    = 0x40000000,
   tdckind_Epoch    = 0x60000000,
   tdckind_Mask     = 0xe0000000,
   tdckind_Hit      = 0x80000000,
   tdckind_Hit1     = 0xa0000000,
   tdckind_Hit2     = 0xc0000000,
   //tdckind_Hit3     = 0xe0000000 // now used for calib message
   tdckind_Calib    = 0xe0000000 // calibrated fine times
};

enum TdcConstants {
   MaxNumTdcChannels = 65
};

/** TdcMessage is wrapper for data, produced by FPGA-TDC
 * struct is used to avoid any potential overhead */

struct HTrb3TdcMessage {
   protected:
      UInt_t   fData;

      static UInt_t gFineMinValue;
      static UInt_t gFineMaxValue;

   public:

      HTrb3TdcMessage() : fData(0) {}

      HTrb3TdcMessage(UInt_t d) : fData(d) {}

      void assign(UInt_t d) { fData=d; }

      /** Returns kind of the message
       * If used for the hit message, four different values can be returned */
      UInt_t getKind() const { return fData & tdckind_Mask; }

      /** uncalibrated raw hit. may use extra information from preceding CalibMsg for fine time calibration*/
      Bool_t isHitMsg() const { return getKind() == tdckind_Hit; }

      /** calibrated format with replacing original fine counter*/
      Bool_t isHit1Msg() const { return getKind() == tdckind_Hit1;}

      /** not used yet*/
      Bool_t isHit2Msg() const { return getKind() == tdckind_Hit2;}

      Bool_t isEpochMsg() const { return getKind() == tdckind_Epoch; }
      Bool_t isDebugMsg() const { return getKind() == tdckind_Debug; }
      Bool_t isHeaderMsg() const { return getKind() == tdckind_Header; }
      Bool_t isReservedMsg() const { return getKind() == tdckind_Reserved; }

      /** extra calibration message: contains 1 or 2 calibrated fine time information*/
      Bool_t isCalibMsg() const { return getKind() == tdckind_Calib; }

      // methods for epoch

      /** Return Epoch for epoch marker, 28 bit */
      UInt_t getEpochValue() const { return fData & 0xFFFFFFF; }
      /** Get reserved bit for epoch, 1 bit */
      UInt_t getEpochRes() const { return (fData >> 28) & 0x1; }

      // methods for hit

      /** Returns hit channel ID */
      UInt_t getHitChannel() const { return (fData >> 22) & 0x7F; }

      /** Returns hit coarse time counter, 11 bit */
      UInt_t getHitTmCoarse() const { return fData & 0x7FF; }

      /** Returns hit fine time counter, 10 bit */
      UInt_t getHitTmFine() const { return (fData >> 12) & 0x3FF; }

      /** Returns time stamp, which is simple combination coarse and fine counter */
      UInt_t getHitTmStamp() const { return (getHitTmCoarse() << 10) | getHitTmFine(); }

      /** Returns hit edge 1 - rising, 0 - falling */
      UInt_t getHitEdge() const {  return (fData >> 11) & 0x1; }

      Bool_t isHitRisingEdge() const { return getHitEdge() == 0x1; }
      Bool_t isHitFallingEdge() const { return getHitEdge() == 0x0; }

      /** Returns hit reserved value, 2 bits */
      UInt_t getHitReserved() const { return (fData >> 29) & 0x3; }

      // methods for header

      /** Return error bits of header message */
      UInt_t getHeaderErr() const { return fData & 0xFFFF; }

      /** Return reserved bits of header message */
      UInt_t getHeaderRes() const { return (fData >> 16) & 0x1FFF; }

      /** Return first value in calibration message */
      UInt_t getCalibFirst() const { return (fData  & 0x3fff); }

      /** Return second value in calibration message */
      UInt_t getCalibSecond() const { return ((fData >> 14) & 0x3fff);}


      void print(Double_t tm = -1.);

      static Double_t coarseUnit() { return 5e-9; }

      static Double_t simpleFineCalibr(UInt_t fine)
      {
         if (fine<=gFineMinValue) return 0.;
         if (fine>=gFineMaxValue) return coarseUnit();
         return (coarseUnit() * (fine - gFineMinValue)) / (gFineMaxValue - gFineMinValue);
      }

      /** Method set static limits, which are used for simple interpolation of time for fine counter */
      static void setFineLimits(UInt_t min, UInt_t max)
      {
         gFineMinValue = min;
         gFineMaxValue = max;
      }

//      ClassDef(HTrb3TdcMessage, 0)
};


#endif
 htrb3tdcmessage.h:1
 htrb3tdcmessage.h:2
 htrb3tdcmessage.h:3
 htrb3tdcmessage.h:4
 htrb3tdcmessage.h:5
 htrb3tdcmessage.h:6
 htrb3tdcmessage.h:7
 htrb3tdcmessage.h:8
 htrb3tdcmessage.h:9
 htrb3tdcmessage.h:10
 htrb3tdcmessage.h:11
 htrb3tdcmessage.h:12
 htrb3tdcmessage.h:13
 htrb3tdcmessage.h:14
 htrb3tdcmessage.h:15
 htrb3tdcmessage.h:16
 htrb3tdcmessage.h:17
 htrb3tdcmessage.h:18
 htrb3tdcmessage.h:19
 htrb3tdcmessage.h:20
 htrb3tdcmessage.h:21
 htrb3tdcmessage.h:22
 htrb3tdcmessage.h:23
 htrb3tdcmessage.h:24
 htrb3tdcmessage.h:25
 htrb3tdcmessage.h:26
 htrb3tdcmessage.h:27
 htrb3tdcmessage.h:28
 htrb3tdcmessage.h:29
 htrb3tdcmessage.h:30
 htrb3tdcmessage.h:31
 htrb3tdcmessage.h:32
 htrb3tdcmessage.h:33
 htrb3tdcmessage.h:34
 htrb3tdcmessage.h:35
 htrb3tdcmessage.h:36
 htrb3tdcmessage.h:37
 htrb3tdcmessage.h:38
 htrb3tdcmessage.h:39
 htrb3tdcmessage.h:40
 htrb3tdcmessage.h:41
 htrb3tdcmessage.h:42
 htrb3tdcmessage.h:43
 htrb3tdcmessage.h:44
 htrb3tdcmessage.h:45
 htrb3tdcmessage.h:46
 htrb3tdcmessage.h:47
 htrb3tdcmessage.h:48
 htrb3tdcmessage.h:49
 htrb3tdcmessage.h:50
 htrb3tdcmessage.h:51
 htrb3tdcmessage.h:52
 htrb3tdcmessage.h:53
 htrb3tdcmessage.h:54
 htrb3tdcmessage.h:55
 htrb3tdcmessage.h:56
 htrb3tdcmessage.h:57
 htrb3tdcmessage.h:58
 htrb3tdcmessage.h:59
 htrb3tdcmessage.h:60
 htrb3tdcmessage.h:61
 htrb3tdcmessage.h:62
 htrb3tdcmessage.h:63
 htrb3tdcmessage.h:64
 htrb3tdcmessage.h:65
 htrb3tdcmessage.h:66
 htrb3tdcmessage.h:67
 htrb3tdcmessage.h:68
 htrb3tdcmessage.h:69
 htrb3tdcmessage.h:70
 htrb3tdcmessage.h:71
 htrb3tdcmessage.h:72
 htrb3tdcmessage.h:73
 htrb3tdcmessage.h:74
 htrb3tdcmessage.h:75
 htrb3tdcmessage.h:76
 htrb3tdcmessage.h:77
 htrb3tdcmessage.h:78
 htrb3tdcmessage.h:79
 htrb3tdcmessage.h:80
 htrb3tdcmessage.h:81
 htrb3tdcmessage.h:82
 htrb3tdcmessage.h:83
 htrb3tdcmessage.h:84
 htrb3tdcmessage.h:85
 htrb3tdcmessage.h:86
 htrb3tdcmessage.h:87
 htrb3tdcmessage.h:88
 htrb3tdcmessage.h:89
 htrb3tdcmessage.h:90
 htrb3tdcmessage.h:91
 htrb3tdcmessage.h:92
 htrb3tdcmessage.h:93
 htrb3tdcmessage.h:94
 htrb3tdcmessage.h:95
 htrb3tdcmessage.h:96
 htrb3tdcmessage.h:97
 htrb3tdcmessage.h:98
 htrb3tdcmessage.h:99
 htrb3tdcmessage.h:100
 htrb3tdcmessage.h:101
 htrb3tdcmessage.h:102
 htrb3tdcmessage.h:103
 htrb3tdcmessage.h:104
 htrb3tdcmessage.h:105
 htrb3tdcmessage.h:106
 htrb3tdcmessage.h:107
 htrb3tdcmessage.h:108
 htrb3tdcmessage.h:109
 htrb3tdcmessage.h:110
 htrb3tdcmessage.h:111
 htrb3tdcmessage.h:112
 htrb3tdcmessage.h:113
 htrb3tdcmessage.h:114
 htrb3tdcmessage.h:115
 htrb3tdcmessage.h:116
 htrb3tdcmessage.h:117
 htrb3tdcmessage.h:118
 htrb3tdcmessage.h:119
 htrb3tdcmessage.h:120
 htrb3tdcmessage.h:121
 htrb3tdcmessage.h:122
 htrb3tdcmessage.h:123
 htrb3tdcmessage.h:124
 htrb3tdcmessage.h:125
 htrb3tdcmessage.h:126
 htrb3tdcmessage.h:127
 htrb3tdcmessage.h:128
 htrb3tdcmessage.h:129
 htrb3tdcmessage.h:130
 htrb3tdcmessage.h:131
 htrb3tdcmessage.h:132