/*******************************************************************************
* Pupe.h Pupe management class
* T.Barnaby, BEAM Ltd, 2007-02-13
*******************************************************************************
*/
#ifndef Pupe_H
#define Pupe_H 1
#include <TmsLib.h>
#include <TmsD.h>
#include <BThread.h>
#include <BMutex.h>
#include <PllSynth.h>
#include <admxrc2.h>
using namespace Tms;
class Control;
#define NEW_CYCLE_INFORMATION 1
const uint32_t FpgaCycleInfoTableSize = 512;
const uint32_t FpgaCycleTimingTableSize = 4096;
const uint32_t FpgaCycleTimingTableMask = (4096-1);
const uint32_t FpgaBunchMeanTableSize = 4096;
class Pupe;
struct PupeEvent {
uint8_t event;
uint32_t timingAddress;
uint32_t time;
uint32_t dataAddress;
};
/// PupeInterrupt thread class
class PupeInterruptThread : public BThread {
public:
PupeInterruptThread(Pupe& pupe);
void* function();
private:
Pupe& opupe;
};
class Pupe {
public:
enum { numChan = 3 };
Pupe(Control& control, int slot, int board);
~Pupe();
// Per board functions
BError init();
BError setMaster(int on); ///< Sets this board as a master for the timing bus
BError status(); ///< Returns the boards status
BError setNextCycle(PuChannel puChannel, UInt32 cycleNumber, BString cycleType, CycleParam& params);
// Per Pick-Up functions
BError setControlInfo(PuChannel puChannel, UInt32 cycleNumber, CycleParam& params);
BError getStatusList(PuChannel puChannel, BList<NameValue>& statusList);
BError getStatus(PuChannel puChannel, PuStatus& puStatus);
BError getCycleInformation(UInt32 cycleNumber, CycleInformation& cycleInformation);
BError getData(PuChannel puChannel, DataInfo dataInfo, Data& data);
BError setTestMode(PuChannel puChannel, UInt32 testOutput, UInt32 timingDisableMask);
BError setTimingSignals(PuChannel puChannel, UInt32 timingSignals);
BError captureDiagnostics(PuChannel puChannel, TestCaptureInfo captureInfo, BArray<UInt64>& data);
BError setTestData(PuChannel puChannel, Int32 on, BArray<UInt32> data); ///< This function will set a PU channel to sample data from memory rather than the ADC's
BError setPupeConfig(PuChannel puPhysChannel, PupeConfig pupeConfig);
BError getPupeConfig(PuChannel puPhysChannel, PupeConfig& pupeConfig);
// Internal functions
void cycleStart(); ///< Start of cycle event
void cycleStop(); ///< End of cycle event
void cycleError(int puChan); ///< An error occured
BError fpgaInterruptLoop();
void fpgaTriggerTimingInputs(TimingSig input); ///< Trigger a timing inputs
int getSlot();
void dumpState();
int adcPllLockCheck(); ///< Checks the ADC PLL lock status
private:
BError setControlInfoPickUp(PuChannel puChannel, UInt32 cycleNumber, CycleParam& params);
PuStateTable* getPuStateTable(CycleParam* params, UInt32 period);
BError getSimData(DataInfo dataInfo, Data& data); ///< return simulated data
BError checkData(UInt32 cycleNumber);
BError getEventList(BUInt32 pupeCycleNumber, BList<PupeEvent>& events);
void printEventList(BList<PupeEvent>& events);
BString getName();
BError fpgaInit();
BError fpgaLoad();
BError fpgaConfig();
void fpgaClose();
BError fpgaGetInfo(BList<NameValue>& infoList);
BError fpgaReadData32(uint32_t fpgaOffset, void* toAddress, int nbytes);
BError fpgaReadData64(uint32_t fpgaOffset, void* toAddress, int nbytes);
BError fpgaWriteData64(void* fromAddress, uint32_t fpgaOffset, int nbytes);
BError fpgaCopyData(int pupeChan, uint32_t address, uint32_t nsamples, Data& data);
BError fpgaGetAverageData(int pupeChan, uint32_t timeMs, uint32_t timingAddress, uint32_t bunch, uint32_t numValues, Data& data);
BError fpgaGetAverageDataAll(int pupeChan, uint32_t timeMs, uint32_t timingAddress, uint32_t numBunches, uint32_t numValues, Data& data);
void dataAverage(uint32_t timeMs, Data& data);
Control& ocontrol;
BMutex olock; ///< Locks access to the FPGA
BMutex odiagLock; ///< Diagnostics capture lock
int oboard;
int oslot; ///< The bus slot the board is in
int omaster;
int osimulate;
PupeConfig opupeConfig;
int oinitialised; ///< The board has been initialised
BError ostatus; ///< The boards current status
UInt32 ocycleNumber; ///< The current PS cycle number
UInt32 ocycleCompletedNumber; ///< The last completed PS cycle number
UInt32 ocycleNumberNext; ///< The next PS cycle number
UInt32 opuCycleNumbers[3]; ///< The board cycle numbers matching the PS cycle number
BString opuCycleTypes[3]; ///< The current cycle type
BString ocycleTypeNext; ///< The next cycle type
ADMXRC2_HANDLE ofpgaCard;
ADMXRC2_CARD_INFO ocardInfo;
ADMXRC2_DMADESC odmabuf;
int opageSize;
int odmaBufferSize; ///< The DMA buffer size
UInt64* odmaBuffer; ///< DMA buffer
volatile uint32_t* ofpga;
volatile uint32_t* ofpgaControl;
PupeInterruptThread ointerruptThread;
UInt32 oprocessingCycle; ///< We are processing a cycle
CycleParam* ocycleParams[3][8]; ///< The cycle paramterstypes for the last 8 cycles for each channel
PllSynth opllSynth; ///< The Phase locked loop frequency synthesisor
int opllLocked; ///< The current PLL lock status
#if NEW_CYCLE_INFORMATION
uint64_t ocycleInfoTable[FpgaCycleInfoTableSize];
#else
uint32_t ocycleInfoTable[FpgaCycleInfoTableSize];
#endif
uint64_t ocycleTimingTable[FpgaCycleTimingTableSize];
uint32_t ocycleCount;
uint32_t opllRefErrors; ///< The number of PLL reference lock errors
};
#endif