Exemplo n.º 1
0
Arquivo: main.c Projeto: thiemar/mucan
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;
}
Exemplo n.º 2
0
Arquivo: main.c Projeto: thiemar/mucan
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;
}
Exemplo n.º 3
0
Arquivo: main.c Projeto: thiemar/mucan
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;
}
Exemplo n.º 4
0
Arquivo: main.c Projeto: thiemar/mucan
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;
}
Exemplo n.º 5
0
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();

}