69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
/*
|
|
* 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<Encoder>(
|
|
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<Encoder> >( env.static_object_ma, *encoder_driver ),
|
|
proc );
|
|
|
|
env.rholder.share<driver::IEncoder>( *encoder_driver, links.encoder_id );
|
|
|
|
typedef systemic::detail::ValueLazyFast< bool, Encoder, &Encoder::isFailure> FailureStatus;
|
|
env.statuses.add( links.failure_id, memories::instance_object<FailureStatus>( 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<EncoderAngle>( 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<EncoderTurn>( 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) {}
|