示例#1
0
文件: cli.c 项目: idaohang/gpsr-1
static void quit(const char *line)
{
	gp_close( port );
	if ( write_history(historyfile) )
		perror( "writing history" );
	exit(EXIT_SUCCESS);
}
示例#2
0
文件: gp_layer.c 项目: eusafe/libgate
// send message to port
int gp_resend () {
	int nwritten;
//	int i=0;

 	if(gp_cfg.fd < 3) exit (100+gp_cfg.fd);
	
	if( debug >= 9 || (debug >= 8 && gp_cfg.polling == 0)  ) {
		print_buff("port  sending: ", send_mess.buf, send_mess.len);
/*		fprintf(stderr, "port  sending: "); 
		for(i=0;i<send_mess.len;i++) {
			fprintf(stderr, "0x%02x, ", send_mess.buf[i]);
		}
	 	fprintf(stderr, "writing  %d bytes into port\n", send_mess.len);*/
 	}
 		
 	if ( event_add(&gp_cfg.evport, &gp_cfg.timeout) < 0) syslog(LOG_ERR, "event_add.send_mess.ev_timeout setup: %m");
	nwritten = write(gp_cfg.fd, send_mess.buf, send_mess.len);
	
// 	struct timeval tv;
//  	gettimeofday(&tv,NULL); 
// 	if( debug >= 5 || (debug >= 4 && gp_cfg.polling == 0)  ) {
//  		fprintf(stderr, "wrote  %d bytes into port, time: %u.%06u, is pend %d\n", nwritten, tv.tv_sec,tv.tv_usec, 
//  			event_pending(&gp_cfg.evport,EV_READ|EV_TIMEOUT, &gp_cfg.timeout));
//  	}

	if (nwritten == 0) {
		if (errno == EPIPE) {
			syslog(LOG_ERR, "recipient closed connection");
			gp_close();
			// daemon_exit(1); // never exit on error!
		}
	} else if (nwritten < 0) {
		syslog(LOG_CRIT, "write (%d): %m", errno);
		gp_close();
		// daemon_exit(1); // never exit on error!
	}
//	if ( event_add(&gp_cfg.evport, NULL) < 0) syslog(LOG_ERR, "evport,event_add setup: %m");
	return nwritten;
}
示例#3
0
文件: gp_layer.c 项目: eusafe/libgate
int gp_send_idle() {
	static int gp_dst=0;
	int activ=0;
	
	do {
		gp_dst++;
		if( gp_dst > gp_cfg.max_dev_n ) { gp_dst=0; return 0; }
//	fprintf(stderr, "Check gp_send_idle for %d (%d)\n",gp_dst,devices[gp_dst].timeout_count );
		if(devices[gp_dst].timeout_count > gp_cfg.max_timeout_count) {
			if( devices[gp_dst].activ > 0)
//			if ( gp_dst == 5  ) 
				{
				fprintf(stderr, "Disabled dev %d (%d)\n", gp_dst, devices[gp_dst].timeout_count);
				syslog(LOG_ERR, "Disabled dev %d (%d)\n", gp_dst, devices[gp_dst].timeout_count);
				}
			devices[gp_dst].activ=activ=0;
			continue;
		}
		activ=1;
	} while( activ == 0 );
//	if ( gp_dst == 5  ) 
//	fprintf(stderr, "Run gp_send_idle for %d (%d)\n",gp_dst,devices[gp_dst].timeout_count );
	
/*	cmd_send_t z = {
		.cmd_n = 0x06,
		.set_timeout = 50,
		.polling = 1,
		.data_len = 0
	};*/
	
//return 0;
//	return ad_get_cid(AD_Q_SHORT, gp_dst, &cb_get_poll_result);
	cmd_send_t z = {
		.queue = AD_Q_SHORT,
		.ev_handler = &cb_get_poll_result,
		.target_n = AD_TARGET_GET_CID,
		.cmd_n = 0x04,
		.set_timeout = 150,
		.polling = 1,
		.data_len = 5,
		.cmd_buff = { 0x00, 0xD0, 6, 0x00, 0x0C }
	};
	
	z.dst=gp_dst;
	return gp_send(&z);
}


#pragma pack(push,1)
#pragma pack(pop)

//void gp_receiv(uint8_t* in, int nread) {
// short event=4;
int mydev=-1;

