⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs080228.c

📁 通过车载终端采集GPS数据
💻 C
📖 第 1 页 / 共 2 页
字号:
                    returnId = 0;
                    //如果此时正在发送数据该怎么处理?//cj add at 2008 2 20
                    if (gprsInfo.state == STATE_WAIT_PROMPT)
                    {
                        
                        gprsInfo.state = STATE_SEND_UDP_PACKET;
                    }
                    else if (gprsInfo.state ==  STATE_WAIT_UDP_OK)
                    {
                        gprsInfo.state = STATE_IDLE;
                    }
                        
                    break;
                }
                else if (returnId == AT_RET_RING)//( (returnId == AT_RET_RING) && (gprsInfo.state>=STATE_IDLE) )//
                {
                    gprsInfo.indication = 1;
                    strcpy(gprsInfo.inCallNumber, "000");
                    gprsInfo.state = STATE_VOICE_RING;
                    set_ringtimeout();
                }

                //cj add,主要是为了获取SIM卡号
                if (returnId == AT_RET_CCID)
                {
                    setSimCard(ptrChar, SIM_CARD_LEN);
                }
                //end of add
                *ptrChar = 0;
                switch( gprsInfo.state )
                {
                    /**cj add for setting volume***/
                    case STATE_RECIEVE_SET_VOLUME:
                        gprsInfo.state = STATE_SEND_CCID;
                        break;
                    /****end of add******/
                    case STATE_RECEIVE_PREINIT:
                        if( (returnId==AT_RET_OK) || (returnId==AT_RET_AT) )
                            gprsInfo.state = STATE_SEND_INIT;
                        break;

                    case STATE_RECEIVE_INIT:
                        if( returnId == AT_RET_OK )
                            gprsInfo.state = STATE_SEND_SET_VOLUME;//cj mod for setting volume:STATE_SEND_CCID;
                        else
                            gprsInfo.state = STATE_SEND_INIT;

                        break;

                    case STATE_RECEIVE_CCID:
                        if( returnId == AT_RET_CCID )
                            gprsInfo.state = STATE_SEND_APN;
                        else
                            gprsInfo.state = STATE_SEND_CCID;

                        break;

                    case STATE_RECEIVE_APN:
                        if( returnId == AT_RET_OK )
                            gprsInfo.state = STATE_SEND_ACTIVE;

                        break;

                    case STATE_RECEIVE_ACTIVE:
                        if( returnId == AT_RET_OK )
                            gprsInfo.state = STATE_SEND_GET_IP;

                        break;

                    case STATE_RECEIVE_PACKET_INIT:
                        if( (returnId==AT_RET_OK) || (returnId==AT_RET_AT) )//cj mod at 2008 2 21 old if( returnId == AT_RET_OK )
                            gprsInfo.state = STATE_SEND_POWER;

                        break;

                    case STATE_RECEIVE_POWER:
                        if(( returnId == AT_RET_CSQ ) || (returnId == AT_RET_ATCSQ))
                        {
                            unsigned char csqCount;
                            char *csqPtr;

                            gprsInfo.state = STATE_SEND_UDP_LENGTH;

                            csqCount = 0;
                            if (returnId == AT_RET_CSQ)
                                csqPtr = ptrChar;
                            else
                                csqPtr = ptrChar+10;
                            while(*csqPtr!=0x0D)
                            {
                                csqCount++;
                                csqPtr++;
                            }
                            csqCount -= 5;
                            csqCount &= 0xF;
                            csqPtr = ptrChar + 5;
                            memcpy(gprsInfo.power, csqPtr, csqCount);
                            *(csqPtr+csqCount) = 0;
                            
                        }

                        break;

                    case STATE_RECEIVE_CONNECT:
                        if( returnId == AT_RET_CONNECT_OK )
                            gprsInfo.state = STATE_IDLE;
                        else if( returnId == AT_RET_OK )
                        {
                            //gprsInfo.txTimer = 80;
                            ptrChar += strlen(at_ret[i].str);
                        }

                        break;

                    case STATE_WAIT_PROMPT:
                        if( returnId == AT_RET_PROMPT )
                            gprsInfo.state = STATE_SEND_UDP_PACKET;
                        else
                            gprs_reset(2);//gprsInfo.state = STATE_SEND_PACKET_INIT;
                        break;

                    case STATE_WAIT_UDP_OK:
                        if( returnId == AT_RET_SEND_OK )
                            gprsInfo.state = STATE_IDLE;

                        break;

                    case STATE_VOICE_OUT:
                        if( returnId==AT_RET_COLP )
                            gprsInfo.indication = 3;

                    case STATE_VOICE_IN:
                        if( (returnId==AT_RET_NO_CARRIER) || (returnId==AT_RET_BUSY) )
                        {
                            gprsInfo.state = STATE_IDLE;
                            gprsInfo.indication = 2;
                        }    
                        break;

                    case STATE_VOICE_RING:
                        if(returnId==AT_RET_NO_CARRIER )
                            gprsInfo.state = STATE_IDLE;

                        break;
                } /*end switch*/
            } /*end if*/
        } /*end for*/
    }while( *ptrChar&&(returnId!=0) );

    

}

