/* * BinaryEncoderInitializer.cpp * * Created on: 23 θών. 2023 γ. * Author: titov */ #include "BinaryEncoder.hh" #include "../../driver/BinaryEncoder.hpp" enum EncoderType { Binary, Grey }; driver::detail::BinaryEncoderInterface * instance_encoder( std::pmr::memory_resource & mr, communication::format::bits::bitsize angle_size, communication::format::bits::bitsize turn_size, bool inversion, EncoderType encoder_type ); bool application::board::BinaryEncoder::input( Environment & env ) { return grab( data_master, env.rholder.getShared( links.data_master ) ); } void application::board::BinaryEncoder::build( Environment & env ) { Local local_data_master( data_master, *env.rholder.getShared( links.data_master ) ); EncoderType encoder_type = static_cast(config.encoder_type); driver::detail::BinaryEncoderInterface * encoder = instance_encoder( env.static_object_ma, config.agnle_bitsize, config.turn_bitsize, config.inversion, encoder_type ); local_data_master->addSubscriber( config.frame_bitoffset, config.frame_bitsize, encoder ); env.rholder.share( *encoder, links.encoder ); } application::board::BinaryEncoder::BinaryEncoder( const Links & links, const Setting & config ) : links(links), config(config) {} driver::detail::BinaryEncoderInterface * instance_encoder( std::pmr::memory_resource & allocator, communication::format::bits::bitsize angle_size, communication::format::bits::bitsize turn_size, bool inversion, EncoderType encoder_type ) { driver::detail::BinaryEncoderInterface * interface = nullptr; switch(encoder_type) { case Binary: { if( angle_size + turn_size <= 16 ) { typedef driver::detail::BinaryEncoder DBE16; typedef driver::detail::BinaryEncoderInverted IBE16; if( not inversion ) interface = memories::instance_object( allocator, angle_size, turn_size ); else interface = memories::instance_object( allocator, angle_size, turn_size ); } else if( angle_size + turn_size <= 32 ) { typedef driver::detail::BinaryEncoder DBE32; typedef driver::detail::BinaryEncoderInverted IBE32; if( not inversion ) interface = memories::instance_object( allocator, angle_size, turn_size ); else interface = memories::instance_object( allocator, angle_size, turn_size ); } else if( angle_size + turn_size <= 64 ) { typedef driver::detail::BinaryEncoder DBE64; typedef driver::detail::BinaryEncoderInverted IBE64; if( not inversion ) interface = memories::instance_object( allocator, angle_size, turn_size ); else interface = memories::instance_object( allocator, angle_size, turn_size ); } } break; case Grey: {} break; } return interface; }