/*
 * ENIで設定されたスレーブ情報を管理するクラスヘッダー
 * SlaveConfigInfo.cpp
 *
 *  Created on: 2018/09/26
 *      Author: shingo
 */

#include <AtEthercat.h>

#include <ti/drv/uart/UART.h>
#include <ti/drv/uart/UART_stdio.h>

#include "SlaveConfigInfo.h"

/**
 * コンストラクタ
 */
SlaveConfigInfo::SlaveConfigInfo()
{
    // TODO Auto-generated constructor stub

}

/**
 * デストラクタ
 */
SlaveConfigInfo::~SlaveConfigInfo()
{
    // TODO Auto-generated destructor stub
}

/**
 * ENIファイル情報をクラウス内に読み込む
 */
void SlaveConfigInfo::readEniInfo() {
    // 定義スレーブ数の取得
    slaveCount = ecatGetNumConfiguredSlaves();
    // スレーブ情報リストの格納メモリを用意
    int listLen = sizeof(EC_T_CFG_SLAVE_INFO) * slaveCount;
    slaveInfoList = (EC_T_CFG_SLAVE_INFO*)malloc(listLen);

    // オートインクリメントアドレスを使用して、順に取得する
    // 0〜(スレーブ数-1)と思うが、0からスレーブ個数の情報取得までのループとする
    EC_T_DWORD infIdx = 0;
    for (int addr = 0; addr < 65535;addr++) {
        EC_T_DWORD stat = ecatGetCfgSlaveInfo(EC_FALSE, addr, &slaveInfoList[infIdx]);

        if (stat == EC_E_NOTFOUND) {
            infIdx++;
            if (infIdx == slaveCount) {
                break;
            }
        } else {
            UART_printf("Slave information not found. autoInc Val=%d\n", addr);
        }
    }
    if (infIdx != slaveCount) {
        UART_printf("All slave information not found. (found/define)=%d/%d\n", infIdx, slaveCount);
    }
}


void SlaveConfigInfo::print() {

    for (EC_T_DWORD idx = 0; idx < slaveCount; idx++) {
        EC_T_CFG_SLAVE_INFO* infPtr = &slaveInfoList[idx];

        UART_printf("venderID   : %d \n", infPtr->dwVendorId);
        UART_printf("slaveID    : %d \n", infPtr->dwSlaveId);
        UART_printf("autoIncAddr: %d \n", infPtr->wAutoIncAddress);
        UART_printf("phyAddr    : %d \n", infPtr->wStationAddress);
        UART_printf("\n");
    }
}
