00001 #ifndef SCTAPIIPC_SCTAPISERVER_H
00002 #define SCTAPIIPC_SCTAPISERVER_H
00003 
00004 #include <map>
00005 
00006 #include <boost/shared_ptr.hpp>
00007 
00008 #include <ipc/object.h>
00009 #include <ipc/server.h>
00010 #include <mrs/message.h>
00011 #include <vector>
00012 
00013 namespace SctApi {
00014   class SctApi;
00015   class Trigger;
00016   class TriggerImpl;
00017   class Scan;
00018   class ScanDefImpl;
00019 }
00020 
00021 #include "Sct_SctApi/SctApi.hh"
00022 #include "CrateStore.h"
00023 
00024 #include "Sct/Addressing.h"
00025 
00031 
00032 namespace Sct {
00033   class ScanStatusManager;
00034 };
00035 
00036 
00037 
00038 
00039 class ScanServer;
00040 class TriggerServer;
00041 
00045 class SctApiServer : public IPCNamedObject<POA_Sct_SctApi::SctApiIPC>,
00046                      public IPCServer {
00047 
00048  public:
00049   typedef std::vector<Sct_SctApi::CrateIPC_var> CrateIPC_vars;
00050   typedef std::vector<Sct::UCID> CrateDescriptors; 
00051 
00052   SctApiServer(const CrateDescriptors & apis,
00053                const char* interfaceName);
00054   virtual ~SctApiServer();      
00055 
00056  
00057 
00058   virtual Sct_SctApi::CrateIPC_ptr getCrate(const Sct::Corba::UCID& ucid);
00059   virtual Sct_SctApi::CrateIPC_ptr getCrateLegacy(CORBA::ULong partition, CORBA::ULong crate);
00060   virtual Sct::Corba::UCIDs* getCrateUCIDs();
00061   virtual void initialiseAll (CORBA::ULong runNumber);
00062   virtual CORBA::Boolean isInitialised();
00063   virtual void shutdownAll ();
00064   virtual char* status ();
00065   virtual void setRunNumber (CORBA::ULong newRun);
00066   virtual void setScanNumber (CORBA::ULong newScan);
00067   virtual CORBA::ULong getRunNumber ();
00068   virtual CORBA::ULong getScanNumber ();
00069   virtual CORBA::Boolean changeRunMode(Sct_SctApi::RunType mode);
00070   virtual CORBA::Boolean changeEventFormat(Sct_SctApi::EventFormatType format);
00071   virtual void unsetDebugOption (const char * opt);
00072   virtual void setDebugOption (const char * opt);
00073   virtual Sct_SctApi::DebugOptionList * listEnabledDebugOptions ();
00074   virtual Sct_SctApi::DebugOptionList * listDebugOptions ();
00075   virtual void unsetBusy();
00076   virtual void standardRegisterDumpURID (const Sct::Corba::URID& urid);
00077   virtual void standardRegisterDumpAll ();
00078   virtual sctConf::ModuleList * getModuleList ();
00079   virtual void configureBOC (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00080   virtual Sct_SctApi::BOCMonitorSequence* getBOCMonitorArray(CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00081   virtual void loadConfiguration (const char * filename);
00082   virtual void storeModuleConfigurations (Sct_SctApi::BankType bank);
00083   virtual void storeBOCConfigurations ();
00084   virtual void configureAllModules ();
00085   virtual void loadModuleConfigurations ();
00086   virtual sctConf::ABCDModule retrieveModule (CORBA::ULong mid);
00087 
00088   
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096   virtual CORBA::ULong findModuleSerial (const char * sn);
00097   virtual char * convertToString (CORBA::ULong mid);
00098   virtual CORBA::ULong findModule (CORBA::UShort mur, CORBA::UShort number);
00099   virtual CORBA::ULong findModuleRod (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, CORBA::ULong channel);
00100   virtual CORBA::ULong findBarrelModule (CORBA::ULong barrel, CORBA::ULong row, CORBA::Short number);
00101   virtual void convertToBarrelModule (CORBA::ULong mid, CORBA::ULong & barrel, CORBA::ULong & row, CORBA::Short & number);
00102   virtual CORBA::ULong findEndcapModule (CORBA::Long disk, CORBA::Long ring, CORBA::Long number);
00103   virtual void convertToEndcapModule (CORBA::ULong mid, CORBA::Long & disk, CORBA::ULong & ring, CORBA::ULong & number);
00104   virtual void getABCDModules (Sct_SctApi::BankType bank);
00105   virtual void getABCDModule (CORBA::ULong mid, Sct_SctApi::BankType bank);
00106   
00107   virtual void setABCDModule (CORBA::ULong mid, const Sct_SctApi::BankList& banks);
00108   virtual void setABCDModules (const Sct_SctApi::BankList& bank);
00109 
00110   virtual void copyABCDModule (CORBA::ULong mid, Sct_SctApi::BankType source, const Sct_SctApi::BankList& to);
00111   virtual void copyABCDModules (Sct_SctApi::BankType source, const Sct_SctApi::BankList& to);
00112   virtual void sendABCDModule (CORBA::ULong mid, Sct_SctApi::BankType bank, CORBA::ULong type);
00113   virtual void sendABCDModules (Sct_SctApi::BankType bank);
00114   virtual void modifyABCDMask (CORBA::ULong mid, const Sct_SctApi::DataBlock & mask);
00115   virtual void modifyABCDTrims (CORBA::ULong mid, const Sct_SctApi::CharBlock & trims);
00116   virtual void modifyABCDRC (CORBA::ULong mid, CORBA::ULong chip, CORBA::UShort index, CORBA::Double p0, CORBA::Double p1, CORBA::Double p2);
00117   virtual void setAutoUpdateBanks(const Sct_SctApi::BankList& banks);
00118   virtual void modifyABCDVar (CORBA::ULong typ, CORBA::Double var);
00119   virtual void modifyABCDModuleVar (CORBA::ULong mid, CORBA::ULong typ, CORBA::Double var);
00120   virtual void modifyABCDChipVar (CORBA::ULong mid, CORBA::ULong chip, CORBA::ULong typ, CORBA::Double var);
00121   virtual void modifyABCDVarAllModulesOneChip (CORBA::ULong chip, CORBA::ULong typ, CORBA::Double var);
00122   virtual void modifyABCDVarROD (CORBA::ULong typ, CORBA::Double var, const Sct_SctApi::BankList& banks);
00123   virtual void modifyABCDModuleVarROD (CORBA::ULong mid, CORBA::ULong typ, CORBA::Double var, const Sct_SctApi::BankList& banks);
00124   virtual void modifyBOCParam (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, CORBA::ULong channel, CORBA::ULong type, CORBA::ULong val);
00125   virtual void lasersOff ();
00126   virtual void timSetFrequency (CORBA::ULong partition, CORBA::ULong crate, CORBA::Double trigFreq, CORBA::Double rstFreq);
00127   virtual void freeTriggers (CORBA::ULong partition, CORBA::ULong crate);
00128   virtual void stopTriggers (CORBA::ULong partition, CORBA::ULong crate);
00129   virtual void timL1A (CORBA::ULong partition, CORBA::ULong crate);
00130   virtual void timCalL1A (CORBA::ULong partition, CORBA::ULong crate, CORBA::Short delay);
00131   virtual CORBA::Short timReadRegister (CORBA::ULong partition, CORBA::ULong crate, CORBA::Short value);
00132   virtual void timWriteRegister (CORBA::ULong partition, CORBA::ULong crate, CORBA::Short reg, CORBA::Short value);
00133   CORBA::ULong sendTriggers (CORBA::ULong partition, CORBA::ULong crate, Sct_SctApi::Trigger_ptr trig, CORBA::ULong ntrigs, CORBA::UShort point_in_scan);
00134   virtual void sendRodTrigger (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, Sct_SctApi::Trigger_ptr trig);
00135 
00136   virtual void doScan (Sct_SctApi::Scan_ptr thisScan);
00137   virtual void doRawScan (Sct_SctApi::Scan_ptr thisScan, CORBA::Long delay, CORBA::Long width, CORBA::Boolean configure, CORBA::Boolean clockByTwo);
00138   virtual Sct_SctApi::ScanMonitor_ptr startAsyncScan(Sct_SctApi::Scan_ptr thisScan);
00139   virtual CORBA::Boolean hasFinishedScanning();
00140   virtual void abortScan();
00141 
00142   
00143   virtual Sct_SctApi::BOCChannelList * currentBOCSetup (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00144   virtual sctConf::BOCGlobalConfig currentBOCRegisters (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00145   virtual void sendL1A (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00146   virtual Sct_SctApi::CharBlock * probe (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod);
00147   virtual Sct_SctApi::CharBlock * probeHarness (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, CORBA::ULong harness);
00148   virtual Sct_SctApi::CharBlock * probeWithTrigger (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, Sct_SctApi::Trigger_ptr trig);
00149   virtual Sct_SctApi::CharBlock * probeHarnessWithTrigger (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, Sct_SctApi::Trigger_ptr trig, CORBA::ULong harness);
00150   virtual Sct_SctApi::CharMatrix * probeScanHarnessWithTrigger (CORBA::ULong partition, CORBA::ULong crate, CORBA::ULong rod, Sct_SctApi::Scan_ptr trig, CORBA::ULong harness);
00151   virtual CORBA::Boolean checkAllModulesProbe (const char * chars);
00152   virtual Sct_SctApi::AutoResultList * autoConfigureScan ();
00153   virtual Sct_SctApi::Scan_ptr createScan ();
00154   virtual Sct_SctApi::Scan_ptr getDefaultScan ();
00155   
00156   virtual Sct_SctApi::Trigger_ptr createTrigger ();
00157   
00158   virtual Sct_SctApi::ScanList * knownScans ();
00159 
00160  private:
00161   typedef boost::shared_ptr<ScanServer> SharedScanServer;
00162   boost::shared_ptr<Sct::ScanStatusManager> m_assm;
00163 
00164  public:
00165   typedef std::list<SharedScanServer> Scans;
00166   Scans scans;
00167 
00168   ScanServer *defaultScan;
00169   TriggerServer *defaultTrigger;
00170 
00171   static SctApiServer *singleton;
00172 
00173   virtual void shutdown();
00174 
00175  protected:
00177   Sct_SctApi::CrateIPC_var worker();   
00178   typedef Sct::CrateStore::Worker Worker;
00179   typedef Sct::CrateStore::Workers Workers;
00180   Workers & workers();
00181 
00182  protected:
00183   MRSStream mrsStream;
00184   
00185   
00186   
00187 
00188  private:
00189   Sct::CrateStore m_crateStore;
00190   unsigned long m_localRunNumber;
00191   unsigned long m_localScanNumber;
00192 };
00193 
00194 #endif