public void Start()
        {
            AGXPresent = AGXInstalled();
            if (KSPit.Config.Verbose)
            {
                Debug.Log(String.Format("KerbalSimpit: ActionGroupsExtended installed: {0}", AGXPresent));
            }

            enableChannel = GameEvents.FindEvent <EventData <byte, object> >("onSerialReceived" + InboundPackets.CAGEnable);
            if (enableChannel != null)
            {
                enableChannel.Add(enableCAGCallback);
            }
            disableChannel = GameEvents.FindEvent <EventData <byte, object> >("onSerialReceived" + InboundPackets.CAGDisable);
            if (disableChannel != null)
            {
                disableChannel.Add(disableCAGCallback);
            }
            toggleChannel = GameEvents.FindEvent <EventData <byte, object> >("onSerialReceived" + InboundPackets.CAGToggle);
            if (toggleChannel != null)
            {
                toggleChannel.Add(toggleCAGCallback);
            }

            CAGStateChannel = GameEvents.FindEvent <EventData <byte, object> >("toSerial" + OutboundPackets.CustomActionGroups);
            GameEvents.FindEvent <EventData <byte, object> >("onSerialChannelSubscribed" + OutboundPackets.CustomActionGroups).Add(resendActionGroup);

            lastCAGStatus = new CAGStatusStruct();
        }
        private CAGStatusStruct getCAGState()
        {
            CAGStatusStruct result = new CAGStatusStruct();

            for (int i = 1; i < ActionGroupIDs.Length; i++) //Ignoring 0 since there is no Action Group 0
            {
                if (FlightGlobals.ActiveVessel.ActionGroups[ActionGroupIDs[i]])
                {
                    result.status[i / 8] |= (byte)(1 << (i % 8)); //Set the selected bit to 1
                }
            }

            if (AGXPresent)
            {
                for (int group = 11; group <= 250; group++) // Only call AGExt for additionnal actions
                {
                    bool activated = (bool)AGXExternal.InvokeMember("AGXGroupState",
                                                                    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new System.Object[] { group });

                    if (activated)
                    {
                        result.status[group / 8] |= (byte)(1 << group % 8);  //Set the selected bit to 1
                    }
                }
            }

            return(result);
        }
 public bool Equals(CAGStatusStruct obj)
 {
     if (status.Length != obj.status.Length)
     {
         return(false);
     }
     for (int i = 0; i < status.Length; i++)
     {
         if (status[i] != obj.status[i])
         {
             return(false);
         }
     }
     return(true);
 }
        private bool UpdateCurrentState()
        {
            CAGStatusStruct newState = getCAGState();

            if (!newState.Equals(lastCAGStatus) || resendState)
            {
                resendState = false;
                if (CAGStateChannel != null)
                {
                    //Debug.Log(String.Format("Sending CAG status : (" + newState.status[0] + ") (" + newState.status[1] + ") "));
                    CAGStateChannel.Fire(OutboundPackets.CustomActionGroups, newState);
                    lastCAGStatus = newState;
                }
                return(true);
            }
            else
            {
                return(false);
            }
        }