2018-02-24 00:30:12 +01:00
|
|
|
|
2018-02-24 00:30:44 +01:00
|
|
|
#include "cw.h"
|
|
|
|
#include "mavl.h"
|
2018-02-24 23:58:31 +01:00
|
|
|
#include "cw/dbg.h"
|
2018-02-24 00:30:12 +01:00
|
|
|
|
2018-02-24 00:30:44 +01:00
|
|
|
#include "message_set.h"
|
2018-02-24 00:30:12 +01:00
|
|
|
|
2018-02-26 20:18:53 +01:00
|
|
|
/*
|
2018-02-24 01:52:39 +01:00
|
|
|
typedef struct {
|
|
|
|
int type;
|
|
|
|
const char * name;
|
|
|
|
int * states;
|
2018-02-24 00:30:44 +01:00
|
|
|
mavl_t elements_tree;
|
|
|
|
mlist_t elements_list;
|
2018-02-24 01:52:39 +01:00
|
|
|
}message2_t;
|
2018-02-26 20:18:53 +01:00
|
|
|
*/
|
2018-02-24 00:30:44 +01:00
|
|
|
|
2018-02-24 23:58:31 +01:00
|
|
|
static inline int cmp_cw_msgelemprops(const void *elem1, const void *elem2){
|
2018-02-25 00:52:45 +01:00
|
|
|
cw_elem_handler_t * e1 = ((cw_msgelemprops_t*)elem1)->elem;
|
|
|
|
cw_elem_handler_t * e2 = ((cw_msgelemprops_t*)elem2)->elem;
|
2018-02-24 00:30:44 +01:00
|
|
|
int r;
|
|
|
|
r = e1->id - e2->id;
|
|
|
|
if (r!=0)
|
|
|
|
return r;
|
|
|
|
r = e1->vendor - e2->vendor;
|
|
|
|
if (r!=0)
|
|
|
|
return r;
|
|
|
|
r = e1->proto - e2->proto;
|
|
|
|
if (r != 0)
|
|
|
|
return r;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline int msg_cmp(const void *elem1, const void *elem2)
|
|
|
|
{
|
2018-02-24 01:52:39 +01:00
|
|
|
message2_t * e1 = (message2_t*)elem1;
|
|
|
|
message2_t * e2 = (message2_t*)elem2;
|
|
|
|
|
|
|
|
return e1->type - e2->type;
|
2018-02-24 00:30:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
void cw_message_set_destroy(cw_MsgSet_t * set){
|
2018-02-24 00:30:44 +01:00
|
|
|
if (set->messages){
|
|
|
|
mavl_destroy(set->messages);
|
|
|
|
}
|
|
|
|
if (set->all_elems){
|
|
|
|
mavl_destroy(set->all_elems);
|
|
|
|
}
|
|
|
|
free(set);
|
|
|
|
}
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
cw_MsgSet_t * cw_message_set_create(){
|
2018-02-24 00:30:44 +01:00
|
|
|
|
|
|
|
/* allocate memory for a message_set */
|
2018-02-25 19:12:28 +01:00
|
|
|
cw_MsgSet_t * set = malloc(sizeof(cw_MsgSet_t));
|
2018-02-24 00:30:44 +01:00
|
|
|
if (set==NULL)
|
|
|
|
return NULL;
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
memset(set,0,sizeof(cw_MsgSet_t));
|
2018-02-24 00:30:44 +01:00
|
|
|
|
|
|
|
/* create mavl for all_elems */
|
2018-02-24 23:58:31 +01:00
|
|
|
set->all_elems = mavl_create(cmp_cw_msgelemprops,NULL);
|
2018-02-24 00:30:44 +01:00
|
|
|
if (set->all_elems==NULL){
|
|
|
|
cw_message_set_destroy(set);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* create mavl for messages */
|
|
|
|
set->messages = mavl_create(msg_cmp,NULL);
|
|
|
|
if (set->messages==NULL){
|
|
|
|
cw_message_set_destroy(set);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return set;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
static void update_message(message2_t * msg, cw_msgdef_t * src, cw_MsgSet_t * set){
|
2018-02-24 00:30:44 +01:00
|
|
|
|
2018-02-24 23:58:31 +01:00
|
|
|
cw_msgelemprops_t *md;
|
|
|
|
|
2018-02-24 00:30:44 +01:00
|
|
|
|
2018-02-24 23:58:31 +01:00
|
|
|
|
|
|
|
for (md = src->elements; md->elem!=0; md++){
|
|
|
|
cw_dbg(DBG_INFO," add element %d - %s, %d",md->elem->id, md->elem->name, md->mand);
|
|
|
|
mavl_add(msg->elements_tree,md);
|
|
|
|
mavl_add(set->all_elems,md);
|
|
|
|
mlist_append(msg->elements_list,md);
|
|
|
|
mlist_replace(msg->elements_list,NULL,md);
|
2018-02-24 01:52:39 +01:00
|
|
|
}
|
|
|
|
|
2018-02-24 23:58:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
void cw_msgset_add(cw_MsgSet_t * set,
|
2018-02-24 23:58:31 +01:00
|
|
|
cw_msgdef_t messages[]){
|
|
|
|
|
2018-02-26 20:18:53 +01:00
|
|
|
cw_msgdef_t * message;
|
|
|
|
for (message=messages; message->type !=0; message++){
|
2018-02-24 23:58:31 +01:00
|
|
|
message2_t search, *next;
|
|
|
|
|
2018-02-26 20:18:53 +01:00
|
|
|
search.type = message->type;
|
2018-02-24 23:58:31 +01:00
|
|
|
|
2018-02-26 20:18:53 +01:00
|
|
|
cw_dbg(DBG_INFO,"Add message: Type:%d - %s",message->type,message->name);
|
2018-02-24 23:58:31 +01:00
|
|
|
|
|
|
|
next = mavl_find(set->messages,&search);
|
|
|
|
|
|
|
|
/** message not already in memory,
|
|
|
|
* create a new one */
|
|
|
|
if (next == NULL){
|
|
|
|
next = malloc (sizeof(message2_t));
|
|
|
|
if (next == NULL)
|
|
|
|
return;
|
|
|
|
next->elements_tree = mavl_create(cmp_cw_msgelemprops,NULL);
|
|
|
|
if (next->elements_tree==NULL){
|
|
|
|
free(next);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
next->elements_list = mlist_create(cmp_cw_msgelemprops);
|
|
|
|
if (next->elements_list == NULL){
|
|
|
|
mavl_destroy(next->elements_tree);
|
|
|
|
free(next);
|
|
|
|
return;
|
|
|
|
}
|
2018-02-26 20:18:53 +01:00
|
|
|
next->type=message->type;
|
2018-02-24 23:58:31 +01:00
|
|
|
mavl_add(set->messages,next);
|
|
|
|
|
|
|
|
}
|
|
|
|
/* massage is alreaddy in there */
|
2018-02-26 20:18:53 +01:00
|
|
|
if (message->name)
|
|
|
|
next->name=message->name;
|
|
|
|
if (message->states)
|
|
|
|
next->states=message->states;
|
2018-02-28 07:38:02 +01:00
|
|
|
if (message->receiver)
|
|
|
|
next->receiver=message->receiver;
|
2018-02-24 23:58:31 +01:00
|
|
|
|
2018-02-26 20:18:53 +01:00
|
|
|
update_message(next,message, set);
|
2018-02-24 00:30:44 +01:00
|
|
|
}
|
2018-02-24 00:30:12 +01:00
|
|
|
}
|
2018-02-24 01:52:39 +01:00
|
|
|
|
2018-02-25 00:52:45 +01:00
|
|
|
cw_elem_handler_t * cw_message_set_find_element(
|
2018-02-25 19:12:28 +01:00
|
|
|
cw_MsgSet_t * set,
|
2018-02-25 00:52:45 +01:00
|
|
|
cw_elem_handler_t * element){
|
2018-02-24 01:52:39 +01:00
|
|
|
return mavl_find(set->all_elems,element);
|
2018-02-24 23:58:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-25 19:12:28 +01:00
|
|
|
mlist_t cw_msgset_get_msg(cw_MsgSet_t * set, int type){
|
2018-02-24 23:58:31 +01:00
|
|
|
message2_t search;
|
|
|
|
search.type = type;
|
|
|
|
message2_t * result = mavl_find(set->messages,&search);
|
|
|
|
if (!result){
|
|
|
|
printf ("no result\n");
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
return result->elements_list;
|
2018-02-24 01:52:39 +01:00
|
|
|
}
|