feat: ir status
This commit is contained in:
parent
54bd378bf7
commit
756d611c31
|
@ -10,6 +10,10 @@ object CarCommands {
|
||||||
const val CMD_GET_BT_STATUS = 0x10u
|
const val CMD_GET_BT_STATUS = 0x10u
|
||||||
const val CMD_GET_SPIFFS_STATUS = 0x11u
|
const val CMD_GET_SPIFFS_STATUS = 0x11u
|
||||||
const val CMD_GET_DISTANCE = 0x12u
|
const val CMD_GET_DISTANCE = 0x12u
|
||||||
|
|
||||||
|
const val CMD_SET_NAME = 0xa1u
|
||||||
|
const val CMD_SET_PID = 0xa2u
|
||||||
|
|
||||||
const val CMD_MOTOR_MOVE_CONTROL = 0x20u
|
const val CMD_MOTOR_MOVE_CONTROL = 0x20u
|
||||||
const val CMD_MOTOR_STEER_CONTROL = 0x21u
|
const val CMD_MOTOR_STEER_CONTROL = 0x21u
|
||||||
const val CMD_MOTOR_SINGLE_CONTROL = 0x22u
|
const val CMD_MOTOR_SINGLE_CONTROL = 0x22u
|
||||||
|
@ -17,5 +21,6 @@ object CarCommands {
|
||||||
const val CMD_MOTOR_XYR_CONTROL = 0x24u
|
const val CMD_MOTOR_XYR_CONTROL = 0x24u
|
||||||
const val CMD_DEMO_PID = 0xf0u
|
const val CMD_DEMO_PID = 0xf0u
|
||||||
const val CMD_DEMO_PATH = 0xf1u
|
const val CMD_DEMO_PATH = 0xf1u
|
||||||
const val CMD_STATUS_MOTOR = 0xE0u
|
|
||||||
|
const val CMD_STATUS = 0xE0u
|
||||||
}
|
}
|
|
@ -4,8 +4,6 @@ import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.navigation.NavHostController
|
|
||||||
import icu.fur93.esp32_car.Route
|
|
||||||
import icu.fur93.esp32_car.repository.ConnectionState
|
import icu.fur93.esp32_car.repository.ConnectionState
|
||||||
import icu.fur93.esp32_car.ui.card.UnconnectedStatusCard
|
import icu.fur93.esp32_car.ui.card.UnconnectedStatusCard
|
||||||
import icu.fur93.esp32_car.ui.carditem.StatusCardInfo
|
import icu.fur93.esp32_car.ui.carditem.StatusCardInfo
|
||||||
|
|
|
@ -31,6 +31,7 @@ import icu.fur93.esp32_car.data.PreferencesDataStore
|
||||||
import icu.fur93.esp32_car.entity.LogDirection
|
import icu.fur93.esp32_car.entity.LogDirection
|
||||||
import icu.fur93.esp32_car.entity.LogEntry
|
import icu.fur93.esp32_car.entity.LogEntry
|
||||||
import icu.fur93.esp32_car.entity.car.CarState
|
import icu.fur93.esp32_car.entity.car.CarState
|
||||||
|
import icu.fur93.esp32_car.entity.car.InfraredState
|
||||||
import icu.fur93.esp32_car.entity.car.MotorState
|
import icu.fur93.esp32_car.entity.car.MotorState
|
||||||
|
|
||||||
// 蓝牙通信接口
|
// 蓝牙通信接口
|
||||||
|
@ -274,10 +275,23 @@ class BluetoothRepositoryImpl(
|
||||||
private fun parsePacket(packet: ByteArray) {
|
private fun parsePacket(packet: ByteArray) {
|
||||||
if (!isValidPacket(packet)) return
|
if (!isValidPacket(packet)) return
|
||||||
|
|
||||||
when (packet[2].toUByte().toUInt()) {
|
/**
|
||||||
|
包体 `01 0E E0 电机A_IN_1_2 电机A_PWM 电机B_IN_1_2 电机B_PWM 电机C_IN_1_2 电机C_PWM 电机D_IN_1_2 电机D_PWM 红外引脚数量 红外数据 FE`
|
||||||
|
|
||||||
// `01 0C E0 电机A_IN_1_2 电机A_PWM 电机B_IN_1_2 电机B_PWM 电机C_IN_1_2 电机C_PWM 电机D_IN_1_2 电机D_PWM FE`
|
| 数据 | 类型 | 表示 |
|
||||||
CarCommands.CMD_STATUS_MOTOR -> updateMotorStatus(packet)
|
| -------- | ---- | ---- |
|
||||||
|
| IN_1_2 | 无符号整数 | 按位表示 IN1 IN2 的值, 0000 00 IN2 IN1 |
|
||||||
|
| PWM | 无符号整数 | - |
|
||||||
|
| 红外引脚数量 | 无符号整数 | - |
|
||||||
|
| 红外数据 | 无符号整数 | 按位表示红外循迹模块数据, 0001 1111 |
|
||||||
|
|
||||||
|
示例 `01 0E E0 01 FF 02 FF 02 FF 01 FF 05 1F FE`
|
||||||
|
**/
|
||||||
|
|
||||||
|
when (packet[2].toUByte().toUInt()) {
|
||||||
|
CarCommands.CMD_STATUS -> {
|
||||||
|
updateStatus(packet)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,13 +301,14 @@ class BluetoothRepositoryImpl(
|
||||||
packet[packet[1].toUByte()
|
packet[packet[1].toUByte()
|
||||||
.toInt() - 1].toUByte() == CarCommands.PACKET_R_TAIL.toUByte()
|
.toInt() - 1].toUByte() == CarCommands.PACKET_R_TAIL.toUByte()
|
||||||
|
|
||||||
private fun updateMotorStatus(packet: ByteArray) {
|
private fun updateStatus(packet: ByteArray) {
|
||||||
val data = packet.sliceArray(3 until packet[1].toUByte().toInt() - 1)
|
val data = packet.sliceArray(3 until packet[1].toUByte().toInt() - 1)
|
||||||
_carState.value = _carState.value.copy(
|
_carState.value = _carState.value.copy(
|
||||||
motorAState = createMotorState(data, 0),
|
motorAState = createMotorState(data, 0),
|
||||||
motorBState = createMotorState(data, 2),
|
motorBState = createMotorState(data, 2),
|
||||||
motorCState = createMotorState(data, 4),
|
motorCState = createMotorState(data, 4),
|
||||||
motorDState = createMotorState(data, 6)
|
motorDState = createMotorState(data, 6),
|
||||||
|
infraredState = createInfraredState(data[8].toUByte().toInt(), data[9].toUByte())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,6 +318,11 @@ class BluetoothRepositoryImpl(
|
||||||
in2 = (data[offset].toUByte().toUInt() shr 1) and 1u
|
in2 = (data[offset].toUByte().toUInt() shr 1) and 1u
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private fun createInfraredState(irPinCount: Int, irData: UByte) = InfraredState(
|
||||||
|
enable = true,
|
||||||
|
statusList = irData.toString(2).padStart(irPinCount, '0').reversed().map { if (it == '1') 1u else 0u }
|
||||||
|
)
|
||||||
|
|
||||||
// 断开连接方法
|
// 断开连接方法
|
||||||
@SuppressLint("MissingPermission")
|
@SuppressLint("MissingPermission")
|
||||||
fun disconnect() {
|
fun disconnect() {
|
||||||
|
|
Loading…
Reference in New Issue