90 lines
2.0 KiB
C++
90 lines
2.0 KiB
C++
|
||
|
||
/*
|
||
* CommunicationLink.cpp
|
||
*
|
||
* Created on: 31 марта 2017 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#include "../service/CommunicationLink.hh"
|
||
|
||
namespace communication { namespace service {
|
||
|
||
CommunicationLink::CommunicationLink( driver::ISlipCommunication & isc, Subscrib * subs, std::size_t max_subs ) :
|
||
communication(isc), answer_created(false), message_handled(false),
|
||
count_subscriber(0), subscribers(subs), max_subscribers(max_subs),
|
||
packet_id(0u), free_counter(0) {}
|
||
|
||
driver::IRxLink & CommunicationLink::getData() {
|
||
|
||
return communication;
|
||
|
||
}
|
||
|
||
driver::ITxLink & CommunicationLink::createMessage( std::size_t size ) {
|
||
|
||
answer_created = communication.sendHead( packet_id | 0x8000u, size * 2 );
|
||
return communication;
|
||
|
||
}
|
||
|
||
bool CommunicationLink::registerMessageHandler( IMessageHandler * handler, size_t id ) {
|
||
|
||
if( count_subscriber < max_subscribers ) {
|
||
Subscrib & subscrib( subscribers[count_subscriber++] );
|
||
subscrib.handler = handler;
|
||
subscrib.id = static_cast<int>(id);
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
|
||
}
|
||
|
||
void CommunicationLink::send_answer()
|
||
{
|
||
message_handled = ( answer_created = not communication.sendEnd() );
|
||
}
|
||
|
||
void CommunicationLink::process() {
|
||
|
||
std::pair<bool, unsigned short> packet_info = communication.isPacketAvailable();
|
||
|
||
if( packet_info.first ) {
|
||
free_counter++;
|
||
|
||
packet_id = packet_info.second;
|
||
|
||
for( unsigned int i = 0; i < count_subscriber; i++ )
|
||
if( subscribers[i].id == packet_id && subscribers[i].handler ) {
|
||
subscribers[i].handler->handler(this);
|
||
message_handled = true;
|
||
}
|
||
|
||
communication.recieveReset();
|
||
}
|
||
|
||
if( message_handled and answer_created )
|
||
send_answer();
|
||
|
||
if( message_handled and not answer_created )
|
||
send_default();
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
void communication::service::CommunicationLink::send_default() {
|
||
|
||
message_handled = not( communication.sendHead( packet_id | 0x8000u, 0 ) and communication.sendEnd() );
|
||
}
|
||
|
||
float communication::service::CommunicationLink::getPacketCounter() const {
|
||
|
||
return free_counter;
|
||
|
||
}
|