Welcome to the new FlexRadio Community! Please review the new Community Rules and other important new Community information on the Message Board.
If you are having a problem, please refer to the product documentation or check the Help Center for known solutions.
Need technical support from FlexRadio? It's as simple as Creating a HelpDesk ticket.

remote software CW keyer with ASIO side tone

Hi folks,


I'm just working on a remote cw keyer for my Flex-6300. The cw key is attached to the PC via USB-RS-232. The side tone is generated via low latency ASIO audio. This already works just fine.

Based on the information given from KE5DTO and NQ6N here

https://community.flexradio.com/flexradio/topics/is-keying-possible-via-the-api-or-cat-serial-rts-or...

I want to key the radio via network.

I have already download the FlexAPI v3.1.8. I was able to connect to the radio according the example ComPortPTT from the FlexAPI. This is my Forms1.cs:

 

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;

 

using Flex.Smoothlake.FlexLib;

using Flex.UiWpfFramework.Utils;

 

 

namespace Iambic2

{

    public partial class Form1 : Form

    {

        private Radio _radio;

 

        public Form1()

        {

            InitializeComponent();

 

            WindowPlacement.SetPlacement(this.Handle, Properties.Settings.Default.WindowPlacement);

 

            API.ProgramName = "ComPortPTT";

            API.RadioAdded += new API.RadioAddedEventHandler(API_RadioAdded);

            API.RadioRemoved += new API.RadioRemovedEventHandler(API_RadioRemoved);

            API.Init();

 

        }

 

        void API_RadioAdded(Radio radio)

        {

            if (_radio == null)

            {

                _radio = radio;

                _radio.Connect();

                //UpdateMox();

                //_radio.CWPitch = 650;

            }

        }

 

        void API_RadioRemoved(Radio radio)

        {

            if (radio == _radio)

                _radio = null;

        }

 

 

        public void RadioTriggerOn(double timeStamp)

        {

            //Console.WriteLine("On - " + ((int)Math.Round(timeStamp)).ToString("X4"));

            _radio.CWPTT(true, ((int)Math.Round(timeStamp)).ToString("X4"));

            _radio.CWKey(true, ((int)Math.Round(timeStamp)).ToString("X4"));

        }

 

 

        public void RadioTriggerOff(double timeStamp)

        {

            //Console.WriteLine("Off - " + ((int)Math.Round(timeStamp)).ToString("X4"));

            _radio.CWKey(false, ((int)Math.Round(timeStamp)).ToString("X4"));

            _radio.CWPTT(false, ((int)Math.Round(timeStamp)).ToString("X4"));

        }

    }

}

 

RadioTriggerOn() / Off() are called at the according time instant of the side tone. timeStamp is counted in milliseconds with rollover at 2^16.

With this programm the radio does not send out any HF. I can see no reaction from the radio except that the normal CW key plugged into the radio itself does no work anymore after I have pressed the RS232 CW key a least one time (no HF is send, side tone works as usual). I have to reboot the radio to bring it back to normal operation.

I have noted that CWKey() is specially designed for the Maestro. So I have changed line 1763 of Radio.cs as follows:

            if (true) //(API.ProgramName == "SmartSDR-Maestro")

 

What changes are necessary to make this program work?


Harald, DL3HM

Answers

  • Harald - DL3HM
    edited February 2020
    Update:

    When I switch from CWKey() to CWKeyImmediate() in the code above the radio is keyed properly. So there is obviously a problem with the generation of my timestamps.

    With Wireshark I can see "ping ms_timestamp" messages on TCP port 4992. My timestamps are not in sync with these timestamps. Moreover the timestamps in CWKey() have a different format (hex integers) than the ping timestamps (decimal numbers).

    Is this the cause of my problem? How can I get my timestamps in sync with the timestamps already sent by SmartSDR?


    Harald, DL3HM
  • Harald - DL3HM
    edited February 2020
    Update:

    with the following code CWKey() works. Nothing was wrong with the timestamps. Instead the appropriate  _guiClientHandle has to be provide to CWKey().



    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;

    using System.Threading;
    using Flex.Smoothlake.FlexLib;
    using Flex.UiWpfFramework.Utils;


    namespace Iambic2
    {
        public partial class Form1 : Form
        {
            private Radio _radio;
            private uint _guiClientHandle = 0;

            public Form1()
            {
                InitializeComponent();

                WindowPlacement.SetPlacement(this.Handle, Properties.Settings.Default.WindowPlacement);

                API.ProgramName = "ComPortPTT";
                API.RadioAdded += new API.RadioAddedEventHandler(API_RadioAdded);
                API.RadioRemoved += new API.RadioRemovedEventHandler(API_RadioRemoved);
                API.Init();

            }

            void API_RadioAdded(Radio radio)
            {
                if (_radio == null)
                {
                    _radio = radio;
                    _radio.Connect();
                    _guiClientHandle = _radio.GuiClients[0].ClientHandle;
                }
            }

            void API_RadioRemoved(Radio radio)
            {
                if (radio == _radio)
                    _radio = null;
            }


            public void RadioCWKey(bool state, double timeStamp)
            {
                if (_radio != null)
                {
                    _radio.CWKey(state, ((int)Math.Round(timeStamp)).ToString("X4"), _guiClientHandle);
                    //_radio.CWKeyImmediate(state);
                }
            }
        }
    }



    Harald, DL3HM

Leave a Comment

Rich Text Editor. To edit a paragraph's style, hit tab to get to the paragraph menu. From there you will be able to pick one style. Nothing defaults to paragraph. An inline formatting menu will show up when you select text. Hit tab to get into that menu. Some elements, such as rich link embeds, images, loading indicators, and error messages may get inserted into the editor. You may navigate to these using the arrow keys inside of the editor and delete them with the delete or backspace key.