void gprs_receive_process(void)
{

    unsigned int tmp;

    if( ipInfo.rxState )
        return;

    tmp = at_serial_receive(&gprsInfo.rxPtr);
    if( tmp )
    {
        gprsInfo.rxBytes += tmp;
    }
    else
    {
        if( gprsInfo.rxBytes )
        {/*收到数据*/
            /*xhb_debug 0*/
   //         if (STATE_RECEIVE_PACKET_INIT == gprsInfo.state)
                debugDump(0, gprsRcvBuffer, gprsInfo.rxBytes);

            gprsRcvBuffer[gprsInfo.rxBytes] = 0;
            explain_at_return();

            gprsInfo.rxBytes = 0;
            gprsInfo.rxPtr = gprsRcvBuffer;

        }
    }

}

void gprs_auto_reset(void)
{
    static unsigned char count=0;

    /*要1分钟内必须收到数据包,否则模块断电*/
    count ++;
    if( gprsInfo.state >= STATE_VOICE_RING )
    {
        ipInfo.rxTimer = 0;
    }
    else if( count >= 20 )
    {
        count = 0;
        ipInfo.rxTimer ++;

        if( (gprsInfo.state<STATE_IDLE) && (ipInfo.rxTimer>=60*1))
        {
            gprs_reset(3);
        }
        else if(ipInfo.rxTimer >= 60*2 )
        {
            gprs_reset(4);
        }
    }

}

/*每50ms调用一次*/
void gprs_process(void)
{
    static unsigned int data lastRxCount=0;

/*add for debug*/
//    gprs_debug();
/*end of add*/
    gprs_transmit_process();
    gprs_receive_process();

    if( gprsInfo.indication )
    {
        voice_indication(gprsInfo.indication, gprsInfo.inCallNumber);
        gprsInfo.indication = 0;
        gprsInfo.inCallNumber[0] = 0;
    }

    if( gprsInfo.txTimer )
    {
        gprsInfo.txTimer --;
        
        if( (!gprsInfo.txTimer) && (gprsInfo.state<STATE_VOICE_RING) )
      //  if( (!gprsInfo.txTimer) && (gprsInfo.state<=STATE_VOICE_RING) )
        {
            switch( gprsInfo.state )
            {
                case STATE_RECEIVE_PREINIT:
                    gprsInfo.state = STATE_SEND_PREINIT;
                    break;

                case STATE_RECEIVE_INIT:
                    gprsInfo.state = STATE_SEND_INIT;
                    break;

                case STATE_IDLE:
                    break;
                case STATE_RECEIVE_PACKET_INIT:
                    gprsInfo.errorCount ++;
                    if( gprsInfo.errorCount >= 20 )
                        gprs_reset(5);
                    else
                        gprsInfo.state = STATE_SEND_PACKET_INIT;
                    break;

                case STATE_WAIT_UDP_OK:
                    gprsInfo.state = STATE_IDLE;
                    sprintf(debug_msg, "111:here\r\n");
                    sioc_send(debug_msg, strlen(debug_msg));

                    break;
                case STATE_WAIT_PROMPT:
                    gprsInfo.state = STATE_SEND_UDP_PACKET;
                   sprintf(debug_msg, "222:here\r\n");
                    sioc_send(debug_msg, strlen(debug_msg));
                    break;
                default:
                    gprsInfo.state = STATE_SEND_PACKET_INIT;
                    break;

                    //gprs_reset();
                    break;
            }
        }
    }

    gprs_auto_reset();

    if( lastRxCount != ipInfo.rxCount )
    {
        ipInfo.ipLinkTimer = 0;

        ipInfo.state = 1;
        lastRxCount = ipInfo.rxCount;
    }
    else 
    {
        ipInfo.ipLinkTimer ++;

        if( (ipInfo.ipLinkTimer>20*60) || (lastRxCount==0) )
            ipInfo.state = 0;
        else
            ipInfo.state = 1;
    }

}



