MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/application/drivers/ModbusRtuInitializer.cpp

83 lines
2.8 KiB
C++

/*
* ModBusRtuSetup.cpp
*
* Created on: 3 èþë. 2020 ã.
* Author: s.maksimenko
*/
#include "ModbusRtu.hh"
#include "../../systemic/Process.hpp"
#include "../../driver/ModbusRtu.hh"
#include "../../systemic/ValueLazyFast.hpp"
namespace application {
namespace drivers {
bool ModbusRtu::input( Environment & env ) {
return grab ( mpPort, env.rholder.getShared<peripheral::IUartPort> ( links.uart ) ) &&
grab ( mpMemRes, env.rholder.getShared<std::pmr::memory_resource> ( links.memory ) ) &&
(mpStsAddrValid = env.statuses.get ( links.enable )) &&
(mpSigAddrModBus = env.signals.get ( links.address ));
}
ModbusRtu::ModbusRtu ( const Links & links, const Setting & sett,
const configuration::ProcessConfig & proc ) : links(links), params(proc), cfg(sett) {}
void ModbusRtu::build( Environment & env ) {
using driver::modbus::ModBusRtu;
using memories::instance_object;
using peripheral::IUartPort;
typedef driver::modbus::ModBusAdu::ModbusCrc CrcType;
common::crc::CrcTable<CrcType>::Instance().inititialize();
uint16_t addrModBus = cfg.address ? cfg.address : *mpSigAddrModBus;
ModBusRtu * pModBusRtu = instance_object<ModBusRtu>(env.static_object_ma,
addrModBus,
*mpPort,
mpMemRes );
systemic::IProcess & modbusProcess =
*instance_object< systemic::Process<ModBusRtu> >(env.static_object_ma, *pModBusRtu);
systemic::ProcScheduler::ProcessParameter modbusProcParam = {
.priority = params.priority,
.period = params.period,
.phase = params.phase,
.controlled = false
};
env.scheduler.registerProcess(params.processor_id, modbusProcess, modbusProcParam);
env.rholder.share<driver::modbus::IModBus>( *pModBusRtu, links.modbus_rtu );
typedef systemic::detail::ValueLazyFast<float, ModBusRtu, &ModBusRtu::getPacketCounter> PacketCounter;
PacketCounter * counter = memories::instance_object<PacketCounter>( env.static_setup_ma, *pModBusRtu );
env.signals.add( links.packet_counter, counter->getValue(), counter->getValueOverride(), counter->getBase() );
typedef systemic::detail::ValueLazyFast<bool, ModBusRtu, &ModBusRtu::isCrcError> CrcError;
CrcError * crc_error = memories::instance_object<CrcError>( env.static_setup_ma, *pModBusRtu );
typedef systemic::detail::ValueLazyFast<bool, ModBusRtu, &ModBusRtu::isException> Exception;
Exception * exception = memories::instance_object<Exception>( env.static_setup_ma, *pModBusRtu );
env.statuses.add( links.crc_error, crc_error->getValue(), crc_error->getValueOverride(), crc_error->getBase() );
env.statuses.add( links.incorrect_request, exception->getValue(), exception->getValueOverride(), exception->getBase() );
}
}// namespace drivers
}// namespace application