161 lines
4.6 KiB
C
161 lines
4.6 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <hwo/serial.h>
|
|
#include <hwo/chksum.h>
|
|
#include <hwo/threads.h>
|
|
#include <hwo/systick.h>
|
|
|
|
#include <sys/errno.h>
|
|
#include <sys/mutex.h>
|
|
#include <util/list.h>
|
|
|
|
#include <io/usart.h>
|
|
|
|
/***********************************
|
|
rb2/regbus.h
|
|
|
|
RegisteredBus2
|
|
|
|
Paketorientierte Kommunikation via Serielle Verbindungen mit Adressierung
|
|
|
|
***********************************/
|
|
|
|
extern RB2_INSTANCE __rb2_instance;
|
|
|
|
int rb2_request (RB2_ADDR receiver,uint16_t registerno,uint8_t type,void *data);
|
|
|
|
static inline int rb2_read_int32(RB2_ADDR receiver,uint16_t registerno,int32_t *i32) {
|
|
return rb2_request(receiver,registerno,RDT_INT32,i32);
|
|
};
|
|
static inline int rb2_read_float(RB2_ADDR receiver,uint16_t registerno,float *f32) {
|
|
return rb2_request(receiver,registerno,RDT_FLOAT,f32);
|
|
};
|
|
|
|
static inline int rb2_write_int32(RB2_ADDR receiver,uint16_t registerno,int32_t *i32) {
|
|
return rb2_request(receiver,registerno,RDT_INT32 | RDT_WRITE,i32);
|
|
};
|
|
static inline int rb2_write_float(RB2_ADDR receiver,uint16_t registerno,float *f32) {
|
|
return rb2_request(receiver,registerno,RDT_FLOAT | RDT_WRITE,f32);
|
|
};
|
|
|
|
static inline int rb2_write_int32_d(RB2_ADDR receiver,uint16_t registerno,int32_t i32) {
|
|
return rb2_request(receiver,registerno,RDT_INT32 | RDT_WRITE,&i32);
|
|
};
|
|
static inline int rb2_write_float_d(RB2_ADDR receiver,uint16_t registerno,float f32) {
|
|
return rb2_request(receiver,registerno,RDT_FLOAT | RDT_WRITE,&f32);
|
|
};
|
|
|
|
//static inline RB2_INSTANCE* rb2_instance(void) { return &__rb2_instance; };
|
|
#define rb2_instance() (&__rb2_instance)
|
|
|
|
static inline uint8_t rb2_first_id(void) { return (__rb2_instance.proxy.next) ? RB2_PROXY(__rb2_instance.proxy.next)->id : 0 ; };
|
|
|
|
static inline uint8_t rb2_request_is_local(RB2_TELEGRAM *telegram) {
|
|
if ( ((telegram->receiver.ax == __rb2_instance.ax)||(telegram->receiver.ax==0)) && (__rb2_instance.idmask & (1<<telegram->receiver.node)) ){
|
|
return -1;
|
|
};
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
static inline void rb2_proxy_init(RB2_PROXY *proxy) {
|
|
memset( proxy, 0x00, sizeof(RB2_PROXY) );
|
|
list_init( &proxy->segments );
|
|
};
|
|
|
|
static inline void rb2_add_proxy(RB2_PROXY *proxy) {
|
|
list_append( &(proxy->list), &((&__rb2_instance)->proxy) );
|
|
__rb2_instance.idmask |= (1 << proxy->id);
|
|
};
|
|
|
|
static inline void rb2_remove_proxy(RB2_PROXY *proxy) {
|
|
list_remove( &(proxy->list) );
|
|
__rb2_instance.idmask &= ~(1 << proxy->id);
|
|
};
|
|
|
|
static inline void rb2_add_rsegment(RB2_PROXY *proxy,RB2_RSEGMENT *segment) {
|
|
list_append( &segment->list, &proxy->segments );
|
|
};
|
|
|
|
static inline RB2_PROXY* rb2_get_proxy(uint8_t id) {
|
|
list_t* i;
|
|
|
|
for_each_list_entry(i,&((&__rb2_instance)->proxy)){
|
|
RB2_PROXY *p = list_entry(i,RB2_PROXY,list);
|
|
if (p->id == id){
|
|
return p;
|
|
}
|
|
};
|
|
return NULL;
|
|
};
|
|
|
|
|
|
uint8_t rb2_init (uint8_t ax);
|
|
void rb2_loop (void* arg); // Management Thread
|
|
void rb2_loop_rx ();
|
|
void rb2_loop_tx ();
|
|
void rb2_loop_ident ();
|
|
|
|
void rb2_handle_request(rb2_telegram_buffer_t *telegram);
|
|
void rb2_handle_response(rb2_telegram_buffer_t *telegram);
|
|
|
|
void rb2_route (RB2_TELEGRAM *request);
|
|
void rb2_route_listed(rb2_telegram_buffer_t *txtele);
|
|
void rb2_router (void *arg);
|
|
|
|
int rb2_build_request (RB2_REQUEST *request,RB2_ADDR receiver,uint16_t registerno,uint8_t type,void *data);
|
|
int rb2_enqueue_pending (RB2_REQUEST *request);
|
|
int rb2_unqueue_pending (RB2_REQUEST *request);
|
|
|
|
RB2_LINK* rb2_create_stream_link(FILE *stream);
|
|
RB2_LINK* rb2_create_usart_link(uint8_t _usart);
|
|
|
|
uint16_t
|
|
rb2_known_endpoints(void);
|
|
|
|
|
|
void rb2_api_rx (rb2_telegram_buffer_t *telegram);
|
|
void rb2_convert (uint8_t srctype,void *src,uint8_t dsttype, void *dst);
|
|
|
|
uint8_t rb2_default_register_proc(RB2_REGISTER *reg,RB2_TELEGRAM *telegram);
|
|
|
|
|
|
static inline int rb2_link_add (RB2_LINK *link){
|
|
cpustate_t state;
|
|
|
|
spinlock_lock_irq( &__rb2_instance.links.lock, &state );
|
|
list_append( &(link->list), &(__rb2_instance.links.list) );
|
|
spinlock_release_irq( &__rb2_instance.links.lock, &state );
|
|
|
|
return ESUCCESS;
|
|
};
|
|
|
|
rb2_telegram_buffer_t* rb2_pool_pop (void);
|
|
rb2_telegram_buffer_t* rb2_pool_pop_irq(void);
|
|
void rb2_pool_push (rb2_telegram_buffer_t *tele);
|
|
|
|
|
|
/* DEBUG / Tracing */
|
|
|
|
void _dbg_trace_rb2_usart_tx(rb2_telegram_buffer_t *telegram) __attribute__(( weak ));
|
|
void _dbg_trace_rb2_usart_rx(rb2_telegram_buffer_t *telegram) __attribute__(( weak ));
|
|
|
|
void _dbg_trace_rb2_can_tx(rb2_telegram_buffer_t *telegram) __attribute__(( weak ));
|
|
void _dbg_trace_rb2_can_rx(rb2_telegram_buffer_t *telegram) __attribute__(( weak ));
|
|
|
|
extern int32_t _dbg_rb2_usart_sync,
|
|
_dbg_rb2_usart_sync_min,
|
|
_dbg_rb2_usart_sync_max;
|
|
extern int32_t _dbg_rb2_usart_txtele,
|
|
_dbg_rb2_usart_rxtele;
|
|
|
|
|
|
|
|
|
|
|