diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt index e001ace..69e40d7 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt @@ -18,9 +18,9 @@ private val gson by lazy { Gson() } val postResult = MutableLiveData() - fun postRegion(context: Context, code: String, color: String, position: String) = launch({ + fun postRegion(context: Context, position: FloatArray) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.postRegion(code, color, position) + val response = RetrofitServiceManager.setVideoRegion(position) when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt index e001ace..69e40d7 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt @@ -18,9 +18,9 @@ private val gson by lazy { Gson() } val postResult = MutableLiveData() - fun postRegion(context: Context, code: String, color: String, position: String) = launch({ + fun postRegion(context: Context, position: FloatArray) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.postRegion(code, color, position) + val response = RetrofitServiceManager.setVideoRegion(position) when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml new file mode 100644 index 0000000..731982b --- /dev/null +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt index e001ace..69e40d7 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt @@ -18,9 +18,9 @@ private val gson by lazy { Gson() } val postResult = MutableLiveData() - fun postRegion(context: Context, code: String, color: String, position: String) = launch({ + fun postRegion(context: Context, position: FloatArray) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.postRegion(code, color, position) + val response = RetrofitServiceManager.setVideoRegion(position) when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml new file mode 100644 index 0000000..731982b --- /dev/null +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_construction_check.xml b/app/src/main/res/layout/activity_construction_check.xml new file mode 100644 index 0000000..5696bbb --- /dev/null +++ b/app/src/main/res/layout/activity_construction_check.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b45866e..68f09d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt index e001ace..69e40d7 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt @@ -18,9 +18,9 @@ private val gson by lazy { Gson() } val postResult = MutableLiveData() - fun postRegion(context: Context, code: String, color: String, position: String) = launch({ + fun postRegion(context: Context, position: FloatArray) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.postRegion(code, color, position) + val response = RetrofitServiceManager.setVideoRegion(position) when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml new file mode 100644 index 0000000..731982b --- /dev/null +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_construction_check.xml b/app/src/main/res/layout/activity_construction_check.xml new file mode 100644 index 0000000..5696bbb --- /dev/null +++ b/app/src/main/res/layout/activity_construction_check.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_site_tab.xml b/app/src/main/res/layout/activity_site_tab.xml index 9c08857..2ee51fa 100644 --- a/app/src/main/res/layout/activity_site_tab.xml +++ b/app/src/main/res/layout/activity_site_tab.xml @@ -92,11 +92,29 @@ - + android:layout_weight="1"> + + + + + + ): String - - /** - * 提交算法区域 - */ - @POST("/set_position") - suspend fun postRegion(@Body requestBody: RequestBody): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 5abd3a4..c09fb28 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -26,6 +26,13 @@ RetrofitFactory.createRetrofit(httpConfig) } + private val aiApi by lazy { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL + ) as String + RetrofitFactory.createRetrofit(httpConfig) + } + /** * 验证PublicKey */ @@ -130,38 +137,6 @@ } /** - * 声光报警开关 - */ - suspend fun changeAlarmState(deviceIp: String, state: String): String { - val param = JsonObject() - param.addProperty("deviceIp", deviceIp) - param.addProperty("state", state) - - val requestBody = param.toString().toRequestBody( - "application/json;charset=UTF-8".toMediaType() - ) - - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.changeAlarmState(requestBody) - } - - /** - * 声光报警开关状态 - */ - suspend fun getAlarmState(): String { - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.getAlarmState() - } - - /** * 上传图片 */ suspend fun uploadImage(image: File): String { @@ -253,21 +228,52 @@ return api.enter(AuthenticationHelper.token!!, requestBody, projectIdMap) } - suspend fun postRegion(code: String, color: String, position: String): String { + /** + * 设置当前阶段 + */ + suspend fun setCurrentPhase(phase: String): String { val param = JsonObject() - param.addProperty("code", code) - param.addProperty("color", color) - param.addProperty("position", position) + param.addProperty("phase", phase) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() ) - val host = SaveKeyValues.getValue(LocaleConstant.TCP_HOST, "192.168.10.133").toString() - val regionApi by lazy { - val httpConfig = "http://${host}:5000" - RetrofitFactory.createRetrofit(httpConfig) - } - return regionApi.postRegion(requestBody) + return aiApi.setCurrentPhase(requestBody) + } + + /** + * 设置声光报警开关 + */ + suspend fun changeAlarmState(state: String): String { + val param = JsonObject() + param.addProperty("state", state) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + return aiApi.changeAlarmState(requestBody) + } + + /** + * 声光报警开关状态 + */ + suspend fun getAlarmState(): String { + return aiApi.getAlarmState() + } + + /** + * 设置区域 + * */ + suspend fun setVideoRegion(position: FloatArray): String { + val param = JsonObject() + val typeToken = object : TypeToken() {}.type + param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return aiApi.postRegion(requestBody) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index 2fc3bef..ee3e446 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -45,10 +45,12 @@ ) } -// const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" + // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" + const val AI_BASE_URL = "http://192.168.10.138:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" + const val AI_SERVER_CONFIG = "aiServerConfig" const val ACCOUNT = "account" const val PASSWORD = "password" const val SEARCH_ACTION = "searchAction" @@ -64,4 +66,8 @@ const val WIFI_PASSWORD = "zhsz20311hw" const val TCP_HOST = "tcpServer" const val TCP_PORT = 9000 + + //施工交底 + val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt index de0d549..b33be84 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/tcp/SocketManager.kt @@ -1,7 +1,7 @@ package com.casic.br.operationsite.utils.tcp import android.util.Log -import com.casic.br.operationsite.view.MethaneActivity +import com.casic.br.operationsite.view.ConstructionCheckActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,7 +16,7 @@ val get by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SocketManager() } } - fun connectNetty(hostname: String, port: Int) { + fun connectTcpServer(hostname: String, port: Int) { Thread { if (!nettyClient.connectStatus) { nettyClient.setSocketListener(this) @@ -35,12 +35,7 @@ if (statusCode == ISocketListener.STATUS_CONNECT_SUCCESS) { if (nettyClient.connectStatus) { Log.d(kTag, "连接成功") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072101) - } - } else { - if (!nettyClient.connectStatus) { - Log.e(kTag, "onServiceStatusConnectChanged:$statusCode,连接断开,正在重连") - MethaneActivity.weakReferenceHandler.sendEmptyMessage(2023072102) + ConstructionCheckActivity.weakReferenceHandler.sendEmptyMessage(2024061801) } } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt new file mode 100644 index 0000000..5be0440 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -0,0 +1,125 @@ +package com.casic.br.operationsite.view + +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.callback.OnImageCompressListener +import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.UploadFileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import java.io.File + +class ConstructionCheckActivity : KotlinBaseActivity(), + Handler.Callback { + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + private val kTag = "ConstructionCheckActivity" + private val context = this + private lateinit var uploadFileViewModel: UploadFileViewModel + + override fun initEvent() { + binding.startCheckButton.setOnClickListener { + when (binding.startCheckTextView.text) { + "开始交底" -> { + //连接TCP服务 + LoadingDialogHub.show(this, "处理中,请稍后...") + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + + "拍照确认" -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) + } + } + + override fun onCancel() { + + } + }) + } + + "确认完交底" -> { + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "开始交底" + } + } + } + } + + private fun analyticalSelectResults(result: LocalMedia) { + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2024061801) { + //成功 + LoadingDialogHub.dismiss() + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + binding.startCheckTextView.text = "拍照确认" + } + return true + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + weakReferenceHandler = WeakReferenceHandler(this) + + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Log.d(kTag, "url: $url") + binding.startCheckTextView.text = "确认完交底" + } + } + } + } + + override fun initViewBinding(): ActivityConstructionCheckBinding { + return ActivityConstructionCheckBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt index 73953df..d08a8b4 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/MethaneActivity.kt @@ -132,7 +132,7 @@ SaveKeyValues.putValue(LocaleConstant.TCP_HOST, value) - SocketManager.get.connectNetty(value, LocaleConstant.TCP_PORT) + SocketManager.get.connectTcpServer(value, LocaleConstant.TCP_PORT) } val bottomActionSheet = diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 76ab644..426f3fd 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -10,11 +10,11 @@ import android.net.wifi.WifiNetworkSpecifier import android.os.Build import android.os.Bundle +import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.reformatFloatArray import com.casic.br.operationsite.utils.DeviceType import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.RuntimeCache @@ -24,11 +24,13 @@ import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.widget.dialog.BottomActionSheet class VideoBoundaryActivity : KotlinBaseActivity() { + private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity private val wifiManager by lazy { getSystemService() } private val wifiSsids = ArrayList() @@ -111,10 +113,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - val data = region.reformatFloatArray() + val region = binding.regionView.getConfirmedRegion() + Log.d(kTag, region.toJson()) - regionViewModel.postRegion(this, "11,12", "#FF0000", data) +// regionViewModel.postRegion(region) } } diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 14f4cbd..0343f09 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -361,6 +361,10 @@ } override fun initEvent() { + binding.floatingActionButton.setOnClickListener { + navigatePageTo() + } + binding.alarmTextView.setOnClickListener { navigatePageTo() } diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7906a31..9575c82 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -86,7 +86,7 @@ fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.changeAlarmState(deviceIp, state) + val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { gson.fromJson( diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt index e001ace..69e40d7 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt @@ -18,9 +18,9 @@ private val gson by lazy { Gson() } val postResult = MutableLiveData() - fun postRegion(context: Context, code: String, color: String, position: String) = launch({ + fun postRegion(context: Context, position: FloatArray) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.postRegion(code, color, position) + val response = RetrofitServiceManager.setVideoRegion(position) when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml new file mode 100644 index 0000000..731982b --- /dev/null +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_construction_check.xml b/app/src/main/res/layout/activity_construction_check.xml new file mode 100644 index 0000000..5696bbb --- /dev/null +++ b/app/src/main/res/layout/activity_construction_check.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_site_tab.xml b/app/src/main/res/layout/activity_site_tab.xml index 9c08857..2ee51fa 100644 --- a/app/src/main/res/layout/activity_site_tab.xml +++ b/app/src/main/res/layout/activity_site_tab.xml @@ -92,11 +92,29 @@ - + android:layout_weight="1"> + + + + +