Example #1
0
void
eb_recv_data_prepare(const unsigned char *buf, int buflen)
{
	unsigned char tmp[SERIAL_BUFSIZE];
	int tmplen, crc;

	memset(tmp, '\0', sizeof(tmp));

	/* reset struct */
	memset(&recv_data, '\0', sizeof(recv_data));	

	/* set recv_data.msg_esc */
	memcpy(&recv_data.msg_esc[0], buf, buflen);
	recv_data.len_esc = buflen;

	/* set recv_data.crc_calc and .crc_recv */
	if (buf[buflen - 2] == EBUS_SYN_ESC_A9) {
		recv_data.crc_calc = eb_calc_crc(buf, buflen - 2);
		if (buf[buflen - 1] == EBUS_SYN_ESC_01)
			recv_data.crc_recv = EBUS_SYN;
		else
			recv_data.crc_recv = EBUS_SYN_ESC_A9;

		crc = 2;

	} else {
		recv_data.crc_calc = eb_calc_crc(buf, buflen - 1);
		recv_data.crc_recv = buf[buflen - 1];

		crc = 1;
	}

	/* set recv_data.msg */
	memcpy(tmp, buf, buflen - crc);
	tmplen = buflen - crc;

	eb_unesc(tmp, &tmplen);

	memcpy(&recv_data.msg[0], tmp, tmplen);
	recv_data.len = tmplen;

}
Example #2
0
void
eb_send_data_prepare(const unsigned char *buf, int buflen)
{
	unsigned char crc[2], tmp[SERIAL_BUFSIZE];
	int tmplen, crclen;

	/* reset struct */
	memset(&send_data, '\0', sizeof(send_data));	

	/* set send_data.msg */
	memcpy(&send_data.msg[0], buf, buflen);
	send_data.len = buflen;


	/* set send_data.msg_esc + send_data.crc */
	memset(tmp, '\0', sizeof(tmp));
	memcpy(tmp, buf, buflen);
	tmplen = buflen;	
	
	eb_esc(tmp, &tmplen);

	memcpy(&send_data.msg_esc[0], &qq, 1);
	memcpy(&send_data.msg_esc[1], tmp, tmplen);
	tmplen++;

	memset(crc, '\0', sizeof(crc));
	send_data.crc = eb_calc_crc(&send_data.msg_esc[0], tmplen);
	crc[0] = send_data.crc;
	crclen = 1;

	if (crc[0] == EBUS_SYN || crc[0] == EBUS_SYN_ESC_A9) {
		/* esc crc */
		eb_esc(crc, &crclen);
		send_data.msg_esc[tmplen] = crc[0];
		tmplen++;
		send_data.msg_esc[tmplen] = crc[1];
		tmplen++;
	} else {
		send_data.msg_esc[tmplen] = crc[0];
		tmplen++;
	}

	send_data.len_esc = tmplen;

}
Example #3
0
int
eb_cyc_data_process(const unsigned char *buf, int buflen)
{
	unsigned char msg[CMD_DATA_SIZE], hlp[CMD_DATA_SIZE];
	unsigned char crcm_recv, crcm_calc, acks, crcs_recv, crcs_calc, ackm;
	int id, msgtype, msglen, hlplen, mlen, slen, len;

	memset(msg, '\0', sizeof(msg));

	/* search command definition */
	id = eb_cmd_search_com_cyc(&buf[1], buflen - 1);
	
	if (id >= 0) {
		msgtype = eb_cmd_get_s_type(id);
		err_ret_if(msgtype < 0, -1);

		/* unescape */
		memcpy(msg, buf, buflen);
		msglen = buflen;

		eb_unesc(msg, &msglen);
		
		/* calc crc vom master */
		mlen = 5 + (int) msg[4];

		if (((int) msg[4]) > EBUS_MSG_MASTER_MAX_DB_LEN) {
			log_print(L_WAR, "%s (%d > %d)", "Master DB Len Error",
				((int) msg[4]), EBUS_MSG_MASTER_MAX_DB_LEN);
			return -2;
		}
		
		memset(hlp, '\0', sizeof(hlp));
		memcpy(hlp, msg, mlen);
		hlplen = mlen;
		
		eb_esc(hlp, &hlplen);
		
		crcm_calc = eb_calc_crc(hlp, hlplen);
		crcm_recv = msg[mlen];

		if (crcm_calc != crcm_recv) {
			log_print(L_WAR, "%s", "Master CRC Error");
			return -2;
		}

		/* set len */
		len = mlen + 1;
		

		if (msgtype != EBUS_MSG_BROADCAST) {

			/* get ack from slave */
			acks = msg[mlen + 1];

			if (acks == EBUS_NAK) {
				log_print(L_WAR, "%s", "Slave ACK Error");
				return -2;
			}

			/* set len */
			len = mlen + 2;			
		}

		
		if (msgtype == EBUS_MSG_MASTER_SLAVE) {

			/* calc crc vom slave */
			slen = 1 + (int) msg[mlen + 2];

			if (((int) msg[mlen + 2]) > EBUS_MSG_SLAVE_MAX_DB_LEN) {
				log_print(L_WAR, "%s (%d > %d)", "Slave DB Len Error",
					((int) msg[mlen + 2]), EBUS_MSG_SLAVE_MAX_DB_LEN);
				return -2;
			}

			memset(hlp, '\0', sizeof(hlp));
			memcpy(hlp, &msg[mlen + 2], slen);
			hlplen = slen;

			eb_esc(hlp, &hlplen);

			crcs_calc = eb_calc_crc(hlp, hlplen);
			crcs_recv = msg[mlen + 2 + slen];

			if (crcs_calc != crcs_recv) {
				log_print(L_WAR, "%s", "Slave CRC Error");
				return -2;
			}

			/* get ack from master */
			ackm = msg[mlen + 2 + slen + 1];

			if (ackm == EBUS_NAK) {
				log_print(L_WAR, "%s", "Master ACK Error");
				return -2;
			}

			/* set len */
			len = mlen + 2 + slen + 2;
		}

		/* check len */			
		if (msglen > len) {
			log_print(L_WAR, "%s", "LEN Error");
			return -2;
						
		}
		
		/* save data */
		eb_cmd_set_cyc_buf(id, msg, msglen);
			
	}

	return id;
}
Example #4
0
int main() {

	int i, j, end, ret;

	int bcd, d1b, data[SERIAL_BUFSIZE + 1];
	float d1c, d2b, d2c;

	char byte;
	
	unsigned char hex, tmp, crc, crc_calc[2] ;

	tmp = 0;
	end = 0;
	do {
		i = 0;
		printf("Input: ");
		while ((byte = fgetc(stdin)) != EOF) {
			
			if (byte == '\n') {
				break;
			}
				
			if (byte == 'q') {
				end = 1;
				break;
			}
			
			if (i < sizeof(data)) {
				ret = eb_htoi(&byte);
				if (ret != -1) {
					data[i] = ret;
					i++;
				}
			} else {
				break;
			}
		}		
		
		if (!end) {
		
			for (j = 0; j < i; j += 2) {
				
				bcd = 0;
				d1b = 0;
				ret = 0;
				d1c = 0.0;
				d2b = 0.0;
				d2c = 0.0;

				hex = (unsigned char) (data[j]*16 + data[j+1]);
				
				ret = eb_bcd_to_int(hex, &bcd);
				ret = eb_d1b_to_int(hex, &d1b);
				
				ret = eb_d1c_to_float(hex, &d1c);
				printf("hex %02x ->\tbcd: %3d\td1b: %4d"
					"\td1c: %5.1f", hex, bcd, d1b, d1c);

				
				if (j == 2) {
					ret = eb_d2b_to_float(tmp, hex, &d2b);
					ret = eb_d2c_to_float(tmp, hex, &d2c);
					crc_calc[0] = tmp;
					crc_calc[1] = hex;
					crc = eb_calc_crc(crc_calc,2);
					printf("\td2b: %10.5f\td2c: %12.6f"
						"\tcrc: %02x\n", d2b, d2c, crc);
				}
				else {
					tmp = hex;
					printf("\n");
				}
			}
		}

	} while (end == 0);
	
	return 0;
}