using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Test_IOPanel
{
    /// 
    /// I/O창에 표시되는 핀 이름
    /// 
    enum eDIName
    {
        SW_START, STOP, RESET, AIR, DOOR ,EMERGENCY, SPARE06, SPARE07,
        MGZ_LOAD_IN, MGZ_LOAD_LIMIT, MGZ_HOLD1, MGZ_HOLD2, MGZ_CLAMP_OPEN, MGZ_CLAMP_CLOSE, SPARE14, SPARE15,
        PCB_PICKER_OVERLOAD, PUSHER_LIMIT1, PUSHER_LIMIT2, GRIPER_OPEN, GRIPER_CLOSE, GRIP_DETECT, PCB_DETECT, SPARE23,
        PCB_PUSHER_OVERLOAD, PUSH_OPEN, PUSH_CLOSE, MGZ_SAFTY, SPARE28, SPARE29, SPARE30, SPARE31,
        SPARE32, SPARE33, SPARE34, SPARE35, SPARE36, SPARE37, SPARE38, SPARE39,
        SPARE40, SPARE41, SPARE42, SPARE43, SPARE44, SPARE45, SPARE46, SPARE47,
    }
    /// 
    /// 실제 작업시사용하는 이름
    /// 
    enum eDIPin
    {
        X00, X01, X02, X03, X04, X05, X06, X07,
        X08, X09, X0A, X0B, X0C, X0D, X0E, X0F,
        X10, X11, X12, X13, X14, X15, X16, X17,
        X18, X19, X1A, X1B, X1C, X1D, X1E, X1F,
        X20, X21, X22, X23, X24, X25, X26, X27,
        X28, X29, X2A, X2B, X2C, X2D, X2E, X2F
    }
    enum eDOName
    {
        LED_START, LED_STOP, LED_RESET, LED_AIR, LED_INSIDE, SPARE05, SPARE06, SPARE07,
        PUSHER, GRIPPER, MGZ_LOADER, MGZ_CLAMP_ON, MGZ_CLAMP_OFF, SPARE13, SPARE14, SPARE15,
        TWR_RED, TWR_GRN, TWR_YEL, TWR_BUZZER, SPARE20, SPARE21, SPARE22, SPARE23,
        AIR_ON, SPARE25, SPARE26, SPARE27, SPARE28, SPARE29, SPARE30, SPARE31,
        SPARE32, SPARE33, SPARE34, SPARE35, SPARE36, SPARE37, SPARE38, SPARE39,
        SPARE40, SPARE41, SPARE42, SPARE43, SPARE44, SPARE45, SPARE46, SPARE47,
    }
  
    enum eDOPin
    {
        Y00, Y01, Y02, Y03, Y04, Y05, Y06, Y07,
        Y08, Y09, Y0A, Y0B, Y0C, Y0D, Y0E, Y0F,
        Y10, Y11, Y12, Y13, Y14, Y15, Y16, Y17,
        Y18, Y19, Y1A, Y1B, Y1C, Y1D, Y1E, Y1F,
        Y20, Y21, Y22, Y23, Y24, Y25, Y26, Y27,
        Y28, Y29, Y2A, Y2B, Y2C, Y2D, Y2E, Y2F
    }
    public partial class fIOMonitor : Form
    {
        public fIOMonitor()
        {
            InitializeComponent();
            //this.WindowState = FormWindowState.Maximized;
            for (int r = 0; r < 8; r++)
            {
                for (int i = 0; i < 6; i++)
                {
                    var idx = i * 8 + r;
                    var pinNo = Enum.GetName(typeof(eDIPin), idx);
                    var pinName = Enum.GetName(typeof(eDIName), idx);
                    
                    var but = new Button();
                    if (pinName.StartsWith("SPARE"))
                    {
                        pinName = "--";
                        but.ForeColor = Color.Gray;
                    }
                    but.Text = string.Format("[{0}]\n{1}", pinNo, pinName, idx);
                    but.TextAlign = ContentAlignment.MiddleLeft;
                    but.Dock = DockStyle.Fill;
                    but.Font = new System.Drawing.Font("Consolas", 9, FontStyle.Bold);
                    but.Tag = idx;
                    but.Click += butI_Click;
                    this.tblDI.Controls.Add(but);
                }
            }
            for (int r = 0; r < 8; r++)
            {
                for (int i = 0; i < 6; i++)
                {
                    var idx = i * 8 + r;
                    var pinNo = Enum.GetName(typeof(eDOPin), idx);
                    var pinName = Enum.GetName(typeof(eDOName), idx);
                    var but = new Button();
                    if (pinName.StartsWith("SPARE"))
                    {
                        pinName = "--";
                        but.ForeColor = Color.Gray;
                    }
                    but.Font = new System.Drawing.Font("Consolas", 9, FontStyle.Bold);
                    but.Text = string.Format("[{0}]\n{1}", pinNo, pinName, idx);
                    but.TextAlign = ContentAlignment.MiddleLeft;
                    but.Dock = DockStyle.Fill;
                    but.Tag = idx;
                    but.Click += butO_Click;
                    this.tblDO.Controls.Add(but);
                }
            }
        }
        private void fIOMonitor_Load(object sender, EventArgs e)
        {
            this.Text = "I/O Monitor";
            this.Show();
            Application.DoEvents();
            for(int i = 0; i < this.tblDI.Controls.Count; i++)
            {
                var but = tblDI.Controls[i] as Button;
                var idx = int.Parse(but.Tag.ToString());
                but.BackColor = Color.Lime;
            }
            for (int i = 0; i < this.tblDO.Controls.Count; i++)
            {
                var but = tblDO.Controls[i] as Button;
                var idx = int.Parse(but.Tag.ToString());
                but.BackColor = Color.Pink;
            }
        }
        void butI_Click(object sender, EventArgs e)
        {
            var but = sender as Button;
            var idx = int.Parse(but.Tag.ToString());
            //var curvalue = Pub.dio.INPUT(idx);
            //Pub.dio.RaiseEvent(arDev.AzinAxt.eIOPINDIR.INPUT, idx, !curvalue);
            //Pub.log.AddI("I/O MON : User DI event idx=" + idx.ToString() + ",oldvalue= " + curvalue.ToString());
        }
        void butO_Click(object sender, EventArgs e)
        {
            var but = sender as Button;
            var idx = int.Parse(but.Tag.ToString());
            var 몫 = (int)(Math.Floor(idx / 8.0));
            var 나머지 = (idx % 8.0);
            var idx2 = 나머지 * 6 + 몫;
            Console.WriteLine(string.Format("idx={0}, 몫={1},나머지={2},컨트롤인덱스={3}", idx, 몫, 나머지, idx2));
            //var curvalue = Pub.dio.OUTPUT(idx);
            //if (Pub.dio.initOK) Pub.dio.SetOutput(idx, !curvalue);
            //else Pub.dio.RaiseEvent(arDev.AzinAxt.eIOPINDIR.OUTPUT, idx, !curvalue);
        }
    }
}