summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/gr_block_registry.cc
blob: eaa770dcaf022b8d78e3233defb77b0e5d051d2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <gr_basic_block.h>
#include <gr_block_registry.h>
#include <gr_tpb_detail.h>
#include <gr_block_detail.h>
#include <gr_block.h>
#include <stdio.h>

gr_block_registry global_block_registry;

gr_block_registry::gr_block_registry(){
    d_ref_map = pmt::make_dict();
}

long gr_block_registry::block_register(gr_basic_block* block){
    if(d_map.find(block->name()) == d_map.end()){
        d_map[block->name()] = blocksubmap_t();
        d_map[block->name()][0] = block;
        return 0;
    } else {
        for(size_t i=0; i<=d_map[block->name()].size(); i++){
            if(d_map[block->name()].find(i) == d_map[block->name()].end()){
                d_map[block->name()][i] = block;
                return i;
            }
        }
    }
    throw std::runtime_error("should not reach this");
}

void gr_block_registry::block_unregister(gr_basic_block* block){
    d_map[block->name()].erase( d_map[block->name()].find(block->symbolic_id()));
    d_ref_map = pmt::dict_delete(d_ref_map, pmt::intern(block->symbol_name()));
    if(block->alias_set()){
        d_ref_map = pmt::dict_delete(d_ref_map, pmt::intern(block->alias()));
        }
}

std::string gr_block_registry::register_symbolic_name(gr_basic_block* block){
    std::stringstream ss;
    ss << block->name() << block->symbolic_id();
    //std::cout << "register_symbolic_name: " << ss.str() << std::endl;
    register_symbolic_name(block, ss.str());
    return ss.str();
}

void gr_block_registry::register_symbolic_name(gr_basic_block* block, std::string name){
    if(dict_has_key(d_ref_map, pmt::intern(name))){
        throw std::runtime_error("symbol already exists, can not re-use!");
        }
    d_ref_map = dict_add(d_ref_map, pmt::intern(name), pmt::make_any(block));
}

gr_basic_block_sptr gr_block_registry::block_lookup(pmt::pmt_t symbol){
    pmt::pmt_t ref = dict_ref(d_ref_map, symbol, pmt::PMT_NIL);
    if(pmt::eq(ref, pmt::PMT_NIL)){
        throw std::runtime_error("block lookup failed! block not found!");
    }
    gr_basic_block* blk = boost::any_cast<gr_basic_block*>( pmt::any_ref(ref) );
    return blk->shared_from_this();
}


void gr_block_registry::register_primitive(std::string blk, gr_block* ref){
    primitive_map[blk] = ref;
}

void gr_block_registry::unregister_primitive(std::string blk){
    primitive_map.erase(primitive_map.find(blk));
}

void gr_block_registry::notify_blk(std::string blk){
    if(primitive_map.find(blk) == primitive_map.end()){ return; }
    if(primitive_map[blk]->detail().get())
        primitive_map[blk]->detail()->d_tpb.notify_msg();
}