static void *eng_pcclient_hdlr(void *_param)
{
	char databuf[ENG_BUFFER_SIZE];
	int fd, ret;
	int status;
	
	ENG_LOG("%s: Run",__FUNCTION__);
	for( ; ; ){
		memset(databuf, 0, ENG_BUFFER_SIZE);

		//read cmd from pc to client
		if(eng_pc2client(pc_client_fd, databuf)==-1) {
			restart_gser();
			continue;
		}

		//write cmd from client to modem
		status = eng_atreq(client_server_fd, databuf, ENG_BUFFER_SIZE);
 
		//write response from client to pc
		switch(status) {
			case ENG_CMD4LINUX:
				eng_linux2pc(pc_client_fd, databuf);
				break;
			case ENG_CMD4MODEM:
				eng_modem2pc(client_server_fd, pc_client_fd, databuf, ENG_BUFFER_SIZE);
				break;
		}
	}

	return NULL;
}
static int eng_linux2pc(int pc_client_fd, char *databuf)
{
	int len;

	ENG_LOG("%s: eng response = %s\n", __FUNCTION__, databuf);
	len = write(pc_client_fd, databuf, strlen(databuf));
	if (len <= 0) {
		restart_gser();
	}

	return 0;
}
Exemplo n.º 3
0
int eng_diag_write2pc(char* diag_data, int r_cnt, int ser_fd)
{
    int offset = 0; //reset the offset
    int w_cnt = 0;
    int split_flag = 0;
    int retry_num = 0;
    int i = 0;

    if((r_cnt%64==0) && s_dev_info->host_int.cali_flag && (s_dev_info->host_int.dev_type == CONNECT_USB))
	split_flag = 1;
    do {
	if(split_flag)
	    w_cnt = write(ser_fd, diag_data + offset, r_cnt-32);
	else
	    w_cnt = write(ser_fd, diag_data + offset, r_cnt);
	if (w_cnt < 0) {
	    if(errno == EBUSY)
		usleep(59000);
	    else {
		ENG_LOG("eng_vdiag_r no log data write:%d ,%s\n", w_cnt, strerror(errno));

		// FIX ME: retry to open
		retry_num = 0; //reset the try number.
		while (-1 == restart_gser(&ser_fd, s_dev_info->host_int.dev_diag)) {
		    ENG_LOG("eng_vdiag_r open gser port failed\n");
		    sleep(1);
		    retry_num ++;
		    if(retry_num > MAX_OPEN_TIMES) {
			ENG_LOG("eng_vdiag_r: vlog thread stop for gser error !\n");
			return 0;
		    }
		}
		s_ser_diag_fd = ser_fd;
	    }
	 } else {
	    r_cnt -= w_cnt;
	    offset += w_cnt;
	    split_flag = 0;
	    //ENG_LOG("eng_vdiag: r_cnt: %d, w_cnt: %d, offset: %d\n", r_cnt, w_cnt, offset);
	}
    } while(r_cnt > 0);

     return offset;
}
Exemplo n.º 4
0
void report_nmea_log(const char* nmea, int length)
{
	int r_cnt = 0, w_cnt = 0, offset = 0;
	int retry_num = 0;
	int restart_num = 0;
	char tmpbuf[GPS_DATA_BUF_SIZE/2] = {0};
	int ser_fd;
	int flags;
	MSG_HEAD_T* msg_head = (MSG_HEAD_T*)tmpbuf;
	msg_head->type = 0x3A;
	msg_head->subtype = 0x5;
	//ENG_LOG("%s: gps log thread start \n", __FUNCTION__);

	r_cnt = length;
	ser_fd = get_ser_diag_fd();

	if(r_cnt > 0)
	{
		memcpy(tmpbuf + sizeof(MSG_HEAD_T),nmea,r_cnt);
		msg_head->len = r_cnt + sizeof(MSG_HEAD_T);
		r_cnt = translate_packet(gps_log_data, tmpbuf, msg_head->len);

		offset = 0;
		w_cnt = 0;
		do
		{
			flags = fcntl(ser_fd, F_GETFL);
			fcntl(ser_fd, F_SETFL, flags | O_NONBLOCK);
			w_cnt = write(ser_fd, gps_log_data + offset, r_cnt);
			fcntl(ser_fd, F_SETFL, flags);
			if(w_cnt < 0)
			{
				ENG_LOG("report_nmea_log: errno(%d)(%s) \n", errno, strerror(errno));
				if(errno == EBUSY)
				{
					usleep(59000);
				}
				else if(errno == 11)
				{
					ENG_LOG("%s: gps log thread end for error(11).\n", __FUNCTION__);
					return;
				}
				else
				{
					restart_num = 0;
					retry_num ++;
					if(retry_num > 2)
					{
						retry_num = 0;
						ENG_LOG("%s: gps log thread end for error(retry 2 times).\n", __FUNCTION__);
						return;
					}
					//ENG_LOG("report_nmea_log, s_dev_info->host_int.dev_diag=%s\n",s_dev_info->host_int.dev_diag);
					while(-1 == restart_gser(&ser_fd, s_dev_info->host_int.dev_diag))
					{
						//sleep(1);
						restart_num ++;
						if(restart_num > 1)
						{
							ENG_LOG("%s: gps log thread end for restart(2 times) error.\n", __FUNCTION__);
							return;
						}
					}
				}
			}
			else
			{
				retry_num = 0;
				r_cnt -= w_cnt;
				offset += w_cnt;
			}
		}while(r_cnt > 0);
	}
	//ENG_LOG("%s: gps log thread end \n", __FUNCTION__);
}
Exemplo n.º 5
0
void *eng_vlog_thread(void *x)
{
    int ser_fd, modem_fd;
    int r_cnt, w_cnt, offset;
    int retry_num = 0;
    int dumpmemlen = 0;
    eng_dev_info_t* dev_info = (eng_dev_info_t*)x;

    ENG_LOG("eng_vlog thread start\n");

    /*open usb/uart*/
    ENG_LOG("eng_vlog open serial...\n");
    ser_fd = eng_open_dev(dev_info->host_int.dev_log, O_WRONLY);
    if(ser_fd < 0) {
        ENG_LOG("eng_vlog open serial failed, error: %s\n", strerror(errno));
        return NULL;
    }

    /*open vbpipe/spipe*/
    ENG_LOG("eng_vlog open SIPC channel...\n");
    do{
        modem_fd = open(dev_info->modem_int.log_chan, O_RDONLY);
        if(modem_fd < 0) {
            ENG_LOG("eng_vlog cannot open %s, error: %s\n", dev_info->modem_int.log_chan, strerror(errno));
            sleep(5);
        }

        if((++retry_num) > MAX_OPEN_TIMES) {
            ENG_LOG("eng_vlog SIPC open times exceed the max times, vlog thread stopped.\n");
            goto out;
        }
    }while(modem_fd < 0);

    ENG_LOG("eng_vlog put log data from SIPC to serial\n");
    while(1) {
        int split_flag = 0;

        if(g_armlog_enable) {
            sem_post(&g_armlog_sem);
        }
        sem_wait(&g_armlog_sem);

        memset(log_data, 0, sizeof(log_data));
        r_cnt = read(modem_fd, log_data, DATA_BUF_SIZE);
        if (r_cnt <= 0) {
            ENG_LOG("eng_vlog read no log data : r_cnt=%d, %s\n",  r_cnt, strerror(errno));
            continue;
        }

        // printf dump memory len
        dump_mem_len_print(r_cnt, &dumpmemlen);

        offset = 0; //reset the offset

        if((r_cnt%64==0) && dev_info->host_int.cali_flag && (dev_info->host_int.dev_type == CONNECT_USB))
            split_flag = 1;
        do {
            if(split_flag)
                w_cnt = write(ser_fd, log_data + offset, r_cnt-32);
            else
                w_cnt = write(ser_fd, log_data + offset, r_cnt);
            if (w_cnt < 0) {
                if(errno == EBUSY)
                    usleep(59000);
                else {
                    ENG_LOG("eng_vlog no log data write:%d ,%s\n", w_cnt, strerror(errno));

                    // FIX ME: retry to open
                    retry_num = 0; //reset the try number.
                    while (-1 == restart_gser(&ser_fd, dev_info->host_int.dev_log)) {
                        ENG_LOG("eng_vlog open gser port failed\n");
                        sleep(1);
                        retry_num ++;
                        if(retry_num > MAX_OPEN_TIMES) {
                            ENG_LOG("eng_vlog: vlog thread stop for gser error !\n");
                            sem_post(&g_armlog_sem);
                            return 0;
                        }
                    }
                }
            } else {
                r_cnt -= w_cnt;
                offset += w_cnt;
                split_flag = 0;
                //ENG_LOG("eng_vlog: r_cnt: %d, w_cnt: %d, offset: %d\n", r_cnt, w_cnt, offset);
            }
        } while(r_cnt > 0);
    }

out:
    ENG_LOG("eng_vlog thread end\n");
    if (modem_fd >= 0)
        close(modem_fd);
    close(ser_fd);

    return 0;
}