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

main
xiaowusky 2 years ago
parent 36c61b30c2
commit 7014cfae07

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

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

@ -5,14 +5,21 @@ import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import com.common.commonlib.CommonApplication import com.common.commonlib.CommonApplication
import com.yinuo.safetywatcher.watcher.db.dao.GasDao 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.dao.WarningDao
import com.yinuo.safetywatcher.watcher.db.entity.Gas import com.yinuo.safetywatcher.watcher.db.entity.Gas
import com.yinuo.safetywatcher.watcher.db.entity.GasType
import com.yinuo.safetywatcher.watcher.db.entity.Warning 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 class AppDatabase : RoomDatabase() {
abstract fun warningDao(): WarningDao abstract fun warningDao(): WarningDao
abstract fun gasDao(): GasDao abstract fun gasDao(): GasDao
abstract fun gasTypeDao(): GasTypeDao
} }
object DBUtils { object DBUtils {
@ -30,4 +37,8 @@ object DBUtils {
fun gasDao(): GasDao { fun gasDao(): GasDao {
return db.gasDao() return db.gasDao()
} }
fun gasTypeDao(): GasTypeDao {
return db.gasTypeDao()
}
} }

@ -11,8 +11,11 @@ interface GasDao {
@Query("SELECT * FROM gas") @Query("SELECT * FROM gas")
suspend fun getAll(): List<Gas> suspend fun getAll(): List<Gas>
@Query("SELECT * FROM gas WHERE gas_name IS :name AND time BETWEEN :startTime AND :endTime") @Query("SELECT * FROM gas WHERE sync_flag IS :flag OR time >= :startTime")
suspend fun findByName(name: String, startTime: Long, endTime: Long): List<Gas> 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 @Insert
suspend fun insertAll(vararg gases: Gas) 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 @Entity
data class Gas( data class Gas(
@PrimaryKey val id: Int, @PrimaryKey var id: Int,
@ColumnInfo(name = "time") val time: Long, @ColumnInfo(name = "time") var time: Long,
@ColumnInfo(name = "gas_name") val gasName: String, @ColumnInfo(name = "gas_name") var gasName: String,
@ColumnInfo(name = "gas_value") val gasValue: Double, @ColumnInfo(name = "gas_value") var gasValue: Double,
@ColumnInfo(name = "unit") val unit: String, @ColumnInfo(name = "unit") var unit: String,
@ColumnInfo(name = "threshold_low") val thresholdLow: Double, @ColumnInfo(name = "threshold_low") var thresholdLow: Double,
@ColumnInfo(name = "threshold_high") val thresholdHigh: Double, @ColumnInfo(name = "threshold_high") var thresholdHigh: Double,
@ColumnInfo(name = "sync_flag") val syncFlag: Boolean = false @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 @Entity
data class Warning( data class Warning(
@PrimaryKey val id: Int, @PrimaryKey var id: Int,
@ColumnInfo(name = "gas_name") val gasName: String, @ColumnInfo(name = "gas_name") var gasName: String,
@ColumnInfo(name = "gas_value") val gasValue: Double, @ColumnInfo(name = "gas_value") var gasValue: Double,
@ColumnInfo(name = "unit") val unit: String, @ColumnInfo(name = "unit") var unit: String,
@ColumnInfo(name = "threshold_low") val thresholdLow: Double, @ColumnInfo(name = "threshold_low") var thresholdLow: Double,
@ColumnInfo(name = "threshold_high") val thresholdHigh: Double, @ColumnInfo(name = "threshold_high") var thresholdHigh: Double,
@ColumnInfo(name = "start_time") val startTime: Long, @ColumnInfo(name = "start_time") var startTime: Long,
@ColumnInfo(name = "end_time") var endTime: Long = -1L, @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.R
import com.yinuo.safetywatcher.databinding.ActivityCloudBinding import com.yinuo.safetywatcher.databinding.ActivityCloudBinding
import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity 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.watcher.net.UploadFileApi
import com.yinuo.safetywatcher.xls.utils.PathUtils import com.yinuo.safetywatcher.xls.utils.PathUtils
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
class CloudActivity : NoOptionsActivity() { class CloudActivity : NoOptionsActivity() {
private val mBinding: ActivityCloudBinding by lazy { private val mBinding: ActivityCloudBinding by lazy {
@ -28,19 +32,59 @@ class CloudActivity : NoOptionsActivity() {
override fun initView() { override fun initView() {
mBinding.apply { mBinding.apply {
syncSensor.setOnClickListener { } syncSensor.setOnClickListener {
uploadSensorData()
}
syncVedio.setOnClickListener { syncVedio.setOnClickListener {
val path = PathUtils.getExternalStorageDirectory() + "/test2.mp4" uploadVideo()
uploadApi.singleUpload(path, System.currentTimeMillis(), object : }
RequestResultCallBack<BaseResponse>() { syncOnce.setOnClickListener {
override fun onResult(result: BaseResponse) { uploadOnece()
}
override fun onError(error: String?) {
}
})
} }
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.annotation.SuppressLint
import android.view.View import android.view.View
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityQueryDataBinding 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.base.BaseActivity
import com.yinuo.safetywatcher.watcher.bean.HistoryData import com.yinuo.safetywatcher.watcher.bean.HistoryData
import com.yinuo.safetywatcher.watcher.constant.TimeStep 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.utils.DateUtils
import com.yinuo.safetywatcher.watcher.view.CommonTopBar import com.yinuo.safetywatcher.watcher.view.CommonTopBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.Collections
class QueryDataActivity : BaseActivity() { class QueryDataActivity : BaseActivity() {
@ -103,9 +110,76 @@ class QueryDataActivity : BaseActivity() {
} }
private fun queryData() { private fun queryData() {
val datas = mutableListOf<HistoryData>() lifecycleScope.launch {
datas.add(HistoryData(0, "气体传感器")) // 根据步长,多个数据合一。合一步长
datas.add(HistoryData(0, "温度传感器")) val step = when (timeStep) {
mAdapter.setData(datas) 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