/////////////////////////////////////////////////////////////////////
//                                                                 //
// file: autoGen_SignalClass_CPP.h                                 //
//                                                                 //
/////////////////////////////////////////////////////////////////////
//                                                                 //
// Copyright (c) 2025 Acroname Inc. - All Rights Reserved          //
//                                                                 //
// This file is part of the BrainStem release. See the license.txt //
// file included with this package or go to                        //
// https://acroname.com/software/brainstem-development-kit         //
// for full license details.                                       //
/////////////////////////////////////////////////////////////////////

#ifndef __AUTOGEN_SIGNAL_CPP_H__
#define __AUTOGEN_SIGNAL_CPP_H__

#include "BrainStem-core.h"

#ifdef __GNUC__
#define DEPRECATED(...) __attribute__((deprecated(__VA_ARGS__)))
#elif defined(_MSC_VER)
#define DEPRECATED(...) __declspec(deprecated(__VA_ARGS__))
#else
#define DEPRECATED(...)
#pragma message("DEPRECATED is not defined for this compiler")
#endif

#if defined(__cplusplus)

namespace Acroname {
namespace BrainStem {

/// SignalClass:
/// Interface to digital pins configured to produce square wave signals.
/// This class is designed to allow for square waves at various frequencies and duty cycles.
/// Control is defined by specifying the wave period as (T3Time) and the active portion of the
///   cycle as (T2Time).
/// See the entity overview section of the reference for more detail regarding the timing.
/// 
class aLIBEXPORT SignalClass : public EntityClass {

public:

    /// Constructor.
    SignalClass(void);

    /// Destructor.
    virtual ~SignalClass(void);

    /// Initialize the Signal Class.
    ///
    /// \param pModule The module to which this entity belongs.
    /// \param index The index of the Signal entity to be addressed.
    ///
    void init(Module* pModule, const uint8_t index);

    /// Enable/Disable the signal output.
    /// 
    /// \param enable True to enable, false to disable
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr setEnable(const uint8_t enable);

    /// Get the Enable/Disable of the signal.
    /// 
    /// \param enable True to enable, false to disable
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr getEnable(uint8_t* enable);

    /// Invert the signal output.
    /// 
    /// Normal mode is High on t0 then low at t2.
    /// Inverted mode is Low at t0 on period start and high at t2.
    /// 
    /// \param invert True to invert, false for normal mode.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr setInvert(const uint8_t invert);

    /// Get the invert status the signal output.
    /// 
    /// Normal mode is High on t0 then low at t2.
    /// Inverted mode is Low at t0 on period start and high at t2.
    /// 
    /// \param invert True to invert, false for normal mode.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr getInvert(uint8_t* invert);

    /// Set the signal period or T3 in nanoseconds.
    /// 
    /// \param t3_nsec Integer not larger than unsigned 32 bit max value representing the wave
    ///        period in nanoseconds.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr setT3Time(const uint32_t t3_nsec);

    /// Get the signal period or T3 in nanoseconds.
    /// 
    /// \param t3_nsec Integer not larger than unsigned 32 bit max value representing the wave
    ///        period in nanoseconds.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr getT3Time(uint32_t* t3_nsec);

    /// Set the signal active period or T2 in nanoseconds.
    /// 
    /// \param t2_nsec Integer not larger than unsigned 32 bit max value representing the wave
    ///        active period in nanoseconds.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr setT2Time(const uint32_t t2_nsec);

    /// Get the signal active period or T2 in nanoseconds.
    /// 
    /// \param t2_nsec Integer not larger than unsigned 32 bit max value representing the wave
    ///        active period in nanoseconds.
    /// 
    /// \return Returns \ref EntityReturnValues "common entity" return values
    aErr getT2Time(uint32_t* t2_nsec);



};

} // namespace BrainStem
} // namespace Acroname

#endif // defined(__cplusplus)

#endif // __AUTOGEN_SIGNAL_CPP_H__