00001 #ifndef BASE_BOARD_H
00002 #define BASE_BOARD_H
00003
00004 #include "base/OperList.h"
00005
00006 #include <string>
00007
00008 #include <iostream>
00009 #include <map>
00010 #include <list>
00011
00012 namespace base {
00013
00014 class BoardFactory;
00015
00016 enum ClientRole {
00017 roleNone = 0,
00018 roleObserver = 1,
00019 roleControl = 2,
00020 roleDAQ = 3
00021 };
00022
00023 extern const char* roleToString(ClientRole role);
00024 extern ClientRole defineClientRole(const char* name,
00025 ClientRole dflt = roleObserver);
00026
00027 enum EFrontendKinds {
00028 kind_nXYTER = 1,
00029 kind_oldFEET = 2,
00030 kind_FEET = 3,
00031 kind_newNX = 4,
00032 kind_SPADIC = 5
00033 };
00034
00035 enum EBackendKinds {
00036 kind_Optic = 1,
00037 kind_FX20 = 2,
00038 kind_FX40 = 3,
00039 kind_FX60 = 4,
00040 kind_newOptic = 5
00041 };
00042
00043
00044 enum ETransportKinds {
00045 kind_UDP = 0,
00046 kind_ABB = 1,
00047 kind_File = 2,
00048 kind_USB = 3
00049 };
00050
00051 enum BasicAddresses {
00052 addr_HardwareType = 0x00,
00053 addr_HardwareVersion = 0x04,
00054 addr_BoardId = 0x10
00055 };
00056
00057
00059 class Board {
00060 friend class BoardFactory;
00061
00062 protected:
00063
00064 typedef std::map<std::string,uint32_t> mapn2a_t;
00065 typedef std::map<uint32_t,std::string> mapa2n_t;
00066
00067 mapn2a_t fMapName2Addr;
00068 mapa2n_t fMapAddr2Name;
00069
00070 BoardFactory* fBrdFactory;
00071 double fDefaultTimeout;
00072 int fVerbosity;
00073 int fOperTrace;
00074 ClientRole fRole;
00075 uint32_t fBrdNumber;
00076
00077
00078
00079 Board();
00080 virtual ~Board();
00081
00082 void traceOper(OperList& lst, int rc);
00083
00084 void setRole(ClientRole role) { fRole = role; }
00085
00086 uint32_t initBoard(const char* name, uint32_t minversion);
00087
00088 public:
00089
00091
00095 enum operErr {
00096 kOperSuccess = 0,
00097 kOperAddrErr = 2,
00098 kOperValueErr = 3,
00099 kOperStateErr = 4,
00100 kOperNetworkErr = 6,
00101 kHostError = 8,
00102 kOperVerifyErr = 20,
00103 kOperBusErr = 21
00104 };
00105
00106 enum addrErr {
00107 kAddrError = 0xffffffff
00108 };
00109
00111
00117 void setDefaultTimeout(double tmout = 2.) { fDefaultTimeout = tmout>0 ? tmout : 1.; }
00118
00120 double getDefaultTimeout() const { return fDefaultTimeout; }
00121
00123 void setVerbosity(int lvl = 0) { fVerbosity = lvl; }
00125 int getVerbosity() const { return fVerbosity; }
00126
00128 ClientRole getRole() const { return fRole; }
00129
00131 void Debug(int lvl, const char *fmt, ...);
00132
00133
00135
00166 void setOperTrace(int lvl = 1) { fOperTrace = lvl; }
00167
00169 int getOperTrace() const { return fOperTrace; }
00170
00171
00173
00192 virtual int operGen(OperList& lst, double tmout = 0.) = 0;
00193
00195 virtual int operGen(bool* isput,
00196 uint32_t* addr,
00197 uint32_t* value,
00198 int num,
00199 double tmout = 0.);
00200
00202 virtual unsigned GetBoardId() const { return 0; }
00203
00204 int put(uint32_t addr, uint32_t value, double tmout = 0.);
00205 int get(uint32_t addr, uint32_t& value, double tmout = 0.);
00206
00207 int operPP(uint32_t addr0, uint32_t val0p,
00208 uint32_t addr1, uint32_t val1p,
00209 double tmout = 0.);
00210 int operPG(uint32_t addr0, uint32_t val0p,
00211 uint32_t addr1, uint32_t& val1g,
00212 double tmout = 0.);
00213 int operPPP(uint32_t addr0, uint32_t val0p,
00214 uint32_t addr1, uint32_t val1p,
00215 uint32_t addr2, uint32_t val2p,
00216 double tmout = 0.);
00217 int operGGG(uint32_t addr0, uint32_t& val0p,
00218 uint32_t addr1, uint32_t& val1p,
00219 uint32_t addr2, uint32_t& val2p,
00220 double tmout = 0.);
00221 int operPPPP(uint32_t addr0, uint32_t val0p,
00222 uint32_t addr1, uint32_t val1p,
00223 uint32_t addr2, uint32_t val2p,
00224 uint32_t addr3, uint32_t val3p,
00225 double tmout = 0.);
00226
00228
00234 static int operErrCode(int rc)
00235 { return rc & 0xff; }
00236
00238
00244 static int operErrIndex(int rc)
00245 { return (rc>>8) & 0xffffff; }
00246
00248
00258 static int operErrBuild(int code, int index)
00259 { return (code & 0xff) | ((index & 0xffffff)<<8); }
00260
00262
00269 static int operErrBuildInc(int rc, int inc)
00270 { return operErrBuild(rc, operErrIndex(rc) + inc); }
00271
00272 static std::string operErrToString(int rc);
00273
00274 static const char* operErrCodeName(int rc);
00275
00276
00278 uint32_t findRegAddressByName(const char* name);
00279 const char* findRegNameByAddress(uint32_t addr);
00280 void printRegAddressMap(std::ostream& os, bool byname=false);
00281 void addRegAddrMapping(const char* name, uint32_t addr);
00282 void fillRegAddrNames(std::list<std::string>& lst);
00283
00284
00286
00289 virtual int getTransportKind() const = 0;
00290
00292
00296 bool isFile() const { return getTransportKind() == base::kind_File; }
00297
00299 bool isOptic() const { return getTransportKind() == base::kind_ABB; }
00300
00302 bool isUSB() const { return getTransportKind() == base::kind_USB; }
00303
00305 virtual bool restartBoard() { return false; }
00306
00308 virtual bool is_SPI_I2C() const { return false; }
00309
00311 virtual int setToDefault() { return 0; }
00312
00313
00315 virtual uint32_t getHardwareType();
00316
00318 virtual uint32_t getHardwareVersion();
00319
00320
00322 virtual uint32_t getFrontendKind() { return getHardwareType() >> 16; }
00323
00325 virtual uint32_t getBackendKind() { return getHardwareType() & 0xffff; }
00326
00327
00329 uint32_t boardNumber() const { return fBrdNumber; }
00330
00332 uint32_t getBoardNumber();
00333
00335 void setBoardNumber(uint32_t num);
00336
00338 virtual int invokeDLM(unsigned num, double tmout = 0.) { return 0; }
00339
00340
00341
00342
00344
00355 virtual bool startDaq() = 0;
00356
00358
00363 virtual bool suspendDaq() = 0;
00364
00366
00370 virtual bool stopDaq() = 0;
00371
00372
00373
00375
00384 virtual bool getNextBuffer(void* &buf, unsigned& len, double tmout = 1.) = 0;
00385
00387
00391 virtual int getMsgFormat() const = 0;
00392
00394
00400 virtual void setFlushTimeout(double tmout) {}
00401
00402
00403
00404 static Board* Connect(const char* url, ClientRole role = roleNone);
00405 static bool Close(Board* brd);
00406
00407 static const char* versionToString(uint32_t ver);
00408
00409 };
00410
00411 class BoardFactory {
00412
00413 protected:
00414
00415 enum { MaxNumFactories = 10 };
00416 static BoardFactory* gArr[MaxNumFactories];
00417
00418 BoardFactory();
00419 virtual ~BoardFactory();
00420
00421 public:
00422
00425 virtual bool IsFactoryFor(const char* url) { return false; }
00426
00427 virtual void ShowDebug(int lvl, const char* msg);
00428
00429 virtual Board* DoConnect(const char* name, base::ClientRole role) = 0;
00430 virtual bool DoClose(Board* brd) = 0;
00431
00432 static Board* CreateBoard(const char* url, ClientRole role = roleNone);
00433 static bool DestroyBoard(base::Board* brd);
00434 };
00435
00436 }
00437
00438
00439 #endif