Exemplo n.º 1
0
 public void Start()
 {
     if (state != LinkStates.ready)
     {
         return;
     }
     try {
         if (!Listening)
         {
             tcp.Start();
         }
         state = LinkStates.listening;
         clock.Start();
         Listening = true;
         debugInstances.Add(this);
     } catch (Exception ex) {
         if (state == LinkStates.listening)
         {
             tcp.Stop();
         }
         state = LinkStates.ready;
         clock.Stop();
         Listening = false;
     }
     listening?.Invoke(Listening);
 }
Exemplo n.º 2
0
        } // Abort

        public ModemTelnet(ref TChannelProperties strNewChannel)
        {
            stcChannel = strNewChannel;
            Globals.blnChannelActive = true;
            enmState = LinkStates.Initialized;
            Globals.queRateDisplay.Enqueue("Internet");
        } // New
Exemplo n.º 3
0
 public Server(ushort port, SGuid?customID = null)
 {
     tcp       = new TcpListener(IPAddress.Any, port);
     this.port = port;
     state     = LinkStates.ready;
     ID        = customID ?? SGuid.NewSGuid();
     _clients  = new List <Link>();
     clock     = new Clock(serverTick, tick);
 }
Exemplo n.º 4
0
 public Link(TcpClient c, SGuid id = default(SGuid))
 {
     client    = c;
     clock     = new Clock(linkTick, read);
     pingPong  = new PingPong(this, timeout);
     sending   = false;
     buffer    = "";
     sendQueue = new Queue <Data>();
     ID        = id;
     state     = LinkStates.creating;
 }
Exemplo n.º 5
0
 void FallCheck()
 {
     if (Mathf.Abs(lastPosition.y - transform.position.y) >= 0.01f && lastPosition.y > transform.position.y)
     {
         state = LinkStates.Falling;
     }
     else
     {
         if (state == LinkStates.Falling)
             state = LinkStates.Idle;
     }
     lastPosition = transform.position;
 }
Exemplo n.º 6
0
 public void Stop()
 {
     state = LinkStates.disconnecting;
     broadcast(true, EnumString(InternalCommands.disconnect), EnumString(LeaveReason.serverStop), "");
     Listening = false;
     state     = LinkStates.ready;
     clock.Stop();
     tcp.Stop();
     stopped?.Invoke();
     foreach (var c in _clients)
     {
         c.Stop();
     }
     _clients.Clear();
     tcp   = null;
     clock = null;
     debugInstances.Remove(this);
 }
Exemplo n.º 7
0
        } // SendRadioCommand

        public void Abort()
        {
            if (enmState != LinkStates.Connected)
            {
                Close();
                return;
            }

            try
            {
                cancelTokenSource.Cancel(); // cancels any pending reads
                objTCPPort.Close();
            }
            catch (Exception ex)
            {
                Log.Error("[TelnetClient.Abort] " + ex.Message);
            }

            enmState = LinkStates.LinkFailed;
        } // Abort
Exemplo n.º 8
0
    void UpdateRunning()
    {
        float h = Input.GetAxis("H-Axis");
        float v = Input.GetAxis("V-Axis");

        if (h == 0.0f && v == 0.0f)
            state = LinkStates.Idle;
        StepSFX();
        ObstacleTest();
        Vector3 cameraEulerAngles = mainCamera.transform.eulerAngles;
        cameraEulerAngles.x = 0;
        cameraEulerAngles.z = 0;
        if (v != 0.0f)
        {
            if (cameraController.isTargeting)
                transform.position += (mainCamera.transform.forward * v * 5.5f) * Time.deltaTime;
            else
            {
                if (v < 0.0f)
                    transform.eulerAngles = cameraEulerAngles + new Vector3(0, 180, 0);
                else
                    transform.eulerAngles = cameraEulerAngles;
            }
        }
        if (h != 0.0f)
        {
            if (cameraController.isTargeting)
                transform.position += (mainCamera.transform.right * h * 5.5f) * Time.deltaTime;
            else
            {
                if (h < 0.0f)
                    transform.eulerAngles = cameraEulerAngles - new Vector3(0, 90, 0);
                else
                    transform.eulerAngles = cameraEulerAngles + new Vector3(0, 90, 0);
            }
        }
        if (!cameraController.isTargeting)
            transform.position += (transform.forward * 5.5f) * Time.deltaTime;
    }
