ECS FoE API Example
1 Example project
There is no EoE Example available. Take the source from ECS simpleConfig Example
2 Configuration packet
For FoE it is necessary to change the EtherCAT Set Configuration Packet.
add ECAT_SET_CONFIG_FOE flag:
ptConfigReq->tData.tBasicCfg.ulComponentInitialization |= ECAT_SET_CONFIG_DEVICEINFO | ECAT_SET_CONFIG_FOE;
ECAT_SET_CONFIG_FOE_T* ptFoe;
ptFoe = &ptConfigReq->tData.tComponentsCfg.tFoECfg;
ptFoe->ulTimeout=1000;
3 ESI
Add in the following FoE parameters to the ESI, in the Mailbox area:
<Mailbox DataLinkLayer="1">
  <FoE/>
...
</Mailbox>
4 Register File Indication Request
For example:
uint32_t AppECS_RegisterFileIndication(CIFX_PACKET* ptPkt)
{
 uint32_t ulRet = SUCCESS_HIL_OK;
 ECAT_FOE_REGISTER_FILE_INDICATIONS_REQ_T * ptFoeFileInd = ( ECAT_FOE_REGISTER_FILE_INDICATIONS_REQ_T * ) ptPkt;
 memset( ptFoeFileInd, 0, sizeof(ECAT_FOE_REGISTER_FILE_INDICATIONS_REQ_T) );
 ptFoeFileInd->tHead.ulDest = HIL_PACKET_DEST_DEFAULT_CHANNEL;
 ptFoeFileInd->tHead.ulCmd = ECAT_FOE_REGISTER_FILE_INDICATIONS_REQ;
 ptFoeFileInd->tHead.ulLen = 1+ sizeof("Examplefile.txt")-1;
 ptFoeFileInd->tData.bIndicationType = ECAT_FOE_INDICATION_TYPE_VIRTUAL_FILE;
 memcpy( ptFoeFileInd->tData.abFilename, "Examplefile.txt", sizeof("Examplefile.txt"));
 return ulRet;
}
5 Packet Handler and ECAT_FOE_WRITE_FILE_IND
...
   case ECAT_FOE_WRITE_FILE_IND:
     AppECS_HanldeFoeWriteFileIndication(ptAppData, &ptAppData->aptChannels[ECS_DEMO_CHANNEL_INDEX]->tPacket);
     fPacketCouldBeHandled = true;
     break;
...
and
int32_t AppECS_HanldeFoeWriteFileIndication(APP_DATA_T *ptAppData, CIFX_PACKET* ptPkt)
{
 ptPkt->tHeader.ulLen   = 0;
 ptPkt->tHeader.ulState = SUCCESS_HIL_OK;
 ptPkt->tHeader.ulCmd  |= 0x01; /* Make it a response */
 Pkt_SendPacket(ptAppData, ECS_DEMO_CHANNEL_INDEX , ptPkt, TX_TIMEOUT);
 return 0;
}
6 Call after Channel Init the function AppECS_RegisterFileIndication
 App_SysPkt_AssembleChannelInitReq(ptPacket);
 ulRet = Pkt_SendReceivePacket(ptAppData, ECS_DEMO_CHANNEL_INDEX, ptPacket, TXRX_TIMEOUT);
 if( ulRet != CIFX_NO_ERROR )
    return ulRet;
 AppECS_RegisterFileIndication(ptPacket);
 ulRet = Pkt_SendReceivePacket(ptAppData, ECS_DEMO_CHANNEL_INDEX, ptPacket, TXRX_TIMEOUT);
   if( ulRet != CIFX_NO_ERROR )
     return ulRet;
 App_SysPkt_AssembleStartStopCommReq(ptPacket, true);
 ulRet = Pkt_SendReceivePacket(ptAppData, ECS_DEMO_CHANNEL_INDEX, ptPacket, TXRX_TIMEOUT);
 if( ulRet != CIFX_NO_ERROR )
    return ulRet;
7 Twincat3
7 Packet Handler and ECAT_FOE_READ_FILE_IND
   case ECAT_FOE_READ_FILE_IND:
     AppECS_HanldeFoeReadFileIndication(ptAppData, &ptAppData->aptChannels[ECS_DEMO_CHANNEL_INDEX]->tPacket);
     fPacketCouldBeHandled = true;
     break;
and
int32_t AppECS_HanldeFoeReadFileIndication(APP_DATA_T *ptAppData, CIFX_PACKET* ptPkt)
{
 ECAT_FOE_READ_FILE_IND_T *ptReadfileInd= (ECAT_FOE_READ_FILE_IND_T *) ptPkt;
 ECAT_FOE_READ_FILE_RES_T *ptReadfileRes= (ECAT_FOE_READ_FILE_RES_T *) ptPkt;
 ptReadfileRes->tHead.ulSta = SUCCESS_HIL_OK;
 ptReadfileRes->tHead.ulCmd |= 0x01; /* Make it a response */
 if (ptReadfileInd->tData.ulPassword == 0x1234)
 {
   ptReadfileRes->tHead.ulLen = sizeof("Hello World");
   memcpy( ptReadfileRes->tData.abData, "Hello World", sizeof("Hello World"));
 }
 else
 {
   ptReadfileRes->tHead.ulLen = 0;
 }
 Pkt_SendPacket(ptAppData, ECS_DEMO_CHANNEL_INDEX , ptPkt, TX_TIMEOUT);
 return 0;
}
7 TwinCAT
on Desktop is not the file Examplefile.txt with "Hello World"