int err=0;
void gp_receiv(int fd, short event, void *arg) {
	int nread=0;
//	int last=0;
	struct timeval tv;
 	
 	gettimeofday(&tv,NULL);
 	uint32_t current_time=tv2ms(tv);
 	uint32_t expect_time=tv2ms(gp_cfg.timeout);
 	uint32_t delta = current_time -  send_mess.sent_time;
 	uint32_t delta2 = current_time -  receiv_mess.last_read;
/*	if (send_mess.dev == 1 ) 
	fprintf(stderr, "Got  event (%d): 0x%X, %u.%06u (%u ms), sent time %u ms, current timeout: %u ms, delta: %u ms (%u ms)\n",
		send_mess.dev,
		event,
		tv.tv_sec,tv.tv_usec,
		current_time,
		send_mess.sent_time,
		expect_time,
		delta, delta2
		);*/
//	char buf[PORT_READ_BUF_LENGTH];
	

//	memset(buf, 0, sizeof(buf));
				
//	if ( event_del(&send_mess.ev_timeout) < 0) syslog(LOG_ERR, "event_del (send_mess.ev_timeout): %m");
//	event_set(&evsocket, sockfd, EV_READ|EV_PERSIST, socket_read, (void*)&evsocket);
//	if ( event_del(&gp_cfg.evport) < 0) syslog(LOG_ERR, "event_del (send_mess.ev_timeout): %m");

/*	if( (event & EV_WRITE) != 0 ) {
//		gp_put_cmd();
		return;
	}*/
/*	evutil_timerclear(&gp_cfg.timeout);
	gp_cfg.timeout.tv_usec = gp_cfg.gp_timeout * 1000;
 	if ( event_add(&gp_cfg.evport, &gp_cfg.timeout) < 0) syslog(LOG_ERR, "event_add.send_mess.ev_timeout setup: %m");*/
	
	if( (event & EV_READ) == 0 ) {
		gp_reconnect(0);
// HACK - we check real timeout, not timer
//		if( current_time >= expect_time ) {	 	
//				} else if(gp_cfg.timeout.tv_sec > 0) {
/*		if ( send_mess.dev == 5 ) 
		fprintf(stderr, "dev=%d,  delta by sent = %d, delta by read = %d, count = %d\n",
			send_mess.dev,delta, delta2, devices[send_mess.dev].timeout_count );*/
	 	if( delta >=  gp_cfg.gp_timeout) {
			if( send_mess.is_expected > 0 ) {
				send_mess.is_expected=0;
				devices[send_mess.dev].timeout_count++;
//				if ( send_mess.dev == 1 ) fprintf(stderr, "inc %d dev=%d\n", devices[send_mess.dev].timeout_count, send_mess.dev);
				if( gp_cfg.polling == 0 ) {
//				if( send_mess.dev == 1 ) {
//					send_mess.target=0;
					uint32_t delta3=current_time - devices[send_mess.dev].last_read;
					fprintf(stderr, "Timeout (%d) for read for %d (cmd=%d, delta=%u)\n", devices[send_mess.dev].timeout_count,
						send_mess.dev, send_mess.target, delta3);
					syslog(LOG_ERR, "Timeout (%d) for read for %d (cmd=%d, delta=%u)",   devices[send_mess.dev].timeout_count,
						send_mess.dev, send_mess.target, delta3);
				}
			}
		}	 	
//		if( current_time >= expect_time + gp_cfg.gp_timeout) {
//	 	if( current_time - receiv_mess.last_read >  gp_cfg.gp_timeout) {
	 	if( delta >=  gp_cfg.gp_timeout) {
// /*	 		if ( send_mess.dev == 5 ) 
// 				fprintf(stderr, "Runed gp_put_cmd!\n");*/
			if( gp_put_cmd() > 0 ||  gp_send_idle() > 0) return;
	 	}
		evutil_timerclear(&gp_cfg.timeout);
		gp_cfg.timeout.tv_usec = gp_cfg.gp_timeout * 1000;
		if ( event_add(&gp_cfg.evport, &gp_cfg.timeout) < 0) syslog(LOG_ERR, "event_add.send_mess.ev_timeout setup: %m");
		return;
	}

// HACK Read (EV_READ)
	evutil_timerclear(&gp_cfg.timeout);
	gp_cfg.timeout.tv_usec = gp_cfg.gp_timeout * 1000;
 	if ( event_add(&gp_cfg.evport, &gp_cfg.timeout) < 0) syslog(LOG_ERR, "event_add.send_mess.ev_timeout setup: %m");

// 	fprintf(stderr, "Set last read %lu \n",current_time);
	devices[send_mess.dev].last_read=receiv_mess.last_read=current_time;
//	gp_cfg.last_dev=send_mess.dev;
	send_mess.is_expected=0;
// TODO after check crc
	if( gp_cfg.polling == 1 && devices[send_mess.dev].activ==0) {
		syslog(LOG_ERR,"Found dev: '%d'\n",send_mess.dev);
	}
	devices[send_mess.dev].activ=1; 
	devices[send_mess.dev].timeout_count=0;
	if (devices[send_mess.dev].is_inited == 0) {
		gp_dev_init(send_mess.dev);
	}
// HACK	
//	mydev=send_mess.dst;
// First chunk of data. 
	if( receiv_buf_p == 0 ) {
		receiv_buf_p = receiv_mess.buf;
		receiv_mess.len=0;
	}
	nread = read(fd, receiv_buf_p, GP_PORT_READ_BUF_LENGTH - 1 - receiv_mess.len);
	
	
//	if( debug >= 5 || (debug >= 4 && gp_cfg.polling == 0) ||  receiv_mess.src != 7) {
	if( debug >= 9 || (debug >= 8 && gp_cfg.polling == 0) ) {
		print_buff("port received: ", receiv_buf_p, nread);
	}
// 	dprint(DL5, "read %d bytes, ev=%x\n", nread, event);
	
	if (nread < 0) { /* EOF */
		syslog(LOG_CRIT, "read: %m");
		gp_close();
		// daemon_exit(1); // never exit on error!
	} else if (nread == 0) {
	 	zprintf(1, "port unexpectedly closed\n");
	 	ad_soft_reset(AD_Q_SHORT,send_mess.dev);
		gp_close();
//		gp_reconnect(0);
//		if(err++  > 10 ) exit(102);
		return;
	} else if (nread > 0) {
		// right trim buffer
		receiv_buf_p[nread] = '\0';
		if( receiv_mess.fl_begin !=  GP_INIT) {
			syslog(LOG_ERR, "Begin flag not found");
			gp_reconnect(0);
//			gp_close();
			return;
		}		
		uint8_t* p=memchr(receiv_buf_p, GP_END,nread);
		if ( p != 0 ) {
			receiv_buf_p=0;
//			*p='\0'; 
			int l = p - &receiv_mess.id_ctrl; // buff. length  for crc		
//	fprintf(stderr, "l = %d bytes\n", l);
//			l = memcpy_unesc(receiv_mess.cmd_buff,receiv_mess.cmd_buff,l);
			l = memcpy_unesc(&receiv_mess.id_ctrl,&receiv_mess.id_ctrl,l);
	
//	fprintf(stderr, "l = %d bytes\n", l);
			if ( crc8_xor(&receiv_mess.id_ctrl,l) > 0 ) {
				int crc=crc8_xor(&receiv_mess.id_ctrl,l-1);
				fprintf(stderr, "crc8 error for %d (cmd=%d, crc=x0%02x) \n", send_mess.dev, send_mess.target, crc);
				syslog(LOG_ERR, "crc8 error for %d (cmd=%d, crc=x0%02x) \n", send_mess.dev, send_mess.target, crc);
				if( debug < 9 ) 
					print_buff("port received (crc error): ", receiv_mess.buf, nread+receiv_mess.len);
//				exit(222);
				return;
			}
// Check error!!!
			if( send_mess.dev !=  receiv_mess.src ) {
				zprintf(2, "device error: got %d, expect %d\n", receiv_mess.src, send_mess.dev);
//				exit(222);				
				return;
			} else {
				receiv_mess.dev=receiv_mess.src;
			}
			if( receiv_mess.cmd_n == GP_REPLY ) {
//				syslog(LOG_ERR, "Got ask(0x%02X) for %d (cmd=%d)\n",receiv_mess.replay, send_mess.dev, send_mess.target);
				if( receiv_mess.replay == GP_REPLY_ACK ) {
					receiv_mess.cmd_n=receiv_mess.was_cmd_n;
//					fprintf(stderr, "Got ACK for (0x%02X) \n", receiv_mess.was_cmd_n);
					process_port_input(PROC_REPLY_ACK);
				} else if ( receiv_mess.replay == GP_REPLY_NACK ) {
					receiv_mess.cmd_n=receiv_mess.was_cmd_n;
					zprintf(2, "Got NACK for (0x%02X) \n", receiv_mess.was_cmd_n);
//					process_port_input(PROC_REPLY_NACK);
				} else {
					receiv_mess.cmd_n=receiv_mess.bad_cmd_n;
					zprintf(2, "Got  EEPROM/RTC error (%d)\n",receiv_mess.replay );
//					process_port_input(PROC_REPLY_EEPROM_ERR);
				}				
			} else {
				receiv_mess.len=l-(3+1);
				if( process_port_input(PROC_REPLY_ACK) > 0 ) return;
			}
		} else {
			receiv_mess.len +=nread;
			receiv_buf_p+=nread;
			return;
		}
//			dprint(DL2, "port recvd: '%.*s'\n", nread, buf);
/*			if(debug >= DL2) {
				char buf2[PORT_READ_BUF_LENGTH];
				char* p=strncpy(buf2,buf,PORT_READ_BUF_LENGTH);
				while( (p=strchr(p,'\r')) > 0 ) *p='$';
				p=buf2;
				while( (p=strchr(buf2,'\n')) >0 ) *p='&';
				dprint(DL2, "port recvd: '%s'\n", buf2);
			}*/
	}
//	fprintf(stderr, "Sending new cmd\n");
	gp_put_cmd();
// 	if ( gp_put_cmd() == 0 && event_add(&gp_cfg.evport, &gp_cfg.timeout) < 0) 
// 		syslog(LOG_ERR, "event_add.send_mess.ev_timeout setup: %m");

// exit(0);	f
// fprintf(stderr, "gp_receiv ok \n");
}