Esempio n. 1
0
static DWORD WINAPI LowBatThread(LPVOID pParam)
{
	BOOL bLBI,bVLBI;

	do
	{
		GetBatteryState(&bLBI,&bVLBI);		// get battery state

		// very low bat detection
		bVLBI = bVLBI && (Chipset.IORam[LPE] & EVLBI) != 0;

		IOBit(LPD,VLBI,bVLBI);				// set VLBI
		IOBit(SRQ1,VSRQ,bVLBI);				// and service bit

		if (bVLBI)							// VLBI detected
		{
			Chipset.SoftInt = TRUE;
			bInterrupt = TRUE;

			if (Chipset.Shutdn)				// CPU shut down
			{
				Chipset.bShutdnWake = TRUE;	// wake up from SHUTDN mode
				SetEvent(hEventShutdn);		// wake up emulation thread
			}
		}
	}
	while (WaitForSingleObject(hEventBat,BAT_FREQ) == WAIT_TIMEOUT);

	return 0;
	UNREFERENCED_PARAMETER(pParam);
}
Esempio n. 2
0
int CTransfer::ConnectToHost(CMobileClient *pClient, char *pszNumber, BOOL bCDMA, int nPort)
{
	char	szBuffer[256];
	char	msg[256];
	char	*p, *p1, *p2, *p3;
	time_t	now, start;
	int		n, nRetry, nState;
	int		nTimeout, nNextState;
	int		nErrorCount = 0;
	int		nAtzError = 0;
	int		nAtsError = 0;
	BOOL	bWaitMessage;
	
	nRetry = 0;
	XDEBUG("Trying %s ...\r\n", pszNumber);

	for(n=0; n<5; n++)
		pClient->ReadFromModem(szBuffer, 255, 100);

	for(nState=STATE_INIT; (!m_bExitSignalPending) && (nState!=STATE_DONE);)
	{
		nTimeout = 3;
		nNextState = nState;

		// Send AT Command
		switch(nState) {
		  case STATE_INIT :
			   XDEBUG("\r\n");
			   XDEBUG("CIRCUIT: TRY Count = %d, BATT CHARGE STATE = %d\r\n",
					nRetry+1, GetBatteryState());
			   nErrorCount = 0;
			   nAtzError = 0;
			   nState = STATE_ATZ;

		  case STATE_EOFF :
			   nAtzError = 0;
			   if (nState == STATE_EOFF)
			   {
			   	   ResetModem();
			   	   nState = STATE_ATZ;
			   }

		  case STATE_ATZ :
			   nState = STATE_ATZ;
			   usleep(1000000);
			   XDEBUG("CIRCUIT: DTR Control.\r\n");
			   DisconnectModem();

		  case STATE_AT_RETRY :
			   usleep(1000000);
			   XDEBUG("CIRCUIT: Sending 'AT'\r\n");
			   pClient->WriteToModem(const_cast<char *>("AT\r\n"));
			   nTimeout = 3;
			   nAtsError = 0;
			   nNextState = STATE_ATS0;
			   break;

		  case STATE_ATS0 :
			   XDEBUG("CIRCUIT: Sending 'ATS0=0'\r\n");
			   pClient->WriteToModem(const_cast<char *>("ATS0=0\r\n"));
			   nTimeout = 3;
			   nNextState = bCDMA ? STATE_CRM : STATE_SCID;
			   break;

		  case STATE_CRM :
			   XDEBUG("CIRCUIT: Sending 'AT+CRM=129'\r\n");
			   pClient->WriteToModem(const_cast<char *>("AT+CRM=129\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_ATH;
			   break;

		  case STATE_SCID :
			   XDEBUG("CIRCUIT: Sending 'AT^SCID'\r\n");
			   pClient->WriteToModem(const_cast<char *>("AT^SCID\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_CPIN;
			   break;

		  case STATE_CPIN :
			   XDEBUG("CIRCUIT: Sending 'AT+CPIN?'\r\n");
			   strcpy(szCPIN, "");
			   pClient->WriteToModem(const_cast<char *>("AT+CPIN?\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_CSQ;
			   break;

		  case STATE_CSQ :
			   XDEBUG("CIRCUIT: Sending 'AT+CSQ'\r\n");
			   strcpy(szCSQ, "");
			   pClient->WriteToModem(const_cast<char *>("AT+CSQ\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_SBV;
			   break;

		  case STATE_SBV :
			   XDEBUG("CIRCUIT: Sending 'AT^SBV'\r\n");
			   strcpy(szSBV, "");
			   pClient->WriteToModem(const_cast<char *>("AT^SBV\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_ATH;
			   break;

		  case STATE_ATH :
			   XDEBUG("CIRCUIT: Sending 'ATH'\r\n");
			   pClient->WriteToModem(const_cast<char *>("ATH\r\n"));
			   nTimeout = 3;
			   nNextState = STATE_DIAL;
			   break;

		  case STATE_DIAL :
			   sprintf(szBuffer, "Sending 'ATDT %s'", pszNumber);
			   XDEBUG("CIRCUIT: %s\r\n", szBuffer);
			   sprintf(szBuffer, "ATDT %s\r\n", pszNumber);
			   pClient->WriteToModem(szBuffer);
			   nTimeout = 30;
			   nNextState = STATE_SELECT;
			   break;

		  case STATE_SELECT :
			   usleep(1000000);
			   XDEBUG("CIRCUIT: Sending 'NURI/1.0 NACS'\r\n");
			   sprintf(msg, "NURI/1.0 NACS %0d\n\n", nPort);
			   pClient->WriteToModem(msg);
			   nTimeout = 3;
			   nState = STATE_WAIT_ACCEPT;
			   break;

		  case STATE_WAIT_ACCEPT :
		  case STATE_DONE :
			   break;
		}

		time(&start);
		bWaitMessage = TRUE;

		// Receive Result
		for(;!m_bExitSignalPending && bWaitMessage;)
		{
			n = pClient->ReadLineFromModem(szBuffer, 255, 3000);
			if (n > 0)
			{
				XDEBUG("CIRCUIT: Recv '%s'\r\n", szBuffer);

				switch(nState) {
				  case STATE_ATZ :
				  case STATE_CRM :
				  case STATE_AT_RETRY :
				  	   p = strstr(szBuffer, "OK");
					   if (p != NULL)
					   {
						   nState = nNextState;
						   bWaitMessage = FALSE;
					   }
					   p = strstr(szBuffer, "ERROR");
					   if (p != NULL)
					   {
						   nAtzError++;
						   if (nAtzError >= 3)
						   {
							   nState = STATE_EOFF;
						   }
					   	   bWaitMessage = FALSE;
					   }
					   p = strstr(szBuffer, "NO CARRIER");
					   if (p != NULL)
					   {
						   nState = STATE_AT_RETRY;
					   	   bWaitMessage = FALSE;
					   }
					   break;
				  case STATE_ATS0 :
				  	   p = strstr(szBuffer, "OK");
					   if (p != NULL)
				       {
						   nState = nNextState;
					       bWaitMessage = FALSE;
				       }
					   p = strstr(szBuffer, "ERROR");
					   if (p != NULL)
					   {
						   nAtsError++;
						   if (nAtsError >= 10)
						   {
							   XDEBUG("ATS Change drop. (IGNORE)\r\n");
						   	   nState = nNextState;
						   }
						   else
						   {
							   XDEBUG("ATS Error (Retry=%d)\r\n", nAtsError);
							   usleep(1000000);
						   }
					       bWaitMessage = FALSE;
					   }
					   break;
				  case STATE_SCID :
				  case STATE_CPIN :
				  case STATE_CSQ :
		  		  case STATE_SBV :
		  		  case STATE_ATH :
				  	   p = strstr(szBuffer, "+CPIN: ");
					   if (p != NULL) strcpy(szCPIN, p+7);
				  	   p = strstr(szBuffer, "+CSQ: ");
					   if (p != NULL) strcpy(szCSQ, p+6);
				  	   p = strstr(szBuffer, "^SBV: ");
					   if (p != NULL) strcpy(szSBV, p+6);

				  	   p = strstr(szBuffer, "OK");
					   if (p != NULL)
					   {
					   	   nState = nNextState;
						   bWaitMessage = FALSE;
						   break;
					   }
					   p = strstr(szBuffer, "ERROR");
					   if (p != NULL)
					   {
						   nErrorCount++;
						   XDEBUG("CIRCUIT: \r\n");
						   if (nErrorCount > 10)
							   return -10;
						   usleep(3000000);
					       bWaitMessage = FALSE;
						   break;
					   }
					   break;
				  case STATE_DIAL :
				       p = strstr(szBuffer, "CONNECT");
				  	   p1 = strstr(szBuffer, "BUSY");
				  	   p2 = strstr(szBuffer, "ERROR");
				  	   p3 = strstr(szBuffer, "NO CARRIER");
				  	   if (p != NULL)
					   {
						   nState = STATE_SELECT;
						   bWaitMessage = FALSE;
						   break;
					   }
					   else if (p1 || p2 || p3)
					   {
						   // Retry
						   nState = STATE_INIT;
						   bWaitMessage = FALSE;

						   nRetry++;
						   if (nRetry >= 3)
							   return -1;
					   }
					   break;
				  case STATE_WAIT_ACCEPT :
				  	   p1 = strstr(szBuffer, "NO CARRIER");
					   p2 = strstr(szBuffer, "BUSY");
					   p3 = strstr(szBuffer, "ERROR");
					   if (p1 || p2 || p3)
					   {
						   nState = STATE_INIT;
						   bWaitMessage = FALSE;
						   nRetry++;
						   if (nRetry >= 3)
							   return -1;
						   break;
					   }

					   p = strstr(szBuffer, "NURI/");
					   if (p != NULL)
					   {			   
						   p2 = strchr(p, ' ');
						   if (p2 == NULL)
							   return -1;

						   n = atoi(p2);
						   XDEBUG("CIRCUIT: ACCEPT Result = %0d\r\n", n);
						   if (n != 250)
						   {
							   XDEBUG("ERROR: Accept error!!\r\n");
						       return -4;
						   }
						   return 0;
					   }
					   break;
				}
			}

			time(&now);
			if ((now-start) > nTimeout)
			{
			    nState = STATE_INIT;
			    nRetry++;
			    if (nRetry >= 3)
				{
					if (n == 0) IgtControl();
				    return -2;
				}
				break;
			}
		}
	}
	return -3;
}