From 305fb8daee73e24617a0156b56dde1f15d0ae856 Mon Sep 17 00:00:00 2001 From: sh123 Date: Fri, 5 Aug 2022 22:01:19 +0300 Subject: [PATCH 01/13] Rig control settings --- .../radio/codec2talkie/rigctl/Disabled.java | 21 +++++++++++++++ .../com/radio/codec2talkie/rigctl/Ft817.java | 22 ++++++++++++++++ .../com/radio/codec2talkie/rigctl/RigCtl.java | 15 +++++++++++ .../codec2talkie/rigctl/RigCtlCallback.java | 4 +++ .../codec2talkie/rigctl/RigCtlFactory.java | 26 +++++++++++++++++++ .../codec2talkie/settings/PreferenceKeys.java | 1 + .../codec2talkie/transport/SoundModem.java | 11 ++++++++ codec2talkie/src/main/res/values/arrays.xml | 10 +++++++ codec2talkie/src/main/res/values/strings.xml | 1 + .../main/res/xml/preferences_sound_modem.xml | 9 +++++++ 10 files changed, 120 insertions(+) create mode 100644 codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Disabled.java create mode 100644 codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java create mode 100644 codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java create mode 100644 codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlCallback.java create mode 100644 codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Disabled.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Disabled.java new file mode 100644 index 0000000..e700b27 --- /dev/null +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Disabled.java @@ -0,0 +1,21 @@ +package com.radio.codec2talkie.rigctl; + +import android.content.Context; + +import com.radio.codec2talkie.transport.Transport; + +import java.io.IOException; + +public class Disabled implements RigCtl{ + @Override + public void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException { + } + + @Override + public void pttOn() { + } + + @Override + public void pttOff() { + } +} diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java new file mode 100644 index 0000000..808d144 --- /dev/null +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -0,0 +1,22 @@ +package com.radio.codec2talkie.rigctl; + +import android.content.Context; + +import com.radio.codec2talkie.transport.Transport; + +import java.io.IOException; + +public class Ft817 implements RigCtl { + + @Override + public void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException { + } + + @Override + public void pttOn() { + } + + @Override + public void pttOff() { + } +} diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java new file mode 100644 index 0000000..cdc477e --- /dev/null +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java @@ -0,0 +1,15 @@ +package com.radio.codec2talkie.rigctl; + +import android.content.Context; + +import com.radio.codec2talkie.protocol.ProtocolCallback; +import com.radio.codec2talkie.transport.Transport; + +import java.io.IOException; + +public interface RigCtl { + void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException; + + void pttOn(); + void pttOff(); +} diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlCallback.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlCallback.java new file mode 100644 index 0000000..ecc7b06 --- /dev/null +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlCallback.java @@ -0,0 +1,4 @@ +package com.radio.codec2talkie.rigctl; + +public interface RigCtlCallback { +} diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java new file mode 100644 index 0000000..97c2beb --- /dev/null +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java @@ -0,0 +1,26 @@ +package com.radio.codec2talkie.rigctl; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import androidx.preference.PreferenceManager; + +import com.radio.codec2talkie.settings.PreferenceKeys; + +public class RigCtlFactory { + private static final String TAG = RigCtlFactory.class.getSimpleName(); + + public static RigCtl create(Context context) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + String rigName = sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_RIG, "Disabled"); + try { + Class loadClass = Class.forName(String.format("com.radio.codec2talkie.rigctl.%s", rigName)); + Log.i(TAG, "Using rig " + rigName); + return (RigCtl)loadClass.newInstance(); + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + return new Disabled(); + } + } +} diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java index 596a0e5..e3b714d 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java @@ -20,6 +20,7 @@ public final class PreferenceKeys { public static String PORTS_SOUND_MODEM_TYPE = "ports_sound_modem_type"; public static String PORTS_SOUND_MODEM_PREAMBLE = "ports_sound_modem_preamble"; public static String PORTS_SOUND_MODEM_DISABLE_RX = "ports_sound_modem_disable_rx"; + public static String PORTS_SOUND_MODEM_RIG = "ports_sound_modem_rig"; public static String CODEC2_MODE = "codec2_mode"; public static String CODEC2_RECORDING_ENABLED = "codec2_recording_enabled"; diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 12032c8..27b7968 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -12,6 +12,8 @@ import android.util.Log; import androidx.preference.PreferenceManager; +import com.radio.codec2talkie.rigctl.RigCtl; +import com.radio.codec2talkie.rigctl.RigCtlFactory; import com.radio.codec2talkie.settings.PreferenceKeys; import com.radio.codec2talkie.tools.AudioTools; import com.radio.codec2talkie.tools.BitTools; @@ -52,6 +54,8 @@ public class SoundModem implements Transport, Runnable { private final long _fskModem; + private final RigCtl _rigCtl; + public SoundModem(Context context) { _context = context; _sharedPreferences = PreferenceManager.getDefaultSharedPreferences(_context); @@ -82,6 +86,13 @@ public class SoundModem implements Transport, Runnable { else _sampleBuffer = ByteBuffer.allocate(0); + _rigCtl = RigCtlFactory.create(context); + try { + _rigCtl.initialize(TransportFactory.create(TransportFactory.TransportType.USB, context), context, null); + } catch (IOException e) { + e.printStackTrace(); + } + if (!disableRx) new Thread(this).start(); } diff --git a/codec2talkie/src/main/res/values/arrays.xml b/codec2talkie/src/main/res/values/arrays.xml index 2ee9eee..03b50ef 100644 --- a/codec2talkie/src/main/res/values/arrays.xml +++ b/codec2talkie/src/main/res/values/arrays.xml @@ -352,4 +352,14 @@ usb sound_modem + + + Do not use rig control + FT-817/818/MCHF + + + + Disabled + Ft817 + \ No newline at end of file diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index d6a2332..42fc84a 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -302,4 +302,5 @@ TNC transport type Disable receive Run modem in transmit only mode, receive is disabled to save CPU cycles + Select radio model to control \ No newline at end of file diff --git a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml index ffe11a0..bc7720f 100644 --- a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml +++ b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml @@ -29,5 +29,14 @@ app:defaultValue="false"> + + + \ No newline at end of file From ae0abed41644847d4c5fefdc2dd307ffd5448954 Mon Sep 17 00:00:00 2001 From: sh123 Date: Fri, 5 Aug 2022 23:33:37 +0300 Subject: [PATCH 02/13] Skip odd samples --- .../java/com/radio/codec2talkie/transport/SoundModem.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 27b7968..40a3730 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -237,8 +237,10 @@ public class SoundModem implements Transport, Runnable { } } else { int readCnt = _systemAudioRecorder.read(_recordAudioBuffer, 0, nin); + // TODO, read tail if (readCnt != nin) { - Log.e(TAG, "" + readCnt + " != " + nin); + Log.w(TAG, "" + readCnt + " != " + nin); + continue; } //Log.v(TAG, "read samples: " + DebugTools.shortsToHex(_recordAudioBuffer)); } From 714593ec7a7a30060cec2791ed484f28251ae890 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 00:08:05 +0300 Subject: [PATCH 03/13] Ptt commands --- .../com/radio/codec2talkie/rigctl/Ft817.java | 19 +++++++++++++++++-- .../com/radio/codec2talkie/rigctl/RigCtl.java | 4 ++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java index 808d144..4d8f73d 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -5,18 +5,33 @@ import android.content.Context; import com.radio.codec2talkie.transport.Transport; import java.io.IOException; +import java.nio.ByteBuffer; +// http://www.ka7oei.com/ft817_meow.html public class Ft817 implements RigCtl { + private Transport _transport; + @Override public void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException { + _transport = transport; } @Override - public void pttOn() { + public void pttOn() throws IOException { + // 0x00, 0x00, 0x00, 0x00, 0x08 + // returns 0x00 (was un-keyed), 0xf0 (already keyed) + ByteBuffer cmd = ByteBuffer.allocate(5); + cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x08); + _transport.write(cmd.array()); } @Override - public void pttOff() { + public void pttOff() throws IOException { + // 0x00, 0x00, 0x00, 0x00, 0xf0 + // returns 0x00 (was keyed), 0xf0 (already un-keyed) + ByteBuffer cmd = ByteBuffer.allocate(5); + cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0xf0); + _transport.write(cmd.array()); } } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java index cdc477e..31788f3 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtl.java @@ -10,6 +10,6 @@ import java.io.IOException; public interface RigCtl { void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException; - void pttOn(); - void pttOff(); + void pttOn() throws IOException; + void pttOff() throws IOException; } From bd3064e20cb2059d57f04c4404e74765aec1b2c7 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 00:37:13 +0300 Subject: [PATCH 04/13] Rig control usb connect --- .../java/com/radio/codec2talkie/MainActivity.java | 11 +++++++++-- .../com/radio/codec2talkie/rigctl/RigCtlFactory.java | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java index 19bc5ff..9c1e246 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java @@ -262,7 +262,11 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection break; case "sound_modem": _textConnInfo.setText(R.string.main_status_sound_modem); - startAppService(TransportFactory.TransportType.SOUND_MODEM); + String rig = _sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_RIG, "Disabled"); + if (rig.equals("Disabled")) + startAppService(TransportFactory.TransportType.SOUND_MODEM); + else + startUsbConnectActivity(); break; case "tcp_ip": startTcpIpConnectActivity(); @@ -284,7 +288,10 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection Intent data = result.getData(); assert data != null; int resultCode = result.getResultCode(); - if (resultCode == RESULT_CANCELED) { + String transportType = _sharedPreferences.getString(PreferenceKeys.PORTS_TYPE, "loopback"); + if (transportType.equals("sound_modem")) { + startAppService(TransportFactory.TransportType.SOUND_MODEM); + } else if (resultCode == RESULT_CANCELED) { _textConnInfo.setText(R.string.main_status_loopback_test); startAppService(TransportFactory.TransportType.LOOPBACK); } else if (resultCode == RESULT_OK) { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java index 97c2beb..38af74e 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/RigCtlFactory.java @@ -6,12 +6,15 @@ import android.util.Log; import androidx.preference.PreferenceManager; +import com.radio.codec2talkie.connect.UsbPortHandler; import com.radio.codec2talkie.settings.PreferenceKeys; public class RigCtlFactory { private static final String TAG = RigCtlFactory.class.getSimpleName(); public static RigCtl create(Context context) { + if (UsbPortHandler.getPort() == null) + return new Disabled(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); String rigName = sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_RIG, "Disabled"); try { From 7f0c38f286130283e056ca51a402c87dc87f0166 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 15:02:22 +0300 Subject: [PATCH 05/13] PTT CAT control --- .../com/radio/codec2talkie/protocol/Hdlc.java | 8 +++- .../com/radio/codec2talkie/rigctl/Ft817.java | 48 ++++++++++++++++++- .../codec2talkie/transport/SoundModem.java | 5 +- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java index a7742bf..91f66e3 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java @@ -15,6 +15,7 @@ import com.radio.codec2talkie.transport.SoundModem; import com.radio.codec2talkie.transport.Transport; import java.io.IOException; +import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.util.Arrays; @@ -121,7 +122,12 @@ public class Hdlc implements Protocol { _readByte = 0; _prevHdlc = 0; } else { - _currentFrameBuffer.put(bit); + try { + _currentFrameBuffer.put(bit); + } catch (BufferOverflowException e) { + e.printStackTrace(); + _currentFrameBuffer.clear(); + } _prevHdlc++; } } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java index 4d8f73d..d19d652 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -1,37 +1,83 @@ package com.radio.codec2talkie.rigctl; import android.content.Context; +import android.util.Log; +import com.radio.codec2talkie.protocol.Hdlc; +import com.radio.codec2talkie.tools.UnitTools; import com.radio.codec2talkie.transport.Transport; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Timer; +import java.util.TimerTask; // http://www.ka7oei.com/ft817_meow.html public class Ft817 implements RigCtl { + private static final String TAG = Ft817.class.getSimpleName(); private Transport _transport; + private Timer _pttOffTimer; + private boolean _isPttOn = false; + @Override public void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException { _transport = transport; + _isPttOn = false; } @Override public void pttOn() throws IOException { + if (_isPttOn) return; + // 0x00, 0x00, 0x00, 0x00, 0x08 // returns 0x00 (was un-keyed), 0xf0 (already keyed) + Log.i(TAG, "PTT ON"); ByteBuffer cmd = ByteBuffer.allocate(5); cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x08); _transport.write(cmd.array()); + Log.i(TAG, "PTT ON done"); + + byte[] response = new byte[1]; + int bytesRead = _transport.read(response); + Log.i(TAG, "PTT ON response: " + bytesRead + " " + response[0]); + + _isPttOn = true; } @Override - public void pttOff() throws IOException { + public void pttOff() { + if (!_isPttOn) return; + if (_pttOffTimer != null) { + _pttOffTimer.cancel(); + _pttOffTimer.purge(); + _pttOffTimer = null; + } + _pttOffTimer = new Timer(); + _pttOffTimer.schedule(new TimerTask() { + @Override + public void run() { + try { + sendPttOff(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }, 2000); + } + + public void sendPttOff() throws IOException { // 0x00, 0x00, 0x00, 0x00, 0xf0 // returns 0x00 (was keyed), 0xf0 (already un-keyed) + Log.i(TAG, "PTT OFF"); ByteBuffer cmd = ByteBuffer.allocate(5); cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0xf0); _transport.write(cmd.array()); + Log.i(TAG, "PTT OFF done"); + + byte[] response = new byte[1]; + int bytesRead = _transport.read(response); + Log.i(TAG, "PTT OFF response: " + bytesRead + " " + response[0]); } } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 40a3730..6c7bffe 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -30,7 +30,8 @@ public class SoundModem implements Transport, Runnable { private static final String TAG = SoundModem.class.getSimpleName(); // NOTE, codec2 library requires that sample_rate % bit_rate == 0 - public static final int SAMPLE_RATE = 19200; + //public static final int SAMPLE_RATE = 19200; + public static final int SAMPLE_RATE = 48000; private final String _name; @@ -162,6 +163,7 @@ public class SoundModem implements Transport, Runnable { byte[] dataBytesAsBits = BitTools.convertToNRZI(srcDataBytesAsBits); //Log.v(TAG, "write NRZ " + DebugTools.byteBitsToFlatString(dataBytesAsBits)); //Log.v(TAG, "write NRZ " + DebugTools.byteBitsToString(dataBytesAsBits)); + _rigCtl.pttOn(); int j = 0; for (int i = 0; i < dataBytesAsBits.length; i++, j++) { @@ -195,6 +197,7 @@ public class SoundModem implements Transport, Runnable { } else { _systemAudioPlayer.write(_playbackAudioBuffer, 0, bitBufferTail.length * _samplesPerSymbol); } + _rigCtl.pttOff(); return 0; } From 0ebb8b07a7dfeba9c7ae50a4d5e91f30dfcc2d2d Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 15:08:09 +0300 Subject: [PATCH 06/13] Working ptt --- .../main/java/com/radio/codec2talkie/rigctl/Ft817.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java index d19d652..468aaf1 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -16,6 +16,8 @@ import java.util.TimerTask; public class Ft817 implements RigCtl { private static final String TAG = Ft817.class.getSimpleName(); + private static final int PTT_OFF_DELAY_MS = 1000; + private Transport _transport; private Timer _pttOffTimer; @@ -64,20 +66,22 @@ public class Ft817 implements RigCtl { e.printStackTrace(); } } - }, 2000); + }, PTT_OFF_DELAY_MS); } public void sendPttOff() throws IOException { - // 0x00, 0x00, 0x00, 0x00, 0xf0 + // 0x00, 0x00, 0x00, 0x00, 0x88 // returns 0x00 (was keyed), 0xf0 (already un-keyed) Log.i(TAG, "PTT OFF"); ByteBuffer cmd = ByteBuffer.allocate(5); - cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0xf0); + cmd.put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x00).put((byte)0x88); _transport.write(cmd.array()); Log.i(TAG, "PTT OFF done"); byte[] response = new byte[1]; int bytesRead = _transport.read(response); Log.i(TAG, "PTT OFF response: " + bytesRead + " " + response[0]); + + _isPttOn = false; } } From f8e617c9caaaaf08a9e2d10b074f3cde80fbcd43 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 19:23:24 +0300 Subject: [PATCH 07/13] PTT optimizations --- .../com/radio/codec2talkie/rigctl/Ft817.java | 34 +------------ .../codec2talkie/transport/SoundModem.java | 49 +++++++++++++++++-- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java index 468aaf1..6788e1c 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -16,23 +16,15 @@ import java.util.TimerTask; public class Ft817 implements RigCtl { private static final String TAG = Ft817.class.getSimpleName(); - private static final int PTT_OFF_DELAY_MS = 1000; - private Transport _transport; - private Timer _pttOffTimer; - private boolean _isPttOn = false; - @Override public void initialize(Transport transport, Context context, RigCtlCallback protocolCallback) throws IOException { _transport = transport; - _isPttOn = false; } @Override public void pttOn() throws IOException { - if (_isPttOn) return; - // 0x00, 0x00, 0x00, 0x00, 0x08 // returns 0x00 (was un-keyed), 0xf0 (already keyed) Log.i(TAG, "PTT ON"); @@ -44,32 +36,10 @@ public class Ft817 implements RigCtl { byte[] response = new byte[1]; int bytesRead = _transport.read(response); Log.i(TAG, "PTT ON response: " + bytesRead + " " + response[0]); - - _isPttOn = true; } @Override - public void pttOff() { - if (!_isPttOn) return; - if (_pttOffTimer != null) { - _pttOffTimer.cancel(); - _pttOffTimer.purge(); - _pttOffTimer = null; - } - _pttOffTimer = new Timer(); - _pttOffTimer.schedule(new TimerTask() { - @Override - public void run() { - try { - sendPttOff(); - } catch (IOException e) { - e.printStackTrace(); - } - } - }, PTT_OFF_DELAY_MS); - } - - public void sendPttOff() throws IOException { + public void pttOff() throws IOException { // 0x00, 0x00, 0x00, 0x00, 0x88 // returns 0x00 (was keyed), 0xf0 (already un-keyed) Log.i(TAG, "PTT OFF"); @@ -81,7 +51,5 @@ public class Ft817 implements RigCtl { byte[] response = new byte[1]; int bytesRead = _transport.read(response); Log.i(TAG, "PTT OFF response: " + bytesRead + " " + response[0]); - - _isPttOn = false; } } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 6c7bffe..668f152 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -24,14 +24,18 @@ import java.io.IOException; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.util.Arrays; +import java.util.Timer; +import java.util.TimerTask; public class SoundModem implements Transport, Runnable { private static final String TAG = SoundModem.class.getSimpleName(); + private static final int PTT_OFF_DELAY_MS = 1000; + // NOTE, codec2 library requires that sample_rate % bit_rate == 0 - //public static final int SAMPLE_RATE = 19200; - public static final int SAMPLE_RATE = 48000; + public static final int SAMPLE_RATE = 19200; + //public static final int SAMPLE_RATE = 48000; private final String _name; @@ -56,6 +60,8 @@ public class SoundModem implements Transport, Runnable { private final long _fskModem; private final RigCtl _rigCtl; + private Timer _pttOffTimer; + private boolean _isPttOn = false; public SoundModem(Context context) { _context = context; @@ -94,6 +100,8 @@ public class SoundModem implements Transport, Runnable { e.printStackTrace(); } + _isPttOn = false; + if (!disableRx) new Thread(this).start(); } @@ -159,11 +167,12 @@ public class SoundModem implements Transport, Runnable { @Override public int write(byte[] srcDataBytesAsBits) throws IOException { + pttOn(); + //Log.v(TAG, "write " + DebugTools.byteBitsToFlatString(srcDataBytesAsBits)); byte[] dataBytesAsBits = BitTools.convertToNRZI(srcDataBytesAsBits); //Log.v(TAG, "write NRZ " + DebugTools.byteBitsToFlatString(dataBytesAsBits)); //Log.v(TAG, "write NRZ " + DebugTools.byteBitsToString(dataBytesAsBits)); - _rigCtl.pttOn(); int j = 0; for (int i = 0; i < dataBytesAsBits.length; i++, j++) { @@ -197,7 +206,7 @@ public class SoundModem implements Transport, Runnable { } else { _systemAudioPlayer.write(_playbackAudioBuffer, 0, bitBufferTail.length * _samplesPerSymbol); } - _rigCtl.pttOff(); + pttOff(); return 0; } @@ -264,4 +273,36 @@ public class SoundModem implements Transport, Runnable { } } } + + private void pttOn() { + if (_isPttOn) return; + + try { + _rigCtl.pttOn(); + _isPttOn = true; + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void pttOff() { + if (!_isPttOn) return; + if (_pttOffTimer != null) { + _pttOffTimer.cancel(); + _pttOffTimer.purge(); + _pttOffTimer = null; + } + _pttOffTimer = new Timer(); + _pttOffTimer.schedule(new TimerTask() { + @Override + public void run() { + try { + _rigCtl.pttOff(); + _isPttOn = false; + } catch (IOException e) { + e.printStackTrace(); + } + } + }, PTT_OFF_DELAY_MS); + } } From b9e9c8d2fa3cfc942a52cc0a4dd3146171fa7202 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 19:35:00 +0300 Subject: [PATCH 08/13] Add gain as argument --- codec2talkie/src/main/res/values/strings.xml | 2 +- libcodec2-android/src/main/cpp/Codec2JNI.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index 42fc84a..1d46f95 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -302,5 +302,5 @@ TNC transport type Disable receive Run modem in transmit only mode, receive is disabled to save CPU cycles - Select radio model to control + Select RIG model for CAT PTT control \ No newline at end of file diff --git a/libcodec2-android/src/main/cpp/Codec2JNI.cpp b/libcodec2-android/src/main/cpp/Codec2JNI.cpp index 698a3f3..d090519 100644 --- a/libcodec2-android/src/main/cpp/Codec2JNI.cpp +++ b/libcodec2-android/src/main/cpp/Codec2JNI.cpp @@ -25,6 +25,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { int Nbits; int N; int Ts; + int gain; }; static Context *getContext(jlong jp) { @@ -74,6 +75,8 @@ namespace Java_com_ustadmobile_codec2_Codec2 { conFsk->demodBits = (uint8_t*)malloc(sizeof(uint8_t) * fsk->Nbits); conFsk->demodBuf = (int16_t*)malloc(sizeof(short) * (fsk->N + 2 * fsk->Ts)); + conFsk->gain = 10 * FDMDV_SCALE; + fsk_set_freq_est_limits(fsk, 500, sampleFrequency / 4); fsk_set_freq_est_alg(fsk, 0); @@ -168,7 +171,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { fsk_mod(conFsk->fsk, conFsk->modBuf, conFsk->modBits, inputBitsSize); jshort *jOutBuf = env->GetShortArrayElements(outputSamples, nullptr); for (int i = 0; i < conFsk->N; i++) { - jOutBuf[i] = (int16_t)(conFsk->modBuf[i] * FDMDV_SCALE); + jOutBuf[i] = (int16_t)(conFsk->modBuf[i] * conFsk->gain); } env->ReleaseShortArrayElements(outputSamples, jOutBuf, 0); return 0; @@ -186,7 +189,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { ContextFsk *conFsk = getContextFsk(n); env->GetShortArrayRegion(inputSamples, 0, conFsk->N, reinterpret_cast(conFsk->demodBuf)); for(int i = 0; i < fsk_nin(conFsk->fsk); i++){ - conFsk->demodCBuf[i].real = ((float)conFsk->demodBuf[i]) / FDMDV_SCALE; + conFsk->demodCBuf[i].real = ((float)conFsk->demodBuf[i]) / conFsk->gain; conFsk->demodCBuf[i].imag = 0.0; } fsk_demod(conFsk->fsk, conFsk->demodBits, conFsk->demodCBuf); From e545a098db8bd3fbabe6b33e8a438b1b5f133233 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 21:08:51 +0300 Subject: [PATCH 09/13] Audio gain into settings --- .../codec2talkie/settings/PreferenceKeys.java | 1 + .../codec2talkie/transport/SoundModem.java | 7 ++-- codec2talkie/src/main/res/values/arrays.xml | 32 +++++++++++++++++++ codec2talkie/src/main/res/values/strings.xml | 1 + .../main/res/xml/preferences_sound_modem.xml | 9 ++++++ libcodec2-android/src/main/cpp/Codec2JNI.cpp | 6 ++-- .../java/com/ustadmobile/codec2/Codec2.java | 2 +- 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java index e3b714d..90cf9b5 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java @@ -21,6 +21,7 @@ public final class PreferenceKeys { public static String PORTS_SOUND_MODEM_PREAMBLE = "ports_sound_modem_preamble"; public static String PORTS_SOUND_MODEM_DISABLE_RX = "ports_sound_modem_disable_rx"; public static String PORTS_SOUND_MODEM_RIG = "ports_sound_modem_rig"; + public static String PORTS_SOUND_MODEM_GAIN ="ports_sound_modem_gain"; public static String CODEC2_MODE = "codec2_mode"; public static String CODEC2_RECORDING_ENABLED = "codec2_recording_enabled"; diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 668f152..705efe4 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -69,14 +69,15 @@ public class SoundModem implements Transport, Runnable { boolean disableRx = _sharedPreferences.getBoolean(PreferenceKeys.PORTS_SOUND_MODEM_DISABLE_RX, false); int bitRate = Integer.parseInt(_sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_TYPE, "1200")); + int gain = Integer.parseInt(_sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_GAIN, "10000")); _name = "SoundModem" + bitRate; if (bitRate == 300) { // <230 spacing for 300 bps does not work with codec2 fsk for receive - _fskModem = Codec2.fskCreate(SAMPLE_RATE, 300, 1600, 200); + _fskModem = Codec2.fskCreate(SAMPLE_RATE, 300, 1600, 200, gain); } else if (bitRate == 1200) { - _fskModem = Codec2.fskCreate(SAMPLE_RATE, 1200, 1200, 1000); + _fskModem = Codec2.fskCreate(SAMPLE_RATE, 1200, 1200, 1000, gain); } else { - _fskModem = Codec2.fskCreate(SAMPLE_RATE, 2400, 2165, 1805); + _fskModem = Codec2.fskCreate(SAMPLE_RATE, 2400, 2165, 1805, gain); } _recordAudioBuffer = new short[Codec2.fskDemodSamplesBufSize(_fskModem)]; diff --git a/codec2talkie/src/main/res/values/arrays.xml b/codec2talkie/src/main/res/values/arrays.xml index 03b50ef..61d6b84 100644 --- a/codec2talkie/src/main/res/values/arrays.xml +++ b/codec2talkie/src/main/res/values/arrays.xml @@ -362,4 +362,36 @@ Disabled Ft817 + + + +0 db + +1 db + +2 db + +3 db + +4 db + +5 db + +6 db + +7 db + +8 db + +9 db + +10 db + +11 db + +12 db + + + + 1000 + 1258 + 1584 + 1995 + 2511 + 3162 + 3981 + 5011 + 6309 + 7943 + 10000 + 12589 + 15848 + \ No newline at end of file diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index 1d46f95..688dfa3 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -303,4 +303,5 @@ Disable receive Run modem in transmit only mode, receive is disabled to save CPU cycles Select RIG model for CAT PTT control + Set modem audio gain \ No newline at end of file diff --git a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml index bc7720f..1716424 100644 --- a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml +++ b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml @@ -38,5 +38,14 @@ app:summary="%s"> + + + \ No newline at end of file diff --git a/libcodec2-android/src/main/cpp/Codec2JNI.cpp b/libcodec2-android/src/main/cpp/Codec2JNI.cpp index d090519..fe1df4b 100644 --- a/libcodec2-android/src/main/cpp/Codec2JNI.cpp +++ b/libcodec2-android/src/main/cpp/Codec2JNI.cpp @@ -57,7 +57,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { return pv; } - static jlong fskCreate(JNIEnv *env, jclass clazz, int sampleFrequency, int symbolRate, int toneFreq, int toneSpacing) { + static jlong fskCreate(JNIEnv *env, jclass clazz, int sampleFrequency, int symbolRate, int toneFreq, int toneSpacing, int gain) { struct ContextFsk *conFsk; conFsk = (struct ContextFsk *) malloc(sizeof(struct ContextFsk)); struct FSK *fsk; @@ -75,7 +75,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { conFsk->demodBits = (uint8_t*)malloc(sizeof(uint8_t) * fsk->Nbits); conFsk->demodBuf = (int16_t*)malloc(sizeof(short) * (fsk->N + 2 * fsk->Ts)); - conFsk->gain = 10 * FDMDV_SCALE; + conFsk->gain = gain; fsk_set_freq_est_limits(fsk, 500, sampleFrequency / 4); fsk_set_freq_est_alg(fsk, 0); @@ -204,7 +204,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { {"destroy", "(J)I", (void *) destroy}, {"encode", "(J[S[C)J", (void *) encode}, {"decode", "(J[S[B)J", (void *) decode}, - {"fskCreate", "(IIII)J", (void *) fskCreate}, + {"fskCreate", "(IIIII)J", (void *) fskCreate}, {"fskDestroy", "(J)I", (void *) fskDestroy}, {"fskModulate", "(J[S[B)J", (void *) fskModulate}, {"fskDemodulate", "(J[S[B)J", (void *) fskDemodulate}, diff --git a/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java b/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java index 4c8a58d..5de0986 100644 --- a/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java +++ b/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java @@ -35,7 +35,7 @@ public class Codec2 { public native static long encode(long con, short[] inputSamples, char[] outputBits); public native static long decode(long con, short[] outputSamples, byte[] inputsBits); - public native static long fskCreate(int sampleFrequency, int symbolRate, int toneFreq, int toneSpacing); + public native static long fskCreate(int sampleFrequency, int symbolRate, int toneFreq, int toneSpacing, int gain); public native static int fskDestroy(long conFsk); public native static int fskDemodBitsBufSize(long conFsk); From a1c770ce2cd14464049ead72c15b5a0b1335c27a Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 21:12:03 +0300 Subject: [PATCH 10/13] Increase version --- codec2talkie/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codec2talkie/build.gradle b/codec2talkie/build.gradle index e05a6f2..4fd45af 100644 --- a/codec2talkie/build.gradle +++ b/codec2talkie/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.radio.codec2talkie" minSdkVersion 23 targetSdkVersion 30 - versionCode 132 - versionName "1.32" + versionCode 133 + versionName "1.33" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 568448d9bf2ead5fee00688e8f16b2f834c211ee Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 21:20:44 +0300 Subject: [PATCH 11/13] Rig CAT control status icon --- .../src/main/java/com/radio/codec2talkie/MainActivity.java | 6 ++++++ codec2talkie/src/main/res/values/strings.xml | 1 + 2 files changed, 7 insertions(+) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java index 9c1e246..d42d5f0 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java @@ -463,6 +463,12 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection status += getString(R.string.kiss_scrambler_label); } + // rig CAT control + String rigName = _sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_RIG, "Disabled"); + if (!rigName.equals("Disabled") && UsbPortHandler.getPort() != null) { + status += getString(R.string.ports_sound_modem_rig_label); + } + // aprs boolean aprsEnabled = _sharedPreferences.getBoolean(PreferenceKeys.APRS_ENABLED, false); if (aprsEnabled) { diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index 688dfa3..bd09f34 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -304,4 +304,5 @@ Run modem in transmit only mode, receive is disabled to save CPU cycles Select RIG model for CAT PTT control Set modem audio gain + 🎛 \ No newline at end of file From 01311042f80a3774262035e2168266dae58f8ab4 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 21:29:01 +0300 Subject: [PATCH 12/13] Improve rigctl icon visibility --- .../src/main/java/com/radio/codec2talkie/MainActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java index d42d5f0..46ce723 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/MainActivity.java @@ -110,6 +110,7 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection private boolean _isConnecting = false; private boolean _isAppExit = false; private boolean _isAppRestart = false; + private boolean _isRigCtlUsbConnected = false; private long _backPressedTimestamp; @@ -290,6 +291,7 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection int resultCode = result.getResultCode(); String transportType = _sharedPreferences.getString(PreferenceKeys.PORTS_TYPE, "loopback"); if (transportType.equals("sound_modem")) { + _isRigCtlUsbConnected = resultCode == RESULT_OK; startAppService(TransportFactory.TransportType.SOUND_MODEM); } else if (resultCode == RESULT_CANCELED) { _textConnInfo.setText(R.string.main_status_loopback_test); @@ -303,6 +305,7 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection protected void startUsbConnectActivity() { _isConnecting = true; + _isRigCtlUsbConnected = false; _usbActivityLauncher.launch(new Intent(this, UsbConnectActivity.class)); } @@ -465,7 +468,7 @@ public class MainActivity extends AppCompatActivity implements ServiceConnection // rig CAT control String rigName = _sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_RIG, "Disabled"); - if (!rigName.equals("Disabled") && UsbPortHandler.getPort() != null) { + if (!rigName.equals("Disabled") && _isRigCtlUsbConnected) { status += getString(R.string.ports_sound_modem_rig_label); } From e016e16df1db4f94f36700ccc0374492cf661fa6 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 6 Aug 2022 21:47:20 +0300 Subject: [PATCH 13/13] Cleanup --- .../com/radio/codec2talkie/connect/UsbConnectActivity.java | 2 +- .../src/main/java/com/radio/codec2talkie/rigctl/Ft817.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/connect/UsbConnectActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/connect/UsbConnectActivity.java index 5d86560..ccc06a4 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/connect/UsbConnectActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/connect/UsbConnectActivity.java @@ -92,7 +92,7 @@ public class UsbConnectActivity extends AppCompatActivity { customTable.addProduct(0x1b4f, 0x9204, CdcAcmSerialDriver.class); // Arduino Due customTable.addProduct(0x2341, 0x003d, CdcAcmSerialDriver.class); - // STM + // STM, MCHF customTable.addProduct(0x0483, 0x5732, CdcAcmSerialDriver.class); return new UsbSerialProber(customTable); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java index 6788e1c..4e9ad0b 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/rigctl/Ft817.java @@ -3,14 +3,10 @@ package com.radio.codec2talkie.rigctl; import android.content.Context; import android.util.Log; -import com.radio.codec2talkie.protocol.Hdlc; -import com.radio.codec2talkie.tools.UnitTools; import com.radio.codec2talkie.transport.Transport; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Timer; -import java.util.TimerTask; // http://www.ka7oei.com/ft817_meow.html public class Ft817 implements RigCtl {