Exemplo n.º 9
0
 void UpdateIdle()
 {
     if (Input.GetKey(KeyCode.UpArrow) || (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow)))
         state = LinkStates.Running;
     ObstacleTest();
 }
Exemplo n.º 10
0
        public void Poll()
        {
            if (Globals.blnChannelActive == false)
            {
                return;
            }
            if (enmState != LinkStates.Connected)
            {
                intTimeout += 1;
                if (intTimeout > 100) // Approx 10 seconds worth of timer ticks...
                {
                    intTimeout = 0;
                    if (Globals.UseRMSRelay())
                    {
                        Globals.queChannelDisplay.Enqueue("R*** No connection to RMS Relay at " + DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm UTC"));
                    }
                    else
                    {
                        Globals.queChannelDisplay.Enqueue("R*** No connection to WL2K CMS Telnet at " + DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm UTC"));
                    }

                    enmState = LinkStates.LinkFailed;
                    cancelTokenSource.Cancel(); // cancels any pending reads
                    objTCPPort.Close();
                }
            }

            while (queDataBytesIn.Count > 0)
            {
                byte[] bytIn;
                try
                {
                    bytIn = (byte[])queDataBytesIn.Dequeue();
                }
                catch
                {
                    break;
                }

                if (enmState == LinkStates.Connected)
                {
                    objProtocol.ChannelInput(ref bytIn);
                }
                else
                {
                    SignInLine(Globals.GetString(bytIn));
                }
            }

            if (enmState == LinkStates.LinkFailed)
            {
                if (objTCPPort is object)
                {
                    if (objTCPPort.Connected)
                    {
                        Disconnect();
                    }
                }
                else
                {
                    try
                    {
                        if (objProtocol != null)
                        {
                            objProtocol.LinkStateChange(ConnectionOrigin.Disconnected);
                            objProtocol = null;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error("[ModemTelnet.Poll] " + ex.Message);
                    }
                }
            }
        } // Poll
Exemplo n.º 11
0
        public bool Close()
        {
            // Subroutine to close the channel and put TNC into known state...
            // Always call this method before the instance goes out of scope
            if (blnClosed)
            {
                return(true);
            }
            try
            {
                if (Globals.blnManualAbort == true)
                {
                    enmState = LinkStates.Disconnected;
                }

                blnClosed = true;
                Globals.queChannelDisplay.Enqueue("G*** Closing Packet Channel " + Globals.stcSelectedChannel.ChannelName + " at " + Globals.TimestampEx());
                if (Globals.objRadioControl != null) // Shut down the radio control and free the serial port
                {
                    Globals.objRadioControl.Close();
                    Thread.Sleep(Globals.intComCloseTime);
                    Globals.objRadioControl = null;
                }

                if (objProtocol is object)
                {
                    objProtocol.CloseProtocol();
                }
                var dttTimeout = DateTime.Now;
                dttTimeout = DateTime.Now;
                while (!(enmState == LinkStates.Disconnected | enmState == LinkStates.LinkFailed))
                {
                    if (dttTimeout.AddSeconds(10) < DateTime.Now)
                    {
                        break;
                    }
                }

                if (objCon != null)
                {
                    objCon.Close();
                }

                if (objKissDLProvider != null)
                {
                    objKissDLProvider.RemoveConnection(objCon);
                    objKissDLProvider.Close();
                }

                if (blnExitKiss & objKissChannel != null)
                {
                    objKissChannel.SetKissModeOff();
                    Thread.Sleep(200);
                }

                if (objKissChannel != null)
                {
                    objKissChannel.Close();
                }
                if (objKissComPort != null)
                {
                    objKissComPort.Close();
                }
                Globals.queStatusDisplay.Enqueue("Idle");
                Globals.queRateDisplay.Enqueue("------");
                Globals.blnChannelActive = false;
                Globals.ObjSelectedModem = null;
                return(true);
            }
            catch (Exception ex)
            {
                Log.Error("[ModemNativeKiss.Close]: " + ex.ToString());
            }

            return(default);
Exemplo n.º 12
0
        } // New

        // Function to open the KISS TNC
        private bool Open()
        {
            bool OpenRet = default;

            OpenRet = true;
            string strConfiguration;
            bool   blnInKissStartSequence = false;
            var    strLine      = default(string);
            bool   blnOnAir1200 = false;
            bool   blnOnAir9600 = false;

            strAPSFile = Globals.stcSelectedChannel.TNCConfigurationFile;
            if (File.Exists(strAPSFile) == false)
            {
                Globals.queChannelDisplay.Enqueue("R*** .aps Configuration file not found...");
                OpenRet = false;
            }
            else
            {
                try
                {
                    strConfiguration = File.ReadAllText(strAPSFile);
                    var objStringReader = new StringReader(strConfiguration);
                    do
                    {
                        try
                        {
                            strLine = objStringReader.ReadLine();
                            if (string.IsNullOrEmpty(strLine))
                            {
                                break;
                            }
                            var strCommand = strLine.Split(';');
                            if (!string.IsNullOrEmpty(strCommand[0].Trim()))
                            {
                                var strTokens  = strCommand[0].Trim().Split(' ');
                                var switchExpr = strTokens[0].Trim().ToUpper();
                                switch (switchExpr)
                                {
                                // These key words define the 1200 and  9600 baud segments
                                case "BEGIN1200B":
                                {
                                    blnOnAir1200 = true;
                                    blnOnAir9600 = false;
                                    break;
                                }

                                case "BEGIN9600B":
                                {
                                    blnOnAir9600 = true;
                                    blnOnAir1200 = false;
                                    break;
                                }

                                case "END1200B":
                                {
                                    blnOnAir9600 = false;
                                    blnOnAir1200 = false;
                                    if (Globals.stcSelectedChannel.TNCOnAirBaud == 1200)
                                    {
                                        break;
                                    }
                                    break;
                                }

                                case "END9600B":
                                {
                                    blnOnAir9600 = false;
                                    blnOnAir1200 = false;
                                    if (Globals.stcSelectedChannel.TNCOnAirBaud == 9600)
                                    {
                                        break;
                                    }
                                    break;
                                }
                                }

                                if (blnOnAir1200 & Globals.stcSelectedChannel.TNCOnAirBaud == 1200 | blnOnAir9600 & Globals.stcSelectedChannel.TNCOnAirBaud == 9600)
                                {
                                    var switchExpr1 = strTokens[0].Trim().ToUpper();
                                    switch (switchExpr1)
                                    {
                                    case "KISSSTART":
                                    {
                                        strKissStart           = new string[0];
                                        blnInKissStartSequence = true;
                                        break;
                                    }

                                    case "KISSEND":
                                    {
                                        blnInKissStartSequence = false;
                                        break;
                                    }

                                    case "TXDELAY":
                                    {
                                        intTXDelay = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "PERSISTANCE":
                                    {
                                        intPersistance = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "SLOTTIME":
                                    {
                                        intSlottime = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "FULLDUPLEX":
                                    {
                                        blnFullDuplex = Convert.ToBoolean(strTokens[1]);
                                        break;
                                    }

                                    case "MAXFRAMESIZE":
                                    {
                                        intMaxFrameSize = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "MAXFRAMES":
                                    {
                                        intMaxFrames = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "ACKTIMER":
                                    {
                                        intACKTimer = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "MAXRETRY":
                                    {
                                        intMaxRetry = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "POLLTHRESH":
                                    {
                                        intPollThresh = Convert.ToInt32(strTokens[1]);
                                        break;
                                    }

                                    case "KISSEXIT":
                                    {
                                        blnExitKiss = Convert.ToBoolean(strTokens[1]);
                                        break;
                                    }

                                    case "ESCAPE":
                                    {
                                        strEscapeChars = strTokens[1].Trim();
                                        break;
                                    }

                                    default:
                                    {
                                        if (blnInKissStartSequence)
                                        {
                                            Array.Resize(ref strKissStart, strKissStart.Length + 1);
                                            strKissStart[strKissStart.Length - 1] = strCommand[0].Trim().ToUpper();
                                        }

                                        break;
                                    }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Log.Error("[ModemNativeKiss.Open] " + strLine + Globals.CR + ex.Message);
                        }
                    }while (true);
                }
                catch (Exception ex)
                {
                    Log.Error("[ModemNativeKiss.Open] " + ex.Message);
                }
            }

            if (objSerial != null)
            {
                objSerial.Close();
                Thread.Sleep(Globals.intComCloseTime);
                objSerial.Dispose();
                objSerial = null;
            }
            // Open the serial port...
            try
            {
                objSerial = new SerialPort(
                    Globals.stcSelectedChannel.TNCSerialPort,
                    Convert.ToInt32(Globals.stcSelectedChannel.TNCBaudRate),
                    Parity.None,
                    8,
                    StopBits.One);
                objSerial.Handshake = Handshake.None;
                objSerial.RtsEnable = true;
                try
                {
                    objSerial.Open();
                }
                catch
                {
                    Globals.queChannelDisplay.Enqueue("R*** Failed to open serial port on " + Globals.stcSelectedChannel.TNCSerialPort + ". Port may be in use by another application.");
                    Log.Error("[ClinetNativeKISS.Open] Failed to open serial port on " + Globals.stcSelectedChannel.TNCSerialPort);
                    return(false);
                }

                if (objSerial.IsOpen == false)
                {
                    Globals.queChannelDisplay.Enqueue("R*** Failed to open serial port on " + Globals.stcSelectedChannel.TNCSerialPort + ". Port may be in use by another application.");
                    Log.Error("[ModemNativeKiss.Open] Failed to open serial port on " + Globals.stcSelectedChannel.TNCSerialPort);
                    return(false);
                }
                else
                {
                    Globals.queChannelDisplay.Enqueue("G*** Serial port " + Globals.stcSelectedChannel.TNCSerialPort + " opened");
                }
            }
            catch (Exception ex)
            {
                Log.Error("[ModemNativeKiss.Open] " + ex.Message);
                return(false);
            }

            OpenRet = InitializeKISSTnc(); // initialize the TNC to KISS mode

            if (OpenRet == false)
            {
                Log.Error("[ClientNativeKiss.Open] Failed to Initialize KISS TNC");
                enmState = LinkStates.LinkFailed;

                if (objSerial != null)
                {
                    objSerial.Close();
                    Thread.Sleep(Globals.intComCloseTime);
                    objSerial.Dispose();
                    objSerial = null;
                }

                return(false);
            }
            else
            {
                // All OK so set up Peter's Native KISS DLL
                try
                {
                    objKissComPort = new COMPort(objSerial); // Globals.stcSelectedChannel.TNCSerialPort, Convert.ToInt32(Globals.stcSelectedChannel.TNCBaudRate));
                    // set up the optional escape characters
                    if (!string.IsNullOrEmpty(strEscapeChars))
                    {
                        objKissComPort.escapedCharList = strEscapeChars;                     // Escape characters from .aps file
                    }
                    objKissChannel    = objKissComPort.CreateChannel(0);                     // Create TNC Channel 0
                    objKissDLProvider = objKissChannel.CreateProvider(Globals.SiteCallsign); // Create a DLProvider for the Site Call sign
                                                                                             // set up the KISS parameters from default values or as updated from the .aps file
                    objConParam               = new Connection.ConnectionParameterBuf();
                    objConParam.ackTimer      = 1000 * intACKTimer;                          // convert from Sec to ms.
                    objConParam.maxRetry      = intMaxRetry;
                    objConParam.maxIFrame     = intMaxFrameSize;
                    objConParam.maxWindowSize = intMaxFrames;
                    objConParam.pollThresh    = 1000 * intPollThresh; // convert from Sec to ms
                    objKissChannel.SetPersistence(intPersistance);
                    objKissChannel.SetSlotTime(intSlottime);
                    objKissChannel.SetTXDelay(intTXDelay);
                    objKissChannel.SetTXFullDuplex(Convert.ToInt32(blnFullDuplex));
                    enmState = LinkStates.Initialized;
                }
                catch (Exception ex)
                {
                    Log.Error("[ClientNativeKiss.Open] Call to DLL Error: " + ex.ToString());
                    return(false);
                }
            }
            // Extended logging added for debugging
            if (File.Exists(Globals.SiteRootDirectory + @"Log\NativeKISSax25PktLog.log"))
            {
                File.Delete(Globals.SiteRootDirectory + @"Log\NativeKISSax25PktLog.log");
            }

            Support.pktLogFile = Globals.SiteRootDirectory + @"Log\NativeKISSax25PktLog.log";
            objKissChannel.packetMonitorEnable = TNCChannel.PacketMonitorType.LogFile;
            return(OpenRet);
        } // Open