avr-fw-modules/core/src/rb2_handle_request.c

67 lines
1.5 KiB
C

#include <rb2/regbus.h>
#include <stdlib.h>
void rb2_handle_request(rb2_telegram_buffer_t *telegram)
{
list_t *segment;
RB2_PROXY *proxy;
uint8_t temp;
if (!telegram)
return;
proxy = rb2_get_proxy( telegram->telegram.receiver.node );
temp = telegram->telegram.sender.addr;
telegram->telegram.sender.addr = telegram->telegram.receiver.addr;
telegram->telegram.receiver.addr = temp;
telegram->telegram.flags.response = 1;
if (proxy) {
if (proxy->register_node_proc != NULL){
temp = telegram->telegram.flags.type;
telegram->telegram.flags.fail = proxy->register_node_proc(
(proxy->id << 8) | (telegram->telegram.flags.read ? RNPOP_READ : RNPOP_WRITE),
telegram->telegram.regno,
&temp,
&telegram->telegram.i32
)
? 1 : 0;
telegram->telegram.flags.type = temp;
rb2_route_listed( telegram );
return;
};
if ((proxy->register_proc == NULL) || proxy->register_proc( NULL, &(telegram->telegram) )) {
for_each_list_entry(segment,&proxy->segments){
RB2_REGISTER *reg;
for (reg = list_entry(segment,RB2_RSEGMENT,list)->registers; reg->ptr; reg++)
{
if (reg->register_no == telegram->telegram.regno)
{
if (rb2_default_register_proc( reg, &telegram->telegram ))
telegram->telegram.flags.fail = 1;
rb2_route_listed( telegram );
return;
};
};
};
} else {
rb2_route_listed( telegram );
return;
};
};
rb2_pool_push( telegram );
};