//updates the port when selected
 private void listBox_avPorts_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     try
     {
         serialPort.Close();
         serialPort.PortName = listBox_avPorts.SelectedItem.ToString();
         serialPort.Open();
     }
     catch (Exception)
     { serialPort.PortName = " "; }
 }
        static void Main(string[] args)
        {
            HrController.port = ComPort;

            ComPort.DataReceived += HrDecoder.DecodePacket;

            HrDecoder.OnDataDecodedEvent += HrDecoder.ProcessPacket;
            HrDecoder.OnStatAckEvent     += HrDecoder_OnStatAckEvent;
            HrDecoder.OnIjogAckEvent     += HrDecoder_OnIjogAckEvent;
            HrDecoder.OnSjogAckEvent     += HrDecoder_OnSjogAckEvent;
            HrDecoder.OnRamReadAckEvent  += HrDecoder_OnRamReadAckEvent;
            HrDecoder.OnEepReadAckEvent  += HrDecoder_OnEepReadAckEvent;
            ComPort.Open();

            while (lockShell)
            {
                Console.Write('>');
                string[] parsedCmd = ParseShellCmd(Console.ReadLine());

                switch (parsedCmd[0])
                {
                case "REBOOT":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("REBOOT <pID>");
                    }
                    else
                    {
                        HrController.REBOOT(Convert.ToByte(parsedCmd[1]));
                    }
                    break;

                case "ROOLBACK":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("ROLLBACK <ID>");
                    }
                    else
                    {
                        HrController.ROLLBACK(Convert.ToByte(parsedCmd[1]));
                    }
                    break;

                case "EEP_WRITE":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("EEP_WRITE <pID> <StartAddr> <Length> <DataDecimal>");
                    }
                    else
                    {
                        HrController.EEP_WRITE(Convert.ToByte(parsedCmd[1]), Convert.ToByte(parsedCmd[2]),
                                               Convert.ToByte(parsedCmd[3]), Convert.ToUInt16(parsedCmd[4]));
                    }
                    break;

                case "EEP_READ":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("EEP_READ <pID> <StartAddr> <Length>");
                    }
                    else
                    {
                        HrController.EEP_READ(Convert.ToByte(parsedCmd[1]), Convert.ToByte(parsedCmd[2]), Convert.ToByte(parsedCmd[3]));
                    }
                    break;

                case "STAT":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("STAT <pID>");
                    }
                    else
                    {
                        HrController.STAT(Convert.ToByte(parsedCmd[1]));
                    }
                    break;

                //for testing incredible things
                case "debug":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("debug <JOG1> <JOG2>");
                    }
                    else
                    {
                        Ser1Config.JOG = Convert.ToUInt16(parsedCmd[1]);
                        Ser2Config.JOG = Convert.ToUInt16(parsedCmd[2]);

                        ROBOT_ARM_CONFIG = new List <JOG_TAG>
                        {
                            Ser1Config,
                            Ser2Config
                        };

                        HrController.S_JOG(ROBOT_ARM_CONFIG, 0x3C);
                    }
                    break;

                //implemented, working
                case "moveto":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("moveto <ID> <JOG>");
                    }
                    else
                    {
                        floatingConfig.ID  = Convert.ToByte(parsedCmd[1]);
                        floatingConfig.JOG = Convert.ToUInt16(parsedCmd[2]);
                        HrController.S_JOG(floatingConfig, 10);
                    }
                    break;

                case "GetPos":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("GetPos <pID>");
                    }
                    else
                    {
                        HrController.RAM_READ(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Absolute_Position, 2);
                    }
                    break;

                //implemented, working
                case "torqueControl":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("torqueControl <ID> <TRK_ON, BRK_ON, TRK_FREE>");
                    }
                    else
                    {
                        if (parsedCmd[2] == "TRK_ON")
                        {
                            HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Torque_Control, 1, 0x60);
                        }
                        if (parsedCmd[2] == "BRK_ON")
                        {
                            HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Torque_Control, 1, 0x40);
                        }
                        if (parsedCmd[2] == "TRK_FREE")
                        {
                            HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Torque_Control, 1, 0x00);
                        }
                    }
                    break;

                case "RAM_READ":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("RAM_READ <pID> <StartAddr> <Length>");
                    }
                    else
                    {
                        HrController.RAM_READ(Convert.ToByte(parsedCmd[1]), Convert.ToByte(parsedCmd[2]), Convert.ToByte(parsedCmd[3]));
                    }
                    break;

                case "RAM_WRITE":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("RAM_WRITE <pID> <StartAddr> <Length> <Value> {ADDR 48 / 49 for error status}");
                    }
                    else
                    {
                        HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), Convert.ToByte(parsedCmd[2]),
                                               Convert.ToByte(parsedCmd[3]), Convert.ToUInt16(parsedCmd[4]));
                    }
                    break;

                case "initPos":
                    floatingConfig.ID       = 1;
                    floatingConfig.JOG      = 512;
                    floatingConfig.playTime = 100;
                    HrController.I_JOG(floatingConfig);

                    floatingConfig.ID       = 2;
                    floatingConfig.JOG      = 512;
                    floatingConfig.playTime = 100;
                    HrController.I_JOG(floatingConfig);
                    break;

                case "allFree":
                    HrController.RAM_WRITE(1, (byte)RAM_ADDR.Torque_Control, 1, 0x00);
                    HrController.RAM_WRITE(2, (byte)RAM_ADDR.Torque_Control, 1, 0x00);
                    break;

                case "allOn":
                    HrController.RAM_WRITE(1, (byte)RAM_ADDR.Torque_Control, 1, 0x60);
                    HrController.RAM_WRITE(2, (byte)RAM_ADDR.Torque_Control, 1, 0x60);
                    break;

                case "disconnect":
                    ComPort.Close();
                    break;

                case "connect":
                    ComPort.Open();
                    break;

                case "list":
                    Console.WriteLine("moveto <ID> <JOG>");
                    Console.WriteLine("torqueControl <ID> <TRK_ON, BRK_ON, TRK_FREE>");
                    Console.WriteLine("RAM_READ <pID> <StartAddr> <Length>");
                    Console.WriteLine("RAM_WRITE <pID> <StartAddr> <Length> <Value> {ADDR 48 / 49 for error status}");
                    Console.WriteLine("initPos");
                    Console.WriteLine("allFree");
                    Console.WriteLine("allOn");
                    Console.WriteLine("disconnect");
                    Console.WriteLine("connect");
                    break;

                case "ResolveErrs":
                    if (parsedCmd.Length == 1)
                    {
                        Console.WriteLine("ResolveErrs <pID>");
                    }
                    else
                    {
                        HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Status_Error, 1, 0x00);
                        HrController.RAM_WRITE(Convert.ToByte(parsedCmd[1]), (byte)RAM_ADDR.Torque_Control, 1, 0x60);
                    }
                    break;

                case "quit":
                    ComPort.Close();
                    lockShell = false;
                    break;
                }
            }
        }