/*-----------------------------------------------------------------------------
 * EC-Master-CANopenMasterEL6751.cpp
 * Copyright                acontis technologies GmbH, Ravensburg, Germany
 * Response                 Holger Oelhaf
 * Description              EC-Master code snippet
 *---------------------------------------------------------------------------*/

/* communicate with a CANopen bus coupler BK51x0 via CANopen Master EL6751 with AoE */
{
    EC_T_DWORD dwSlaveId = ecatGetSlaveId(1002);
    EC_T_BYTE  abyData[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
    EC_T_DWORD dwDataOutLen = 0;
    EC_T_DWORD dwCANObjIdx = 0;
    EC_T_DWORD dwCANObjSubIdx = 0;
    EC_T_WORD  wAdsPort = 4097;
    EC_T_DWORD dwAdsError = 0;
    EC_T_DWORD dwAdsCmdResult = 0;
    EC_T_AOE_NETID AoeNetId;
    OsMemset(&AoeNetId, 0, sizeof(EC_T_AOE_NETID));
    dwRes = ecatAoeGetSlaveNetId(dwSlaveId, &AoeNetId);
    if (dwRes != EC_E_NOERROR)
    {
        EcLogMsg(EC_LOG_LEVEL_ERROR, (pEcLogContext, EC_LOG_LEVEL_ERROR, "Cannot read AoE net id %s (0x%lx))\n", ecatGetText(dwRes), dwRes));
    }

    /* read device name */
    dwCANObjIdx = 0x1008;
    dwCANObjSubIdx = 0;
    dwRes = ecatAoeRead(dwSlaveId, &AoeNetId, wAdsPort, dwCANObjIdx, dwCANObjSubIdx, sizeof(abyData), abyData, &dwDataOutLen, &dwAdsError, &dwAdsCmdResult, 5000);
    if (dwRes != EC_E_NOERROR)
    {
        EcLogMsg(EC_LOG_LEVEL_ERROR, (pEcLogContext, EC_LOG_LEVEL_ERROR, "Cannot read AoE object (0x%lx))\n", ecatGetText(dwRes), dwRes));
    }
    EcLogMsg(EC_LOG_LEVEL_ANY, (pEcLogContext, EC_LOG_LEVEL_ANY, "CANopen device name: %s\n", abyData));

    /* read terminal identifiers */
    for (EC_T_DWORD i = 0; i < 255; i++)
    {
        EC_T_WORD wTerminalId = 0;
        EC_T_DWORD dwBusNodeReg = 0;
        dwBusNodeReg |= (9 << 24);   /* table number */
        dwBusNodeReg |= (i << 16);   /* register number */

        /* read request */
        dwCANObjIdx = 0x4500;
        dwCANObjSubIdx = 0;
        dwRes = ecatAoeWrite(dwSlaveId, &AoeNetId, wAdsPort, dwCANObjIdx, dwCANObjSubIdx, sizeof(EC_T_DWORD), (EC_T_BYTE*)&dwBusNodeReg, &dwAdsError, &dwAdsCmdResult, 5000);
        if (dwRes != EC_E_NOERROR)
        {
            EcLogMsg(EC_LOG_LEVEL_ERROR, (pEcLogContext, EC_LOG_LEVEL_ERROR, "Cannot write AoE object (0x%lx))\n", ecatGetText(dwRes), dwRes));
            break;
        }
        /* read response */
        dwRes = ecatAoeRead(dwSlaveId, &AoeNetId, wAdsPort, dwCANObjIdx, dwCANObjSubIdx, sizeof(abyData), abyData, &dwDataOutLen, &dwAdsError, &dwAdsCmdResult, 5000);
        if (dwRes != EC_E_NOERROR)
        {
            EcLogMsg(EC_LOG_LEVEL_ERROR, (pEcLogContext, EC_LOG_LEVEL_ERROR, "Cannot read AoE object (0x%lx))\n", ecatGetText(dwRes), dwRes));
            break;
        }
        wTerminalId = EC_GETWORD(abyData);
        EcLogMsg(EC_LOG_LEVEL_ANY, (pEcLogContext, EC_LOG_LEVEL_ANY, "CANopen terminal identifier: 0x%x\n", wTerminalId));
        if (0 == wTerminalId)
        {
            /* no more terminals found */
            break;
        }
    }
}