/* * SecondaryEncoderSetup.cpp * * Created on: 20 мар. 2019 г. * Author: krugliy */ #include "SecondaryEncoderSetup.hh" #include "../../common/Codec.hpp" #include "../../systemic/Scheduler.hpp" #include "../../systemic/Process.hpp" #include "../../driver/SerialPortAdapter.hpp" #include "../../driver/EncoderEncoderDataParser.hpp" #include "../../driver/EncoderSsi.hpp" typedef uint32_t SSI32_Frame; const short ssi_frame_size = 32; typedef driver::SerialPortAdapter SerialPortRegister; template<> uint16_t SerialPortRegister::temp = 0; bool application::board::SecondaryEncoderSetup::input(Environment& env) { return grab( serial_port, env.rholder.getShared< peripheral::ISerialPort >( links.serial_port_id ) ) && grab( de_pin, env.rholder.getShared< peripheral::IGpio >( links.de_pin_id ) ) && grab( power_pin, env.rholder.getShared< peripheral::IGpio >( links.power_pin_id ) ) && grab( cs21_pin, env.rholder.getShared< peripheral::IGpio >( links.cs21_id ) ) && grab( cs22_pin, env.rholder.getShared< peripheral::IGpio >( links.cs22_id ) ) ; } bool application::board::SecondaryEncoderSetup::prepare() { return true; } #include "../../systemic/ValueLazyFast.hpp" void application::board::SecondaryEncoderSetup::build(Environment& env) { de_pin->write( config.de_active_level ); power_pin->write( config.power_pin_active_level ); cs21_pin->write( config.cs21_active_level ); cs22_pin->write( config.cs22_active_level ); const systemic::time_t update_period = config.update_period * 1000.0f; SSI32_Frame default_frame = 0; SerialPortRegister * obj = memories::instance_object( env.static_object_ma, *serial_port, ssi_frame_size, update_period, default_frame, default_frame, default_frame ); systemic::ProcScheduler::ProcessParameter proc = { .priority = params.priority, .period = params.period, .phase = params.phase, .controlled = false }; env.scheduler.registerProcess( params.processor_id, *memories::instance_object< systemic::Process >( env.static_object_ma, *obj ), proc ); typedef codec::GrayCodeDecoder DecoderType; typedef driver::EncoderDataParser::ParserType EncoderDataParserType; DecoderType decoder; EncoderDataParserType * encoder_data_parser = memories::instance_object( env.static_object_ma, decoder //codec::GrayCodeDecoder() ); EncoderDataParserType::Setting parser_setting; { parser_setting.turn_bit_len = config.turn_bit_len, parser_setting.angle_bit_len = config.angle_bit_len, parser_setting.error_bit_len = config.error_bit_len; }; encoder_data_parser->cofigure( parser_setting ); typedef driver::detail::EncoderSsi, EncoderDataParserType> Encoder; driver::detail::EncoderSsiConfig::Config encoder_config; const short ssi_bit_len = config.turn_bit_len + config.angle_bit_len + config.error_bit_len; { encoder_config.num_error = 2; encoder_config.max_angle_delta = 6.28f; encoder_config.ssi_data_bit_len = ssi_bit_len; encoder_config.max_turn_bit = config.turn_bit_len; //todo: WTF? encoder_config.frame_size = ssi_frame_size; encoder_config.ssi_extra_bit = 0; encoder_config.shift_count = config.shift_bit_count; encoder_config.inverse = false; encoder_config.swap_bytes = true; } Encoder * encoder_driver = memories::instance_object( env.static_object_ma, *encoder_data_parser, *obj, encoder_config ); env.scheduler.registerProcess( params.processor_id, *memories::instance_object< systemic::Process >( env.static_object_ma, *encoder_driver ), proc ); env.rholder.share( *encoder_driver, links.secondary_encoder_id ); //Регистрация сигналов для демо версии: typedef systemic::detail::ValueLazyFast< float, Encoder, &Encoder::getAngle> EncoderAngle; env.signals.add( links.encoder_angle_sig_id, memories::instance_object( env.static_setup_ma, *encoder_driver ) ); typedef systemic::detail::ValueLazyFast< float, Encoder, &Encoder::getTurn> EncoderTurn; env.signals.add( links.encoder_turn_sig_id, memories::instance_object( env.static_setup_ma, *encoder_driver ) ); typedef systemic::detail::ValueLazyFast< float, Encoder, &Encoder::getErrorCode> EncoderErr; env.signals.add( links.encoder_err_sig_id, memories::instance_object( env.static_setup_ma, *encoder_driver ) ); } application::board::SecondaryEncoderSetup::SecondaryEncoderSetup( const Links& links, const Setting& config, const configuration::ProcessConfig& proc) : links(links), config(config), params(proc), serial_port(nullptr), de_pin(nullptr), power_pin(nullptr), cs21_pin(nullptr), cs22_pin(nullptr) {}