예제 #1
0
void send_to_mud(const char *messg, ...)
{
  va_list args;

  if (messg == NULL)
    return;

  va_start(args, messg);
  write_to_channel(1, messg, args);
  va_end(args);
}
/*
	Send and Recive Packets over USB(HOST)
*/
portCHAR putDataToUSBChannel(struct device_data* dev,  unsigned portCHAR* buffer,  unsigned portCHAR blen ) {
	portCHAR ret = STATUS_OK;

	OBD2HW_Header *ph 	= (OBD2HW_Header *)sbi_dev[ dev->index ].putDataToUSBChannel_buffer;
	OBD2HW_Header *ph_sen = (OBD2HW_Header *)buffer;
	unsigned portCHAR tmp_buffer[ 150];
	unsigned int i, j;
	unsigned portCHAR send_len = sizeof(OBD2HW_Header)+ph_sen->length ;
	unsigned long tmp_enc=0, tmp_dec=0;

	if(  USBCHANNEL_BUFFER_SIZE-sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len>send_len) {
		memcpy(sbi_dev[ dev->index ].putDataToUSBChannel_buffer+sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len, buffer, send_len>blen?blen:send_len);
		sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len += send_len;

		if(sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len>= (portLONG)(sizeof(OBD2HW_Header)+ph->length) ) { // can full send
			tmp_buffer[0] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[0];     //  is 0
			j=1;
			for(i=1; i<sizeof(OBD2HW_Header)+ph->length; i++) {
				// encoding for usb-channel
				if( sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]==0x00 || (sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]>0x00 && sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]<ENCODING_PARAMETER) ) {
					tmp_enc++;
					tmp_buffer[j] = 0x01;
					j++;
					tmp_buffer[j] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]+ENCODING_PARAMETER;
				} else {
					tmp_buffer[j] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i];
				}
				j++;
				tmp_enc++;
				tmp_dec++;
			}
			tmp_buffer[j] = 0; j++;
			if(write_to_channel( (char*)tmp_buffer, j, dev )>0) {
				dev->stat_data.usb_send_packets++;
				dev->stat_data.usb_send_enc_bytes+=tmp_enc;
				dev->stat_data.usb_send_dec_bytes+=tmp_dec;
			}

			sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len -= sizeof(OBD2HW_Header)+ph->length;
			if(sbi_dev[ dev->index ].putDataToUSBChannel_lastpacket<0) sbi_dev[ dev->index ].putDataToUSBChannel_lastpacket = 0;

			memmove( sbi_dev[ dev->index ].putDataToUSBChannel_buffer, sbi_dev[ dev->index ].putDataToUSBChannel_buffer+sizeof(OBD2HW_Header)+ph->length, sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len );
		}
	} else {
		dev->stat_data.usb_fail_send_packets;
		ret=STATUS_ERROR_NO_DATA;
	}
	return ret;
}
예제 #3
0
int main(int argc, char const *argv[])
{

	int channel[2];
	pid_t working_process;
	// first create process to write to pipe 
	// main process will be read from it.


	if(pipe(channel)){
		printf("Pipe creation is failed : %s\n",strerror(errno));
		return 0;
	}

	working_process = fork();

	if(working_process == 0)
	{
			// write pipe with child process
			close(channel[0]); // close read status
			struct message msg;
			msg.data = 5;
			printf("Data write to channel : %d\n",msg.data);
			write_to_channel(channel[1],&msg);
			return 0;
	}else {

			// read data from pipe with main (parent) process
		struct message recv;
		recv.data = 0 ; // just resetting
		close(channel[1]);
		read_from_channel(channel[0],&recv);
		printf("Data recv from channel : %d\n",recv.data);

	}

	// then will wait for child process works done!
	while(working_process = waitpid(-1,NULL,0)){
		if(errno == ECHILD)
			break;
	}
	return 0;
}