forked from haraldwolff/avr-fw-modules
67 lines
1.5 KiB
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 );
|
|
};
|