/*******************************************************************************
 * Copyright (c) 2013 fortiss GmbH, 2018 TU Vienna/ACIN
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Alois Zoitl
 *      - initial implementation and rework communication infrastructure
 *    Martin Melik Merkumians
 *      - fixes event chain initialisation, adds typifyAnyAdapter
 *******************************************************************************/
#ifndef ANYADAPTER_H_
#define ANYADAPTER_H_

#include "adapter.h"

/*! \brief A generic adapter that behaves similar to the ANY data type and allows all other adapters to be connected.
 *
 *  The main use of such an adapter is in service interfaces that provide generic services based on the adapter connected.
 */

class CAnyAdapter : public CAdapter{
  DECLARE_ADAPTER_TYPE(CAnyAdapter)

  public:
    CAnyAdapter(CStringDictionary::TStringId pa_anAdapterInstanceName, CResource *pa_poSrcRes, bool pa_bIsPlug);
    virtual ~CAnyAdapter();

    void typifyAnyAdapter(CAdapter *pa_poPeer);

    virtual void setParentFB(CFunctionBlock *pa_poParentFB, TForteUInt8 pa_nParentAdapterlistID);

    virtual bool disconnect(CAdapterConnection *pa_poAdConn);

    //! Helper functions allowing to retrieve interface information from any_adpaters TODO look for Doxygen grouping syntax
    TForteUInt8 getNumEIs(){
      return m_pstInterfaceSpec->m_nNumEIs;
    }

    TForteUInt8 getNumEOs(){
      return m_pstInterfaceSpec->m_nNumEOs;
    }

    const TForteInt16* getEIWithIndexes(){
      return m_pstInterfaceSpec->m_anEIWithIndexes;
    }

    const TDataIOID* getEIWiths(){
      return m_pstInterfaceSpec->m_anEIWith;
    }

    TForteUInt8 getNumDIs(){
      return m_pstInterfaceSpec->m_nNumDIs;
    }

    const CStringDictionary::TStringId* getDataInputNames(){
      return m_pstInterfaceSpec->m_aunDINames;
    }

    TIEC_ANYPtr getDataInputs(){
      return getDI(0);
    }

    TForteUInt8 getNumDOs(){
      return m_pstInterfaceSpec->m_nNumDOs;
    }

    const CStringDictionary::TStringId* getDataOutputNames(){
      return m_pstInterfaceSpec->m_aunDONames;
    }

    TIEC_ANYPtr getDataOutputs(){
      return getDO(0);
    }

  protected:

  private:
    static const SFBInterfaceSpec scm_stFBInterfaceSpec; //! interface spec for the empty interface of an any adapter will be used for plug and socket

    //!Interface specification to be used when configured
    SFBInterfaceSpec m_stCurrentFBInterfaceSpec;

    CFunctionBlock *m_ParentFB; //!< Pointer to the parent FB
    TForteUInt8 m_nParentAdapterlistID; //!< Adapter list ID in respect to the parent FB
};

#endif /* ANYADAPTER_H_ */
