desc:查询气体,自己计算步长平均值

main
xiaowusky 2 years ago
parent 36c61b30c2
commit 7014cfae07

@ -4,17 +4,17 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import com.yinuo.safetywatcher.databinding.LayoutItemHistoryBinding
import com.yinuo.safetywatcher.watcher.base.BaseRvAdapter
import com.yinuo.safetywatcher.watcher.bean.HistoryData
import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.utils.DateUtils
class HistoryDataAdapter :
BaseRvAdapter<HistoryData, LayoutItemHistoryBinding, HistoryDataAdapter.HViewHolder>() {
BaseRvAdapter<Gas, LayoutItemHistoryBinding, HistoryDataAdapter.HViewHolder>() {
class HViewHolder(val binding: LayoutItemHistoryBinding) :
BaseRvAdapter.BaseViewHolder<HistoryData, LayoutItemHistoryBinding>(binding) {
override fun bindView(data: HistoryData) {
BaseRvAdapter.BaseViewHolder<Gas, LayoutItemHistoryBinding>(binding) {
override fun bindView(data: Gas) {
binding.tvTime.text = formatTime(data.time)
binding.tvSensor.text = data.sensor
binding.tvSensor.text = data.gasName
}
private fun formatTime(time: Long): CharSequence? {

@ -12,7 +12,7 @@ import com.yinuo.safetywatcher.watcher.utils.DateUtils
class WarnDataAdapter :
BaseRvAdapter<WarnData, LayoutItemWarnBinding, WarnDataAdapter.WViewHolder>() {
class WViewHolder(val binding: LayoutItemWarnBinding) :
class WViewHolder(private val binding: LayoutItemWarnBinding) :
BaseRvAdapter.BaseViewHolder<WarnData, LayoutItemWarnBinding>(binding) {
override fun bindView(data: WarnData) {
binding.tvTime.text = formatTime(data.time)

@ -5,14 +5,21 @@ import androidx.room.Room
import androidx.room.RoomDatabase
import com.common.commonlib.CommonApplication
import com.yinuo.safetywatcher.watcher.db.dao.GasDao
import com.yinuo.safetywatcher.watcher.db.dao.GasTypeDao
import com.yinuo.safetywatcher.watcher.db.dao.WarningDao
import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.db.entity.GasType
import com.yinuo.safetywatcher.watcher.db.entity.Warning
@Database(entities = [Warning::class, Gas::class], version = 1, exportSchema = false)
@Database(
entities = [Warning::class, Gas::class, GasType::class],
version = 1,
exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
abstract fun warningDao(): WarningDao
abstract fun gasDao(): GasDao
abstract fun gasTypeDao(): GasTypeDao
}
object DBUtils {
@ -30,4 +37,8 @@ object DBUtils {
fun gasDao(): GasDao {
return db.gasDao()
}
fun gasTypeDao(): GasTypeDao {
return db.gasTypeDao()
}
}

@ -11,8 +11,11 @@ interface GasDao {
@Query("SELECT * FROM gas")
suspend fun getAll(): List<Gas>
@Query("SELECT * FROM gas WHERE gas_name IS :name AND time BETWEEN :startTime AND :endTime")
suspend fun findByName(name: String, startTime: Long, endTime: Long): List<Gas>
@Query("SELECT * FROM gas WHERE sync_flag IS :flag OR time >= :startTime")
suspend fun getAllBySyncFlagOrTime(flag: Boolean, startTime: Long): List<Gas>
@Query("SELECT * FROM gas WHERE time BETWEEN :startTime AND :endTime")
suspend fun getAllByTime(startTime: Long, endTime: Long): List<Gas>
@Insert
suspend fun insertAll(vararg gases: Gas)

@ -0,0 +1,19 @@
package com.yinuo.safetywatcher.watcher.db.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import com.yinuo.safetywatcher.watcher.db.entity.GasType
@Dao
interface GasTypeDao {
@Query("SELECT * FROM gas_type")
suspend fun getAll(): List<GasType>
@Insert
suspend fun insert(gas: GasType)
@Delete
suspend fun delete(gas: GasType)
}

@ -6,12 +6,12 @@ import androidx.room.PrimaryKey
@Entity
data class Gas(
@PrimaryKey val id: Int,
@ColumnInfo(name = "time") val time: Long,
@ColumnInfo(name = "gas_name") val gasName: String,
@ColumnInfo(name = "gas_value") val gasValue: Double,
@ColumnInfo(name = "unit") val unit: String,
@ColumnInfo(name = "threshold_low") val thresholdLow: Double,
@ColumnInfo(name = "threshold_high") val thresholdHigh: Double,
@ColumnInfo(name = "sync_flag") val syncFlag: Boolean = false
@PrimaryKey var id: Int,
@ColumnInfo(name = "time") var time: Long,
@ColumnInfo(name = "gas_name") var gasName: String,
@ColumnInfo(name = "gas_value") var gasValue: Double,
@ColumnInfo(name = "unit") var unit: String,
@ColumnInfo(name = "threshold_low") var thresholdLow: Double,
@ColumnInfo(name = "threshold_high") var thresholdHigh: Double,
@ColumnInfo(name = "sync_flag") var syncFlag: Boolean = false
)

@ -0,0 +1,10 @@
package com.yinuo.safetywatcher.watcher.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "gas_type")
data class GasType(
@PrimaryKey @ColumnInfo(name = "gas_type") var type: String
)

@ -6,12 +6,12 @@ import androidx.room.PrimaryKey
@Entity
data class Warning(
@PrimaryKey val id: Int,
@ColumnInfo(name = "gas_name") val gasName: String,
@ColumnInfo(name = "gas_value") val gasValue: Double,
@ColumnInfo(name = "unit") val unit: String,
@ColumnInfo(name = "threshold_low") val thresholdLow: Double,
@ColumnInfo(name = "threshold_high") val thresholdHigh: Double,
@ColumnInfo(name = "start_time") val startTime: Long,
@PrimaryKey var id: Int,
@ColumnInfo(name = "gas_name") var gasName: String,
@ColumnInfo(name = "gas_value") var gasValue: Double,
@ColumnInfo(name = "unit") var unit: String,
@ColumnInfo(name = "threshold_low") var thresholdLow: Double,
@ColumnInfo(name = "threshold_high") var thresholdHigh: Double,
@ColumnInfo(name = "start_time") var startTime: Long,
@ColumnInfo(name = "end_time") var endTime: Long = -1L,
)

@ -6,8 +6,12 @@ import com.common.commonlib.net.callback.RequestResultCallBack
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityCloudBinding
import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity
import com.yinuo.safetywatcher.watcher.db.DBUtils
import com.yinuo.safetywatcher.watcher.net.UploadFileApi
import com.yinuo.safetywatcher.xls.utils.PathUtils
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
class CloudActivity : NoOptionsActivity() {
private val mBinding: ActivityCloudBinding by lazy {
@ -28,19 +32,59 @@ class CloudActivity : NoOptionsActivity() {
override fun initView() {
mBinding.apply {
syncSensor.setOnClickListener { }
syncSensor.setOnClickListener {
uploadSensorData()
}
syncVedio.setOnClickListener {
val path = PathUtils.getExternalStorageDirectory() + "/test2.mp4"
uploadApi.singleUpload(path, System.currentTimeMillis(), object :
RequestResultCallBack<BaseResponse>() {
override fun onResult(result: BaseResponse) {
}
override fun onError(error: String?) {
}
})
uploadVideo()
}
syncOnce.setOnClickListener {
uploadOnece()
}
syncOnce.setOnClickListener { }
}
}
private fun uploadOnece() {
uploadSensorData()
uploadVideo()
}
private fun uploadVideo() {
//TODO 1.拿到云端最新数据时间
val cloudTime = 0L
// 2. 拿到待上传文件列表
val fileList = getFileList(cloudTime)
// 上传
fileList?.forEach {
uploadFile(it)
}
}
@OptIn(DelicateCoroutinesApi::class)
private fun uploadSensorData() {
GlobalScope.launch {
//TODO 1.拿到云端最新数据时间
val cloudTime = 0L
// 2. 查询本地数据库中该时间之后的数据
val gasList = DBUtils.gasDao().getAllBySyncFlagOrTime(false, cloudTime)
// 3. 上传数据给服务器
}
}
private fun getFileList(cloudTime: Long): List<String>? {
return null
}
private fun uploadFile(path: String) {
val path = PathUtils.getExternalStorageDirectory() + "/test2.mp4"
uploadApi.singleUpload(path, System.currentTimeMillis(), object :
RequestResultCallBack<BaseResponse>() {
override fun onResult(result: BaseResponse) {
}
override fun onError(error: String?) {
}
})
}
}

@ -3,6 +3,7 @@ package com.yinuo.safetywatcher.watcher.ui
import android.annotation.SuppressLint
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityQueryDataBinding
@ -10,8 +11,14 @@ import com.yinuo.safetywatcher.watcher.adapter.HistoryDataAdapter
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.bean.HistoryData
import com.yinuo.safetywatcher.watcher.constant.TimeStep
import com.yinuo.safetywatcher.watcher.db.DBUtils
import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.db.entity.GasType
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.view.CommonTopBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.Collections
class QueryDataActivity : BaseActivity() {
@ -103,9 +110,76 @@ class QueryDataActivity : BaseActivity() {
}
private fun queryData() {
val datas = mutableListOf<HistoryData>()
datas.add(HistoryData(0, "气体传感器"))
datas.add(HistoryData(0, "温度传感器"))
mAdapter.setData(datas)
lifecycleScope.launch {
// 根据步长,多个数据合一。合一步长
val step = when (timeStep) {
TimeStep.SECOND_30 -> 1
TimeStep.MINUTE_1 -> 2
TimeStep.MINUTE_3 -> 6
TimeStep.MINUTE_5 -> 10
else -> 1
}
// 全量数据
val gasDao = DBUtils.gasDao()
val gasList = gasDao.getAllByTime(startTime, endTime)
if (step == 1) {
launch(Dispatchers.Main) {
mAdapter.setData(gasList)
}
} else {
// 多气体分开创建list存储之后。 再分步
val gasTypeDao = DBUtils.gasTypeDao()
val gasTypes = gasTypeDao.getAll()
// 每种气体建立一个list
val gasMap = HashMap<String, MutableList<Gas>>()
// 预先创建分步合一之后的list
val gasNewMap = HashMap<String, MutableList<Gas>>()
gasTypes.forEach {
gasMap[it.type] = mutableListOf()
gasNewMap[it.type] = mutableListOf()
}
// 分开各个气体的数据
gasList.forEach {
val list = gasMap[it.gasName]
list?.add(it)
}
//根据步长分割数据填充新的列表
gasMap.forEach { (type, list) ->
val newMapList = gasNewMap[type]
var gasValue = 0.0
var startGas: Gas? = null
list.forEachIndexed { index, gas ->
// 不能整除的时候,最后一个特殊处理
if (list.size - 1 == index) {
if (gasValue != 0.0) {
startGas!!.gasValue = gasValue / (list.size % step)
newMapList?.add(startGas!!)
}
}
if (index % step == 0) {
if (gasValue != 0.0) {
startGas!!.gasValue = gasValue / step
newMapList?.add(startGas!!)
}
startGas = gas
gasValue = gas.gasValue
} else {
gasValue += gas.gasValue
}
}
}
var newList = mutableListOf<Gas>()
gasNewMap.forEach { t, u ->
newList.addAll(u)
}
newList.sortWith { o1, o2 ->
(o1.time - o2.time).toInt()
}
launch(Dispatchers.Main) {
mAdapter.setData(newList)
}
}
}
}
}
Loading…
Cancel
Save