#ifndef _STRUCTURE
#define _STRUCTURE
#include "Input.h"
#include "Output.h"
#include "Motor.h"

#define MAX_MODULE  32
#define MAX_MODULE_INPUT    11 // 16
#define MAX_MODULE_OUTPUT   15
#define MAX_MODULE_MOTOR    16

struct stModule
{
    stModule()
    {
        nNoOfInput  = 0;
        nNoOfOutput = 0;
        nNoOfMotor  = 0;
        for (int i = 0; i < MAX_MOTOR_MODULE_ARRAY; i++)
        {
            Motor[i] = nullptr;
        }
    }

    bool HasMotors()
    {
        return nNoOfMotor > 0;
    }

    CString csName;

    CInputSetting Input[MAX_IO_MODULE_ARRAY];
    int nNoOfInput;

    COutputSetting Output[MAX_IO_MODULE_ARRAY];
    int nNoOfOutput;

    CMtrProfile *Motor[MAX_MOTOR_MODULE_ARRAY];
    int nNoOfMotor;
};

// input and output module data structure for Maintenance page
struct stMaintIoModule
{
    CString m_csModuleName;                  // store module name
    CString m_csIoName[MAX_IO_MODULE_ARRAY]; // MAX_MODULE_INPUT]; // store input name
};

// Gary 21Dec10, V1.23.02 for multilanguage motor name and motor position name
// for Maintenance page
struct stMaintMotorModule
{
    CString m_csModuleName;              // store module name
    CString m_csMtrName[MAX_MOTOR];      // store motor name
    CStringArray m_csaMtrPos[MAX_MOTOR]; // store Motor Position Name
};

// user change accordingly to suit the machine requirement
struct stLotInfo
{
    CString csLotStarted;
    CString csLotName;
    long lLotQty;
    CString csShiftID;
    CString csOperatorID;
    CString csLotStartTime;
    CString csRecipeName;
    CString csPackageName;
};

struct stRecipeInfo
{
    CString csRecipeName;
    CString csPackageName;
};

struct stPackageInfo
{
    CString csPackageName;
    int nPackageID;
};

// Light Config
typedef struct {
    int iRed;
    int iAmber;
    int iGreen;
    int iBuzzer;
    int iLightOnTime;
    int iLightOffTime;
    int iBuzzerOnTime;
    int iBuzzerOffTime;
}LIGHT_CONFIG;

//
#endif
