blob: 5cf3b0146dfb06a20d631010cef142661f53b970 [file] [log] [blame]
/**
* @author generated by eTrice
*
* Source File of ProtocolClass PTimer
*
*/
#include "PTimer.h"
#include "common/debugging/DebuggingService.h"
#include "common/debugging/MSCFunctionObject.h"
#include "common/messaging/AbstractMessageReceiver.h"
#include "common/messaging/Address.h"
#include "common/messaging/Message.h"
#include "common/modelbase/IEventReceiver.h"
using namespace etRuntime;
/* message names as strings for debugging (generate MSC) */
const String PTimer::s_messageStrings[] = {"MIN", "timeout", "startTimer","startTimeout","kill","MAX"};
const String& PTimer::getMessageString(int msg_id) {
if ((MSG_MIN < msg_id ) && ( msg_id < MSG_MAX )) {
return s_messageStrings[msg_id];
} else {
// id out of range
static const String errorMsg = "Message ID out of range";
return errorMsg;
}
}
//------------------------------------------------------------------------------------------------------------
// port class
//------------------------------------------------------------------------------------------------------------
PTimerPort::PTimerPort(IInterfaceItemOwner* actor, const String& name, int localId)
: PortBase(actor, name, localId, 0)
{
}
PTimerPort::PTimerPort(IInterfaceItemOwner* actor, const String& name, int localId, int idx)
: PortBase(actor, name, localId, idx)
{
}
void PTimerPort::destroy() {
DebuggingService::getInstance().removePortInstance(*this);
PortBase::destroy();
}
void PTimerPort::receive(const Message* msg) {
// TODO JH further
if (! PTimer::isValidIncomingEvtID(msg->getEvtId())) {
//std::cout << "unknown" << std::endl;
}
DebuggingService::getInstance().addMessageAsyncIn(getPeerAddress(), getAddress(), PTimer::getMessageString(msg->getEvtId()).c_str());
getActor()->receiveEvent(this, msg->getEvtId(), msg->getData());
}
// sent messages
void PTimerPort::timeout() {
timeout_impl();
}
void PTimerPort::timeout_impl() {
DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
PTimer::getMessageString(PTimer::OUT_timeout).c_str());
if (getPeerAddress().isValid()) {
Message* buffer = dynamic_cast<IMessageService*>(getPeerMsgReceiver())->getMessageBuffer(sizeof(Message));
if (buffer) {
getPeerMsgReceiver()->receive(new (buffer) Message(getPeerAddress(), PTimer::OUT_timeout));
}
}
}
//------------------------------------------------------------------------------------------------------------
// replicated port class
//------------------------------------------------------------------------------------------------------------
PTimerReplPort::PTimerReplPort(IInterfaceItemOwner* actor, const String& name, int localId) :
ReplicatedPortBase(actor, name, localId)
{
}
// outgoing messages
void PTimerReplPort::timeout(){
for (Vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {
(dynamic_cast<PTimerPort*>(*it))->timeout();
}
}
//------------------------------------------------------------------------------------------------------------
// conjugated port class
//------------------------------------------------------------------------------------------------------------
PTimerConjPort::PTimerConjPort(IInterfaceItemOwner* actor, const String& name, int localId)
: PortBase(actor, name, localId, 0)
, status(0)
{
}
PTimerConjPort::PTimerConjPort(IInterfaceItemOwner* actor, const String& name, int localId, int idx)
: PortBase(actor, name, localId, idx)
, status(0)
{
}
void PTimerConjPort::destroy() {
DebuggingService::getInstance().removePortInstance(*this);
PortBase::destroy();
}
void PTimerConjPort::receive(const Message* msg) {
// TODO JH further
if (! PTimer::isValidOutgoingEvtID(msg->getEvtId())) {
//std::cout << "unknown" << std::endl;
}
DebuggingService::getInstance().addMessageAsyncIn(getPeerAddress(), getAddress(), PTimer::getMessageString(msg->getEvtId()).c_str());
switch (msg->getEvtId()) {
case PTimer::OUT_timeout:
{
//TODO: clear active bit in case of single shot timer
if (status!=0){
if (status==ET_TIMER_RUNNING){
// single shot timer
status=0;
}
// msg to fsm
getActor()->receiveEvent(this, msg->getEvtId(), msg->getData());
}
}
break;
default:
getActor()->receiveEvent(this, msg->getEvtId(), msg->getData());
break;
}
}
/*--------------------- operations ---------------------*/
// sent messages
void PTimerConjPort::startTimer(uint32 transitionData) {
if (status==0){
status=ET_TIMER_RUNNING | ET_TIMER_PERIODIC;
startTimer_impl(transitionData);
}
}
void PTimerConjPort::startTimer_impl(uint32 transitionData) {
DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
PTimer::getMessageString(PTimer::IN_startTimer).c_str());
if (getPeerAddress().isValid()) {
Message* buffer = dynamic_cast<IMessageService*>(getPeerMsgReceiver())->getMessageBuffer(sizeof(DataMessage<uint32>));
if (buffer) {
getPeerMsgReceiver()->receive(new (buffer) DataMessage<uint32>(getPeerAddress(), PTimer::IN_startTimer, transitionData));
}
}
}
void PTimerConjPort::startTimeout(uint32 transitionData) {
if (status==0){
status = ET_TIMER_RUNNING;
startTimeout_impl(transitionData);
}
}
void PTimerConjPort::startTimeout_impl(uint32 transitionData) {
DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
PTimer::getMessageString(PTimer::IN_startTimeout).c_str());
if (getPeerAddress().isValid()) {
Message* buffer = dynamic_cast<IMessageService*>(getPeerMsgReceiver())->getMessageBuffer(sizeof(DataMessage<uint32>));
if (buffer) {
getPeerMsgReceiver()->receive(new (buffer) DataMessage<uint32>(getPeerAddress(), PTimer::IN_startTimeout, transitionData));
}
}
}
void PTimerConjPort::kill() {
if (status!=0){
status=0;
kill_impl();
}
}
void PTimerConjPort::kill_impl() {
DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
PTimer::getMessageString(PTimer::IN_kill).c_str());
if (getPeerAddress().isValid()) {
Message* buffer = dynamic_cast<IMessageService*>(getPeerMsgReceiver())->getMessageBuffer(sizeof(Message));
if (buffer) {
getPeerMsgReceiver()->receive(new (buffer) Message(getPeerAddress(), PTimer::IN_kill));
}
}
}
//------------------------------------------------------------------------------------------------------------
// conjugated replicated port class
//------------------------------------------------------------------------------------------------------------
PTimerConjReplPort::PTimerConjReplPort(IInterfaceItemOwner* actor, const String& name, int localId) :
ReplicatedPortBase(actor, name, localId)
{
}
// incoming messages
void PTimerConjReplPort::startTimer(uint32 transitionData){
for (Vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {
(dynamic_cast<PTimerConjPort*>(*it))->startTimer( transitionData);
}
}
void PTimerConjReplPort::startTimeout(uint32 transitionData){
for (Vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {
(dynamic_cast<PTimerConjPort*>(*it))->startTimeout( transitionData);
}
}
void PTimerConjReplPort::kill(){
for (Vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {
(dynamic_cast<PTimerConjPort*>(*it))->kill();
}
}