/***********************************************
*
************************************************/

static unsigned long data transIndex=300;

char udp_send2(char *ptr, unsigned char len)
{
    return 0;
}

char udp_send(char *ptr, unsigned int len)
{

    unsigned char *tmpPtr;
    unsigned int i;
    unsigned int checkSum;

    if( gprsInfo.state != STATE_IDLE)
        return -1;


    gprsInfo.state = STATE_SEND_PACKET_INIT;    

    ipInfo.txTimer = 40;
    ipInfo.txLength = len + 12 + 0;  /*多发送一个字节*/
    ptr[len+12] = 0;

    tmpPtr = ptr + 12;
    checkSum = 0;   

    for(i=0; i<len; i++)
    {
        checkSum += *tmpPtr;
        tmpPtr ++;
    }
    
    tmpPtr = ptr + 8;
    *tmpPtr++ = checkSum;
    *tmpPtr++ = checkSum / 256;
    *tmpPtr++ = LSB(len);
    *tmpPtr++ = MSB(len); 
    
    memcpy(ipInfo.txBuffer, ptr, ipInfo.txLength);

    return(0);

}

/***********************************************
*
************************************************/
unsigned char udp_receive(char **ptr)
{

    if( ipInfo.rxState )
    {
        *ptr = ipInfo.rxBuffer;

        return(ipInfo.rxLength);
    }

    return(0);
}

void udp_start_receive(void)
{

    ipInfo.rxState = 0;

}

                 
unsigned char udpOnline[]={0x4E, 0x4A, 0x50, 0x54, 0x02, 0, 0x07, 0x20, 0, 0x0, 0, 0x0E,\
                 0, 0, 0, 0,\
                 0x31, 0x32, 0x33, \
                 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31,\
                 };

void test_online(void)
{

    udpOnline[15] ++;
    udp_send2(udpOnline, sizeof(udpOnline)-12);

}

void udp_test(void)
{
/*    static unsigned char count;

    count ++;
    if( count == 10 )
    {
        test_online();
    }
    else if( count >= 20 )
    {
        count = 0;
        udp_send2(udpDebug, sizeof(udpDebug)-12);
    }*/


}

/*陈剑修改,07年3月16日*/
/*************************
**返回值:0 表示无法连通
**        1 表示与中心连接
**        2 表示正在语音通话
**************************/
unsigned char get_gprs_state(void)
{
    if( gprsInfo.state >= STATE_VOICE_RING )
        return PPP_VOICE;
    else if( ipInfo.state )
        return PPP_CONECTTOCENTER;
    else 
        return PPP_CONECTTING;
}


/**********************************************************/
char voice_call(char *number)
{
    strcpy(gprsInfo.outCallNumber, number);
    
    return 0;
}

void voice_hold_on(void)
{
    if( gprsInfo.state >= STATE_VOICE_RING )
        gprsInfo.state = STATE_HOLD_ON;
}

void voice_hold_off(void)
{
    if( gprsInfo.state >= STATE_VOICE_RING )
        gprsInfo.state = STATE_HOLD_OFF;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -