// ------------------------------------------------------------------------- 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()
//----------------------------------------------------------------------------- // 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); } }