/*@@var:*/
/*
 * Node1 - MultiSection example node               Version 1.0
 *
 * Copyright 2006, Vector Informatik GmbH - All right reserved
 *
 * History:
 * 1.0 (Jr) Created 
 */
variables
{
  // Global variables
  int  gMID          = 0;
  char gNodeName[32] = "NodeA";

  // TX parameters
  J1587Param * TX_Param1 = { DLC = 255 };
}
/*@@end*/

/*@@j1587Param:J17081.J1587::CMP (0xC5),J1587::CDP (0xC6):*/
on J1587Param CMP, CDP
{
  J1587Param CMP rxCmp;
  J1587Param CMP txCmp;
  J1587Param CDP rxCdp;
  INT            i;
  BYTE           nextSegment;
  BYTE           numberOfSegments;
  WORD           numberOfDataBytes;

  if (this.J1587_PID == rxCmp.J1587_PID) {
    rxCmp.DWORD(0) = this.DWORD(0);
    rxCmp.DWORD(4) = this.DWORD(4);

    if (this.J1587_ReceiverMID != gMID) return;

    switch(rxCmp.CMCommand) {
      case 1: // RTS
        nextSegment       = 1;
        numberOfSegments  = rxCmp.RTSNumberOfSegments;
        numberOfDataBytes = rxCmp.RTSNumberOfDataBytes;

        txCmp.J1587_MID           = gMID;
        txCmp.ReceiverMID         = this.J1587_MID;
        txCmp.CMCommand           = txCmp.CMCommand::CTS;
        txCmp.CTSNextSegment      = nextSegment;
        txCmp.CTSNumberOfSegments = 1;
        txCmp.DLC                 = 4;
        output( txCmp );
        break;
    }
  }
  else {
    for( i = 0; i < this.dlc; i++ ) {
      rxCdp.byte(i) = this.byte(i);
    }

    if (this.J1587_ReceiverMID != gMID) return;

    if (rxCdp.SegmentID == nextSegment) {
      nextSegment++;
      if (nextSegment > numberOfSegments) {
        txCmp.J1587_MID           = gMID;
        txCmp.ReceiverMID         = this.J1587_MID;
        txCmp.CMCommand           = txCmp.CMCommand::EOM;
        txCmp.DLC                 = 2;
        output( txCmp );
      }
      else {
        txCmp.J1587_MID           = gMID;
        txCmp.ReceiverMID         = this.J1587_MID;
        txCmp.CMCommand           = txCmp.CMCommand::CTS;
        txCmp.CTSNextSegment      = nextSegment;
        txCmp.CTSNumberOfSegments = 1;
        txCmp.DLC                 = 4;
        output( txCmp );
      }
    }
    else {
      txCmp.J1587_MID           = gMID;
      txCmp.ReceiverMID         = this.J1587_MID;
      txCmp.CMCommand           = txCmp.CMCommand::Abort;
      txCmp.DLC                 = 2;
      output( txCmp );
    }
  }
}
/*@@end*/

/*@@caplFunc:Node1Init():*///function
void Node1Init()
{
  gMID = Node1.NmStationAddress;

  putValue( EvNode1_MID, gMID );
}
/*@@end*/

/*@@caplFunc:Node1StartUp():*///function
void Node1StartUp()
{
}
/*@@end*/

/*@@startStart:Start:*/
on start
{
  Node1Init();
  Node1StartUp();
}
/*@@end*/

/*@@j1587Param:*:*/
on J1587Param *
{
  if (this.DIR == RX) {
    putValue( EvNode1_RxSize, this.DLC );
    putValue( EvNode1_RxMID, this.J1587_MID );
  }
}
/*@@end*/

/*@@envVar:EvNode1_Send:*/
on envVar EvNode1_Send
{
  int i;

  if (getValue(this) == 1) {
    TX_Param1.J1587_MID         = gMID;
    TX_Param1.J1587_ReceiverMID = getValue( EvNode1_ReceiverMID );
    TX_Param1.DLC               = getValue( EvNode1_Size );
    TX_Param1.J1587_PID         = getValue( EvNode1_PID );

    // use setJ1587TP to disable transport protocol
    // 0 = default, select TP by receiver
    // 1 = do not use TP
    // 2 = use multisection protocol
    // 3 = use RTS/CTS protocol
    // setJ1587TP( TX_Param1, 0 );

    for( i = 0; i < TX_Param1.DLC; i++ ) {
      TX_Param1.BYTE(i) = i;
    }

    output( TX_Param1 );
  }
}
/*@@end*/

