コード例 #1
0
ファイル: usart.c プロジェクト: koumu/HelloX_Kernel
//Handler to handle the receive(RXNE) interrupt,DA means Data Available here,the name
//inherites from COM driver implemented on X86 platform.
static VOID DAIntHandler(__USART_CONTROL_BLOCK* pCtrlBlock)
{
    CHAR                bt;
    DWORD               dwFlags;


    //Process data available interrupt.
    __ENTER_CRITICAL_SECTION(NULL,dwFlags);
    while(IsDataAvailable(pCtrlBlock->dwUsartBase))  //Data available.
    {
        bt = GetUsartByte(pCtrlBlock->dwUsartBase);  //Read the byte.
        pCtrlBlock->Buffer[pCtrlBlock->nBuffTail] = bt;
        pCtrlBlock->nBuffTail ++;
        if(COM_BUFF_LENGTH == pCtrlBlock->nBuffTail)  //Reach end of buffer.
        {
            pCtrlBlock->nBuffTail = 0;
        }
        if(pCtrlBlock->nBuffHeader == pCtrlBlock->nBuffTail)  //Buffer full.
        {
            break;
        }
    }
    while(IsDataAvailable(pCtrlBlock->dwUsartBase))  //Drain out all data from COM interface,since the buffer is full.
    {
        GetUsartByte(pCtrlBlock->dwUsartBase);
    }
    //Wake up all threads waiting for COM data.
    while(pCtrlBlock->pReadingList)
    {
        pCtrlBlock->pReadingList->OnCompletion((__COMMON_OBJECT*)pCtrlBlock->pReadingList);
        pCtrlBlock->pReadingList = pCtrlBlock->pReadingList->lpNext;
    }
    pCtrlBlock->pReadingListTail = NULL;
    __LEAVE_CRITICAL_SECTION(NULL,dwFlags);
}
コード例 #2
0
ファイル: TimeShiftUtil.cpp プロジェクト: abt8WG/EDCB
__int64 CTimeShiftUtil::GetAvailableFileSize() const
{
	if( this->filePath.empty() == false ){
		if( this->fileMode ){
			//単純にファイルサイズを返す
			if( this->seekFile == INVALID_HANDLE_VALUE ){
				WIN32_FIND_DATA findData;
				HANDLE find = FindFirstFile(this->filePath.c_str(), &findData);
				if( find != INVALID_HANDLE_VALUE ){
					FindClose(find);
					return (__int64)findData.nFileSizeHigh << 32 | findData.nFileSizeLow;
				}
			}else{
				LARGE_INTEGER liSize;
				if( GetFileSizeEx(this->seekFile, &liSize) ){
					return liSize.QuadPart;
				}
			}
		}else{
			//有効なデータのある範囲を調べる
			HANDLE file = this->seekFile;
			if( file == INVALID_HANDLE_VALUE ){
				file = CreateFile(this->filePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
				                  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			}
			if( file != INVALID_HANDLE_VALUE ){
				LARGE_INTEGER liSize;
				CPacketInit packetInit;
				if( GetFileSizeEx(file, &liSize) == FALSE || liSize.QuadPart < 188 * 16 * 8 ){
					liSize.QuadPart = 0;
				}else if( IsDataAvailable(file, liSize.QuadPart - 188 * 16 * this->seekJitter, &packetInit) == FALSE ){
					//終端部分が無効なので有効なデータの境目を探す
					//seekJitterは調査箇所がたまたま壊れている場合への対処
					__int64 range = liSize.QuadPart - 188 * 16 * this->seekJitter;
					__int64 pos = range / 2 / 188 * 188;
					//ここは頻繁に呼ばれると高負荷に見えるが、ファイルキャッシュがよく効く条件なのでさほどでもない
					for( ; range > 256 * 1024; range /= 2 ){
						if( IsDataAvailable(file, pos, &packetInit) ){
							pos += range / 4 / 188 * 188;
						}else{
							pos -= range / 4 / 188 * 188;
						}
					}
					//安定のため有効なデータの境目からさらに512KBだけ手前にする
					liSize.QuadPart = max(pos - range / 2 - 512 * 1024, 0);
				}
				if( file != this->seekFile ){
					CloseHandle(file);
				}
				return liSize.QuadPart;
			}
		}
	}
	return 0;
}
コード例 #3
0
// Registers a callback function
void WirelessDevice::RegisterWatcher(void *target, WirelessDeviceWatcher function, void *parameter)
{
    this->target = target;
    this->parameter = parameter;
    this->function = function;
    if ((function != NULL) && IsDataAvailable())
        NewData();
}
コード例 #4
0
void MythSocket::CallReadyReadHandler(void)
{
    // Because the connection to this is a queued connection the
    // data may have already been read by the time this is called
    // so we check that there is still data to read before calling
    // the callback.
    if (IsDataAvailable())
    {
        LOG(VB_SOCKET, LOG_DEBUG, LOC +
            "calling m_callback->readyRead()");
        m_callback->readyRead(this);
    }
}
コード例 #5
0
ファイル: IPComm.cpp プロジェクト: cdaffara/symbiandump-os2
/*
 * This method is used to wait for data to become available in incoming queue 
 * and then read all data into single Data object which is given as parameter
 */
DWORD IPCommPlugin::ReceiveWait(Data** data_out, long timeout)
{
    long elapsed = 0;
    while (elapsed < timeout && !IsDataAvailable())
    {
        elapsed += 25;
        Sleep(25);
    }
    if (elapsed >= timeout)
    {
        return ERR_DG_COMM_DATA_RECV_TIMEOUT;
    }
    return Receive(data_out, timeout);
}
コード例 #6
0
ファイル: Limitless.cpp プロジェクト: steplebr/domoticz
bool CLimitLess::GetV6BridgeID()
{
	m_BridgeID_1 = m_BridgeID_2 = 0;
	int totRetries = 0;
	sendto(m_RemoteSocket, (const char*)&V6_GetSessionID, sizeof(V6_GetSessionID), 0, (struct sockaddr*)&m_stRemoteDestAddr, sizeof(sockaddr_in));

	while (totRetries < v6_repeats)
	{
		if (!IsDataAvailable(m_RemoteSocket))
		{
			totRetries++;
			sendto(m_RemoteSocket, (const char*)&V6_GetSessionID, sizeof(V6_GetSessionID), 0, (struct sockaddr*)&m_stRemoteDestAddr, sizeof(sockaddr_in));
			continue;
		}
		uint8_t rbuffer[1024];
		sockaddr_in si_other;
		socklen_t slen = sizeof(sockaddr_in);
		int trecv = recvfrom(m_RemoteSocket, (char*)&rbuffer, sizeof(rbuffer), 0, (struct sockaddr*)&si_other, &slen);
		if (trecv < 1)
		{
			return false;
		}
		if (trecv != 0x16)
			return false;
		if ((rbuffer[0x00] != 0x28) || (rbuffer[0x15] != 0x00))
			return false;
		uint8_t mac_1 = rbuffer[0x07];
		uint8_t mac_2 = rbuffer[0x08];
		uint8_t mac_3 = rbuffer[0x09];
		uint8_t mac_4 = rbuffer[0x0A];
		uint8_t mac_5 = rbuffer[0x0B];
		uint8_t mac_6 = rbuffer[0x0C];
		m_BridgeID_1 = rbuffer[0x13];
		m_BridgeID_2 = rbuffer[0x14];
		return true;
	}
	return false;
}
コード例 #7
0
bool ODDecodeBlockFile::IsSummaryAvailable()
{
    return IsDataAvailable();
}
コード例 #8
0
FArchive* FHttpNetworkReplayStreamer::GetStreamingArchive()
{
	return ( StreamArchive.IsSaving() || IsDataAvailable() ) ? &StreamArchive : NULL;
}
コード例 #9
0
ファイル: Measure.c プロジェクト: ESLab/DataloggerExynos4412
void Measure(OutputChannel *outputs,int numoutputs)
{
	DataSource *sources[numoutputs];
	int numsources=0;

	for(int i=0;i<numoutputs;i++)
	{
		bool found=false;
		for(int j=0;j<numsources;j++)
		{
			if(outputs[i].source==sources[j]) { found=true; break; }
		}

		if(!found)
		{
			sources[numsources]=outputs[i].source;
			numsources++;
		}
	}

	for(;;)
	{
		bool didupdate=false;
		while(!didupdate)
		{
			for(int i=0;i<numsources;i++)
			{
				if(IsDataAvailable(sources[i]))
				{
					SampleData(sources[i]);
					if(IsDataSourceImportant(sources[i])) didupdate=true;

					for(int j=0;j<numoutputs;j++)
					{
						if(outputs[j].source==sources[i] && outputs[j].accumulates)
						{
							double value=GetData(outputs[j].source,outputs[j].channel);
							outputs[j].accumulator+=value;
						}
					}
				}
			}
		}
		FILE *fp;
		fp = fopen("power.log","a");
		for(int i=0;i<numoutputs;i++)
		{
			if(i!=0) printf(",");

			if(outputs[i].accumulates)
			{
				printf(outputs[i].format,outputs[i].accumulator*outputs[i].scalefactor);
				fprintf(fp,outputs[i].format,outputs[i].accumulator*outputs[i].scalefactor);
			}
			else
			{
				double value=GetData(outputs[i].source,outputs[i].channel);
				printf(outputs[i].format,value*outputs[i].scalefactor);
				fprintf(fp,outputs[i].format,value*outputs[i].scalefactor);
			}
		}
		
		printf("\n");
		fprintf(fp,"\n");
		fclose(fp);
	}
}
コード例 #10
0
ファイル: Limitless.cpp プロジェクト: steplebr/domoticz
bool CLimitLess::SendV6Command(const uint8_t *pCmd)
{
	if (m_BridgeID_1 == 0)
	{
		//No Bridge ID received yet, try getting it
		if (!GetV6BridgeID())
			return false;
	}
	uint8_t OutBuffer[100];
	int wPointer = 0;
	memcpy(OutBuffer + wPointer, V6_PreAmble, sizeof(V6_PreAmble)); wPointer += sizeof(V6_PreAmble);
	OutBuffer[wPointer++] = m_BridgeID_1;
	OutBuffer[wPointer++] = m_BridgeID_2;
	OutBuffer[wPointer++] = 0x00;
	OutBuffer[wPointer++] = (uint8_t)(m_CommandCntr++);
	OutBuffer[wPointer++] = 0x00;

	int wPointerCmd = wPointer;
	memcpy(OutBuffer + wPointer, pCmd, 10); wPointer += 10;

	OutBuffer[wPointer++] = 0x00;

	//Calculate checksum
	uint8_t crc = 0;
	for (int ii = 0; ii < wPointer- wPointerCmd; ii++)
		crc = (crc + OutBuffer[wPointerCmd+ii]) & 0xFF;
	OutBuffer[wPointer++] = crc;

	sendto(m_RemoteSocket, (const char*)&OutBuffer, wPointer, 0, (struct sockaddr*)&m_stRemoteDestAddr, sizeof(sockaddr_in));
//	return true;
	int totRetries = 0;
	while (totRetries < v6_repeats)
	{
		if (!IsDataAvailable(m_RemoteSocket))
		{
			sendto(m_RemoteSocket, (const char*)&OutBuffer, wPointer, 0, (struct sockaddr*)&m_stRemoteDestAddr, sizeof(sockaddr_in));
			totRetries++;
			continue;
		}
		sockaddr_in si_other;
		socklen_t slen = sizeof(sockaddr_in);
		int trecv = recvfrom(m_RemoteSocket, (char*)&OutBuffer, sizeof(OutBuffer), 0, (struct sockaddr*)&si_other, &slen);
		if (trecv < 1)
			return false;
		if (OutBuffer[0x07] != 0x00)
		{
			//Maybe the Bridge was turned off, try getting the ID again
			if (GetV6BridgeID())
			{
				sendto(m_RemoteSocket, (const char*)&OutBuffer, wPointer, 0, (struct sockaddr*)&m_stRemoteDestAddr, sizeof(sockaddr_in));
				return (IsDataAvailable(m_RemoteSocket));
			}
			else
			{
				_log.Log(LOG_ERROR, "AppLamp: Invalid command send to Bridge!...");
			}
			return false;
		}
		return true;
	}
	_log.Log(LOG_ERROR, "AppLamp: Error sending command to Bridge!...");
	return false;
}