#include <iostream>
#include <string>
enum sample_state_t
{
DEFAULT_STATE,
FIRST_STATE,
SECOND_STATE,
};
struct my_message
{
int m_x;
};
struct my_another_message
{
std::string m_s;
};
{
public:
my_agent_t( context_t ctx );
void change_state_event_handler( sample_state_t next_state );
void my_event_handler( const my_message & message );
void my_another_event_handler( const my_another_message & message );
private:
const state_t st_first{ this, "first" };
const state_t st_second{ this, "second" };
};
my_agent_t::my_agent_t( context_t ctx )
:
so_5::agent_t{ std::move(ctx) }
{}
void my_agent_t::so_define_agent()
{
std::cout << "so_define_agent()" << std::endl;
st_first.event( &my_agent_t::change_state_event_handler );
st_second.event( &my_agent_t::change_state_event_handler );
so_default_state().event( &my_agent_t::change_state_event_handler );
std::cout << "\tsubscribe my_event_handler in "
<< st_first.query_name() << std::endl;
st_first.event( &my_agent_t::my_event_handler );
std::cout << "\tsubscribe my_another_event_handler in "
<< st_first.query_name() << std::endl;
st_first.event( &my_agent_t::my_another_event_handler );
std::cout << "\tsubscribe my_event_handler in "
<< st_second.query_name() << std::endl;
st_second.event( &my_agent_t::my_event_handler );
}
void my_agent_t::so_evt_start()
{
std::cout << "so_evt_start()" << std::endl;
std::cout << "\tsend the first sample_state_t for state changes" << std::endl;
so_5::send< sample_state_t >( *this, FIRST_STATE );
}
void my_agent_t::change_state_event_handler( sample_state_t next_state )
{
std::cout << "change_state_event_handler()" << std::endl;
if( DEFAULT_STATE == next_state )
{
this >>= so_default_state();
std::cout << "\tswitched to default state and shutdown..." << std::endl;
so_environment().stop();
}
else
{
if( FIRST_STATE == next_state )
{
this >>= st_first;
std::cout << "\tswitched to " << so_current_state().query_name()
<< std::endl;
so_5::send< my_message >( *this, 42 );
so_5::send< my_another_message >( *this, "SObjectizer" );
std::cout << "\tmessages sent" << std::endl;
so_5::send< sample_state_t >( *this, SECOND_STATE );
}
else if( SECOND_STATE == next_state )
{
this >>= st_second;
std::cout << "\tswitched to " << so_current_state().query_name()
<< std::endl;
so_5::send< my_message >( *this, -42 );
so_5::send< my_another_message >( *this, "rezitcejbOS" );
std::cout << "\tmessages sent" << std::endl;
so_5::send< sample_state_t >( *this, DEFAULT_STATE );
}
}
}
void my_agent_t::my_event_handler( const my_message & message )
{
std::cout << "my_event_handler()" << std::endl;
std::cout
<< "\tcurrent state is " << so_current_state().query_name() << std::endl
<<
"\tmessage.x = " <<
message.m_x << std::endl;
}
void my_agent_t::my_another_event_handler( const my_another_message & message )
{
std::cout << "my_another_event_handler()" << std::endl;
std::cout
<< "\tcurrent state is " << so_current_state().query_name() << std::endl
<<
"\tmessage.s = " <<
message.m_s << std::endl;
}
int main()
{
try
{
{
} );
}
catch( const std::exception & ex )
{
std::cerr << "Error: " << ex.what() << std::endl;
return 1;
}
return 0;
}