kopia lustrzana https://github.com/N0BOY/FT8CN
Merge branch 'dev' of https://github.com/N0BOY/FT8CN into dev
commit
42e652f679
Plik binarny nie jest wyświetlany.
42
LICENSE
42
LICENSE
|
@ -1,21 +1,21 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2023 BG7YOZ
|
Copyright (c) 2023 BG7YOZ
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
15
README.md
15
README.md
|
@ -1,10 +1,9 @@
|
||||||
# FT8CN
|
# FT8CN
|
||||||
Developed by BG7YOZ and hosted by N0BOY
|
Developed by BG7YOZ and hosted by N0BOY
|
||||||
|
|
||||||
Run FT8 natively on Android
|
Run FT8 natively on Android
|
||||||
|
|
||||||
Check [Releases](https://github.com/N0BOY/FT8CN/releases) to download the latest apk file.
|
Check [Releases](https://github.com/N0BOY/FT8CN/releases) to download the latest apk file.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
免责声明:
|
免责声明:
|
||||||
|
@ -62,4 +61,4 @@ BG7YOZ
|
||||||
BH4FTI,发现并协助对一些BUG进行调试。
|
BH4FTI,发现并协助对一些BUG进行调试。
|
||||||
BG8BXM(M哥),为FT8CN的使用做推广,抖音和B站上有很多他的教学视频。
|
BG8BXM(M哥),为FT8CN的使用做推广,抖音和B站上有很多他的教学视频。
|
||||||
BG7MFQ,为FT8CN的使用做推广,帮助测试。
|
BG7MFQ,为FT8CN的使用做推广,帮助测试。
|
||||||
```
|
```
|
|
@ -1,8 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="CompilerConfiguration">
|
<component name="CompilerConfiguration">
|
||||||
<bytecodeTargetLevel target="11">
|
<bytecodeTargetLevel target="11" />
|
||||||
<module name="Ft8CN.app" target="1.8" />
|
|
||||||
</bytecodeTargetLevel>
|
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="deploymentTargetDropDown">
|
|
||||||
<targetSelectedWithDropDown>
|
|
||||||
<Target>
|
|
||||||
<type value="QUICK_BOOT_TARGET" />
|
|
||||||
<deviceKey>
|
|
||||||
<Key>
|
|
||||||
<type value="VIRTUAL_DEVICE_PATH" />
|
|
||||||
<value value="C:\Users\jmsmf\.android\avd\Pixel_XL_API_30.avd" />
|
|
||||||
</Key>
|
|
||||||
</deviceKey>
|
|
||||||
</Target>
|
|
||||||
</targetSelectedWithDropDown>
|
|
||||||
<timeTargetWasSelectedWithDropDown value="2023-05-01T08:38:28.258277700Z" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -6,8 +6,5 @@
|
||||||
<option name="m_reportAllNonLibraryCalls" value="false" />
|
<option name="m_reportAllNonLibraryCalls" value="false" />
|
||||||
<option name="callCheckString" value="java.io.File,.*,java.io.InputStream,read|skip|available|markSupported,java.io.Reader,read|skip|ready|markSupported,java.lang.AbstractStringBuilder,capacity|codePointAt|codePointBefore|codePointCount|indexOf|lastIndexOf|offsetByCodePoints|substring|subSequence,java.lang.Boolean,.*,java.lang.Byte,.*,java.lang.Character,.*,java.lang.Double,.*,java.lang.Float,.*,java.lang.Integer,.*,java.lang.Long,.*,java.lang.Math,.*,java.lang.Object,equals|hashCode|toString,java.lang.Short,.*,java.lang.StrictMath,.*,java.lang.String,.*,java.lang.Thread,interrupted,java.math.BigDecimal,.*,java.math.BigInteger,.*,java.net.InetAddress,.*,java.net.URI,.*,java.nio.channels.AsynchronousChannelGroup,.*,java.util.Arrays,.*,java.util.Collections,(?!addAll).*,java.util.List,of,java.util.Map,of|ofEntries|entry,java.util.Set,of,java.util.UUID,.*,java.util.concurrent.CountDownLatch,await|getCount,java.util.concurrent.ExecutorService,awaitTermination|isShutdown|isTerminated,java.util.concurrent.ForkJoinPool,awaitQuiescence,java.util.concurrent.Semaphore,tryAcquire|availablePermits|isFair|hasQueuedThreads|getQueueLength|getQueuedThreads,java.util.concurrent.locks.Condition,await|awaitNanos|awaitUntil,java.util.concurrent.locks.Lock,tryLock|newCondition,java.util.regex.Matcher,pattern|toMatchResult|start|end|group|groupCount|matches|find|lookingAt|quoteReplacement|replaceAll|replaceFirst|regionStart|regionEnd|hasTransparentBounds|hasAnchoringBounds|hitEnd|requireEnd,java.util.regex.Pattern,.*,java.util.stream.BaseStream,.*,java.util.stream.DoubleStream,.*,java.util.stream.IntStream,.*,java.util.stream.LongStream,.*,java.util.stream.Stream,.*" />
|
<option name="callCheckString" value="java.io.File,.*,java.io.InputStream,read|skip|available|markSupported,java.io.Reader,read|skip|ready|markSupported,java.lang.AbstractStringBuilder,capacity|codePointAt|codePointBefore|codePointCount|indexOf|lastIndexOf|offsetByCodePoints|substring|subSequence,java.lang.Boolean,.*,java.lang.Byte,.*,java.lang.Character,.*,java.lang.Double,.*,java.lang.Float,.*,java.lang.Integer,.*,java.lang.Long,.*,java.lang.Math,.*,java.lang.Object,equals|hashCode|toString,java.lang.Short,.*,java.lang.StrictMath,.*,java.lang.String,.*,java.lang.Thread,interrupted,java.math.BigDecimal,.*,java.math.BigInteger,.*,java.net.InetAddress,.*,java.net.URI,.*,java.nio.channels.AsynchronousChannelGroup,.*,java.util.Arrays,.*,java.util.Collections,(?!addAll).*,java.util.List,of,java.util.Map,of|ofEntries|entry,java.util.Set,of,java.util.UUID,.*,java.util.concurrent.CountDownLatch,await|getCount,java.util.concurrent.ExecutorService,awaitTermination|isShutdown|isTerminated,java.util.concurrent.ForkJoinPool,awaitQuiescence,java.util.concurrent.Semaphore,tryAcquire|availablePermits|isFair|hasQueuedThreads|getQueueLength|getQueuedThreads,java.util.concurrent.locks.Condition,await|awaitNanos|awaitUntil,java.util.concurrent.locks.Lock,tryLock|newCondition,java.util.regex.Matcher,pattern|toMatchResult|start|end|group|groupCount|matches|find|lookingAt|quoteReplacement|replaceAll|replaceFirst|regionStart|regionEnd|hasTransparentBounds|hasAnchoringBounds|hitEnd|requireEnd,java.util.regex.Pattern,.*,java.util.stream.BaseStream,.*,java.util.stream.DoubleStream,.*,java.util.stream.IntStream,.*,java.util.stream.LongStream,.*,java.util.stream.Stream,.*" />
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
<inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="ADDITIONAL_TAGS" value="date" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
</profile>
|
||||||
</component>
|
</component>
|
|
@ -172,11 +172,4 @@
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
<option name="id" value="Android" />
|
<option name="id" value="Android" />
|
||||||
</component>
|
</component>
|
||||||
<component name="VisualizationToolProject">
|
|
||||||
<option name="state">
|
|
||||||
<ProjectState>
|
|
||||||
<option name="scale" value="0.027632950990615225" />
|
|
||||||
</ProjectState>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
</project>
|
|
@ -5,7 +5,7 @@ plugins {
|
||||||
id 'com.android.application'
|
id 'com.android.application'
|
||||||
}
|
}
|
||||||
|
|
||||||
def currentTime = getCurrentTime()
|
def currentTime = getCurrentTime();
|
||||||
|
|
||||||
static def getCurrentTime() {
|
static def getCurrentTime() {
|
||||||
DateFormat df = new SimpleDateFormat("yyyy-MM-dd")
|
DateFormat df = new SimpleDateFormat("yyyy-MM-dd")
|
||||||
|
@ -22,7 +22,7 @@ android {
|
||||||
minSdk 23
|
minSdk 23
|
||||||
targetSdk 33
|
targetSdk 33
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName '0.88'
|
versionName '0.87'
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
dataBinding{
|
dataBinding{
|
||||||
|
|
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
|
@ -0,0 +1,26 @@
|
||||||
|
package com.bg7yoz.ft8cn;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
|
assertEquals("com.bg7yoz.ft8cn", appContext.getPackageName());
|
||||||
|
}
|
||||||
|
}
|
Plik binarny nie jest wyświetlany.
|
@ -1,5 +0,0 @@
|
||||||
关于音频输出设置
|
|
||||||
|
|
||||||
采样位深:也称采样精度,FT8CN只有16位整型和32位浮点可选。采样位数是表示声音强度量化后的精细程度,它的数值越大,波动幅度的分辨率也就越高,所发出声音的能力越强。
|
|
||||||
|
|
||||||
采样率:也称取样频率, 指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,但占的资源也多。
|
|
|
@ -1,5 +0,0 @@
|
||||||
Audio Output Setting
|
|
||||||
|
|
||||||
Bit depth: Choose 16-bit int or 32-bit float. Bit depth dictates the number of possible amplitude values of audio sample. A higher bit depth will produce a higher resolution audio.
|
|
||||||
|
|
||||||
Sample rate: Sample rate refers to the number of samples that are present within one second of digital audio. Higher sample rate provides more accurate audio waveform, but consume more system resources.
|
|
|
@ -41,7 +41,7 @@ YAESU FT-DX Other series,00,4800,3
|
||||||
KENWOOD(建伍) TK-90,00,9600,5
|
KENWOOD(建伍) TK-90,00,9600,5
|
||||||
KENWOOD(建伍) TS-480,00,9600,7
|
KENWOOD(建伍) TS-480,00,9600,7
|
||||||
KENWOOD(建伍) TS-590,00,9600,7
|
KENWOOD(建伍) TS-590,00,9600,7
|
||||||
KENWOOD(建伍) TS-2000,00,9600,14
|
KENWOOD(建伍) TS-2000,00,9600,7
|
||||||
KN990,00,38400,1
|
KN990,00,38400,1
|
||||||
Elecraft K3S\K3\KX3\KX2,00,38400,10
|
Elecraft K3S\K3\KX3\KX2,00,38400,10
|
||||||
mcHF-QRP sdr,00,4800,1
|
mcHF-QRP sdr,00,4800,1
|
||||||
|
|
|
@ -14,8 +14,6 @@ import com.bg7yoz.ft8cn.connector.ConnectMode;
|
||||||
import com.bg7yoz.ft8cn.database.ControlMode;
|
import com.bg7yoz.ft8cn.database.ControlMode;
|
||||||
import com.bg7yoz.ft8cn.database.DatabaseOpr;
|
import com.bg7yoz.ft8cn.database.DatabaseOpr;
|
||||||
import com.bg7yoz.ft8cn.ft8transmit.QslRecordList;
|
import com.bg7yoz.ft8cn.ft8transmit.QslRecordList;
|
||||||
import com.bg7yoz.ft8cn.html.HtmlContext;
|
|
||||||
import com.bg7yoz.ft8cn.icom.IcomAudioUdp;
|
|
||||||
import com.bg7yoz.ft8cn.log.QSLRecord;
|
import com.bg7yoz.ft8cn.log.QSLRecord;
|
||||||
import com.bg7yoz.ft8cn.rigs.BaseRigOperation;
|
import com.bg7yoz.ft8cn.rigs.BaseRigOperation;
|
||||||
import com.bg7yoz.ft8cn.timer.UtcTimer;
|
import com.bg7yoz.ft8cn.timer.UtcTimer;
|
||||||
|
@ -35,9 +33,6 @@ public class GeneralVariables {
|
||||||
public static boolean saveSWLMessage=false;//保存解码消息开关
|
public static boolean saveSWLMessage=false;//保存解码消息开关
|
||||||
public static boolean saveSWL_QSO=false;//保存解码消息消息中的QSO开关
|
public static boolean saveSWL_QSO=false;//保存解码消息消息中的QSO开关
|
||||||
|
|
||||||
public static boolean audioOutput32Bit =true;//音频输出类型true=float,false=int16
|
|
||||||
public static int audioSampleRate=12000;//发射音频的采样率
|
|
||||||
|
|
||||||
public static MutableLiveData<Float> mutableVolumePercent = new MutableLiveData<>();
|
public static MutableLiveData<Float> mutableVolumePercent = new MutableLiveData<>();
|
||||||
public static float volumePercent = 0.5f;//播放音频的音量,是百分比
|
public static float volumePercent = 0.5f;//播放音频的音量,是百分比
|
||||||
|
|
||||||
|
@ -548,9 +543,21 @@ public class GeneralVariables {
|
||||||
int order = 0;
|
int order = 0;
|
||||||
for (String key : callsignAndGrids.keySet()) {
|
for (String key : callsignAndGrids.keySet()) {
|
||||||
order++;
|
order++;
|
||||||
HtmlContext.tableKeyRow(result,order % 2 != 0,key,callsignAndGrids.get(key));
|
if (order % 2 == 0) {
|
||||||
|
result.append("<tr class=\"bbb\" >");
|
||||||
|
} else {
|
||||||
|
result.append("<tr>");
|
||||||
|
}
|
||||||
|
result.append("<td align=center class=\"default\" >");
|
||||||
|
result.append(key);
|
||||||
|
result.append("</td>\n");
|
||||||
|
result.append("<td align=center class=\"default\" >");
|
||||||
|
result.append(callsignAndGrids.get(key));
|
||||||
|
result.append("</tr>\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
return result.toString();
|
return result.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void deleteArrayListMore(ArrayList<Ft8Message> list) {
|
public static synchronized void deleteArrayListMore(ArrayList<Ft8Message> list) {
|
||||||
|
@ -575,11 +582,4 @@ public class GeneralVariables {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 输出音频的数据类型,网络模式不可用
|
|
||||||
*/
|
|
||||||
public enum AudioOutputBitMode{
|
|
||||||
Float32,
|
|
||||||
Int16
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,6 @@ import com.bg7yoz.ft8cn.rigs.GuoHeQ900Rig;
|
||||||
import com.bg7yoz.ft8cn.rigs.IcomRig;
|
import com.bg7yoz.ft8cn.rigs.IcomRig;
|
||||||
import com.bg7yoz.ft8cn.rigs.InstructionSet;
|
import com.bg7yoz.ft8cn.rigs.InstructionSet;
|
||||||
import com.bg7yoz.ft8cn.rigs.KenwoodKT90Rig;
|
import com.bg7yoz.ft8cn.rigs.KenwoodKT90Rig;
|
||||||
import com.bg7yoz.ft8cn.rigs.KenwoodTS2000Rig;
|
|
||||||
import com.bg7yoz.ft8cn.rigs.KenwoodTS590Rig;
|
import com.bg7yoz.ft8cn.rigs.KenwoodTS590Rig;
|
||||||
import com.bg7yoz.ft8cn.rigs.OnRigStateChanged;
|
import com.bg7yoz.ft8cn.rigs.OnRigStateChanged;
|
||||||
import com.bg7yoz.ft8cn.rigs.XieGu6100Rig;
|
import com.bg7yoz.ft8cn.rigs.XieGu6100Rig;
|
||||||
|
@ -367,12 +366,12 @@ public class MainViewModel extends ViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTransmitByWifi(Ft8Message msg) {
|
public void onAfterGenerate(float[] data) {
|
||||||
if (GeneralVariables.connectMode == ConnectMode.NETWORK) {
|
if (GeneralVariables.connectMode == ConnectMode.NETWORK) {
|
||||||
if (baseRig != null) {
|
if (baseRig != null) {
|
||||||
if (baseRig.isConnected()) {
|
if (baseRig.isConnected()) {
|
||||||
sendWaveDataRunnable.baseRig=baseRig;
|
sendWaveDataRunnable.baseRig=baseRig;
|
||||||
sendWaveDataRunnable.message=msg;
|
sendWaveDataRunnable.data=data;
|
||||||
//以线程池的方式执行网络数据包发送
|
//以线程池的方式执行网络数据包发送
|
||||||
sendWaveDataThreadPool.execute(sendWaveDataRunnable);
|
sendWaveDataThreadPool.execute(sendWaveDataRunnable);
|
||||||
}
|
}
|
||||||
|
@ -747,9 +746,6 @@ public class MainViewModel extends ViewModel {
|
||||||
case InstructionSet.XIEGU_6100:
|
case InstructionSet.XIEGU_6100:
|
||||||
baseRig = new XieGu6100Rig(GeneralVariables.civAddress);//协谷6100
|
baseRig = new XieGu6100Rig(GeneralVariables.civAddress);//协谷6100
|
||||||
break;
|
break;
|
||||||
case InstructionSet.KENWOOD_TS2000:
|
|
||||||
baseRig = new KenwoodTS2000Rig();//建伍TS2000
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mutableIsFlexRadio.postValue(GeneralVariables.instructionSet==InstructionSet.FLEX_NETWORK);
|
mutableIsFlexRadio.postValue(GeneralVariables.instructionSet==InstructionSet.FLEX_NETWORK);
|
||||||
|
@ -885,12 +881,11 @@ public class MainViewModel extends ViewModel {
|
||||||
}
|
}
|
||||||
private static class SendWaveDataRunnable implements Runnable{
|
private static class SendWaveDataRunnable implements Runnable{
|
||||||
BaseRig baseRig;
|
BaseRig baseRig;
|
||||||
//float[] data;
|
float[] data;
|
||||||
Ft8Message message;
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (baseRig!=null&&message!=null){
|
if (baseRig!=null&&data!=null){
|
||||||
baseRig.sendWaveData(message);//实际生成的数据是12.64+0.04,0.04是生成的0数据
|
baseRig.sendWaveData(data);//实际生成的数据是12.64+0.04,0.04是生成的0数据
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Ładowanie…
Reference in New Issue