@@ -0,0 +1 @@ | |||
/build |
@@ -0,0 +1,125 @@ | |||
//plugins { | |||
// alias(libs.plugins.androidApplication) | |||
//} | |||
import java.text.DateFormat | |||
import java.text.SimpleDateFormat | |||
apply plugin: 'com.android.application' | |||
def releaseTime() { | |||
DateFormat df = new SimpleDateFormat("yyyyMMddHHmm") | |||
return df.format(Calendar.getInstance(Locale.CHINA).getTime()) | |||
} | |||
android { | |||
namespace 'com.jdzh.jdzhandroid' | |||
compileSdk 34 | |||
buildToolsVersion "33.0.0" | |||
defaultConfig { | |||
applicationId "com.jdzh.jdzhandroid"//设置applicationId(这里很重要,两个相同applicationId的apk不同同时安装在同一台Android手机中) | |||
minSdk 23 | |||
targetSdk 34 | |||
versionCode 1 | |||
versionName "1.0" | |||
manifestPlaceholders = [UMENG_CHANNEL_VALUE : "default"] | |||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||
multiDexEnabled true | |||
} | |||
buildTypes { | |||
release { | |||
minifyEnabled false | |||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | |||
} | |||
debug { | |||
resValue("string", "PORT_NUMBER", "8081") | |||
resValue("bool","superAdminTest","true") | |||
} | |||
} | |||
lintOptions { | |||
abortOnError false | |||
checkReleaseBuilds false | |||
} | |||
compileOptions { | |||
coreLibraryDesugaringEnabled true | |||
sourceCompatibility JavaVersion.VERSION_1_8 | |||
targetCompatibility JavaVersion.VERSION_1_8 | |||
} | |||
sourceSets { | |||
main { | |||
res.srcDirs = [ | |||
'src/main/res/layout/dialog', | |||
'src/main/res/layout/datatab', | |||
'src/main/res/layout/item', | |||
'src/main/res/layout/new', | |||
'src/main/res/layout', | |||
'src/main/res' | |||
] | |||
assets { | |||
srcDirs 'src\\main\\assets' | |||
} | |||
} | |||
} | |||
buildFeatures { | |||
viewBinding = true | |||
} | |||
applicationVariants.all { variant -> | |||
variant.outputs.all { | |||
outputFileName = "jdzh-master-v${defaultConfig.versionCode}-${releaseTime()}"+"-unsigned-${variant.name}.apk" | |||
} | |||
} | |||
} | |||
dependencies { | |||
implementation libs.appcompat | |||
implementation libs.material | |||
implementation libs.activity | |||
implementation libs.constraintlayout | |||
implementation libs.play.services.vision.common | |||
testImplementation libs.junit | |||
androidTestImplementation libs.ext.junit | |||
androidTestImplementation libs.espresso.core | |||
//http服务器组件 | |||
implementation 'org.nanohttpd:nanohttpd:2.3.1' | |||
//Modbus | |||
implementation 'com.github.licheedev:Modbus4Android:2.0.2' | |||
//Modbus server | |||
implementation 'com.github.hwx95:ModbusTCP:v1.1' | |||
//s7通讯库 | |||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' | |||
implementation 'com.github.xingshuangs:iot-communication:1.5.0' | |||
//日志工具 可定位代码行数 | |||
// api 'com.apkfuns.logutils:library:1.7.5' | |||
implementation 'com.apkfuns.logutils:library:1.7.5' | |||
//事件总线库 | |||
api 'org.greenrobot:eventbus:3.1.1' | |||
//图片加载库 | |||
api 'com.github.bumptech.glide:glide:4.16.0' | |||
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0' | |||
//json操作库 | |||
implementation 'com.google.code.gson:gson:2.8.0' | |||
// RecyclerAdapter框架 | |||
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46' | |||
// SmartShow Toast框架,解决不同机型弹出方式缺陷问题 | |||
implementation 'com.github.the-pig-of-jungle.smart-show:toast:2.6.7' | |||
// litePal 数据库操作框架 | |||
implementation 'org.litepal.android:java:3.0.0' | |||
} |
@@ -0,0 +1,21 @@ | |||
# Add project specific ProGuard rules here. | |||
# You can control the set of applied configuration files using the | |||
# proguardFiles setting in build.gradle. | |||
# | |||
# For more details, see | |||
# http://developer.android.com/guide/developing/tools/proguard.html | |||
# If your project uses WebView with JS, uncomment the following | |||
# and specify the fully qualified class name to the JavaScript interface | |||
# class: | |||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview { | |||
# public *; | |||
#} | |||
# Uncomment this to preserve the line number information for | |||
# debugging stack traces. | |||
#-keepattributes SourceFile,LineNumberTable | |||
# If you keep the line number information, uncomment this to | |||
# hide the original source file name. | |||
#-renamesourcefileattribute SourceFile |
@@ -0,0 +1,26 @@ | |||
package com.jdzh.jdzhandroid; | |||
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.jdzh.jdzhandroid", appContext.getPackageName()); | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
xmlns:tools="http://schemas.android.com/tools"> | |||
<!-- 网络权限 --> | |||
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络连接 --> | |||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络连接状态 --> | |||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 写存储的权限 --> | |||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 读存储的权限 --> | |||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 0未知来源的应用权限,更新App --> | |||
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 在SDCard中创建与删除文件权限 --> | |||
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> <!-- DownloadManager --> | |||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 录音权限 --> | |||
<uses-permission android:name="android.permission.RECORD_VIDEO" /> <!-- 录像权限 --> | |||
<uses-permission android:name="android.permission.CAMERA" /> | |||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> | |||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | |||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> | |||
<application | |||
android:allowBackup="true" | |||
android:dataExtractionRules="@xml/data_extraction_rules" | |||
android:fullBackupContent="@xml/backup_rules" | |||
android:label="@string/app_name" | |||
android:supportsRtl="true" | |||
android:theme="@style/Theme.AppCompat.NoActionBar" | |||
tools:targetApi="31"> | |||
<activity | |||
android:name=".MainActivity" | |||
android:exported="true"> | |||
<intent-filter> | |||
<action android:name="android.intent.action.MAIN" /> | |||
<category android:name="android.intent.category.LAUNCHER" /> | |||
</intent-filter> | |||
</activity> | |||
</application> | |||
</manifest> |
@@ -0,0 +1,60 @@ | |||
package com.jdzh.jdzhandroid.ActionNotify; | |||
import com.jdzh.jdzhandroid.Interface.IRun; | |||
import com.jdzh.jdzhandroid.Interface.IRunT; | |||
import com.jdzh.jdzhandroid.Result.OperateResult; | |||
import java.util.concurrent.ConcurrentHashMap; | |||
public class NotifyEvent { | |||
private static volatile NotifyEvent _instance; | |||
public synchronized static NotifyEvent get(){ | |||
if(_instance == null)_instance = new NotifyEvent(); | |||
return _instance; | |||
} | |||
private NotifyEvent(){} | |||
private ConcurrentHashMap<String, Object> _runMap = new ConcurrentHashMap<String, Object>(); | |||
public void Register(String name, IRun run){ | |||
_runMap.put(name,run); | |||
} | |||
public <T> void Register(String name, IRunT<T> run){ | |||
_runMap.put(name,run); | |||
} | |||
public OperateResult Send(String name){ | |||
try{ | |||
if(_runMap.containsKey(name)&&_runMap.get(name)!=null){ | |||
if(_runMap.get(name) instanceof IRun){ | |||
((IRun)_runMap.get(name)).Run(); | |||
return OperateResult.CreateSuccess(); | |||
}else{ | |||
return OperateResult.CreateFailed("注册类型和发送消息类型不匹配"); | |||
} | |||
}else{ | |||
return OperateResult.CreateFailed(name+"消息未注册"); | |||
} | |||
}catch(Exception e){ | |||
return OperateResult.CreateFailed(e); | |||
} | |||
} | |||
public <T> OperateResult Send(String name, T value){ | |||
try{ | |||
if(_runMap.containsKey(name)&&_runMap.get(name)!=null){ | |||
if(_runMap.get(name) instanceof IRunT){ | |||
((IRunT)_runMap.get(name)).Run(value); | |||
return OperateResult.CreateSuccess(); | |||
}else{ | |||
return OperateResult.CreateFailed("注册类型和发送消息类型不匹配"); | |||
} | |||
}else{ | |||
return OperateResult.CreateFailed(name+"消息未注册"); | |||
} | |||
}catch(Exception e){ | |||
return OperateResult.CreateFailed(e); | |||
} | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.jdzh.jdzhandroid.DataUtil.DataConvertLib; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
import com.licheedev.modbus4android.ModbusRespException; | |||
import com.serotonin.modbus4j.exception.ModbusInitException; | |||
import com.serotonin.modbus4j.exception.ModbusTransportException; | |||
import java.util.concurrent.ExecutionException; | |||
public class ExceptionServer { | |||
public ExceptionServer(String Address, int length,IExceptionHandling excpet) | |||
{ | |||
try { | |||
int add = DataConvertLib.GetAddress(Address); | |||
if (add < 0) { | |||
MessageLog.ShowError("地址解析失败=" + Address); | |||
return; | |||
} | |||
if (excpet!=null) excpet.onSuccess(add); | |||
} catch (InterruptedException e) { | |||
MessageLog.ShowError("InterruptedException,Address=" + Address + ",length=" + length + ",msg:" + e.getMessage()); | |||
if (excpet!=null) excpet.onFailure(e.getMessage()); | |||
} catch (ExecutionException e) { | |||
MessageLog.ShowError("ExecutionException,Address=" + Address + ",length=" + length + ",msg:" + e.getMessage()); | |||
if (excpet!=null) excpet.onFailure(e.getMessage()); | |||
} catch (ModbusTransportException e) { | |||
MessageLog.ShowError("ModbusTransportException,Address=" + Address + ",length=" + length + ",msg:" + e.getMessage()); | |||
if (excpet!=null) excpet.onFailure(e.getMessage()); | |||
} catch (ModbusInitException e) { | |||
MessageLog.ShowError("ModbusInitException,Address=" + Address + ",length=" + length + ",msg:" + e.getMessage()); | |||
if (excpet!=null) excpet.onFailure(e.getMessage()); | |||
} catch (ModbusRespException e) { | |||
MessageLog.ShowError("ModbusRespException,Address=" + Address + ",length=" + length + ",msg:" + e.getMessage()); | |||
if (excpet!=null) excpet.onFailure(e.getMessage()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.licheedev.modbus4android.ModbusRespException; | |||
import com.serotonin.modbus4j.exception.ModbusInitException; | |||
import com.serotonin.modbus4j.exception.ModbusTransportException; | |||
import java.util.concurrent.ExecutionException; | |||
public interface IExceptionHandling { | |||
void onSuccess(int add)throws InterruptedException, ExecutionException, ModbusTransportException, | |||
ModbusInitException, ModbusRespException; | |||
void onFailure(String error); | |||
} |
@@ -0,0 +1,8 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.jdzh.jdzhandroid.Result.OperateResult; | |||
public interface IModbusMaster { | |||
OperateResult TcpConnect(String ip, int port)throws InterruptedException; | |||
OperateResult RtuConnect(String com, int baudRate)throws InterruptedException; | |||
} |
@@ -0,0 +1,19 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
public interface IRead { | |||
void ReadBool(String address, int length, int slaveId, IReadCallBack<boolean[]> callback); | |||
void ReadShort(String address, int length,int slaveId, IReadCallBack<short[]> callback); | |||
void ReadInt(String address, int length, int slaveId, DataFormat df, IReadCallBack<int[]> callback); | |||
void ReadInt(String address, int length, int slaveId, IReadCallBack<int[]> callback); | |||
void ReadByte(String address, int length, int slaveId, IReadCallBack<byte[]> callback); | |||
void ReadString(String address, int length, int slaveId, IReadCallBack<String> callback); | |||
void ReadFloat(String address, int length, int slaveId,DataFormat df, IReadCallBack<float[]> callback); | |||
void ReadFloat(String address, int length, int slaveId, IReadCallBack<float[]> callback); | |||
} |
@@ -0,0 +1,5 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
public interface IReadCallBack<T> { | |||
void onSuccess(T t); | |||
} |
@@ -0,0 +1,19 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
public interface IWrite { | |||
void WriteBool(String address, boolean value, int slaveId, IWriteCallBack callback); | |||
void WriteBool(String address, boolean[] value, int slaveId, IWriteCallBack callback); | |||
void WriteShort(String address, short value, int slaveId, IWriteCallBack callback); | |||
void WriteShort(String address, short[] value, int slaveId, IWriteCallBack callback); | |||
void WriteInt(String address, int value, int slaveId, IWriteCallBack callback); | |||
void WriteInt(String address, int[] value, int slaveId, IWriteCallBack callback); | |||
void WriteString(String address, String value, int slaveId, IWriteCallBack callback); | |||
void WriteFloat(String address, float value, int slaveId, IWriteCallBack callback); | |||
void WriteFloat(String address, float[] value, int slaveId, IWriteCallBack callback); | |||
} |
@@ -0,0 +1,7 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
public interface IWriteCallBack { | |||
void onSuccess(); | |||
void onFailure(String ErrorMsg); | |||
} |
@@ -0,0 +1,43 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.licheedev.modbus4android.ModbusWorker; | |||
import com.serotonin.modbus4j.ModbusMaster; | |||
public class ModbusBasis extends ModbusWorker { | |||
private static volatile ModbusBasis instance = null; | |||
public static ModbusBasis get() { | |||
ModbusBasis manager = instance; | |||
if (manager == null) { | |||
synchronized (ModbusBasis.class) { | |||
manager = instance; | |||
if (manager == null) { | |||
manager = new ModbusBasis(); | |||
instance = manager; | |||
} | |||
} | |||
} | |||
return manager; | |||
} | |||
private ModbusBasis() { | |||
} | |||
/** | |||
* 释放整个ModbusManager,单例会被置null | |||
*/ | |||
public synchronized void release() { | |||
super.release(); | |||
instance = null; | |||
} | |||
/** | |||
* 获取 | |||
* @return | |||
*/ | |||
public synchronized ModbusMaster getModbusMaster() | |||
{ | |||
return super.getModbusMaster(); | |||
} | |||
} |
@@ -0,0 +1,626 @@ | |||
package com.jdzh.jdzhandroid.Communication.Modbus; | |||
import com.jdzh.jdzhandroid.DataUtil.DataConvertLib; | |||
import com.jdzh.jdzhandroid.DataUtil.NotifyPropVar; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
import com.jdzh.jdzhandroid.Result.OperateResult; | |||
import com.licheedev.modbus4android.ModbusCallback; | |||
import com.licheedev.modbus4android.ModbusParam; | |||
import com.licheedev.modbus4android.ModbusRespException; | |||
import com.licheedev.modbus4android.ModbusWorker; | |||
import com.licheedev.modbus4android.param.SerialParam; | |||
import com.licheedev.modbus4android.param.TcpParam; | |||
import com.serotonin.modbus4j.exception.ModbusInitException; | |||
import com.serotonin.modbus4j.exception.ModbusTransportException; | |||
import com.serotonin.modbus4j.msg.ReadCoilsResponse; | |||
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse; | |||
import java.io.IOException; | |||
import java.io.InputStreamReader; | |||
import java.io.LineNumberReader; | |||
import java.io.UnsupportedEncodingException; | |||
import java.util.Arrays; | |||
import java.util.concurrent.ExecutionException; | |||
public class ModbusHelper implements IRead,IWrite,IModbusMaster { | |||
//https://blog.csdn.net/zgkxzx/article/details/71630301 | |||
// ModbusFactory factory = new ModbusFactory();//使用该方法可以创建不同类型的modbus通讯 | |||
private ModbusWorker mw = new ModbusWorker(); | |||
public void release(){ | |||
try{ | |||
mw.release(); | |||
}catch (Exception e){} | |||
} | |||
/** | |||
* Ping PLC地址是否通畅 | |||
* @param address | |||
* @param pingTimes ping的次数 | |||
* @param timeOut 超时时间 10 | |||
* @return | |||
*/ | |||
private boolean ping2(String address, int pingTimes, int timeOut) { | |||
Process process = null; | |||
try { | |||
process = Runtime.getRuntime().exec( "ping " + "-c " + pingTimes + " -w " + timeOut+ " "+address); | |||
InputStreamReader r = new InputStreamReader(process.getInputStream()); | |||
LineNumberReader returnData = new LineNumberReader(r); | |||
String returnMsg=""; | |||
String line = ""; | |||
while ((line = returnData.readLine()) != null) { | |||
System.out.println(line); | |||
returnMsg += line; | |||
} | |||
if(returnMsg.indexOf("100% packet loss")!=-1){ | |||
System.out.println("与 " +address +" 连接不畅通."); | |||
return false; | |||
} else{ | |||
System.out.println("与 " +address +" 连接畅通."); | |||
return true; | |||
} | |||
} catch (IOException e) { | |||
} | |||
return false; | |||
} | |||
public boolean IsConnected=false; | |||
public String TempIp; | |||
private int TempPort; | |||
private String TempCom; | |||
private int TempBaudRate; | |||
/** | |||
* 连接类型,1=TCP,2=RUT | |||
*/ | |||
private int ConnectionType; | |||
private void ReConnect(String error){ | |||
if(ConnectionType==1){ | |||
if(error.contains("Connection refused")||error.contains("SocketException")||error.contains("SocketTimeoutException")){ | |||
IsConnected=false; | |||
ConnectStatus.setValue(false); | |||
TcpConnect(TempIp,TempPort); | |||
}else{ | |||
MessageLog.ShowError("Tcp 重连失败:"+error); | |||
} | |||
} | |||
else if (ConnectionType==2){ | |||
if(error.contains("Connection refused")){ | |||
IsConnected=false; | |||
ConnectStatus.setValue(false); | |||
RtuConnect(TempCom,TempBaudRate); | |||
}else{ | |||
MessageLog.ShowError("Rtu 重连失败:"+error); | |||
} | |||
} | |||
} | |||
boolean IsOutErrorLog=false; | |||
/** | |||
* 连接状态通知 | |||
*/ | |||
public NotifyPropVar<Boolean> ConnectStatus=new NotifyPropVar<>(false); | |||
/** | |||
* TCP 连接,连接时请用多线程的方式,否者有可能无法连接 | |||
* @param ip | |||
* @param port | |||
* @throws InterruptedException | |||
*/ | |||
@Override | |||
public OperateResult TcpConnect(String ip, int port){ | |||
OperateResult result=new OperateResult(); | |||
TempIp=ip; | |||
TempPort=port; | |||
ConnectionType=1; | |||
MessageLog.ShowInfo("开始验证网络:"+ip ); | |||
boolean status = false; | |||
while (!status) { | |||
try { | |||
//status为0则代表通,为1则代表不通。 | |||
status =ping2(ip,1,1); | |||
Thread.sleep(1000); | |||
} catch (InterruptedException e) { | |||
MessageLog.ShowInfo("设备 " + ip + " 网络验证失败"); | |||
} catch (Exception e) { | |||
MessageLog.ShowInfo("设备 " + ip + " 网络验证失败"); | |||
} | |||
} | |||
MessageLog.ShowInfo("设备 " + ip + " 网络验证成功"); | |||
ModbusParam param= TcpParam.create(ip, port) | |||
.setTimeout(1000) | |||
.setRetries(0) | |||
.setEncapsulated(false) | |||
.setKeepAlive(true); | |||
IsOutErrorLog=false; | |||
while (IsConnected==false) | |||
{ | |||
mw.init(param, new ModbusCallback<com.serotonin.modbus4j.ModbusMaster>() { | |||
@Override | |||
public void onSuccess(com.serotonin.modbus4j.ModbusMaster modbusMaster) { | |||
IsConnected=true; | |||
result.isSuccess=true; | |||
ConnectStatus.setValue(true); | |||
MessageLog.ShowInfo("Modbus TCP 连接成功" ); | |||
} | |||
@Override | |||
public void onFailure(Throwable tr) { | |||
IsConnected = false; | |||
ConnectStatus.setValue(false); | |||
result.isSuccess=false; | |||
result.message=tr.getMessage(); | |||
if(!IsOutErrorLog) { | |||
MessageLog.ShowInfo("Modbus TCP 连接失败" ); | |||
IsOutErrorLog=true; | |||
} | |||
} | |||
@Override | |||
public void onFinally() { | |||
} | |||
}); | |||
try | |||
{ | |||
if(IsConnected==false) Thread.sleep(5000); | |||
}catch(InterruptedException ex){ | |||
} | |||
} | |||
return result.isSuccess?OperateResult.CreateSuccess():OperateResult.CreateFailed(result.message); | |||
} | |||
/** | |||
* RTU 串口连接,建议连接时用多线程的方式,否者有可能无法连接 | |||
* @param com | |||
* @param baudRate | |||
* @throws InterruptedException | |||
*/ | |||
@Override | |||
public OperateResult RtuConnect(String com, int baudRate){ | |||
OperateResult result=new OperateResult(); | |||
MessageLog.ShowInfo("开始连接Modbus RTU" ); | |||
TempCom=com; | |||
TempBaudRate=baudRate; | |||
ConnectionType=2; | |||
ModbusParam param= SerialParam.create(com, baudRate) // 串口地址和波特率 | |||
.setDataBits(8) // 数据位 | |||
.setParity(0) // 校验位 | |||
.setStopBits(1) // 停止位 | |||
.setTimeout(500).setRetries(0); // 不重试 | |||
while (IsConnected==false) | |||
{ | |||
mw.init(param, new ModbusCallback<com.serotonin.modbus4j.ModbusMaster>() { | |||
@Override | |||
public void onSuccess(com.serotonin.modbus4j.ModbusMaster modbusMaster) { | |||
IsConnected=true; | |||
ConnectStatus.setValue(true); | |||
result.isSuccess=true; | |||
MessageLog.ShowInfo("Modbus RTU 连接成功" ); | |||
} | |||
@Override | |||
public void onFailure(Throwable tr) { | |||
IsConnected = false; | |||
ConnectStatus.setValue(false); | |||
result.isSuccess=false; | |||
result.message=tr.getMessage(); | |||
MessageLog.ShowInfo("Modbus RTU 连接失败" ); | |||
} | |||
@Override | |||
public void onFinally() { | |||
} | |||
}); | |||
try{ | |||
if(IsConnected==false) Thread.sleep(5000); | |||
}catch (InterruptedException ex){ | |||
} | |||
} | |||
return result.isSuccess?OperateResult.CreateSuccess():OperateResult.CreateFailed(result.message); | |||
} | |||
@Override | |||
public void ReadBool(String address, int length, int slaveId, IReadCallBack<boolean[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
ReadCoilsResponse res = mw.syncReadCoil(slaveId, add, length); | |||
boolean[] data = res.getBooleanData(); | |||
boolean[] result = Arrays.copyOfRange(data, 0, length); | |||
if (callback != null) callback.onSuccess(result); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadShort(String address, int length,int slaveId, IReadCallBack<short[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(slaveId, add, length); | |||
short[] data = res.getShortData(); | |||
if (data.length == length) { | |||
if (callback != null) callback.onSuccess(data); | |||
} | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadInt(String address, int length, int slaveId, DataFormat df, IReadCallBack<int[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(slaveId, add, length * 2); | |||
byte[] data = res.getData(); | |||
int[] tempValues = new int[length]; | |||
if(data.length==4*length) | |||
{ | |||
for (int i = 0; i < length; i++) { | |||
byte[] tempData = new byte[4]; | |||
for (int m = 0; m < 4; m++) { | |||
tempData[m] = data[i * 4 + m]; | |||
} | |||
tempValues[i] = DataConvertLib.BytesToInt(tempData, df); | |||
} | |||
if (callback != null) callback.onSuccess(tempValues); | |||
}else{ | |||
MessageLog.ShowError("ReadInt onFailure,数据长度不匹配,读取长度:"+length+"返回长度:"+data.length ); | |||
} | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadInt(String address, int length, int slaveId, IReadCallBack<int[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
ReadInt(address, length, slaveId,DataFormat.BADC, callback); | |||
} | |||
@Override | |||
public void ReadByte(String address, int length, int slaveId, IReadCallBack<byte[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
int tempLength=length; | |||
if (length%2!=0){ | |||
tempLength++; | |||
} | |||
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(slaveId, add, tempLength ); | |||
byte[] data = res.getData(); | |||
if(data.length==tempLength) | |||
{ | |||
byte[] result = Arrays.copyOfRange(data, 0, length); | |||
if (callback != null) callback.onSuccess(result); | |||
}else | |||
{ | |||
MessageLog.ShowError("ReadInt onFailure,数据长度不匹配,读取长度:"+length+"返回长度:"+data.length ); | |||
} | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadString(String address, int length, int slaveId, IReadCallBack<String> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(slaveId, add, length); | |||
byte[] data = res.getData(); | |||
try { | |||
if (data.length ==length*2) { | |||
if (callback != null) callback.onSuccess(new String(data, "UTF-8").trim()); | |||
} | |||
} catch (UnsupportedEncodingException ex) { | |||
} | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadFloat(String address, int length, int slaveId, DataFormat df, IReadCallBack<float[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
new ExceptionServer(address, length, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(slaveId, add, length*2); | |||
byte[] data = res.getData(); | |||
float[] tempValues = new float[length]; | |||
for (int i = 0; i < length; i++) { | |||
byte[] tempData = new byte[4]; | |||
for (int m = 0; m < 4; m++) { | |||
tempData[m] = data[i * 4 + m]; | |||
} | |||
tempValues[i] = DataConvertLib.BytesToFloat(tempData, df); | |||
} | |||
if (tempValues.length == length) { | |||
if (callback != null) callback.onSuccess(tempValues); | |||
} | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void ReadFloat(String address, int length, int slaveId, IReadCallBack<float[]> callback) { | |||
if (!IsConnected) { | |||
return; | |||
} | |||
ReadFloat(address,length,slaveId,DataFormat.BADC,callback); | |||
} | |||
@Override | |||
public void WriteBool(String address, boolean value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
mw.syncWriteCoil(slaveId, add, value); | |||
if (callback != null)callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteBool(String address, boolean[] value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
mw.syncWriteCoils(slaveId, add, value); | |||
if (callback != null)callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteShort(String address, short value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
short[] send = new short[1]; | |||
send[0] = value; | |||
mw.syncWriteRegisters(slaveId, add, send); | |||
if (callback != null)callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteShort(String address, short[] value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
mw.syncWriteRegisters(slaveId, add, value); | |||
if (callback != null)callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteInt(String address, int value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
short[] send = DataConvertLib.IntToShorts(value); | |||
mw.syncWriteRegisters(slaveId, add, send); | |||
if (callback != null) callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteInt(String address, int[] value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
short[] send=new short[value.length*2]; | |||
for(int i=0;i<value.length;i=i+2) | |||
{ | |||
short[] temp = DataConvertLib.IntToShorts(value[i]); | |||
if (temp.length==2) | |||
{ | |||
send[i]=temp[0]; | |||
send[i+1]=temp[1]; | |||
} | |||
} | |||
mw.syncWriteRegisters(slaveId, add,send); | |||
if (callback != null) callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteString(String address, String value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
byte[] bytes= value.getBytes(); | |||
short[] send =DataConvertLib.ByteToShort(bytes); | |||
mw.syncWriteRegisters(slaveId, add, send); | |||
if (callback != null) callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteFloat(String address, float value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
int intBits = Float.floatToRawIntBits(value); | |||
short[] send = DataConvertLib.IntToShorts(intBits); | |||
mw.syncWriteRegisters(slaveId, add, send); | |||
if (callback != null) callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void WriteFloat(String address, float[] value, int slaveId, IWriteCallBack callback) { | |||
if (!IsConnected) { | |||
if (callback != null) callback.onFailure("设备未连接"); | |||
return; | |||
} | |||
new ExceptionServer(address, 1, new IExceptionHandling() { | |||
@Override | |||
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException { | |||
short[] send=new short[value.length*2]; | |||
for(int i=0;i<value.length;i=i+2) | |||
{ | |||
int intBits = Float.floatToRawIntBits(value[i]); | |||
short[] temp = DataConvertLib.IntToShorts(intBits); | |||
if (temp.length==2) | |||
{ | |||
send[i]=temp[0]; | |||
send[i+1]=temp[1]; | |||
} | |||
} | |||
mw.syncWriteRegisters(slaveId, add, send); | |||
if (callback != null) callback.onSuccess(); | |||
} | |||
@Override | |||
public void onFailure(String error) { | |||
if (callback != null)callback.onFailure(error); | |||
ReConnect(error); | |||
} | |||
}); | |||
} | |||
} |
@@ -0,0 +1,81 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
public class ByteLib { | |||
public static byte[] ToBytes(short value, DataFormat df) { | |||
byte[] b = new byte[2]; | |||
b[0]=(byte)((value>>8)&0xff); | |||
b[1]=(byte)((value>>0)&0xff); | |||
return new ByteTransDataFormat().ByteTransDataFormat2(b,df,0); | |||
} | |||
public static byte[] ToBytes(short[] value,DataFormat df) { | |||
byte[] b = new byte[value.length*2]; | |||
for (int i = 0; i < value.length; i++) | |||
{ | |||
b[i*2]=(byte)((value[i]>>8)&0xff); | |||
b[i*2+1]=(byte)((value[i]>>0)&0xff); | |||
} | |||
return new ByteTransDataFormat().ByteTransDataFormat2(b,df,0); | |||
} | |||
public static byte[] ToBytes(float value,DataFormat df) { | |||
int tempValue = Float.floatToRawIntBits(value); | |||
byte[] b = new byte[4]; | |||
b[0]=(byte)((tempValue>>24)&0xff); | |||
b[1]=(byte)((tempValue>>16)&0xff); | |||
b[2]=(byte)((tempValue>>8)&0xff); | |||
b[3]=(byte)((tempValue>>0)&0xff); | |||
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0); | |||
} | |||
public static byte[] ToBytes(float[] value,DataFormat df) { | |||
byte[] b = new byte[value.length*4]; | |||
for (int i=0;i<value.length;i++) | |||
{ | |||
int tempValue = Float.floatToRawIntBits(value[i]); | |||
b[i*4]=(byte)((tempValue>>24)&0xff); | |||
b[i*4+1]=(byte)((tempValue>>16)&0xff); | |||
b[i*4+2]=(byte)((tempValue>>8)&0xff); | |||
b[i*4+3]=(byte)((tempValue>>0)&0xff); | |||
} | |||
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0); | |||
} | |||
public static byte[] ToBytes(int value,DataFormat df) { | |||
byte[] b = new byte[4]; | |||
b[0]=(byte)((value>>24)&0xff); | |||
b[1]=(byte)((value>>16)&0xff); | |||
b[2]=(byte)((value>>8)&0xff); | |||
b[3]=(byte)((value>>0)&0xff); | |||
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0); | |||
} | |||
public static byte[] ToBytes(int[] value,DataFormat df) { | |||
byte[] b = new byte[value.length*4]; | |||
for (int i=0;i<value.length;i++) | |||
{ | |||
b[i*4]=(byte)((value[i]>>24)&0xff); | |||
b[i*4+1]=(byte)((value[i]>>16)&0xff); | |||
b[i*4+2]=(byte)((value[i]>>8)&0xff); | |||
b[i*4+3]=(byte)((value[i]>>0)&0xff); | |||
} | |||
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0); | |||
} | |||
public static boolean GetBit(byte value,int offset) | |||
{ | |||
if (offset > 8 || offset < 1) return false; | |||
return (value & 1 << offset - 1) == 0 ? false : true; | |||
} | |||
public static byte SetBit(byte value,int offset, boolean val) | |||
{ | |||
if (offset > 8 || offset < 1) return value; | |||
int ConvertValue = 1 << offset - 1; | |||
return (byte)(val ? value | ConvertValue : value & ~ConvertValue); | |||
} | |||
} |
@@ -0,0 +1,51 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
public class ByteTransDataFormat { | |||
public byte[] ByteTransDataFormat2(byte[] data, DataFormat df, int offset ){ | |||
if (offset+2<2) return new byte[2]; | |||
byte[] numArray = new byte[2]; | |||
if (df==DataFormat.ABCD||df==DataFormat.BADC){ | |||
numArray[0] = data[offset+1]; | |||
numArray[1] = data[offset]; | |||
} | |||
else { | |||
numArray[0] = data[offset]; | |||
numArray[1] = data[offset+1]; | |||
} | |||
return numArray; | |||
} | |||
public byte[] ByteTransDataFormat4(byte[] data, DataFormat df,int offset ){ | |||
if (offset+4<4) return new byte[4]; | |||
byte[] numArray = new byte[4]; | |||
if (df==DataFormat.ABCD){ | |||
numArray[0] = data[offset+3]; | |||
numArray[1] = data[offset+2]; | |||
numArray[2] = data[offset+1]; | |||
numArray[3] = data[offset]; | |||
} | |||
else if (df==DataFormat.BADC){ | |||
numArray[0] = data[offset+2]; | |||
numArray[1] = data[offset+3]; | |||
numArray[2] = data[offset]; | |||
numArray[3] = data[offset+1]; | |||
} | |||
else if(df==DataFormat.CDAB){ | |||
numArray[0] = data[offset+1]; | |||
numArray[1] = data[offset]; | |||
numArray[2] = data[offset+3]; | |||
numArray[3] = data[offset+2]; | |||
} | |||
else if(df==DataFormat.DCBA){ | |||
numArray[0] = data[offset]; | |||
numArray[1] = data[offset+1]; | |||
numArray[2] = data[offset+2]; | |||
numArray[3] = data[offset+3]; | |||
} | |||
return numArray; | |||
} | |||
} | |||
@@ -0,0 +1,107 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.google.gson.Gson; | |||
import com.google.gson.GsonBuilder; | |||
import com.jdzh.jdzhandroid.Result.OperateResultT; | |||
public class Convert { | |||
public static OperateResultT<Boolean> TryToBoolean(Object value){ | |||
if(value==null) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空"); | |||
try{ | |||
return OperateResultT.CreateSuccess(Boolean.parseBoolean(value.toString())); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
public static OperateResultT<Integer> TryToInt(Object value){ | |||
if(value==null) return OperateResultT.CreateFailedT("TryToInt:转换对象为空"); | |||
try{ | |||
return OperateResultT.CreateSuccess(Integer.parseInt(value.toString())); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
public static OperateResultT<Short> TryToShort(Object value){ | |||
if(value==null) return OperateResultT.CreateFailedT("TryToShort:转换对象为空"); | |||
try{ | |||
return OperateResultT.CreateSuccess(Short.parseShort(value.toString())); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
public static OperateResultT<Float> TryToFloat(Object value){ | |||
if(value==null) return OperateResultT.CreateFailedT("TryToFloat:转换对象为空"); | |||
try{ | |||
return OperateResultT.CreateSuccess(Float.parseFloat(value.toString())); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
public static <T> OperateResultT<T> TryToGenericity( Object value){ | |||
if(value==null) return OperateResultT.CreateFailedT("TryToGenericity:转换对象为空"); | |||
try{ | |||
return OperateResultT.CreateSuccess((T)value); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
// public static <T extends Number> OperateResultT<T> TryToNumber(Object value,Class<T> type){ | |||
// if(value==null) return OperateResultT.CreateFailedT("TryToGenericity:转换对象为空"); | |||
// try{ | |||
// String temp = value.toString(); | |||
// if(type==Integer.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Integer.valueOf(temp)); | |||
// }else if (type==Short.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Short.valueOf(temp)); | |||
// }else if (type==Byte.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Byte.valueOf(temp)); | |||
// }else if (type==Float.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Float.valueOf(temp)); | |||
// }else if (type==Long.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Long.valueOf(temp)); | |||
// }else if (type==Double.TYPE){ | |||
// return OperateResultT.CreateSuccess((T)Double.valueOf(temp)); | |||
// }else if (type.getName().contains(Boolean.TYPE.getName())){ | |||
// return OperateResultT.CreateSuccess((T)Boolean.valueOf(temp)); | |||
// }else if (type.getName().contains(String.class.getName())){ | |||
// return OperateResultT.CreateSuccess((T)temp); | |||
// } | |||
// return OperateResultT.CreateSuccess((T)value); | |||
// }catch (Exception e) { | |||
// return OperateResultT.CreateFailedT(e); | |||
// } | |||
// } | |||
public static <T> OperateResultT<T> fromJson(Object value, Class<T> clazz) { | |||
if(value==null) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空"); | |||
try{ | |||
Gson gson = new GsonBuilder().create(); | |||
String temp = gson.toJson(value); | |||
T arr = gson.fromJson(temp, clazz); | |||
if(arr!=null)return OperateResultT.CreateSuccess( arr ); | |||
else return OperateResultT.CreateFailedT("返回对象为空"); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
public static <T> OperateResultT<T> fromJson(String value, Class<T> clazz) { | |||
if(value==null||value.isEmpty()) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空"); | |||
try{ | |||
Gson gson = new GsonBuilder().create(); | |||
T arr = gson.fromJson(value, clazz); | |||
if(arr!=null)return OperateResultT.CreateSuccess( arr); | |||
else return OperateResultT.CreateFailedT("返回对象为空"); | |||
}catch (Exception e) { | |||
return OperateResultT.CreateFailedT(e); | |||
} | |||
} | |||
} |
@@ -0,0 +1,263 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
import java.io.UnsupportedEncodingException; | |||
import java.nio.ByteBuffer; | |||
public class DataConvertLib { | |||
/*** | |||
* 字节数组转换成浮点数 | |||
* @param ,需要转换的字节 | |||
* @param ,转换的数据格式 | |||
* @return | |||
*/ | |||
public static Float BytesToFloat(byte[] buffers, DataFormat df) { | |||
if (buffers.length == 4) { | |||
byte[] bytes = new byte[4]; | |||
if (df == DataFormat.ABCD) { | |||
bytes[0] = buffers[3]; | |||
bytes[1] = buffers[2]; | |||
bytes[2] = buffers[1]; | |||
bytes[3] = buffers[0]; | |||
} else if (df == DataFormat.CDAB) { | |||
bytes[0] = buffers[1]; | |||
bytes[1] = buffers[0]; | |||
bytes[2] = buffers[3]; | |||
bytes[3] = buffers[2]; | |||
} else if (df == DataFormat.BADC) { | |||
bytes[0] = buffers[2]; | |||
bytes[1] = buffers[3]; | |||
bytes[2] = buffers[0]; | |||
bytes[3] = buffers[1]; | |||
} else if (df == DataFormat.DCBA) { | |||
bytes[0] = buffers[0]; | |||
bytes[1] = buffers[1]; | |||
bytes[2] = buffers[2]; | |||
bytes[3] = buffers[3]; | |||
} | |||
return ByteBuffer.wrap(bytes).getFloat(); | |||
} | |||
return 0.0f; | |||
} | |||
/** | |||
* 字节数组转换成整形 | |||
* @param ,需要转换的字节数组 | |||
* @param ,转换的数据格式 | |||
* @return | |||
*/ | |||
public static Integer BytesToInt(byte[] buffers, DataFormat df) { | |||
if (buffers.length == 4) { | |||
byte[] bytes = new byte[4]; | |||
if (df == DataFormat.ABCD) { | |||
bytes[0] = buffers[3]; | |||
bytes[1] = buffers[2]; | |||
bytes[2] = buffers[1]; | |||
bytes[3] = buffers[0]; | |||
} else if (df == DataFormat.CDAB) { | |||
bytes[0] = buffers[1]; | |||
bytes[1] = buffers[0]; | |||
bytes[2] = buffers[3]; | |||
bytes[3] = buffers[2]; | |||
} else if (df == DataFormat.BADC) { | |||
bytes[0] = buffers[2]; | |||
bytes[1] = buffers[3]; | |||
bytes[2] = buffers[0]; | |||
bytes[3] = buffers[1]; | |||
} else if (df == DataFormat.DCBA) { | |||
bytes[0] = buffers[0]; | |||
bytes[1] = buffers[1]; | |||
bytes[2] = buffers[2]; | |||
bytes[3] = buffers[3]; | |||
} | |||
return ByteBuffer.wrap(bytes).getInt(); | |||
} | |||
return 0; | |||
} | |||
/** | |||
* 32位整数转换成字节 | |||
* @param ,number | |||
* @return | |||
*/ | |||
public static byte[] IntToByte(int number) { | |||
int temp = number; | |||
byte[] b = new byte[4]; | |||
for (int i = 0; i < b.length; i++) { | |||
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位 | |||
temp = temp >> 8; // 向右移8位 | |||
} | |||
return b; | |||
} | |||
/** | |||
* 32位整形转换成16位整数数组 | |||
* @param ,value | |||
* @return | |||
*/ | |||
public static short[] IntToShorts(int value) { | |||
short[] res = new short[2]; | |||
int temp = value; | |||
byte[] b = new byte[4]; | |||
for (int i = 0; i < b.length; i++) { | |||
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位 | |||
temp = temp >> 8; // 向右移8位 | |||
} | |||
for (int i = 0; i < res.length; i++) { | |||
short s0 = (short) (b[i * 2] & 0xff);// 最低位 | |||
short s1 = (short) (b[i * 2 + 1] & 0xff); | |||
s1 <<= 8; | |||
res[i] = (short) (s0 | s1); | |||
} | |||
return res; | |||
} | |||
public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException { | |||
short[] temp = new short[len]; | |||
for (int i = 0; i < len; i++) { | |||
temp[i] = src[i + start]; | |||
} | |||
byte[] bytesTemp = shorts2Bytes(temp); | |||
for (int i = 0; i < bytesTemp.length; i++) { | |||
byte b = bytesTemp[i]; | |||
} | |||
String str = new String(bytesTemp, "UTF-8"); | |||
return str; | |||
} | |||
public static short[] ByteToShort(byte[] bytes) { | |||
int len=bytes.length; | |||
if (bytes.length%2!=0) len++; | |||
byte[] tempBytes=new byte[len]; | |||
short[] result = new short[len/2]; | |||
for (int i=0;i<len;i++){ | |||
if (i<bytes.length)tempBytes[i]=bytes[i]; | |||
} | |||
for(int m=0;m<result.length;m++) { | |||
result[m] = (short) ((tempBytes[m * 2] & 0xff) | ((tempBytes[m * 2 + 1] & 0xff) << 8)); | |||
} | |||
return result; | |||
} | |||
public static byte[] shorts2Bytes(short[] data) { | |||
byte[] byteValue = new byte[data.length * 2]; | |||
for (int i = 0; i < data.length; i++) { | |||
byteValue[i * 2] = (byte) (data[i] & 0xff); | |||
byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8); | |||
} | |||
return byteValue; | |||
} | |||
public static int GetAddress(String address) { | |||
if (address == null) return -1; | |||
if (address.length() > 0) { | |||
address = address.trim(); | |||
if (address.toUpperCase().contains("M") && address.length() >= 4) { | |||
String[] res = address.substring(1).split("[.]"); | |||
if (res != null && res.length == 2) { | |||
try { | |||
int firstAdd = Integer.parseInt(res[0]); | |||
int endAdd = Integer.parseInt(res[1]); | |||
if (endAdd >= 0 && endAdd <= 7) { | |||
return (firstAdd * 8) + 320 + endAdd; | |||
} | |||
} catch (NumberFormatException e) { | |||
return -1; | |||
} | |||
} | |||
} else if (address.toUpperCase().contains("I") && address.length() >= 4) { | |||
String[] res = address.substring(1).split("[.]"); | |||
if (res != null && res.length == 2) { | |||
try { | |||
int firstAdd = Integer.parseInt(res[0]); | |||
int endAdd = Integer.parseInt(res[1]); | |||
if (endAdd >= 0 && endAdd <= 7) { | |||
return (firstAdd * 8) + endAdd; | |||
} | |||
} catch (NumberFormatException e) { | |||
return -1; | |||
} | |||
} | |||
} else if ((address.toUpperCase().contains("VW") || address.toUpperCase().contains("VD")) && address.length() >= 3) { | |||
String res = address.substring(2); | |||
if (res != null) { | |||
try { | |||
int tempAdd = Integer.parseInt(res); | |||
return (tempAdd / 2) + 100; | |||
} catch (NumberFormatException e) { | |||
return -1; | |||
} | |||
} | |||
}else if (address.toUpperCase().contains("GI") &&address.length() >=3){ | |||
String res = address.substring(2); | |||
if (res != null) { | |||
try { | |||
return Integer.parseInt(res); | |||
} catch (NumberFormatException e) { | |||
return -1; | |||
} | |||
} | |||
} | |||
else { | |||
try { | |||
return Integer.parseInt(address); | |||
} catch (NumberFormatException e) { | |||
return -1; | |||
} | |||
} | |||
} | |||
return -1; | |||
} | |||
/** | |||
* 获取布尔位地址信息 | |||
* 列:M2.5 = getBitSingleAdd("M",2,5); | |||
* | |||
* @param Prefix 地址标头 | |||
* @param startAdd 起始地址编号 | |||
* @param num 要获取的第几位数量 | |||
* @return | |||
*/ | |||
public static String getBitSingleAdd(String Prefix, int startAdd, int num) { | |||
if (num > 0) { | |||
int FirstAdd = num / 8; | |||
int EndAdd = num % 8; | |||
if (EndAdd == 0) { | |||
FirstAdd--; | |||
EndAdd = 7; | |||
} else { | |||
EndAdd--; | |||
} | |||
return Prefix + FirstAdd + startAdd + "." + EndAdd; | |||
} | |||
return ""; | |||
} | |||
public static String bytesToString(byte[] bytes){ | |||
if (bytes == null) { | |||
return null; | |||
} | |||
StringBuilder builder = new StringBuilder(); | |||
char[] hexArray = "0123456789ABCDEF".toCharArray(); | |||
for (byte aByte : bytes) { | |||
int v = aByte & 0xFF; | |||
builder.append(hexArray[v >>> 4]).append(hexArray[v & 0x0F]).append(" "); | |||
} | |||
return builder.toString(); | |||
} | |||
public static int bytes2Int(byte[] bytes) { | |||
int value = 0; | |||
// 由高位到低位 | |||
for (int i = 0; i < 4; i++) { | |||
int shift = (4 - 1 - i) * 8; | |||
value += (bytes[i] & 0x000000FF) << shift;// 往高位游 | |||
} | |||
return value; | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
public class DataType { | |||
public static final String STRING=""; | |||
public static final byte BYTE=0; | |||
public static final short SHORT=0; | |||
public static final short[] SHORTS = new short[0]; | |||
public static final int INT=0; | |||
public static final long LONG=0; | |||
public static final float FLOAT=0f; | |||
public static final double DOUBLE=0d; | |||
public static final boolean BOOLEAN=false; | |||
} |
@@ -0,0 +1,27 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
import java.nio.ByteBuffer; | |||
public class FloatLib { | |||
public static float ToFloat(byte[] bytes, DataFormat df) { | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(bytes,df,0); | |||
return ByteBuffer.wrap(res).getFloat(); | |||
} | |||
public static float[] ToFloats(byte[] bytes, DataFormat df) { | |||
byte[] tempBytes=new byte[bytes.length]; | |||
if (bytes.length%4!=0) | |||
{ | |||
int offset=4-bytes.length%4; | |||
tempBytes=new byte[bytes.length+offset]; | |||
} | |||
for (int i=0;i<bytes.length;i++){tempBytes[i]=bytes[i];} | |||
float[] result = new float[tempBytes.length/4]; | |||
for (int i=0; i<result.length; i++){ | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(tempBytes,df,i*4); | |||
result[i]=ByteBuffer.wrap(res).getFloat(); | |||
} | |||
return result; | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
import java.nio.ByteBuffer; | |||
public class IntLib { | |||
public static int ToInt(byte[] bytes, DataFormat df) { | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(bytes,df,0); | |||
return ByteBuffer.wrap(res).getInt(); | |||
} | |||
public static int ToInt(short[] shorts, DataFormat df) { | |||
if (shorts.length<2) return 0; | |||
byte[] bytes= ByteLib.ToBytes(shorts,df); | |||
if (bytes.length!=4) return 0; | |||
return ByteBuffer.wrap(bytes).getInt(); | |||
} | |||
public static int[] ToInts(byte[] bytes, DataFormat df) { | |||
byte[] tempBytes=new byte[bytes.length]; | |||
if (bytes.length%4!=0) | |||
{ | |||
int offset=4-bytes.length%4; | |||
tempBytes=new byte[bytes.length+offset]; | |||
} | |||
for (int i=0;i<bytes.length;i++){tempBytes[i]=bytes[i];} | |||
int[] result = new int[tempBytes.length/4]; | |||
for (int i=0; i<result.length; i++){ | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(tempBytes,df,i*4); | |||
result[i]=ByteBuffer.wrap(res).getInt(); | |||
} | |||
return result; | |||
} | |||
public static boolean GetBit(int value,int offset) | |||
{ | |||
if (offset > 32 || offset < 1) return false; | |||
return (value & 1 << offset - 1) == 0 ? false : true; | |||
} | |||
public static int SetBit(int value,int offset, boolean val) | |||
{ | |||
if (offset > 32 || offset < 1) return value; | |||
int ConvertValue =1 << offset - 1; | |||
return val ? value | ConvertValue : value & ~ConvertValue; | |||
} | |||
} |
@@ -0,0 +1,34 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Interface.IRunT; | |||
import java.io.Serializable; | |||
import java.util.LinkedHashMap; | |||
public class NotifyPropVar<T extends Serializable> { | |||
public NotifyPropVar(T defaultValue){ | |||
_value=defaultValue; | |||
} | |||
public IRunT<T> ChangeNotify; | |||
private boolean IsFirst=false; | |||
private LinkedHashMap<String,IRunT<T>> changedNotifys=new LinkedHashMap<>(); | |||
public void Register(String key,IRunT<T> notify){ | |||
// if(changedNotifys.containsKey(key))changedNotifys.remove(key); | |||
changedNotifys.put(key,notify); | |||
} | |||
private T _value; | |||
// public T getValue(){ return _value; } | |||
public <T> T getValue(){ return (T) _value; } | |||
public void setValue(T value){ | |||
if (value != null && !value.equals(_value) || !IsFirst) { | |||
_value=value; | |||
if(ChangeNotify!=null) ChangeNotify.Run(value); | |||
changedNotifys.values().forEach(item->{if(item!=null) item.Run(value);}); | |||
IsFirst = true; | |||
} | |||
} | |||
} | |||
@@ -0,0 +1,47 @@ | |||
package com.jdzh.jdzhandroid.DataUtil; | |||
import com.jdzh.jdzhandroid.Enum.DataFormat; | |||
import java.nio.ByteBuffer; | |||
public class ShortLib { | |||
public static short ToShort(byte[] bytes, DataFormat df) { | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat2(bytes,df,0); | |||
short result= ByteBuffer.wrap(res).getShort(); | |||
return result; | |||
} | |||
public static short[] ToShorts(byte[] bytes, DataFormat df) { | |||
byte[] tempBytes=new byte[bytes.length]; | |||
if (bytes.length%2!=0){ tempBytes=new byte[bytes.length+1]; } | |||
for (int i=0; i<bytes.length; i++){tempBytes[i]=bytes[i];} | |||
short[] result = new short[tempBytes.length/2]; | |||
for (int i=0; i<result.length; i++){ | |||
byte[] res= new ByteTransDataFormat().ByteTransDataFormat2(tempBytes,df,i*2); | |||
result[i]=ByteBuffer.wrap(res).getShort(); | |||
} | |||
return result; | |||
} | |||
public static short[] ToShorts(float[] floats, DataFormat df) { | |||
byte[] bytes = ByteLib.ToBytes(floats,df); | |||
return ShortLib.ToShorts(bytes,df); | |||
} | |||
public static short[] ToShorts(int[] floats, DataFormat df) { | |||
byte[] bytes = ByteLib.ToBytes(floats,df); | |||
return ShortLib.ToShorts(bytes,df); | |||
} | |||
public static boolean GetBit(short value,int offset) | |||
{ | |||
if (offset > 16 || offset < 1) return false; | |||
return (value & 1 << offset - 1) == 0 ? false : true; | |||
} | |||
public static short SetBit(short value,int offset, boolean val) | |||
{ | |||
if (offset > 16 || offset < 1) return value; | |||
short ConvertValue = (short)(1 << offset - 1); | |||
return (short)(val ? value | ConvertValue : value & ~ConvertValue); | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
package com.jdzh.jdzhandroid.Enum; | |||
public enum DataFormat { | |||
ABCD, | |||
CDAB, | |||
BADC, | |||
DCBA | |||
} |
@@ -0,0 +1,5 @@ | |||
package com.jdzh.jdzhandroid.Interface; | |||
public interface IRun { | |||
void Run(); | |||
} |
@@ -0,0 +1,7 @@ | |||
package com.jdzh.jdzhandroid.Interface; | |||
public interface IRunT<T> { | |||
void Run(T t); | |||
} | |||
@@ -0,0 +1,5 @@ | |||
package com.jdzh.jdzhandroid.Interface; | |||
public interface IRunT2<T1,T2> { | |||
void Run(T1 t1, T2 t2);; | |||
} |
@@ -0,0 +1,7 @@ | |||
package com.jdzh.jdzhandroid.Log; | |||
public interface IMessageLogNotify { | |||
void ErrorMsg(String msg); | |||
void InfoMsg(String msg); | |||
void WarnMsg(String msg); | |||
} |
@@ -0,0 +1,58 @@ | |||
package com.jdzh.jdzhandroid.Log; | |||
import com.apkfuns.logutils.LogUtils; | |||
import java.util.concurrent.ConcurrentLinkedQueue; | |||
public class MessageLog { | |||
private static IMessageLogNotify MsgNotify; | |||
private static ConcurrentLinkedQueue<String> msgQueue=new ConcurrentLinkedQueue<String>(); | |||
private static void Init(){ | |||
MsgNotify = new IMessageLogNotify() { | |||
@Override | |||
public void ErrorMsg(String msg) { | |||
LogUtils.e("错误日志 "+msg); | |||
} | |||
@Override | |||
public void InfoMsg(String msg) { | |||
LogUtils.d("信息日志 "+msg); | |||
} | |||
@Override | |||
public void WarnMsg(String msg) { | |||
LogUtils.d("警告日志 "+msg); | |||
} | |||
}; | |||
// ThreadManager.get().StartLong("日志信息保存",true, () -> { | |||
// while(msgQueue.size()>0){ | |||
// String msg= msgQueue.poll(); | |||
// BPA_ALERTLOG log= new BPA_ALERTLOG(); | |||
// log.text=msg; | |||
// QueryDB.AddAlertlog(log); | |||
// } | |||
// Thread.sleep(2000); | |||
// }); | |||
} | |||
public static void ShowInfo(String msg) { | |||
if (MsgNotify == null)Init(); | |||
MsgNotify.InfoMsg(msg); | |||
} | |||
public static void ShowWarning(String msg) { | |||
if (MsgNotify == null)Init(); | |||
MsgNotify.WarnMsg(msg); | |||
} | |||
public static void ShowError(String msg) { | |||
if (MsgNotify == null)Init(); | |||
MsgNotify.ErrorMsg(msg); | |||
} | |||
public static void ShowError(Exception e) { | |||
if (MsgNotify == null)Init(); | |||
MsgNotify.ErrorMsg(e.toString()); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
package com.jdzh.jdzhandroid; | |||
import android.os.Bundle; | |||
import androidx.activity.EdgeToEdge; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import androidx.core.graphics.Insets; | |||
import androidx.core.view.ViewCompat; | |||
import androidx.core.view.WindowInsetsCompat; | |||
public class MainActivity extends AppCompatActivity { | |||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
EdgeToEdge.enable(this); | |||
setContentView(R.layout.activity_main); | |||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { | |||
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); | |||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); | |||
return insets; | |||
}); | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
package com.jdzh.jdzhandroid.Result; | |||
public abstract class IResult { | |||
/** | |||
* 是否成功 | |||
*/ | |||
public boolean isSuccess ; | |||
/** | |||
* 返回消息 | |||
*/ | |||
public String message; | |||
/** | |||
* 操作代码 | |||
*/ | |||
public ResultCode resultCode = ResultCode.Default ; | |||
abstract void setErrorMsg(String msg); | |||
public boolean getIsSuccess(){ | |||
return resultCode==ResultCode.Success; | |||
} | |||
public void setIsSuccess(boolean tempSuccess){ | |||
isSuccess= tempSuccess; | |||
resultCode = tempSuccess ? ResultCode.Success : ResultCode.Fail; | |||
} | |||
@Override | |||
public String toString() { | |||
return "IResult{" + | |||
"isSuccess=" + isSuccess + | |||
", message='" + message + '\'' + | |||
", resultCode=" + resultCode + | |||
'}'; | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
package com.jdzh.jdzhandroid.Result; | |||
import com.jdzh.jdzhandroid.Interface.IRun; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
public class OperateResult extends IResult { | |||
public OperateResult(){ | |||
} | |||
public OperateResult(Exception ex){ | |||
message = ex.getMessage()+"\rException:"+ex.toString(); | |||
resultCode = ResultCode.Exception; | |||
isSuccess=false; | |||
} | |||
public OperateResult(String msg, ResultCode rc) | |||
{ | |||
message = msg; | |||
resultCode = rc; | |||
isSuccess=false; | |||
} | |||
public OperateResult(ResultCode rc) | |||
{ | |||
resultCode = rc; | |||
isSuccess=true; | |||
} | |||
@Override | |||
public void setErrorMsg(String msg) { | |||
message =message+ msg; | |||
isSuccess=false; | |||
resultCode = ResultCode.Fail; | |||
} | |||
public OperateResult OnSource(IRun action){ | |||
if(action!=null&&getIsSuccess())action.Run(); | |||
return this; | |||
} | |||
public OperateResult OnFailed(IRun action){ | |||
try{ | |||
if(action!=null&&!getIsSuccess())action.Run(); | |||
}catch(Exception e){ | |||
MessageLog.ShowError(e); | |||
} | |||
return this; | |||
} | |||
public OperateResult OnFinally(IRun action){ | |||
try{ | |||
if(action!=null)action.Run(); | |||
}catch(Exception e){ | |||
MessageLog.ShowError(e); | |||
} | |||
return this; | |||
} | |||
public static OperateResult CreateSuccess() | |||
{ | |||
return new OperateResult(ResultCode.Success); | |||
} | |||
public static OperateResult CreateFailed(String msg) | |||
{ | |||
MessageLog.ShowError(msg); | |||
return new OperateResult(msg, ResultCode.Fail); | |||
} | |||
public static OperateResult CreateFailed(Exception ex) | |||
{ | |||
MessageLog.ShowError(ex.toString()); | |||
return new OperateResult(ex); | |||
} | |||
} |
@@ -0,0 +1,89 @@ | |||
package com.jdzh.jdzhandroid.Result; | |||
import com.apkfuns.logutils.LogUtils; | |||
import com.jdzh.jdzhandroid.Interface.IRunT; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
public class OperateResultT<T> extends IResult | |||
{ | |||
public OperateResultT(){} | |||
public OperateResultT(Exception ex) { | |||
message = ex.getMessage()+"\rException:"+ex.toString(); | |||
resultCode = ResultCode.Exception; | |||
isSuccess=false; | |||
} | |||
public OperateResultT(String msg, ResultCode rc ){ | |||
message = msg; | |||
resultCode = rc; | |||
isSuccess=false; | |||
} | |||
public OperateResultT(ResultCode rc){ | |||
resultCode = rc; | |||
isSuccess=true; | |||
} | |||
@Override | |||
public void setErrorMsg(String msg) { | |||
message =message+ msg; | |||
isSuccess=false; | |||
resultCode = ResultCode.Fail; | |||
} | |||
public OperateResultT(T content, String msg, ResultCode rc){ | |||
Content = content; | |||
message = msg; | |||
resultCode = rc; | |||
isSuccess=getIsSuccess(); | |||
} | |||
public T Content ; | |||
public void setContent(T value){ | |||
Content = value; | |||
resultCode = ResultCode.Success; | |||
isSuccess=true; | |||
} | |||
public OperateResultT<T> OnSource(IRunT<OperateResultT<T>> action){ | |||
try{ | |||
if(action!=null&&getIsSuccess())action.Run(this); | |||
}catch(Exception e){ | |||
MessageLog.ShowError(e); | |||
} | |||
return this; | |||
} | |||
public OperateResultT<T> OnFailed(IRunT<OperateResultT<T>> action){ | |||
try{ | |||
if(action!=null&&!getIsSuccess())action.Run(this); | |||
}catch(Exception e){ | |||
MessageLog.ShowError(e); | |||
} | |||
return this; | |||
} | |||
public OperateResultT<T> OnFinally(IRunT<OperateResultT<T>> action){ | |||
if(action!=null)action.Run(this); | |||
return this; | |||
} | |||
public static <T> OperateResultT<T> CreateSuccess(T value) | |||
{ | |||
return new OperateResultT<T>(value,"", ResultCode.Success); | |||
} | |||
public static <T> OperateResultT<T> CreateFailedT(String msg) | |||
{ | |||
MessageLog.ShowError(msg); | |||
return new OperateResultT<T>( msg, ResultCode.Fail); | |||
} | |||
public static <T> OperateResultT<T> CreateFailedT(Exception ex) | |||
{ | |||
MessageLog.ShowError(ex.toString()); | |||
return new OperateResultT<T>(ex); | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
package com.jdzh.jdzhandroid.Result; | |||
public enum ResultCode { | |||
/** | |||
* 默认 | |||
*/ | |||
Default, | |||
/** | |||
* 错误 | |||
*/ | |||
Error, | |||
/** | |||
* 异常 | |||
*/ | |||
Exception, | |||
/** | |||
* 成功 | |||
*/ | |||
Success, | |||
/** | |||
* 失败 | |||
*/ | |||
Fail, | |||
/** | |||
* 操作超时 | |||
*/ | |||
Overtime, | |||
/** | |||
* 操作取消 | |||
*/ | |||
Canceled | |||
} |
@@ -0,0 +1,5 @@ | |||
package com.jdzh.jdzhandroid.Task; | |||
public interface ITask { | |||
void Run() throws InterruptedException; | |||
} |
@@ -0,0 +1,7 @@ | |||
package com.jdzh.jdzhandroid.Task; | |||
public interface ITaskComplete { | |||
void Run() throws Exception; | |||
void RunComplete() throws Exception; | |||
} |
@@ -0,0 +1,25 @@ | |||
package com.jdzh.jdzhandroid.Task; | |||
import com.jdzh.jdzhandroid.Interface.IRun; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
public class Task { | |||
public static void Run(IRun action){ | |||
if(action!=null){ | |||
new Thread(()->{ | |||
try{ | |||
action.Run(); | |||
}catch(Exception e){ | |||
MessageLog.ShowError(e.getMessage()); | |||
} | |||
}).start(); | |||
} | |||
} | |||
public static void Delay(long millis){ | |||
try{ | |||
Thread.sleep(millis); | |||
}catch (Exception e){} | |||
} | |||
} |
@@ -0,0 +1,82 @@ | |||
package com.jdzh.jdzhandroid.Task; | |||
import com.jdzh.jdzhandroid.Log.MessageLog; | |||
import java.util.HashMap; | |||
import java.util.concurrent.ConcurrentHashMap; | |||
import java.util.concurrent.ExecutorService; | |||
import java.util.concurrent.Executors; | |||
public class TaskManager { | |||
private static volatile TaskManager _Instance; | |||
public static TaskManager get() { | |||
if (_Instance == null){ | |||
synchronized (TaskManager.class){ | |||
if (_Instance == null){ | |||
_Instance = new TaskManager(); | |||
} | |||
} | |||
} | |||
return _Instance; | |||
} | |||
private TaskManager() { | |||
} | |||
public long RestartInterval = 1000; | |||
ConcurrentHashMap<String, TaskModel> tm = new ConcurrentHashMap<>(); | |||
private void Sleep(long millis) { | |||
try { | |||
Thread.sleep(millis); | |||
} catch (InterruptedException e) { | |||
throw new RuntimeException(e); | |||
} | |||
} | |||
public void StartLong(String Key, boolean IsRestart, ITask _thread) { | |||
if (!tm.containsKey(Key)) { | |||
tm.put(Key, new TaskModel()); | |||
tm.get(Key).Task = _thread; | |||
tm.get(Key).ThreadObj = new Thread(() -> { | |||
MessageLog.ShowInfo("启动线程:" + Key); | |||
while (!tm.get(Key).IsCancel) { | |||
if (IsRestart) { | |||
try { | |||
tm.get(Key).Task.Run(); | |||
} catch (Exception ex) { | |||
MessageLog.ShowError("多线程:[" + Key + "] 运行发生异常,已重启,错误信息:" + ex.toString()); | |||
Sleep(RestartInterval); | |||
} | |||
} else { | |||
try { | |||
tm.get(Key).Task.Run(); | |||
} catch (Exception e) { | |||
MessageLog.ShowError("多线程:[" + Key + "] 运行发生异常,已重启,错误信息:" + e.toString()); | |||
} | |||
} | |||
} | |||
tm.remove(Key); | |||
}); | |||
tm.get(Key).ThreadObj.setName(Key); | |||
tm.get(Key).ThreadObj.start(); | |||
} else { | |||
MessageLog.ShowWarning("任务-[" + Key + "]-已存在"); | |||
} | |||
} | |||
public void Stop(String Key) { | |||
if (tm.containsKey(Key)) { | |||
tm.get(Key).IsCancel = true; | |||
} | |||
} | |||
public void release(){ | |||
for (HashMap.Entry<String, TaskModel> entry : tm.entrySet()) { | |||
entry.getValue().IsCancel = true; | |||
} | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
package com.jdzh.jdzhandroid.Task; | |||
public class TaskModel { | |||
public ITaskComplete RunThread; | |||
public ITask Task; | |||
public boolean IsCancel; | |||
public Thread ThreadObj; | |||
} |
@@ -0,0 +1,41 @@ | |||
package com.jdzh.jdzhandroid.Trig; | |||
import com.jdzh.jdzhandroid.Interface.IRun; | |||
import java.util.concurrent.ConcurrentHashMap; | |||
/** | |||
* 上升沿操作 | |||
*/ | |||
public class RTrig { | |||
private static volatile ConcurrentHashMap<String, RTrig> _Instance; | |||
public static RTrig get(String name) { | |||
if (_Instance == null) | |||
_Instance = new ConcurrentHashMap<String, RTrig>(); | |||
if (!_Instance.containsKey(name)) | |||
_Instance.put(name, new RTrig()); | |||
return _Instance.get(name); | |||
} | |||
private RTrig() { | |||
} | |||
private boolean flag=false; | |||
private boolean Q=false; | |||
public boolean getQ() { | |||
return Q; | |||
} | |||
private void setIN(boolean falag) { | |||
Q = falag && !flag; | |||
flag = falag; | |||
} | |||
public void Start(boolean IN, IRun callback) { | |||
setIN(IN); | |||
if (Q) | |||
callback.Run(); | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||
xmlns:tools="http://schemas.android.com/tools" | |||
android:id="@+id/main" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
tools:context=".MainActivity"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Hello World!" | |||
app:layout_constraintBottom_toBottomOf="parent" | |||
app:layout_constraintEnd_toEndOf="parent" | |||
app:layout_constraintStart_toStartOf="parent" | |||
app:layout_constraintTop_toTopOf="parent" /> | |||
</androidx.constraintlayout.widget.ConstraintLayout> |
@@ -0,0 +1,3 @@ | |||
<resources > | |||
</resources> |
@@ -0,0 +1,5 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<resources> | |||
<color name="black">#FF000000</color> | |||
<color name="white">#FFFFFFFF</color> | |||
</resources> |
@@ -0,0 +1,3 @@ | |||
<resources> | |||
<string name="app_name">JDZHAndroid</string> | |||
</resources> |
@@ -0,0 +1,3 @@ | |||
<resources xmlns:tools="http://schemas.android.com/tools"> | |||
</resources> |
@@ -0,0 +1,13 @@ | |||
<?xml version="1.0" encoding="utf-8"?><!-- | |||
Sample backup rules file; uncomment and customize as necessary. | |||
See https://developer.android.com/guide/topics/data/autobackup | |||
for details. | |||
Note: This file is ignored for devices older that API 31 | |||
See https://developer.android.com/about/versions/12/backup-restore | |||
--> | |||
<full-backup-content> | |||
<!-- | |||
<include domain="sharedpref" path="."/> | |||
<exclude domain="sharedpref" path="device.xml"/> | |||
--> | |||
</full-backup-content> |
@@ -0,0 +1,19 @@ | |||
<?xml version="1.0" encoding="utf-8"?><!-- | |||
Sample data extraction rules file; uncomment and customize as necessary. | |||
See https://developer.android.com/about/versions/12/backup-restore#xml-changes | |||
for details. | |||
--> | |||
<data-extraction-rules> | |||
<cloud-backup> | |||
<!-- TODO: Use <include> and <exclude> to control what is backed up. | |||
<include .../> | |||
<exclude .../> | |||
--> | |||
</cloud-backup> | |||
<!-- | |||
<device-transfer> | |||
<include .../> | |||
<exclude .../> | |||
</device-transfer> | |||
--> | |||
</data-extraction-rules> |
@@ -0,0 +1,61 @@ | |||
// Top-level build file where you can add configuration options common to all sub-projects/modules. | |||
//plugins { | |||
// alias(libs.plugins.androidApplication) apply false | |||
//} | |||
//最新版的Android studio已经将配置转移到settings.gradle文件中了,要正常编译的话需要将多余的项注释掉 | |||
buildscript { | |||
repositories { | |||
google() | |||
jcenter() | |||
maven { | |||
url "https://maven.aliyun.com/nexus/content/repositories/releases/" | |||
} | |||
} | |||
dependencies { | |||
classpath 'com.android.tools.build:gradle:7.4.1' | |||
//classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' | |||
// NOTE: Do not place your application dependencies here; they belong | |||
// in the individual module build.gradle files | |||
} | |||
} | |||
allprojects { | |||
repositories { | |||
google() | |||
jcenter() | |||
maven { url "https://jitpack.io" } | |||
maven { | |||
url "https://maven.aliyun.com/nexus/content/repositories/releases/" | |||
} | |||
} | |||
} | |||
task clean(type: Delete) { | |||
delete rootProject.buildDir | |||
} | |||
ext { // 统一版本入口 | |||
//App版本号 | |||
versionCode = 101 | |||
versionName = "1.0.1" | |||
// 支持Android版本 | |||
buildToolsVersion = "33.0.0" | |||
minSdkVersion = 23 | |||
targetSdkVersion = 33 | |||
compileSdkVersion = 33 | |||
// 支持包 | |||
supportVersion = "28.0.0" | |||
//butterknife = "8.8.1" | |||
butterknife = "10.0.0" | |||
//设置applicationId(这里很重要,两个相同applicationId的apk不同同时安装在同一台Android手机中) | |||
applicationId= "com.bonait.yteccj" | |||
} |
@@ -0,0 +1,23 @@ | |||
# Project-wide Gradle settings. | |||
# IDE (e.g. Android Studio) users: | |||
# Gradle settings configured through the IDE *will override* | |||
# any settings specified in this file. | |||
# For more details on how to configure your build environment visit | |||
# http://www.gradle.org/docs/current/userguide/build_environment.html | |||
# Specifies the JVM arguments used for the daemon process. | |||
# The setting is particularly useful for tweaking memory settings. | |||
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 | |||
# When configured, Gradle will run in incubating parallel mode. | |||
# This option should only be used with decoupled projects. For more details, visit | |||
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects | |||
# org.gradle.parallel=true | |||
# AndroidX package structure to make it clearer which packages are bundled with the | |||
# Android operating system, and which are packaged with your app's APK | |||
# https://developer.android.com/topic/libraries/support-library/androidx-rn | |||
android.useAndroidX=true | |||
# Enables namespacing of each library's R class so that its R class includes only the | |||
# resources declared in the library itself and none from the library's dependencies, | |||
# thereby reducing the size of the R class for that library | |||
android.nonTransitiveRClass=true | |||
android.enableJetifier=true |
@@ -0,0 +1,24 @@ | |||
[versions] | |||
agp = "8.3.2" | |||
junit = "4.13.2" | |||
junitVersion = "1.1.5" | |||
espressoCore = "3.5.1" | |||
appcompat = "1.6.1" | |||
material = "1.10.0" | |||
activity = "1.8.0" | |||
constraintlayout = "2.1.4" | |||
playServicesVisionCommon = "19.1.3" | |||
[libraries] | |||
junit = { group = "junit", name = "junit", version.ref = "junit" } | |||
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } | |||
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } | |||
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } | |||
material = { group = "com.google.android.material", name = "material", version.ref = "material" } | |||
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } | |||
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } | |||
play-services-vision-common = { group = "com.google.android.gms", name = "play-services-vision-common", version.ref = "playServicesVisionCommon" } | |||
[plugins] | |||
androidApplication = { id = "com.android.application", version.ref = "agp" } | |||
@@ -0,0 +1,6 @@ | |||
#Thu Aug 22 15:36:42 CST 2024 | |||
distributionBase=GRADLE_USER_HOME | |||
distributionPath=wrapper/dists | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip | |||
zipStoreBase=GRADLE_USER_HOME | |||
zipStorePath=wrapper/dists |
@@ -0,0 +1,185 @@ | |||
#!/usr/bin/env sh | |||
# | |||
# Copyright 2015 the original author or authors. | |||
# | |||
# Licensed under the Apache License, Version 2.0 (the "License"); | |||
# you may not use this file except in compliance with the License. | |||
# You may obtain a copy of the License at | |||
# | |||
# https://www.apache.org/licenses/LICENSE-2.0 | |||
# | |||
# Unless required by applicable law or agreed to in writing, software | |||
# distributed under the License is distributed on an "AS IS" BASIS, | |||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
# See the License for the specific language governing permissions and | |||
# limitations under the License. | |||
# | |||
############################################################################## | |||
## | |||
## Gradle start up script for UN*X | |||
## | |||
############################################################################## | |||
# Attempt to set APP_HOME | |||
# Resolve links: $0 may be a link | |||
PRG="$0" | |||
# Need this for relative symlinks. | |||
while [ -h "$PRG" ] ; do | |||
ls=`ls -ld "$PRG"` | |||
link=`expr "$ls" : '.*-> \(.*\)$'` | |||
if expr "$link" : '/.*' > /dev/null; then | |||
PRG="$link" | |||
else | |||
PRG=`dirname "$PRG"`"/$link" | |||
fi | |||
done | |||
SAVED="`pwd`" | |||
cd "`dirname \"$PRG\"`/" >/dev/null | |||
APP_HOME="`pwd -P`" | |||
cd "$SAVED" >/dev/null | |||
APP_NAME="Gradle" | |||
APP_BASE_NAME=`basename "$0"` | |||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |||
# Use the maximum available, or set MAX_FD != -1 to use that value. | |||
MAX_FD="maximum" | |||
warn () { | |||
echo "$*" | |||
} | |||
die () { | |||
echo | |||
echo "$*" | |||
echo | |||
exit 1 | |||
} | |||
# OS specific support (must be 'true' or 'false'). | |||
cygwin=false | |||
msys=false | |||
darwin=false | |||
nonstop=false | |||
case "`uname`" in | |||
CYGWIN* ) | |||
cygwin=true | |||
;; | |||
Darwin* ) | |||
darwin=true | |||
;; | |||
MINGW* ) | |||
msys=true | |||
;; | |||
NONSTOP* ) | |||
nonstop=true | |||
;; | |||
esac | |||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | |||
# Determine the Java command to use to start the JVM. | |||
if [ -n "$JAVA_HOME" ] ; then | |||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |||
# IBM's JDK on AIX uses strange locations for the executables | |||
JAVACMD="$JAVA_HOME/jre/sh/java" | |||
else | |||
JAVACMD="$JAVA_HOME/bin/java" | |||
fi | |||
if [ ! -x "$JAVACMD" ] ; then | |||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |||
Please set the JAVA_HOME variable in your environment to match the | |||
location of your Java installation." | |||
fi | |||
else | |||
JAVACMD="java" | |||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||
Please set the JAVA_HOME variable in your environment to match the | |||
location of your Java installation." | |||
fi | |||
# Increase the maximum file descriptors if we can. | |||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | |||
MAX_FD_LIMIT=`ulimit -H -n` | |||
if [ $? -eq 0 ] ; then | |||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | |||
MAX_FD="$MAX_FD_LIMIT" | |||
fi | |||
ulimit -n $MAX_FD | |||
if [ $? -ne 0 ] ; then | |||
warn "Could not set maximum file descriptor limit: $MAX_FD" | |||
fi | |||
else | |||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | |||
fi | |||
fi | |||
# For Darwin, add options to specify how the application appears in the dock | |||
if $darwin; then | |||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | |||
fi | |||
# For Cygwin or MSYS, switch paths to Windows format before running java | |||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then | |||
APP_HOME=`cygpath --path --mixed "$APP_HOME"` | |||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | |||
JAVACMD=`cygpath --unix "$JAVACMD"` | |||
# We build the pattern for arguments to be converted via cygpath | |||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | |||
SEP="" | |||
for dir in $ROOTDIRSRAW ; do | |||
ROOTDIRS="$ROOTDIRS$SEP$dir" | |||
SEP="|" | |||
done | |||
OURCYGPATTERN="(^($ROOTDIRS))" | |||
# Add a user-defined pattern to the cygpath arguments | |||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then | |||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | |||
fi | |||
# Now convert the arguments - kludge to limit ourselves to /bin/sh | |||
i=0 | |||
for arg in "$@" ; do | |||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | |||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option | |||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition | |||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | |||
else | |||
eval `echo args$i`="\"$arg\"" | |||
fi | |||
i=`expr $i + 1` | |||
done | |||
case $i in | |||
0) set -- ;; | |||
1) set -- "$args0" ;; | |||
2) set -- "$args0" "$args1" ;; | |||
3) set -- "$args0" "$args1" "$args2" ;; | |||
4) set -- "$args0" "$args1" "$args2" "$args3" ;; | |||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | |||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | |||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | |||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | |||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | |||
esac | |||
fi | |||
# Escape application args | |||
save () { | |||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | |||
echo " " | |||
} | |||
APP_ARGS=`save "$@"` | |||
# Collect all arguments for the java command, following the shell quoting and substitution rules | |||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | |||
exec "$JAVACMD" "$@" |
@@ -0,0 +1,89 @@ | |||
@rem | |||
@rem Copyright 2015 the original author or authors. | |||
@rem | |||
@rem Licensed under the Apache License, Version 2.0 (the "License"); | |||
@rem you may not use this file except in compliance with the License. | |||
@rem You may obtain a copy of the License at | |||
@rem | |||
@rem https://www.apache.org/licenses/LICENSE-2.0 | |||
@rem | |||
@rem Unless required by applicable law or agreed to in writing, software | |||
@rem distributed under the License is distributed on an "AS IS" BASIS, | |||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
@rem See the License for the specific language governing permissions and | |||
@rem limitations under the License. | |||
@rem | |||
@if "%DEBUG%" == "" @echo off | |||
@rem ########################################################################## | |||
@rem | |||
@rem Gradle startup script for Windows | |||
@rem | |||
@rem ########################################################################## | |||
@rem Set local scope for the variables with windows NT shell | |||
if "%OS%"=="Windows_NT" setlocal | |||
set DIRNAME=%~dp0 | |||
if "%DIRNAME%" == "" set DIRNAME=. | |||
set APP_BASE_NAME=%~n0 | |||
set APP_HOME=%DIRNAME% | |||
@rem Resolve any "." and ".." in APP_HOME to make it shorter. | |||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | |||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |||
@rem Find java.exe | |||
if defined JAVA_HOME goto findJavaFromJavaHome | |||
set JAVA_EXE=java.exe | |||
%JAVA_EXE% -version >NUL 2>&1 | |||
if "%ERRORLEVEL%" == "0" goto execute | |||
echo. | |||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||
echo. | |||
echo Please set the JAVA_HOME variable in your environment to match the | |||
echo location of your Java installation. | |||
goto fail | |||
:findJavaFromJavaHome | |||
set JAVA_HOME=%JAVA_HOME:"=% | |||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |||
if exist "%JAVA_EXE%" goto execute | |||
echo. | |||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | |||
echo. | |||
echo Please set the JAVA_HOME variable in your environment to match the | |||
echo location of your Java installation. | |||
goto fail | |||
:execute | |||
@rem Setup the command line | |||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |||
@rem Execute Gradle | |||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | |||
:end | |||
@rem End local scope for the variables with windows NT shell | |||
if "%ERRORLEVEL%"=="0" goto mainEnd | |||
:fail | |||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |||
rem the _cmd.exe /c_ return code! | |||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | |||
exit /b 1 | |||
:mainEnd | |||
if "%OS%"=="Windows_NT" endlocal | |||
:omega |
@@ -0,0 +1,23 @@ | |||
//pluginManagement { | |||
// repositories { | |||
// google { | |||
// content { | |||
// includeGroupByRegex("com\\.android.*") | |||
// includeGroupByRegex("com\\.google.*") | |||
// includeGroupByRegex("androidx.*") | |||
// } | |||
// } | |||
// mavenCentral() | |||
// gradlePluginPortal() | |||
// } | |||
//} | |||
//dependencyResolutionManagement { | |||
// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) | |||
// repositories { | |||
// google() | |||
// mavenCentral() | |||
// } | |||
//} | |||
// | |||
rootProject.name = "JDZHAndroid" | |||
include ':app' |