Exemplo n.º 1
0
//  -------------------------------------------------------------------------
static int refresh( Device *dv ){
//#ifdef DEBUG
//printf( "Refresh: %d, %d, %s, %d\n", dv->id, dv->adr, dv->name, dv->reg );
//#endif
    dv->err = 0;
// закодировать dv->cmd, dv->cmd_len в buffer
str_err = "dv->coder_frm";
    memset( buffer, 0, sizeof( buffer ));
    buf_len = dv->coder_frm( dv->adr, dv->frm, dv->frm_len, buffer );
    if( buf_len < 2 ){
        dv->err = E_CODER;
        buf_len = 0;
        return 0;
    }
//  --
// передача в устройство
str_err = "write_transport";
    int tmp = write_transport( buffer, buf_len );
    if( tmp < 0 ){
        dv->err = tmp;
        return 0;
    }
//  --

// чтение из устройства
str_err = "read_transport";
    memset( buffer, 0, sizeof( buffer ));
    buf_len = read_transport( buffer, ( sizeof( buffer ) - 1 ));
    if( buf_len < 0 ){
        dv->err = buf_len;
        buf_len = 0;
        return 0;
    }
//  --
    if( buf_len >= (signed)sizeof( buffer ) ){
        dv->err = E_TR_READ;
        buf_len = 0;
        return 0;
    }
//  --

// распаковать ответ
str_err = "dv->decoder";
    buf_len = dv->decoder( dv->adr, buffer, buf_len );
    if( buf_len < 0 ){
        dv->err = buf_len;
        buf_len = 0;
        return 0;
    }
//  --
str_err = "end refresh";
return 1;
}//  End refresh()
Exemplo n.º 2
0
//-----------------------------------------------------------------------------
// read an incoming message from datalink to network layer
void read_network(int link, size_t length, char * datagram) {
    DATAGRAM dtg;
    memcpy(&dtg, datagram, length);

    // dispatch the datagram
    if (is_kind(dtg.kind,__DISCOVER__))
        do_discovery(link, dtg);
    if (is_kind(dtg.kind,__ROUTING__))
        do_routing(link, dtg);
    if (is_kind(dtg.kind,__TRANSPORT__)) {
        PACKET pkt;
        size_t len_to_cpy = dtg.length;
        memcpy((char*)&pkt, dtg.payload, len_to_cpy);
        if ((CnetAddr)(dtg.dest) != nodeinfo.address) {
            route(dtg);
            packets_forwarded_total++;
        } else
            read_transport(dtg.kind, dtg.length, dtg.src, (char*)dtg.payload);
    }
}