using System;
using System.Collections.Generic;
using System.Text;

namespace U160_SDK
{
    class jClass_GPIO : jClass_FT4222
    {
        private GPIO_Dir[] gpioDir = new GPIO_Dir[4];

        public jClass_GPIO()
        {
            gpioDir[0] = jClass_FT4222.GPIO_Dir.GPIO_INPUT;// GPIO_INPUT;
            gpioDir[1] = jClass_FT4222.GPIO_Dir.GPIO_INPUT;// GPIO_OUTPUT;
            gpioDir[2] = jClass_FT4222.GPIO_Dir.GPIO_INPUT;
            gpioDir[3] = jClass_FT4222.GPIO_Dir.GPIO_INPUT;

            //FT_Status = FT4222_GPIO_Init(ftHandle_B, ref gpioDir[0]);
        }

        private void Func_Public()
        {
            FT4222_STATUS FT_Status;

            FT_Status = FT4222_SetSuspendOut(jClass_FT4222.ftHandle_B, false);
            FT_Status = FT4222_SetWakeUpInterrupt(jClass_FT4222.ftHandle_B, false);
        }

        public void GPIO23_Init()
        {
            Func_Public();
        }

        //HAL code
        public void IOx_Index_SetOut(byte bIOx_Index)
        {
            //Func_Public();

            //
            FT4222_STATUS FT_Status;

            gpioDir[bIOx_Index] = jClass_FT4222.GPIO_Dir.GPIO_OUTPUT;

            FT_Status = FT4222_GPIO_Init(ftHandle_B, ref gpioDir[0]);
        }

        public void IOx_Index_SetIn(byte bIOx_Index)
        {
            //Func_Public();

            //
            FT4222_STATUS FT_Status;

            gpioDir[bIOx_Index] = jClass_FT4222.GPIO_Dir.GPIO_INPUT;

            FT_Status = FT4222_GPIO_Init(ftHandle_B, ref gpioDir[0]);
        }

        public void IOx_Index_SetValue(byte bIOx_Index, int iValue)
        {
            //Func_Public();

            //
            FT4222_STATUS FT_Status;

            GPIO_Port GPIO_PortX = GPIO_Port.GPIO_PORT2;

            switch (bIOx_Index)
            {
                case 0x02:
                    GPIO_PortX = GPIO_Port.GPIO_PORT2;
                    break;

                case 0x03:
                    GPIO_PortX = GPIO_Port.GPIO_PORT3;
                    break;

                default:
                    break;
            }

            bool bIO_Value = (iValue == 0) ? false : true;
            FT_Status = FT4222_GPIO_Write(ftHandle_B, GPIO_PortX, bIO_Value);
        }

        public byte IOx_Index_ReadBit(byte bIOx_Index)
        {
            Func_Public();

            //
            //FT4222_STATUS FT_Status;

            GPIO_Port GPIO_PortX = GPIO_Port.GPIO_PORT2;

            switch (bIOx_Index)
            {
                case 0x02:
                    GPIO_PortX = GPIO_Port.GPIO_PORT2;
                    break;

                case 0x03:
                    GPIO_PortX = GPIO_Port.GPIO_PORT3;
                    break;

                default:
                    break;
            }

            bool bPinValue = false;
            FT4222_GPIO_Read(ftHandle_B, GPIO_PortX, ref bPinValue);

            byte bytePinValue = (byte)((bPinValue == true) ? 1 : 0);
            return (bytePinValue);
        }
    }//end class
}
