MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/BiSSCMasterLogic.cpp
2024-06-07 11:12:56 +03:00

101 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* BiSSCMasterLogic.cpp
*
* Created on: 7 сент. 2021 г.
* Author: sozonov
*/
#include <cstring>
#include "BiSSCMasterLogic.hh"
driver::BiSSCMasterLogic::BiSSCMasterLogic( peripheral::ISerialPort *_serial_port, uint16_t _crc_polinom, std::pmr::memory_resource * memory_resource ) :
serial_port ( _serial_port ),
crc_type ( static_cast<CrcType>( _crc_polinom ) ),
data_lenght ( 0 ),
f_reading_data ( true ),
crc_size ( 6 ),
err_warn_size ( 2 ),
fE ( false ),
fW ( false ),
crc_error ( false ),
read_complete ( false ),
write_complete ( false ),
binary_sybscriber ( memory_resource ),
data_lenth_to_subscriber ( 0 )
{
//todo: определять длину crc полинома
// crc_size = 6;
}
void driver::BiSSCMasterLogic::addSubscriber( std::size_t bit_address, std::size_t bit_len, communication::IBinaryDataSubscriber * subscriber ) {
binary_sybscriber.addSubscriber(bit_address, bit_len, subscriber);
update_size( binary_sybscriber.getBitSize() );
}
void driver::BiSSCMasterLogic::process() {
uint16_t *pdata_for_cpy = data_first;
if( spi_tx_result ) {
//уточнить, как мы понимаем, что прочитали именно ту инфу, которую запросил конкретный абонент
if(serial_port->isDataReady()) {
if ( serial_port->receive( pdata_for_cpy ) ){
crc_error = parce( pdata_for_cpy );
binary_sybscriber.read( pdata_for_cpy, data_lenth_to_subscriber );
}
spi_tx_result = serial_port->transmite( tmp_data_to_transm, data_lenght );
}
} else {
spi_tx_result = serial_port->transmite( tmp_data_to_transm, data_lenght );
}
}
bool driver::BiSSCMasterLogic::parce( uint16_t *data ) {
uint16_t crc_checksumm;
uint16_t tmp_array[32] = {};
uint16_t bits_copy_counter = 0;
while ( bits_copy_counter < data_lenght - err_warn_size - crc_size ) {
tmp_array[bits_copy_counter / 16] |= data[bits_copy_counter / 16] & ( 0x1 << static_cast<uint16_t>( 15 - bits_copy_counter % 16 ) );
bits_copy_counter++;
}
fE = data[bits_copy_counter / 16] & ( 0x1 << static_cast<uint16_t>( 15 - bits_copy_counter % 16 ) );
bits_copy_counter++;
fW = data[bits_copy_counter / 16] & ( 0x1 << static_cast<uint16_t>( 15 - bits_copy_counter % 16 ) );
bits_copy_counter++;
while ( bits_copy_counter < data_lenght ) {
crc_checksumm |= data[bits_copy_counter / 16] & ( 0x1 << static_cast<uint16_t>( 15 - bits_copy_counter % 16 ) );
bits_copy_counter++;
}
//todo: проверка CRC : Crc.hpp и CrcDesc.hpp вернуть из функции результат проверки crc (tasks: UFC-677, UFC-680)
std::memcpy( data, tmp_array, size_of_array );
return true;
}
void driver::BiSSCMasterLogic::update_size( std::size_t binary_sybscriber_BitSize ) {
data_lenght = binary_sybscriber_BitSize + err_warn_size + crc_size ;
data_lenth_to_subscriber = ( binary_sybscriber_BitSize + ( ( binary_sybscriber_BitSize ) % CHAR_BIT ) ) / CHAR_BIT ;
}