/* * QuadratureEncoderSetup.cpp * * Created on: 22 ÿíâ. 2020 ã. * Author: user */ #include "QuadratureEncoderSetup.hh" #include "../../systemic/ValueLazyFast.hpp" #include "../../systemic/Scheduler.hpp" #include "../../systemic/Process.hpp" #include "../../driver/EncoderQuadratureCounter.hh" bool application::board::QuadratureEncoderSetup::input( Environment & env ) { return grab( counter, env.rholder.getShared< peripheral::ICounter >( links.counter_id ) ) && grab( gpio_sel1, env.rholder.getShared< peripheral::IGpio >( links.sel1_pin_id ) ) && grab( gpio_sel2, env.rholder.getShared< peripheral::IGpio >( links.sel2_pin_id ) ); } void application::board::QuadratureEncoderSetup::build( Environment & env ) { typedef driver::derail::EncoderQuadratureCounter Encoder; gpio_sel1->write( config.sel1_active_level ); gpio_sel2->write( config.sel2_active_level ); Encoder * encoder_driver = memories::instance_object( env.static_object_ma, *counter ); Encoder::Setting encoder_setting = { .max_turn_value = config.max_turn_value, .line_in_turn = config.line_in_turn }; encoder_driver->configure( encoder_setting ); 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, *encoder_driver ), proc ); env.rholder.share( *encoder_driver, links.encoder_id ); typedef systemic::detail::ValueLazyFast< bool, Encoder, &Encoder::isFailure> FailureStatus; env.statuses.add( links.failure_id, memories::instance_object( env.static_setup_ma, *encoder_driver ) ); 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 ) ); } application::board::QuadratureEncoderSetup::QuadratureEncoderSetup( const Links & links, const Setting & config, const configuration::ProcessConfig & proc ) : links(links), config(config), params(proc), gpio_sel1(nullptr), gpio_sel2(nullptr), counter(nullptr) {}