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; }
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; }
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; }
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; }