00001
00002 #include <cassert>
00003 #include <cstdarg>
00004 #include <cstdlib>
00005 #include <iostream>
00006 #include <boost/thread.hpp>
00007 #include <boost/asio.hpp>
00008 #include <boost/bind.hpp>
00009 #include <boost/date_time/posix_time/posix_time.hpp>
00010 #include <boost/interprocess/shared_memory_object.hpp>
00011 #include <boost/interprocess/mapped_region.hpp>
00012
00013
00014 #include "Listener.h"
00015 #include "EventSender.h"
00016 #include "TimeStampedEvent.h"
00017 #include "PolymorphEvent.h"
00018
00019 #include <map>
00020 #include <utility>
00021 #include <map>
00022 #include <string>
00023 #include <queue>
00024
00025 #define DEVICE
00026
00027 class dvDataLayer;
00028 class mdEmbedded;
00029 bool aucDevice();
00030
00031 #include "mdcommon.h"
00032
00033 #define DV_NAME "OpenAUC Embedded"
00034 #define DV_VERSION "1.0"
00035
00036 #ifdef _WIN32_WINNT
00037 #include <SDKDDKVer.h>
00038
00039 #ifdef DV_DLL_MAIN
00040
00041 BOOL APIENTRY DllMain( HMODULE hModule,
00042 DWORD ul_reason_for_call,
00043 LPVOID lpReserved
00044 )
00045 {
00046 BOOL rc=TRUE;
00047
00048 switch (ul_reason_for_call)
00049 {
00050 case DLL_PROCESS_ATTACH:
00051 rc=aucDevice();
00052 break;
00053 case DLL_THREAD_ATTACH:
00054 case DLL_THREAD_DETACH:
00055 case DLL_PROCESS_DETACH:
00056 break;
00057 }
00058 return rc;
00059 }
00060
00061 #endif
00062
00063 #else
00064 #define DllExport
00065 #define APIENTRY
00066 #endif
00067
00068 #include "mdBehavior.h"
00069 #include "mdObservable.h"
00070 #include "mdState.h"
00071
00072 #include "deviceDaemonConfig.h"
00073 #include "dvLogger.h"
00074
00075
00076
00077 #define N_OBSERVABLES 80
00078 #define N_ODES 20
00079
00080 typedef
00081 struct DV_TELEMETRY_DATA {
00082 char id[16];
00083 int nObs,nODEs;
00084 std::string obs[N_OBSERVABLES];
00085 std::string odes[N_ODES];
00086 mdObsPOD observations[N_OBSERVABLES];
00087 mdODEPOD opsdata[N_ODES];
00088 }
00089 auc_dv_global;
00090
00091 typedef std::map<std::string,mdObservable *> ObservationsByName;
00092 typedef std::map<std::string,mdOperationalDataElement *> ODEsPerName;
00093
00094 class dvQueryMD;
00095 class dvIncoming;
00096
00097 typedef struct {
00098 dvQueryMD *call;
00099 dvIncoming *response;
00100 }
00101 mdDialog;
00102
00103 class DllExport mdEmbeddedAPI;
00104
00105 #ifdef DV_DLL
00106 #ifdef DV_DLL_MAIN
00107
00108 auc_dv_global *gm;
00109 boost::asio::io_service io_;
00110 boost::thread *bgThreadGroup;
00111 boost::thread *dataLayer;
00112 dvLogger theseLogs;
00113 deviceDaemonConfig *thisConfig;
00114 mdDialog thisCmdQry;
00115 mdDialog thisObsQry;
00116 mdDialog thisODEQry;
00117 mdEmbedded *thisDevice;
00118 mdError *mdErrors;
00119 mdEmbeddedAPI *mdDDAPI=NULL;
00120
00121 extern void runDeviceDaemon();
00122 extern void shutdown();
00123
00124 InstructionSet mySCPI;
00125 ObservationsByName myObs;
00126 ODEsPerName myODEs;
00127
00128 #else
00129
00130 extern auc_dv_global *gm;
00131 extern boost::asio::io_service io_;
00132 extern boost::thread *bgThreadGroup;
00133 extern boost::thread *dataLayer;
00134 extern dvLogger theseLogs;
00135 extern deviceDaemonConfig *thisConfig;;
00136 extern mdDialog thisCmdQry;
00137 extern mdDialog thisObsQry;
00138 extern mdDialog thisODEQry;
00139 extern mdEmbedded *thisDevice;
00140 extern mdError *mdErrors;
00141 extern mdEmbeddedAPI *mdDDAPI;
00142
00143 extern InstructionSet mySCPI;
00144 extern ObservationsByName myObs;
00145 extern ODEsPerName myODEs;
00146
00147 #endif
00148
00149 #include "dvEvents.h"
00150 #include "deviceDaemon.h"
00151
00152 #endif
00153
00154 #ifdef DV_DRV
00155 #ifdef DV_DRV_MAIN
00156
00157 auc_dv_global *gm;
00158 dvLogger theseLogs;
00159 mdError *mdErrors;
00160 mdEmbeddedAPI *mdDDAPI=NULL;
00161
00162 ObservationsByName myObs;
00163 ODEsPerName myODEs;
00164
00165 #else
00166
00167
00168
00169 extern auc_dv_global *gm;
00170 extern dvLogger theseLogs;
00171 extern mdError *mdErrors;
00172 extern mdEmbeddedAPI *mdDDAPI=NULL;
00173 extern ObservationsByName myObs;
00174 extern ODEsPerName myODEs;
00175
00176 #endif
00177 #endif
00178
00179 #ifdef DV_DLL
00180 class DllExport mdEmbeddedAPI {
00181 #else
00182 class mdEmbeddedAPI {
00183 #endif
00184 public:
00185
00186 std::string mdAddress;
00187 std::string mdPort;
00188 std::string cdAddress;
00189 std::string cdPort;
00190
00191 bool *cdConnected, shutdown;
00192 boost::thread *data_layer,*telemetry;
00193
00194 int mdHeartbeat, telemetryRefresh;
00195
00196 mdEmbeddedAPI(const char *ma, const char *mp, const char *ca,
00197 const char *cp) : mdAddress(ma), mdPort(mp), cdAddress(ca), cdPort(cp)
00198 { mdHeartbeat = MD_HEARTBEAT; telemetryRefresh = MD_REFRESH;
00199 shutdown = false;
00200 data_layer = telemetry = NULL;
00201 };
00202
00203 void mdCmdResult(int mdErrCode);
00204 int mdRegisterCommandCallback(void (f)(char *,char *),const char *canonicalSCPI);
00205 mdOperationalDataElement *mdRegisterODE(const char *name);
00206 mdObservable *mdRegisterObservable(const char *name);
00207 bool mdResume();
00208 bool mdYield();
00209 void setSingleton(auc_dv_global *sm);
00210 dvLogger *log;
00211 };
00212
00213