using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;

namespace led_kostka
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string hodnota = "0";
        volatile bool pripojeno = false;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            hodnota = textBox1.Text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (pripojeno)
            {
                try
                {
                    if (!port.IsOpen)
                        port.Open();
                    if (port.IsOpen)
                        port.Write(hodnota);
                }
                catch (IOException)
                {
                    MessageBox.Show("Zařízení není připojeno, ujistěte se že je správně nastaven COM port", "Error");
                    label3.Invoke(new MethodInvoker(delegate { label3.Text = "Nepřipojeno"; }));
                    port.Close();
                }
            }
            else
                MessageBox.Show("Nepřipojeno", "Error");
        }
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (!port.IsOpen)
                    port.Open();
                if (port.IsOpen)
                    port.Write("i");
            }
            catch (IOException)
            {
                MessageBox.Show("Zařízení není připojeno, ujistěte se že je správně nastaven COM port", "Error");
                label3.Invoke(new MethodInvoker(delegate { label3.Text = "Nepřipojeno"; }));
                port.Close();
            }

        }
        private UInt16 ReadU16(System.IO.Stream stm)
        {
            byte[] buffer = new byte[2];
            stm.Read(buffer, 0, 2);
            return (UInt16)(buffer[0] + buffer[1] * 256);
        }
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int[] i = new int[4];
            if (port.IsOpen)
            {
                for(int n=0;n<4;n++)
                {
                    i[n] = ReadU16(port.BaseStream);
                }

                if (i[0] == 1 && i[1] == 2 && i[2] == 3 && i[3] == 4)
                {
                    label3.Invoke(new MethodInvoker(delegate { label3.Text = "Připojeno"; }));
                    pripojeno = true;
                }
                else
                {
                    label3.Invoke(new MethodInvoker(delegate { label3.Text = "Nepřipojeno"; }));
                    pripojeno = false;
                }
            }
            port.Close();
        }       

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (pripojeno)
            {
                port.Write("def");
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (pripojeno)
            {
                port.Write("a1");
            }
        }
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (pripojeno)
            {
                port.Write("a2");
            }
        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            if (pripojeno)
            {
                port.Write("a3");
            }
        }        
    }
}
