00001
00002
00003 #define DV_DLL
00004 #define DV_DLL_MAIN
00005 #include "md_device.h"
00006 #include "mdBehavior.h"
00007 #include "../server/Listener.cpp"
00008 #include "../server/EventSender.cpp"
00009 #include <time.h>
00010
00011 extern boost::mutex mdQuery;
00012 extern boost::condition_variable mdObsQPending;
00013 extern boost::condition_variable mdODEQPending;
00014 extern boost::condition_variable mdCmdQPending;
00015
00016 void runEmbedded();
00017 void runDataLayer();
00018 void setStrMsg(mdDG &mdg,const char *str,
00019 mdDGtype md_DG_type,mdDGtype md_DG_subtype,
00020 const char *extraTxt );
00021 bool aucDevice() {
00022
00023 bool value=true;
00024
00025 try {
00026
00027 thisConfig = new deviceDaemonConfig();
00028 theseLogs.init("auc-dv");
00029 theseLogs.logN(0,DV_NAME " " DV_VERSION " compiled on " __DATE__ " @ " __TIME__);
00030 theseLogs.logN(0,"Embedded processing begun.");
00031
00032 boost::thread fg(runEmbedded);
00033 boost::thread bg(runDataLayer);
00034
00035 if ( !bg.joinable() || !fg.joinable() )
00036 theseLogs.logN(0,"Failed to start MD thread group.");
00037 else {theseLogs.logN(0,"MD thread group started OK.");
00038 bgThreadGroup = &fg;
00039 dataLayer = &bg;
00040 }
00041 }
00042 catch (std::exception &e)
00043 {
00044 theseLogs.logN(1,"Exception: %s",e.what());
00045 }
00046 catch (...) {
00047 theseLogs.logN(0,"General fault.");
00048 }
00049 return value;
00050
00051 }
00052 void mdEmbeddedAPI::mdCmdResult(int rc) {
00053
00054 if (rc == OK) {
00055
00056 } else {
00057
00058
00059 }
00060
00061
00062 }
00063 int mdEmbeddedAPI::mdRegisterCommandCallback(void (f)(char *,char *), const char *canonicalSCPI) {
00064
00065 boost::unique_lock<boost::mutex> cmdRegResponse(mdQuery);
00066 dvQueryMD checkCmd;
00067 int value=OK;
00068
00069 setStrMsg(checkCmd.mdg,canonicalSCPI,MDDG_MDQUERY,MDDG_REGSCPI,thisConfig->deviceName.c_str());
00070 checkCmd.mdg.dg.hdr.handle = checkCmd.mdg.dg.hdr.sourceHandle = thisDevice->myHandle;
00071 thisCmdQry.call = &checkCmd;
00072 checkCmd.send();
00073 mdCmdQPending.wait(cmdRegResponse);
00074
00075 if (thisCmdQry.response->mdg.dg.hdr.dgType.value) {
00076
00077 mdCmdPOD *flattened = (mdCmdPOD *)(&thisCmdQry.response->mdg.dg.payLoad[0]);
00078 mdCommand *gotten = new mdCommand();
00079 char *sVal = &flattened->sVal;
00080
00081 memcpy(&gotten->parms,&flattened,sizeof(mdCmdPOD));
00082 gotten->signature = std::string(sVal);
00083 mySCPI[std::string(canonicalSCPI)] = gotten;
00084
00085 } else
00086 value = thisCmdQry.response->mdg.dg.hdr.ec;
00087
00088 return value;
00089
00090 }
00091 bool mdEmbeddedAPI::mdResume() {
00092
00093 bool value=false;
00094 return value;
00095
00096 }
00097 mdOperationalDataElement *mdEmbeddedAPI::mdRegisterODE(const char *name) {
00098
00099 boost::unique_lock<boost::mutex> ODERegResponse(mdQuery);
00100 mdOperationalDataElement *value = NULL, *candidate = new mdOperationalDataElement();
00101 dvQueryMD regODE;
00102 int nthODE;
00103
00104 if (!thisDevice->myHandle) {mdErrors->set(1); goto done;}
00105 if (!thisConfig->cdConnected) {mdErrors->set(2); goto done;}
00106
00107 setStrMsg(regODE.mdg,name,MDDG_MDQUERY,MDDG_REGODE,thisConfig->deviceName.c_str());
00108 regODE.mdg.dg.hdr.handle = regODE.mdg.dg.hdr.sourceHandle = thisDevice->myHandle;
00109 thisODEQry.call = ®ODE;
00110 regODE.send();
00111 mdODEQPending.wait(ODERegResponse);
00112
00113 if (thisODEQry.response->mdg.dg.hdr.dgType.value) {
00114
00115 mdODEPOD *flattened = (mdODEPOD *)(&thisODEQry.response->mdg.dg.payLoad[0]);
00116 mdODEPOD *shared = &gm->opsdata[(nthODE=gm->nODEs++)];
00117 gm->odes[nthODE] = std::string(name);
00118 mdOperationalDataElement *gotten = new mdOperationalDataElement(shared);
00119 char *sVal = &flattened->sVal;
00120
00121 memcpy(&gotten->ode,&flattened,sizeof(mdODEPOD));
00122 gotten->stringValue = std::string(sVal);
00123 myODEs[std::string(name)] = value = gotten;
00124
00125 } else
00126 mdErrors->set(thisODEQry.response->mdg.dg.hdr.ec);
00127
00128 done: return value;
00129 }
00130 mdObservable *mdEmbeddedAPI::mdRegisterObservable(const char *name) {
00131
00132 boost::unique_lock<boost::mutex> obsRegResponse(mdQuery);
00133 mdObservable *value = NULL, *candidate = new mdObservable();
00134 dvQueryMD regObs;
00135 int nthObs;
00136
00137 if (!thisDevice->myHandle) {mdErrors->set(1); goto done;}
00138 if (!thisConfig->cdConnected) {mdErrors->set(2); goto done;}
00139
00140 setStrMsg(regObs.mdg,name,MDDG_MDQUERY,MDDG_REGOBS,thisConfig->deviceName.c_str());
00141 regObs.mdg.dg.hdr.handle = regObs.mdg.dg.hdr.sourceHandle = thisDevice->myHandle;
00142 thisObsQry.call = ®Obs;
00143 regObs.send();
00144 mdObsQPending.wait(obsRegResponse);
00145 if (thisObsQry.response->mdg.dg.hdr.dgType.value) {
00146
00147 mdObsPOD *flattened = (mdObsPOD *)(&thisObsQry.response->mdg.dg.payLoad[0]);
00148 mdObsPOD *shared = &gm->observations[(nthObs=gm->nObs++)];
00149 gm->obs[nthObs] = std::string(name);
00150 mdObservable *gotten = new mdObservable(shared);
00151 char *sVal = &flattened->sVal;
00152
00153 memcpy(&gotten->obs,&flattened,sizeof(mdObsPOD));
00154 gotten->sValue = std::string(sVal);
00155 myObs[std::string(name)] = value = gotten;
00156
00157 } else
00158 mdErrors->set(thisObsQry.response->mdg.dg.hdr.ec);
00159
00160 done: return value;
00161
00162 }
00163 bool mdEmbeddedAPI::mdYield() {
00164
00165 bool value=true;
00166 return value;
00167
00168 }
00169 void mdEmbeddedAPI::setSingleton(auc_dv_global *shared)
00170 {
00171 mdDDAPI = this;
00172 if (!mdAddress.empty()) thisConfig->mdAddress = mdAddress;
00173 if (!mdPort.empty()) thisConfig->mdPort = mdPort;
00174 cdConnected = &thisConfig->cdConnected;
00175 log = &theseLogs;
00176 gm = shared;
00177 gm->nObs = gm->nODEs = 0;
00178 }
00179 void mdEmbedded::additionalSystemMsgs() {
00180
00181 mdErrors = new mdError();
00182
00183 mdErrors->additionalSystemMsg(1, "The device is not connected to the MD.");
00184 mdErrors->additionalSystemMsg(2, "The device is not connected to the CD.");
00185 mdErrors->additionalSystemMsg(10,"The data element is unknown to the MD.");
00186 mdErrors->additionalSystemMsg(20,"The SCPI command is unknown to the MD.");
00187
00188 }