Value* DownloadModemFn(const char* name, State* state, int argc, Expr* argv[]) { char* modemImg; int result = -1; if (argc != 1) return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); if (ReadArgs(state, argv, 1, &modemImg) != 0) { return NULL; } printf("DownloadModemFn: %s\n", modemImg); result = DownloadFiles(modemImg); if (result < 0) { printf("Download failed!\n"); } else { printf("Download success!\n"); ResetModem(); sleep(6); } return StringValue(strdup(result >= 0 ? "t" : "")); }
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; }