6 #include "named pipes.h" 7 #include "Log buffer.h" 9 #include "ftdi device.h" 10 #include "rtv device.h" 11 #include "serial device.h" 12 #include "mcdaq_device.h" 13 #include "misc tools.h" 17 CMainManager::CMainManager() :
CDevice(_T(
"Main"))
21 m_hClose= CreateEvent(NULL, TRUE, FALSE, NULL);
28 CMainManager::~CMainManager()
32 for (
size_t i= 0; i<m_acManagers.size(); ++i)
33 delete m_acManagers[i];
34 CloseHandle(m_hClose);
48 memset(&sBase, 0,
sizeof(
SBaseIn));
53 if (!pHead || dwSize <
sizeof(
SBaseIn) || dwSize != ((
SBaseIn*)pHead)->dwSize)
55 sBase.nError= SIZE_MISSMATCH;
59 sBase.dwInfo= BARST_VERSION;
60 sBase.eType= eVersion;
63 if (((
SBaseIn*)pHead)->nChan == -1)
65 else if (((
SBaseIn*)pHead)->nChan >= 0 && ((
SBaseIn*)pHead)->nChan < m_acManagers.size() &&
66 m_acManagers[((
SBaseIn*)pHead)->nChan])
68 delete m_acManagers[((
SBaseIn*)pHead)->nChan];
69 m_acManagers[((
SBaseIn*)pHead)->nChan]= NULL;
72 sBase.nError= INVALID_CHANN;
73 sBase.nChan= ((
SBaseIn*)pHead)->nChan;
79 for (; t < m_acManagers.size() && m_acManagers[t]; ++t);
80 if (t == m_acManagers.size())
81 m_acManagers.push_back(NULL);
83 switch (((
SBaseIn*)pHead)->eType2)
88 for (
size_t i= 0; i < m_acManagers.size() && nPos == -1; ++i)
89 if (m_acManagers[i] && _tcscmp(FTDI_MAN_STR, m_acManagers[i]->
m_csName.c_str()) == 0)
93 sBase.nError= ALREADY_OPEN;
101 m_acManagers[t]= pMan;
109 for (
size_t i= 0; i < m_acManagers.size() && nPos == -1; ++i)
110 if (m_acManagers[i] && _tcscmp(RTV_MAN_STR, m_acManagers[i]->
m_csName.c_str()) == 0)
114 sBase.nError= ALREADY_OPEN;
122 m_acManagers[t]= pMan;
130 for (
size_t i= 0; i < m_acManagers.size() && nPos == -1; ++i)
131 if (m_acManagers[i] && _tcscmp(SERIAL_MAN_STR, m_acManagers[i]->
m_csName.c_str()) == 0)
135 sBase.nError= ALREADY_OPEN;
143 m_acManagers[t]= pMan;
151 for (
size_t i= 0; i < m_acManagers.size() && nPos == -1; ++i)
152 if (m_acManagers[i] && _tcscmp(MCDAQ_MAN_STR, m_acManagers[i]->
m_csName.c_str()) == 0)
156 sBase.nError= ALREADY_OPEN;
164 m_acManagers[t]= pMan;
170 sBase.nError= INVALID_MAN;
173 }
else if (((
SBaseIn*)pHead)->nChan == -1 && ((
SBaseIn*)pHead)->eType == eQuery)
176 void *pHead = sData.pHead = m_pcMemPool->PoolAcquire(sData.dwSize);
180 ((
SBaseIn*)pHead)->eType= eQuery;
183 pHead = (
char*)pHead +
sizeof(
SBaseIn);
186 ((
SBase *)pHead)->eType = eServerTime;
187 pHead= (
char *)pHead +
sizeof(
SBase);
190 ULARGE_INTEGER ulTime;
192 GetSystemTimeAsFileTime(&sTime);
193 ulTime.HighPart = sTime.dwHighDateTime;
194 ulTime.LowPart = sTime.dwLowDateTime;
195 ((
SPerfTime *)pHead)->dUTCTime = ulTime.QuadPart / 10000000.0;
198 }
else if (((
SBaseIn*)pHead)->nChan < 0 || ((
SBaseIn*)pHead)->nChan >= m_acManagers.size() ||
199 !m_acManagers[((
SBaseIn*)pHead)->nChan])
201 sBase.nError= INVALID_CHANN;
202 sBase.eType= ((
SBaseIn*)pHead)->eType;
206 DWORD dwResSize= m_acManagers[((
SBaseIn*)pHead)->nChan]->GetInfo(NULL, 0);
207 sData.pHead= m_pcMemPool->PoolAcquire(dwResSize);
210 m_acManagers[((
SBaseIn*)pHead)->nChan]->GetInfo(sData.pHead, dwResSize);
211 sData.dwSize= dwResSize;
214 }
else if (((
SBaseIn*)pHead)->eType == ePassOn)
217 m_acManagers[((
SBaseIn*)pHead)->nChan]->ProcessData((
char*)pHead +
sizeof(
SBaseIn), dwSize-
sizeof(
SBaseIn), llId);
219 sBase.nError= INVALID_COMMAND;
223 sData.pHead= m_pcMemPool->PoolAcquire(sData.dwSize);
226 memcpy(sData.pHead, &sBase,
sizeof(
SBaseIn));
234 if (argc != 4 && argc != 5)
235 return BAD_INPUT_PARAMS;
236 DWORD dwBuffSizeIn, dwBuffSizeOut;
237 std::tstringstream in(argv[2]), out(argv[3]);
238 g_llMaxQueueBytes = -1;
241 std::tstringstream ssMaxBytes(argv[4]);
242 ssMaxBytes >> g_llMaxQueueBytes;
245 out >> dwBuffSizeOut;
248 if (in.fail() || out.fail() || _tcschr(argv[2], _T(
'-'))
249 || _tcschr(argv[3], _T(
'-')))
250 return BAD_INPUT_PARAMS;
252 HANDLE hPipe= CreateFile(argv[1], GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
253 if (hPipe != INVALID_HANDLE_VALUE || GetLastError() == ERROR_PIPE_BUSY)
259 if (nRes= static_cast<CPipeServer*>(m_pcComm)->Init(argv[1], 1, dwBuffSizeIn, dwBuffSizeOut,
this, NULL))
261 if (WAIT_OBJECT_0 != WaitForSingleObject(m_hClose, INFINITE))
262 return WIN_ERROR(GetLastError(), nRes);
267 int _tmain(
int argc, _TCHAR* argv[])
269 InitializeQueueLimit();
272 ShowWindow(GetConsoleWindow(), SW_HIDE);
275 int nRes= pMainManager->
Run(argc, argv);
virtual int SendData(const SData *pData, __int64 llId)=0
int Run(int argc, TCHAR *argv[])
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
const std::tstring m_csName