static uint8_t read_ext_message(CanTxMsgTypeDef *dest, uint8_t *msg, uint8_t msg_length) { uint8_t i; if (msg[0] > '1' || msg[8] < '0' || msg[8] > '8' || msg_length != 8u + 1u + ((msg[8] - '0') << 1u)) { return 0; } dest->ExtId = (nibble_from_hex(msg[0]) << 28u) | (nibble_from_hex(msg[1]) << 24u) | (nibble_from_hex(msg[2]) << 20u) | (nibble_from_hex(msg[3]) << 16u) | (nibble_from_hex(msg[4]) << 12u) | (nibble_from_hex(msg[5]) << 8u) | (nibble_from_hex(msg[6]) << 4u) | (nibble_from_hex(msg[7]) << 0u); dest->IDE = CAN_ID_EXT; dest->RTR = 0; dest->DLC = msg[8] - '0'; for (i = 0; i < dest->DLC; i++) { dest->Data[i] = (nibble_from_hex(msg[9u + (i << 1u)]) << 4u) | (nibble_from_hex(msg[9u + (i << 1u) + 1u]) << 0u); } return 1u; }
static uint8_t read_std_rtr(CanTxMsgTypeDef *dest, uint8_t *msg, uint8_t msg_length) { if (msg[0] > '7' || msg[3] < '0' || msg[3] > '8' || msg_length != 3u) { return 0; } dest->StdId = (nibble_from_hex(msg[0]) << 8u) | (nibble_from_hex(msg[1]) << 4u) | (nibble_from_hex(msg[2]) << 0u); dest->IDE = CAN_ID_STD; dest->RTR = 1u; dest->DLC = 0; return 1u; }
static uint8_t read_std_message(CanTxMsgTypeDef *dest, uint8_t *msg, uint8_t msg_length) { uint8_t i; if (msg[0] > '7' || msg[3] < '0' || msg[3] > '8' || msg_length != 3u + 1u + ((msg[3] - '0') << 1u)) { return 0; } dest->StdId = (nibble_from_hex(msg[0]) << 8u) | (nibble_from_hex(msg[1]) << 4u) | (nibble_from_hex(msg[2]) << 0u); dest->IDE = CAN_ID_STD; dest->RTR = 0; dest->DLC = msg[3] - '0'; for (i = 0; i < dest->DLC; i++) { dest->Data[i] = (nibble_from_hex(msg[4u + (i << 1u)]) << 4u) | (nibble_from_hex(msg[4u + (i << 1u) + 1u]) << 0u); } return 1u; }
static uint8_t read_ext_rtr(CanTxMsgTypeDef *dest, uint8_t *msg, uint8_t msg_length) { if (msg[0] > '1' || msg[8] < '0' || msg[8] > '8' || msg_length != 8u) { return 0; } dest->ExtId = (nibble_from_hex(msg[0]) << 28u) | (nibble_from_hex(msg[1]) << 24u) | (nibble_from_hex(msg[2]) << 20u) | (nibble_from_hex(msg[3]) << 16u) | (nibble_from_hex(msg[4]) << 12u) | (nibble_from_hex(msg[5]) << 8u) | (nibble_from_hex(msg[6]) << 4u) | (nibble_from_hex(msg[7]) << 0u); dest->IDE = CAN_ID_EXT; dest->RTR = 1u; dest->DLC = 0; return 1u; }
void dcon_process_pkt( uint8_t *cp, uint8_t len ) { uint8_t node_addr = fromhex( cp+1 ); uint8_t cmd_prefix = cp[0]; // TODO ** is broadcast too if( (node_addr != modbus_our_address) && (node_addr != 0) ) return; cp += 3; // skip prefix & addr len -= 3; len -= 3; // chk and 0x0D at end switch( cmd_prefix ) { case '#': if( len == 0 ) dcon_send_all_ins(); else if( len == 1 ) { uint8_t nIn = nibble_from_hex( *cp ); dcon_send_in(nIn); } else { // analogue out - just integer uint8_t nOut = nibble_from_hex( *cp ); uint16_t data = dcon_read_int( cp+1, len-1 ); // TODO aout } return; case '@': { // dig outs if( len == 0 ) // read dig in { dcon_make_pkt( '>', "00" ); // TODO di return; } else { uint8_t dout = fromhex( cp ); // TODO do dcon_make_pkt( '>', 0 ); return; } } break; case '$': { // $aaB // if( (len == 1) && (*cp == 'B') ) // dcon_send_channel_errors(); // $aaF - fw ver if( (len == 1) && (*cp == 'F') ) { dcon_make_pkt( '!', FW_VER_STRING ); // TODO get ver through modbus return; } // $aaM - module name if( (len == 1) && (*cp == 'M') ) { dcon_make_pkt( '!', DEVICE_NAME ); return; } // $aaP - proto info if( (len == 1) && (*cp == 'P') ) { dcon_make_pkt( '!', "10" ); // RTU return; } } break; case '~': { // $aaO - set name if( (len > 1) && (len < 17) && (*cp == 'O') ) { char name[17]; strlcpy( name, cp+1, len-1 ); // TODO dev name, eeprom, modbus, menu dcon_send_ack(); return; } } break; } dcon_send_error(); }