BOOL CSummInfo::RecordSaveDate() { FILETIME saveDate; CoFileTimeNow(&saveDate); return m_pSection->Set(PIDSI_LASTSAVE_DTM, (void*)&saveDate, VT_FILETIME); }
BOOL CSummInfo::RecordPrintDate() { FILETIME printDate; CoFileTimeNow(&printDate); return m_pSection->Set(PIDSI_LASTPRINTED, (void*)&printDate, VT_FILETIME); }
BOOL CSummInfo::RecordCreateDate() { FILETIME createDate; CoFileTimeNow(&createDate); return m_pSection->Set(PIDSI_CREATE_DTM, (void*)&createDate, VT_FILETIME); }
STDMETHODIMP IMemStream::Stat( STATSTG *pstatstg, DWORD grfStatFlag ) { #if 0 if( grfStatFlag & STATFLAG_DEFAULT ) // wants the stream name using CoMemTaskAlloc { pstatstg->pwcsName = (PTCHAR) CoTaskMemAlloc( 5 ); // STATFLAG_NONAME _tcscpy( pstatstg->pwcsName, _T("Test") ); } #endif memset( pstatstg, 0, sizeof(STATSTG) ); pstatstg->type = STGTY_STREAM; pstatstg->cbSize.QuadPart = m_ullEnd; pstatstg->grfMode = STGM_SIMPLE|STGM_READ; //0x80000000; pstatstg->clsid = IID_IStream; // ??? don't know what to do here... FILETIME ft; CoFileTimeNow( &ft ); pstatstg->mtime = ft; pstatstg->ctime = ft; pstatstg->atime = ft; return S_OK; }
BOOL CSummInfo::AddCountToEditTime() { FILETIME now; CoFileTimeNow(&now); __int64 currTime = *(__int64*)&now; __int64 thisSession = currTime - startEdit; __int64 lastTotal = *(__int64*)m_pSection->Get(PIDSI_EDITTIME); __int64 newTotal = lastTotal + thisSession; return m_pSection->Set(PIDSI_EDITTIME, (void*)&newTotal, VT_FILETIME); }
CString CSummInfo::GetEditTime() { FILETIME now; CoFileTimeNow(&now); __int64 currTime = *(__int64*)&now; __int64 thisSession = currTime - startEdit; __int64 lastTotal = *(__int64*)m_pSection->Get(PIDSI_EDITTIME); __int64 newTotal = lastTotal + thisSession; ULONG editMinutes = (ULONG)(newTotal/600000000); TCHAR buff[20]; #if _MSC_VER < 1400 _stprintf(buff, _T("%lu min"), min(20, editMinutes)); #else _stprintf_s(buff, 20, _T("%lu min"), editMinutes); #endif return CString(buff); }
//------------------------------------------------------------------* HRESULT COPCConnection::DoDisconnect() { TRACE(_T("COPCConnection::DoDisconnect from %s\n"), (LPCTSTR)m_sMachineName); CSingleLock lock(&m_cs, TRUE); _ASSERTE(m_bConnected); m_bConnected = false; FILETIME timeNow; CoFileTimeNow(&timeNow); POSITION pos = m_activeItemList.GetHeadPosition(); while (pos != NULL) { CComVariant Value; WORD quality; FILETIME time; CItem *pItem = m_activeItemList.GetNext(pos); pItem->m_hServer = 0; pItem->GetQVT(&Value, &quality, &time); quality = OPC_QUALITY_BAD; time = timeNow; pItem->SetQVT(Value, quality, time); } while (!m_removedItemList.IsEmpty()) { CItem *pItem = m_removedItemList.RemoveHead(); pItem->Release(); } while (!m_writeRequestList.IsEmpty()) { CWriteRequest *pRequest = m_writeRequestList.RemoveHead(); pRequest->Release(); } lock.Unlock(); m_pSyncIO->Release(); m_pSyncIO=NULL; m_pItemMgt->Release(); m_pItemMgt=NULL; HRESULT hr = m_pOPCServer->RemoveGroup(m_hGroup1, TRUE); m_pOPCServer->Release(); m_pOPCServer=NULL; return S_OK; }
HRESULT __stdcall Stat(STATSTG* stat, DWORD grfStatFlag) { if(!stat) return E_INVALIDARG; switch(grfStatFlag) { case STATFLAG_DEFAULT: str::clear(stat->pwcsName); break; default: stat->pwcsName = NULL; break; } FILETIME time; CoFileTimeNow(&time); stat->type = STGTY_STREAM; stat->cbSize.QuadPart = GetSize(); stat->grfMode = GetAccessMode(); stat->grfLocksSupported = 0; stat->clsid = GUID_NULL; stat->mtime = stat->ctime = stat->atime = time; return S_OK; }
/*********************************************************************** * CoFileTimeNow [COMPOBJ.82] */ HRESULT WINAPI CoFileTimeNow16( FILETIME *lpFileTime ) { return CoFileTimeNow( lpFileTime ); }
//******************************************************************* BOOL ODevice::UpdateTags( OTagList& tags, DWORD mSec ) { if( simulate ) { sim( tags ); return TRUE; } //pCurrent->pPort->Initialize( ); // Only first call will do anything FILETIME now; CoFileTimeNow( &now ); // for each tag in the list POSITION pos = tags.GetHeadPosition(); while( pos ) { // maybe reuse a msg, instead of new/delete each time POSITION savedPos = pos; OModbusTag* pTag = tags.GetNext( pos ); // OModbusTag::TYPE range = pTag->range; // // // search for tags to group with this one // BOOL done = FALSE; // int count=1; // WORD groupSize = 1; // WORD groupStart = pTag->offset; // OModbusTag* pLastTag = pTag; // while( pos && !done) // { // OModbusTag* pNextTag = tags.GetNext( pos ); // // Can this tag be combined in a message? // if( pNextTag->offset - pLastTag->offset < ADJACENT_SPAN // && pNextTag->offset - groupStart < MAX_SPAN // && pNextTag->range == range) // { // groupSize = pNextTag->offset - groupStart + 1; // count++; // } // else // done = TRUE; // pLastTag = pNextTag; // } // // // create a packet for it // OMessage* msg = CreateReadPacket( pTag, groupSize+1 ); // // // Wait for the device's delay period? // DWORD diff = FileTimeDiff(pCurrent->lastMessage, now ); // if( diff < pCurrent->interPollDelay ) // Sleep( pCurrent->interPollDelay - diff ); // // send the message to the port and get response // m_Sent++; // msg = pCurrent->pPort->Message( msg, pCurrent->timeout ); // pCurrent->lastMessage = now; // if( msg->IsOk() == COMM_NO_ERROR ) // { // m_Rcvd++; // pCurrent->pPort->m_Rcvd++; // } // else // { // // lock // if( msg->IsOk() == TIMEOUT ) // { // m_Timeouts++; // pCurrent->pPort->m_Timeouts++; // need lock! // // // set quality for remaining tags // CSLock wait( &tagCS ); // protect data // pos = savedPos; // while( pos ) // { // pTag = tags.GetNext( pos ); // pTag->quality = OPC_QUALITY_BAD | OPC_QUALITY_COMM_FAILURE; // } // delete msg; // return FALSE; // } // else // { // m_Messages++; // pCurrent->pPort->m_Messages++; // need lock! // } // } // // // // extract the data from the packet // VARIANT value; // pos = savedPos; // while( pos && count-- ) // { // CSLock wait( &tagCS ); // protect data // pTag = tags.GetNext( pos ); // if( msg->IsOk() == COMM_NO_ERROR ) // { // switch( pTag->range ) // { // case OModbusTag::OUTPUT_BOOL: // case OModbusTag::INPUT_BOOL : // { // value.vt = VT_BOOL; // value.boolVal = msg->GetBit( pTag->offset - groupStart ); // break; // } // case OModbusTag::OUTPUT_VALUE: // case OModbusTag::INPUT_VALUE : // value.vt = pTag->nativeType; // switch( pTag->nativeType ) // { // default: // case VT_EMPTY: ASSERT( FALSE ); // case VT_I2: // value.iVal = msg->GetWord( pTag->offset - groupStart ); // break; // case VT_I4: // value.lVal = MAKELONG(msg->GetWord( pTag->offset - groupStart ), // msg->GetWord( pTag->offset - groupStart + 1 )); // if( pCurrent->wordSwap ) // value.lVal = MAKELONG(HIWORD(value.lVal),LOWORD(value.lVal)); // break; // case VT_R8: // case VT_R4: // DWORD temp = MAKELONG(msg->GetWord( pTag->offset - groupStart ), // msg->GetWord( pTag->offset - groupStart + 1 )); // if( pCurrent->wordSwap ) // temp = MAKELONG(HIWORD(temp),LOWORD(temp)); // void* pfloat = &temp; // value.fltVal = *(float*)pfloat; // break; // } // break; // default: ASSERT( FALSE ); // } // pTag->SetValue( value ); // pTag->quality = OPC_QUALITY_GOOD; // } // else // message had an error // { // pTag->quality = OPC_QUALITY_BAD | OPC_QUALITY_COMM_FAILURE; // } // pTag->timestamp = msg->timestamp; // } // delete msg; } return TRUE; }
void sim( OTagList& tags ) { CSLock wait( &tagCS ); // protect data double t = GetTickCount()/6000.0; POSITION pos = tags.GetHeadPosition(); while( pos ) { OModbusTag* pTag = tags.GetNext( pos ); pTag->quality = OPC_QUALITY_GOOD; if( !pTag->active || pTag->m_IsOutput) continue; switch( pTag->value.vt ) { case VT_EMPTY: case VT_NULL: pTag->value.vt = VT_R8; pTag->value.dblVal = 0.0; break; case VT_BOOL: switch(pTag->simType) { case OModbusTag::SIN: case OModbusTag::RAMP: pTag->value.boolVal = ((int)t)&1 ? VARIANT_TRUE : VARIANT_FALSE; break; case OModbusTag::RANDOM: pTag->value.boolVal = rand()&1 ? VARIANT_TRUE : VARIANT_FALSE; break; } break; case VT_UI1: // uchar switch(pTag->simType) { case OModbusTag::SIN: pTag->value.bVal = (UCHAR)(50*sin(pi*t/10)+50); break; case OModbusTag::RAMP: pTag->value.bVal = (pTag->value.bVal+1)%100; break; case OModbusTag::RANDOM: pTag->value.bVal = rand()%100; break; } break; case VT_I2 : // short switch(pTag->simType) { case OModbusTag::SIN: pTag->value.iVal = (short)(50*sin(pi*t/10)+50); break; case OModbusTag::RAMP: pTag->value.iVal = (pTag->value.iVal+1)%100; break; case OModbusTag::RANDOM: pTag->value.iVal = rand()%100; break; } break; case VT_I4 : // long switch(pTag->simType) { case OModbusTag::SIN: pTag->value.lVal = (long)(50*sin(pi*t/10)+50); break; case OModbusTag::RAMP: pTag->value.lVal = (pTag->value.lVal+1)%100; break; case OModbusTag::RANDOM: pTag->value.lVal = rand()%100; break; } break; case VT_R4 : switch(pTag->simType) { case OModbusTag::SIN: pTag->value.fltVal = (float)sin(pi*t/10); break; case OModbusTag::RAMP: pTag->value.fltVal = (float)(long(t)%100); break; case OModbusTag::RANDOM: pTag->value.fltVal = (float)((rand()%300)/3.0); break; } break; case VT_R8 : switch(pTag->simType) { case OModbusTag::SIN: pTag->value.dblVal = sin(pi*t/10); break; case OModbusTag::RAMP: pTag->value.dblVal = (long)(t)%100; break; case OModbusTag::RANDOM: pTag->value.dblVal = (rand()%300)/3.0; break; } break; default: ASSERT( FALSE ); } CoFileTimeNow( &pTag->timestamp ); } }
void CSummInfo::StartEditTimeCount() { FILETIME now; CoFileTimeNow(&now); startEdit = *(__int64*)&now; }