long HpHardware::ReadCounter() { int ExtraWaitTime = 10; //~100 ms do { if (ExtraWaitTime<10) Sleep(10); if (--ExtraWaitTime <= 0) throw EXCEPTION("Ошибка ожидания окончания счета таймера КАМАК: не получен сигнал Q в течение ожидаемого времени."); Camac_ReadWord(_crateN, _timerN, 1, 8); } while (!Camac_q()); Camac_ReadWord(_crateN, _counterN, 0, COUNTER_OVERFLOW_CHECK_F); if (Camac_q() && !Camac_ErrorCode()) //Counter overflow { LogFileFormat("Counter overflow. Continue measuring?"); if (IDNO == ::MessageBox(NULL, " Counter overflow. \n Continue measuring? ", "Error", MB_ICONSTOP | MB_YESNO)) throw EXCEPTION("Counter overflow."); Camac_ReadWord(_crateN, _counterN, 0, COUNTER_RESET_F); //Reset counter and overflow Camac_ReadWord(_crateN, _counterN, 0, COUNTER_OVERFLOW_LAM_RESET_F); //Reset LAM and overflow } auto newN = Camac_ReadLong(_crateN, _counterN, 0, COUNTER_READ_RESET_F); if (Camac_ErrorCode()) { LogFileFormat("Counter read failure. Continue measuring?"); if (IDNO == ::MessageBox(NULL, " Counter read failure. \n Continue measuring? ", "Camac error", MB_ICONSTOP | MB_YESNO)) throw EXCEPTION("Counter read failure."); } return newN; }
DWORD SCALL LogFileInit(VOID) { DWORD result; InterlockedExchange(&logStatus, LOG_STATUS_INACTIVE); STAILQ_INIT(&logQueue); logPath = Io_ConfigGetPath("Locations", "Log_Files", "nxMyDB.log", NULL); if (logPath == NULL) { return ERROR_NOT_ENOUGH_MEMORY; } if (!InitializeCriticalSectionAndSpinCount(&logLock, 50)) { result = GetLastError(); Io_Free(logPath); } else { result = ERROR_SUCCESS; // Set logging system as active InterlockedExchange(&logStatus, LOG_STATUS_ACTIVE); // Write log header LogFileFormat("------------------------------------------------------------\r\n"); } return result; }
//Может запрашивать действие пользователя и заканчивать поток void CComThread::ReportComErrorAndExit() { LPTSTR lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM| FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); CString str2; DetectSerialErrors(m_hComPort,&str2); LogSpecifiedFileFormat(LogFileName, "ReadFile: ошибка чтения из порта.%s %s",lpMsgBuf,(LPCSTR)str2); LogFileFormat("ReadFile: ошибка чтения из порта.%s %s",lpMsgBuf,(LPCSTR)str2); LocalFree(&lpMsgBuf); m_Pool.PutMsg(NULL,SERIAL_ERROR_COM_FAILED); AfxEndThread(0); }
long KratosHardware::ReadCounter() { bool firstTry = true; int ExtraWaitTime = 100; //Extra wait time ~ 1000...3000 ms CounterState counterState; do { counterState = _counterUnit.ReadLastCounter(); if (!firstTry) { LogFileFormat("USB counter ExtraWaitTime: %i ", ExtraWaitTime); Sleep(10); } firstTry = false; if (--ExtraWaitTime <= 0) throw EXCEPTION_SPECIFIC(CounterTimeoutException, "ќшибка в блоке USB-счетчика: счетчик во врем¤ не закончил счет."); } while (counterState.StartState == StartStates::Start); return counterState.Count; }
DWORD SCALL LogFileInit(VOID) { CHAR *path; DWORD result; InterlockedExchange(&logStatus, LOG_STATUS_INACTIVE); STAILQ_INIT(&logQueue); path = Io_ConfigGetPath("Locations", "Log_Files", "nxMyDB.log", NULL); if (path == NULL) { return ERROR_NOT_ENOUGH_MEMORY; } // Open log file for writing logHandle = CreateFileA(path, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL); if (logHandle == INVALID_HANDLE_VALUE) { result = GetLastError(); } else if (!InitializeCriticalSectionAndSpinCount(&logLock, 50)) { result = GetLastError(); CloseHandle(logHandle); } else { result = ERROR_SUCCESS; // Set logging system as active InterlockedExchange(&logStatus, LOG_STATUS_ACTIVE); // Write log header LogFileFormat("------------------------------------------------------------\r\n"); } Io_Free(path); return result; }