Porównaj commity

...

6 Commity

Autor SHA1 Wiadomość Data
sh123 df80a982de Tune timeouts 2023-11-17 14:53:35 +02:00
sh123 9886bccaf4 Display speed based on modulation 2023-11-17 13:19:59 +02:00
sh123 3346003d2d Escape control command data 2023-11-16 23:26:22 +02:00
sh123 9dab9acad0 Small settings update 2023-11-16 21:23:54 +02:00
sh123 561325757b Added settings for FSK 2023-11-16 21:16:05 +02:00
sh123 3a4438e80c FSK support for set hardware 2023-11-16 20:32:19 +02:00
10 zmienionych plików z 278 dodań i 73 usunięć

Wyświetl plik

@ -10,8 +10,8 @@ android {
applicationId "com.radio.codec2talkie"
minSdkVersion 23
targetSdkVersion 30
versionCode 164
versionName "1.64"
versionCode 165
versionName "1.65"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Wyświetl plik

@ -46,7 +46,7 @@ public class AppWorker extends Thread {
private static final int AUDIO_MAX_LEVEL = 0;
private static final int AUDIO_SAMPLE_SIZE = 8000;
private static final int PROCESS_INTERVAL_MS = 20;
private static final int PROCESS_INTERVAL_MS = 10;
private static final int LISTEN_AFTER_MS = 1500;
private boolean _needTransmission = false;

Wyświetl plik

@ -15,6 +15,7 @@ import com.radio.codec2talkie.protocol.message.TextMessage;
import com.radio.codec2talkie.protocol.position.Position;
import com.radio.codec2talkie.settings.PreferenceKeys;
import com.radio.codec2talkie.settings.SettingsWrapper;
import com.radio.codec2talkie.tools.DebugTools;
import com.radio.codec2talkie.transport.Transport;
import java.io.IOException;
@ -30,7 +31,7 @@ public class Kiss implements Protocol {
private static final int FRAME_OUTPUT_BUFFER_SIZE = 1024;
private static final int KISS_CMD_BUFFER_SIZE = 128;
private static final int KISS_RADIO_CONTROL_COMMAND_SIZE = 17;
private static final int KISS_RADIO_CONTROL_COMMAND_SIZE = 34;
private static final byte KISS_FEND = (byte)0xc0;
private static final byte KISS_FESC = (byte)0xdb;
@ -155,41 +156,52 @@ public class Kiss implements Protocol {
private void initializeExtended() throws IOException {
/*
struct LoraControlCommand {
uint32_t freq;
struct SetHardware {
uint32_t freqRx;
uint32_t freqTx;
uint8_t modType;
uint16_t pwr;
uint32_t bw;
uint16_t sf;
uint16_t cr;
uint16_t pwr;
uint16_t sync;
uint8_t crc;
} __attribute__((packed));
uint32_t fskBitRate;
uint32_t fskFreqDev;
uint32_t fskRxBw;
} __attribute__((packed));
*/
String freq = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FREQUENCY, "433775000");
String freqTx = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FREQUENCY_TX, "433775000");
if (!_sharedPreferences.getBoolean(PreferenceKeys.KISS_EXTENSIONS_RADIO_SPLIT_FREQ, false)) freqTx = freq;
String modType = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_MOD, "0");
String bw = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_BANDWIDTH, "125000");
String sf = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_SF, "7");
String cr = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_CR, "6");
String pwr = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_POWER, "20");
String sync = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_SYNC, "34");
byte crc = (byte)(_sharedPreferences.getBoolean(PreferenceKeys.KISS_EXTENSIONS_RADIO_CRC, true) ? 1 : 0);
String fskBitRate = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FSK_BIT_RATE, "4800");
String fskFreqDev = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FSK_FREQ_DEV, "1200");
String fskRxBw = _sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FSK_RX_BW, "9700");
ByteBuffer rawBuffer = ByteBuffer.allocate(KISS_RADIO_CONTROL_COMMAND_SIZE);
rawBuffer.putInt(Integer.parseInt(freq))
.putInt(Integer.parseInt(freqTx))
.put(Byte.parseByte(modType))
.putShort(Short.parseShort(pwr))
.putInt(Integer.parseInt(bw))
.putShort(Short.parseShort(sf))
.putShort(Short.parseShort(cr))
.putShort(Short.parseShort(pwr))
.putShort(Short.parseShort(sync, 16))
.put(crc)
.putInt(Integer.parseInt(fskBitRate))
.putInt(Integer.parseInt(fskFreqDev))
.putInt(Integer.parseInt(fskRxBw))
.rewind();
startKissPacket(KISS_CMD_SET_HARDWARE);
for (byte b: rawBuffer.array()) {
sendKissByte(b);
}
completeKissPacket();
send(KISS_CMD_SET_HARDWARE, rawBuffer.array());
_context.registerReceiver(onModemRebootRequested, new IntentFilter(PreferenceKeys.KISS_EXTENSIONS_ACTION_REBOOT_REQUESTED));
}
@ -210,7 +222,7 @@ public class Kiss implements Protocol {
@Override
public void sendCompressedAudio(String src, String dst, int codec, byte[] frame) throws IOException {
// NOTE, KISS does not distinguish between audio and data packet, upper layer should decide
send(frame);
send(KISS_CMD_DATA, frame);
}
@Override
@ -226,7 +238,7 @@ public class Kiss implements Protocol {
@Override
public void sendData(String src, String dst, String path, byte[] dataPacket) throws IOException {
// NOTE, KISS does not distinguish between audio and data packet, upper layer should decide
send(dataPacket);
send(KISS_CMD_DATA, dataPacket);
}
@Override
@ -258,14 +270,14 @@ public class Kiss implements Protocol {
}
}
private void send(byte[] data) throws IOException {
private void send(byte commandCode, byte[] data) throws IOException {
// escape
ByteBuffer escapedFrame = escape(data);
int escapedFrameSize = escapedFrame.position();
escapedFrame.rewind();
// send
startKissPacket(KISS_CMD_DATA);
startKissPacket(commandCode);
while (escapedFrame.position() < escapedFrameSize) {
sendKissByte(escapedFrame.get());
}
@ -412,6 +424,8 @@ public class Kiss implements Protocol {
private void completeKissPacket() throws IOException {
if (_transportOutputBufferPos > 0) {
sendKissByte(KISS_FEND);
//byte[] d = Arrays.copyOf(_transportOutputBuffer, _transportOutputBufferPos);
//Log.i(TAG, DebugTools.bytesToHex(d));
_transport.write(Arrays.copyOf(_transportOutputBuffer, _transportOutputBufferPos));
_transportOutputBufferPos = 0;
}

Wyświetl plik

@ -47,13 +47,19 @@ public final class PreferenceKeys {
public static String KISS_SCRAMBLER_ITERATIONS = "kiss_scrambler_iterations";
public static String KISS_EXTENSIONS_ENABLED = "kiss_extensions_enable";
public static String KISS_EXTENSIONS_RADIO_MOD = "kiss_extension_radio_mod";
public static String KISS_EXTENSIONS_RADIO_SPLIT_FREQ = "kiss_extension_radio_split_freq";
public static String KISS_EXTENSIONS_RADIO_FREQUENCY = "kiss_extension_radio_frequency";
public static String KISS_EXTENSIONS_RADIO_FREQUENCY_TX = "kiss_extension_radio_frequency_tx";
public static String KISS_EXTENSIONS_RADIO_BANDWIDTH = "kiss_extension_radio_bandwidth";
public static String KISS_EXTENSIONS_RADIO_POWER = "kiss_extension_radio_power";
public static String KISS_EXTENSIONS_RADIO_SF = "kiss_extension_radio_sf";
public static String KISS_EXTENSIONS_RADIO_CR = "kiss_extension_radio_cr";
public static String KISS_EXTENSIONS_RADIO_SYNC = "kiss_extension_radio_sync";
public static String KISS_EXTENSIONS_RADIO_CRC = "kiss_extension_radio_crc";
public static String KISS_EXTENSIONS_RADIO_FSK_BIT_RATE = "kiss_extension_radio_fsk_bit_rate";
public static String KISS_EXTENSIONS_RADIO_FSK_FREQ_DEV = "kiss_extension_radio_fsk_freq_dev";
public static String KISS_EXTENSIONS_RADIO_FSK_RX_BW = "kiss_extension_radio_fsk_rx_bw";
public static String KISS_EXTENSIONS_ACTION_REBOOT_REQUESTED = "com.radio.codec2talkie.MODEM_REBOOT";

Wyświetl plik

@ -76,6 +76,11 @@ public class AudioTools {
return null;
}
public static String getModulationAsText(SharedPreferences sharedPreferences) {
int modulation = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_MOD, "0"));
return modulation == RadioTools.ModulationTypeLora ? "LoRa" : "FSK";
}
public static String getSpeedStatusText(String codec2ModeName, SharedPreferences sharedPreferences) {
// use freedv mode text instead if it is active

Wyświetl plik

@ -7,25 +7,37 @@ import com.radio.codec2talkie.settings.PreferenceKeys;
import com.radio.codec2talkie.settings.SettingsWrapper;
public class RadioTools {
public static final int ModulationTypeLora = 0;
public static final int ModulationTypeFsk = 1;
public static int calculateLoraSpeedBps(int bw, int sf, int cr) {
return (int)(sf * (4.0 / cr) / (Math.pow(2.0, sf) / bw));
}
public static int getRadioSpeed(SharedPreferences sharedPreferences) {
int resultBps = 0;
int maxSpeedBps = 128000;
try {
if (!SettingsWrapper.isSoundModemEnabled(sharedPreferences) && SettingsWrapper.isKissExtensionEnabled(sharedPreferences)) {
int bw = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_BANDWIDTH, "125000"));
int sf = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_SF, "7"));
int cr = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_CR, "5"));
resultBps = RadioTools.calculateLoraSpeedBps(bw, sf, cr);
}
} catch (NumberFormatException|ArithmeticException e) {
e.printStackTrace();
int modulation = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_MOD, "0"));
if (SettingsWrapper.isSoundModemEnabled(sharedPreferences)) {
return SettingsWrapper.getFskSpeed(sharedPreferences);
}
return (resultBps > 0 && resultBps <= maxSpeedBps) ? resultBps : 0;
if (modulation == ModulationTypeLora) {
int resultBps = 0;
int maxSpeedBps = 128000;
try {
if (!SettingsWrapper.isSoundModemEnabled(sharedPreferences) && SettingsWrapper.isKissExtensionEnabled(sharedPreferences)) {
int bw = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_BANDWIDTH, "125000"));
int sf = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_SF, "7"));
int cr = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_CR, "5"));
resultBps = RadioTools.calculateLoraSpeedBps(bw, sf, cr);
}
} catch (NumberFormatException | ArithmeticException e) {
e.printStackTrace();
}
return (resultBps > 0 && resultBps <= maxSpeedBps) ? resultBps : 0;
} else if (modulation == ModulationTypeFsk){
return Integer.parseInt(sharedPreferences.getString(PreferenceKeys.KISS_EXTENSIONS_RADIO_FSK_BIT_RATE, "4.8"));
}
return 0;
}
public static double calculateLoraSensitivity(SharedPreferences sharedPreferences) {

Wyświetl plik

@ -7,7 +7,7 @@ import java.io.IOException;
public class UsbSerial implements Transport {
private static final int RX_TIMEOUT = 10;
private static final int RX_TIMEOUT = 5;
private static final int TX_TIMEOUT = 2000;
private final UsbSerialPort _usbPort;

Wyświetl plik

@ -38,7 +38,6 @@
</string-array>
<string-array name="lora_spreading_factors">
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
@ -275,7 +274,76 @@
<item>/y</item>
</string-array>
<string-array name="radio_mod_entries">
<item>LoRa</item>
<item>FSK</item>
</string-array>
<string-array name="radio_mod_values">
<item>0</item>
<item>1</item>
</string-array>
<string-array name="fsk_rx_bw_entries">
<item>4800 Hz</item>
<item>5800 Hz</item>
<item>7300 Hz</item>
<item>9700 Hz</item>
<item>11700 Hz</item>
<item>14600 Hz</item>
<item>19500 Hz</item>
<item>23400 Hz</item>
<item>29300 Hz</item>
<item>39000 Hz</item>
<item>46900 Hz</item>
<item>58600 Hz</item>
<item>78200 Hz</item>
<item>93800 Hz</item>
<item>117300 Hz</item>
<item>156200 Hz</item>
<item>187200 Hz</item>
<item>234300 Hz</item>
<item>312000 Hz</item>
<item>373000 Hz</item>
<item>467000 Hz</item>
</string-array>
<string-array name="fsk_rx_bw_values">
<item>4800</item>
<item>5800</item>
<item>7300</item>
<item>9700</item>
<item>11700</item>
<item>14600</item>
<item>19500</item>
<item>23400</item>
<item>29300</item>
<item>39000</item>
<item>46900</item>
<item>58600</item>
<item>78200</item>
<item>93800</item>
<item>117300</item>
<item>156200</item>
<item>187200</item>
<item>234300</item>
<item>312000</item>
<item>373000</item>
<item>467000</item>
</string-array>
<string-array name="lora_power_entries">
<item>-9 dBm</item>
<item>-8 dBm</item>
<item>-7 dBm</item>
<item>-6 dBm</item>
<item>-5 dBm</item>
<item>-4 dBm</item>
<item>-3 dBm</item>
<item>-2 dBm</item>
<item>-1 dBm</item>
<item>0 dBm</item>
<item>1 dBm</item>
<item>2 dBm</item>
<item>3 dBm</item>
<item>4 dBm</item>
@ -300,6 +368,17 @@
</string-array>
<string-array name="lora_power_values">
<item>-9</item>
<item>-8</item>
<item>-7</item>
<item>-6</item>
<item>-5</item>
<item>-4</item>
<item>-3</item>
<item>-2</item>
<item>-1</item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>

Wyświetl plik

@ -54,11 +54,24 @@
<string name="kiss_extensions_enable_title">Enable extensions</string>
<string name="kiss_extensions_enable_summary">Enable radio control and signal level reports</string>
<string name="kiss_extensions_radio_mod_title">Select radio modulation type</string>
<string name="kiss_extensions_radio_control_title">Set radio parameters</string>
<string name="kiss_extensions_radio_control_summary">Set frequency, bandwidth and other radio parameters</string>
<string name="kiss_extensions_radio_category_lora_title">Set LoRa modulation parameters</string>
<string name="kiss_extensions_radio_category_fsk_title">Set FSK modulation parameters</string>
<string name="kiss_extensions_radio_category_other_title">Modem control</string>
<string name="kiss_extension_radio_split_freq_title">Split frequency operation</string>
<string name="kiss_extension_radio_split_freq_summary">Use separate frequencies for RX and TX</string>
<string name="kiss_extensions_radio_frequency_title">Frequency (Hz)</string>
<string name="kiss_extensions_radio_frequency_summary">Set radio frequency</string>
<string name="kiss_extensions_radio_frequency_summary">Set radio frequency for RX/TX or RX frequency when split operation is enabled</string>
<string name="kiss_extensions_radio_frequency_title_tx">Frequency TX (Hz)</string>
<string name="kiss_extensions_radio_frequency_summary_tx">Set transmit radio frequency</string>
<string name="kiss_extensions_radio_bandwidth_title">Bandwidth (Hz)</string>
<string name="kiss_extensions_radio_bandwidth_summary">Set radio bandwidth</string>
@ -78,6 +91,14 @@
<string name="kiss_extensions_radio_crc_title">Enable CRC check</string>
<string name="kiss_extensions_radio_crc_summary">Enable packet CRC check</string>
<string name="kiss_extension_radio_fsk_bit_rate_title">Bit rate (600–300000 bps)</string>
<string name="kiss_extension_radio_fsk_bit_rate_summary">Set bit rate</string>
<string name="kiss_extension_radio_fsk_freq_dev_title">Set freq deviation (600–200000 Hz)</string>
<string name="kiss_extension_radio_fsk_freq_dev_summary">Set freq deviation</string>
<string name="kiss_extension_radio_fsk_rx_bw_title">Set receive bandwidth (Hz)</string>
<string name="app_volume_ptt_title">Use volume keys for PTT</string>
<string name="app_volume_ptt_summary">Volume up/down keys will be used for PTT</string>

Wyświetl plik

@ -13,14 +13,21 @@
app:defaultValue="433775000">
</EditTextPreference>
<ListPreference
app:key="kiss_extension_radio_bandwidth"
app:title="@string/kiss_extensions_radio_bandwidth_title"
app:entries="@array/lora_bandwidths"
app:entryValues="@array/lora_bandwidths"
app:defaultValue="125000"
app:summary="%s">
</ListPreference>
<SwitchPreference
app:key="kiss_extension_radio_split_freq"
app:title="@string/kiss_extension_radio_split_freq_title"
app:summary="@string/kiss_extension_radio_split_freq_summary"
app:defaultValue="false">
</SwitchPreference>
<EditTextPreference
app:key="kiss_extension_radio_frequency_tx"
app:title="@string/kiss_extensions_radio_frequency_title_tx"
app:useSimpleSummaryProvider="true"
app:summary="@string/kiss_extensions_radio_frequency_summary_tx"
app:dependency="kiss_extension_radio_split_freq"
app:defaultValue="433775000">
</EditTextPreference>
<ListPreference
app:key="kiss_extension_radio_power"
@ -32,43 +39,104 @@
</ListPreference>
<ListPreference
app:key="kiss_extension_radio_sf"
app:title="@string/kiss_extensions_radio_sf_title"
app:key="kiss_extension_radio_mod"
app:title="@string/kiss_extensions_radio_mod_title"
app:entries="@array/radio_mod_entries"
app:entryValues="@array/radio_mod_values"
app:summary="%s"
app:entries="@array/lora_spreading_factors"
app:entryValues="@array/lora_spreading_factors"
app:defaultValue="7">
app:defaultValue="0">
</ListPreference>
<ListPreference
app:key="kiss_extension_radio_cr"
app:title="@string/kiss_extensions_radio_cr_title"
app:summary="%s"
app:entries="@array/lora_coding_rates"
app:entryValues="@array/lora_coding_rates"
app:defaultValue="6">
</ListPreference>
<PreferenceCategory
app:key="kiss_extensions_radio_category_lora"
app:title="@string/kiss_extensions_radio_category_lora_title">
<EditTextPreference
app:key="kiss_extension_radio_sync"
app:title="@string/kiss_extensions_radio_sync_title"
app:summary="@string/kiss_extensions_radio_sync_summary"
app:useSimpleSummaryProvider="true"
app:defaultValue="34">
</EditTextPreference>
<ListPreference
app:key="kiss_extension_radio_bandwidth"
app:title="@string/kiss_extensions_radio_bandwidth_title"
app:entries="@array/lora_bandwidths"
app:entryValues="@array/lora_bandwidths"
app:defaultValue="125000"
app:summary="%s">
</ListPreference>
<CheckBoxPreference
app:key="kiss_extension_radio_crc"
app:title="@string/kiss_extensions_radio_crc_title"
app:summary="@string/kiss_extensions_radio_crc_summary"
app:defaultValue="true">
</CheckBoxPreference>
<ListPreference
app:key="kiss_extension_radio_sf"
app:title="@string/kiss_extensions_radio_sf_title"
app:summary="%s"
app:entries="@array/lora_spreading_factors"
app:entryValues="@array/lora_spreading_factors"
app:defaultValue="7">
</ListPreference>
<Preference
app:key="kiss_extension_reboot"
app:title="@string/kiss_extension_reboot_title"
app:summary="@string/kiss_extension_reboot_summary">
</Preference>
<ListPreference
app:key="kiss_extension_radio_cr"
app:title="@string/kiss_extensions_radio_cr_title"
app:summary="%s"
app:entries="@array/lora_coding_rates"
app:entryValues="@array/lora_coding_rates"
app:defaultValue="6">
</ListPreference>
<EditTextPreference
app:key="kiss_extension_radio_sync"
app:title="@string/kiss_extensions_radio_sync_title"
app:summary="@string/kiss_extensions_radio_sync_summary"
app:useSimpleSummaryProvider="true"
app:defaultValue="34">
</EditTextPreference>
<CheckBoxPreference
app:key="kiss_extension_radio_crc"
app:title="@string/kiss_extensions_radio_crc_title"
app:summary="@string/kiss_extensions_radio_crc_summary"
app:defaultValue="true">
</CheckBoxPreference>
</PreferenceCategory>
<PreferenceCategory
app:key="kiss_extensions_radio_category_fsk"
app:title="@string/kiss_extensions_radio_category_fsk_title">
<EditTextPreference
app:key="kiss_extension_radio_fsk_bit_rate"
app:title="@string/kiss_extension_radio_fsk_bit_rate_title"
app:useSimpleSummaryProvider="true"
app:summary="@string/kiss_extension_radio_fsk_bit_rate_summary"
app:defaultValue="4800">
</EditTextPreference>
<EditTextPreference
app:key="kiss_extension_radio_fsk_freq_dev"
app:title="@string/kiss_extension_radio_fsk_freq_dev_title"
app:useSimpleSummaryProvider="true"
app:summary="@string/kiss_extension_radio_fsk_freq_dev_summary"
app:defaultValue="1200">
</EditTextPreference>
<ListPreference
app:key="kiss_extension_radio_fsk_rx_bw"
app:title="@string/kiss_extension_radio_fsk_rx_bw_title"
app:entries="@array/fsk_rx_bw_entries"
app:entryValues="@array/fsk_rx_bw_values"
app:summary="%s"
app:defaultValue="9700">
</ListPreference>
</PreferenceCategory>
<PreferenceCategory
app:key="kiss_extensions_radio_category_other"
app:title="@string/kiss_extensions_radio_category_other_title">
<Preference
app:key="kiss_extension_reboot"
app:title="@string/kiss_extension_reboot_title"
app:summary="@string/kiss_extension_reboot_summary">
</Preference>
</PreferenceCategory>
</PreferenceCategory>
</PreferenceScreen>