Psyllid  v1.12.4
Project 8 Data Acquisisition Software
data_producer.cc
Go to the documentation of this file.
1 /*
2  * data_producer.cc
3  *
4  * Created on: May 31, 2019
5  * Author: obla999
6  */
7 
8 #include "data_producer.hh"
9 
10 #include "logger.hh"
11 
12 
13 LOGGER( plog, "data_producer" );
14 
15 using midge::stream;
16 
17 namespace psyllid
18 {
19 
20  REGISTER_NODE_AND_BUILDER( data_producer, "data-producer", data_producer_binding );
21 
23  f_length( 10 ),
24  f_data_size( 8224 ),
25  f_master_packet()
26  {
27  f_master_packet.set_freq_not_time( false );
28  }
29 
31  {
32  }
33 
35  {
36  out_buffer< 0 >().initialize( f_length );
37  }
38 
39  void data_producer::execute( midge::diptera* a_midge )
40  {
41  LDEBUG( plog, "Executing the data_producer" );
42 
43  try
44  {
45  memory_block* t_block = nullptr;
46 
47  //LDEBUG( plog, "Server is listening" );
48 
49  if( ! out_stream< 0 >().set( stream::s_start ) ) return;
50 
51  ssize_t t_size_received = 0;
52 
53  LINFO( plog, "Starting main loop; sending packets" );
54  //unsigned count = 0;
55  while( ! is_canceled() )
56  {
57  t_block = out_stream< 0 >().data();
58  if( t_block->get_n_bytes() != f_data_size )
59  {
60  initialize_block( t_block );
61  }
62 
63  t_size_received = 0;
64 
65  if( out_stream< 0 >().get() == stream::s_stop )
66  {
67  LWARN( plog, "Output stream(s) have stop condition" );
68  break;
69  }
70 
71  if( ! out_stream< 0 >().set( stream::s_run ) )
72  {
73  LERROR( plog, "Exiting due to stream error" );
74  break;
75  }
76  }
77 
78  LINFO( plog, "Data producer is exiting" );
79 
80  // normal exit condition
81  LDEBUG( plog, "Stopping output stream" );
82  if( ! out_stream< 0 >().set( stream::s_stop ) ) return;
83 
84  LDEBUG( plog, "Exiting output stream" );
85  out_stream< 0 >().set( stream::s_exit );
86 
87  return;
88  }
89  catch(...)
90  {
91  a_midge->throw_ex( std::current_exception() );
92  }
93  }
94 
96  {
97  out_buffer< 0 >().finalize();
98 
99  return;
100  }
101 
103  {
104  a_block->resize( f_data_size );
105  a_block->set_n_bytes_used( f_data_size );
106 
107  roach_packet* t_roach_packet = reinterpret_cast< roach_packet* >( a_block->block() );
108  ::memcpy( t_roach_packet, &f_master_packet.packet(), f_data_size );
109 
110  return;
111  }
112 
115  {
116  }
117 
119  {
120  }
121 
122  void data_producer_binding::do_apply_config( data_producer* a_node, const scarab::param_node& a_config ) const
123  {
124  LDEBUG( plog, "Configuring data_producer with:\n" << a_config );
125  a_node->set_length( a_config.get_value( "length", a_node->get_length() ) );
126  a_node->set_data_size( a_config.get_value( "data-size", a_node->get_data_size() ) );
127  return;
128  }
129 
130  void data_producer_binding::do_dump_config( const data_producer* a_node, scarab::param_node& a_config ) const
131  {
132  LDEBUG( plog, "Dumping data_producer configuration" );
133  a_config.add( "length", scarab::param_value( a_node->get_length() ) );
134  a_config.add( "data-size", scarab::param_value( a_node->get_data_size() ) );
135  return;
136 
137  }
138 
139 } /* namespace dripline */
static scarab::logger plog("data_producer")
virtual void initialize()
void initialize_block(memory_block *a_block)
virtual void do_apply_config(data_producer *a_node, const scarab::param_node &a_config) const
A producer to use for debugging: continously outputss identical blank data.
static scarab::logger plog("batch_executor")
virtual void do_dump_config(const data_producer *a_node, scarab::param_node &a_config) const
REGISTER_NODE_AND_BUILDER(data_producer, "data-producer", data_producer_binding)
virtual void finalize()
LOGGER(plog, "egg_writer")
void resize(size_t a_n_bytes)
Definition: memory_block.cc:27
virtual void execute(midge::diptera *a_midge=nullptr)