update control logic

This commit is contained in:
Zhengyu Peng 2022-02-27 11:40:58 -05:00
parent e75a1c983d
commit 83c6621482

View File

@ -96,6 +96,9 @@ class ControlActivity : AppCompatActivity() {
private const val CMD_ROTATEZ = "rotatez:" private const val CMD_ROTATEZ = "rotatez:"
private const val CMD_TWIST = "twist:" private const val CMD_TWIST = "twist:"
private const val CTRL_LEFT = 1
private const val CTRL_RIGHT = 0
} }
private var rightWidth = 0 private var rightWidth = 0
@ -124,6 +127,8 @@ class ControlActivity : AppCompatActivity() {
private var rightControlImage: ImageView? = null private var rightControlImage: ImageView? = null
private var leftControlImage: ImageView? = null private var leftControlImage: ImageView? = null
private var controlImg = CTRL_RIGHT
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -163,7 +168,7 @@ class ControlActivity : AppCompatActivity() {
override fun onPreDraw(): Boolean { override fun onPreDraw(): Boolean {
leftControlImage!!.viewTreeObserver.removeOnPreDrawListener(this) leftControlImage!!.viewTreeObserver.removeOnPreDrawListener(this)
leftHeight = leftControlImage!!.measuredHeight leftHeight = leftControlImage!!.measuredHeight
leftWidth = 2*leftHeight/3 leftWidth = 2 * leftHeight / 3
return true return true
} }
}) })
@ -171,107 +176,127 @@ class ControlActivity : AppCompatActivity() {
rightControlImage!!.setOnTouchListener( rightControlImage!!.setOnTouchListener(
object : View.OnTouchListener { object : View.OnTouchListener {
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
val touchX = motionEvent.x when (motionEvent.action) {
val touchY = motionEvent.y MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN -> {
if (touchX < 0) { if (motionEvent.action == MotionEvent.ACTION_DOWN) {
return false controlImg = CTRL_RIGHT
} }
if (touchY < 0) { if (controlImg == CTRL_RIGHT) {
return false val touchX = motionEvent.x
} val touchY = motionEvent.y
if (touchX < 0) {
return false
}
if (touchY < 0) {
return false
}
val coorX = touchX - rightWidth / 2 val coorX = touchX - rightWidth / 2
val coorY = touchY - rightHeight / 2 val coorY = touchY - rightHeight / 2
val length = sqrt(coorX.pow(2) + coorY.pow(2)) val length = sqrt(coorX.pow(2) + coorY.pow(2))
if (length < rightRadius / 4) { if (length < rightRadius / 4) {
if (currentState != CMD_STANDBY) { if (currentState != CMD_STANDBY) {
sendMessageAsync(CMD_STANDBY) sendMessageAsync(CMD_STANDBY)
currentState = CMD_STANDBY currentState = CMD_STANDBY
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_standby) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_standby)
leftControlImage!!.setImageResource(R.drawable.ic_control_left) leftControlImage!!.setImageResource(R.drawable.ic_control_left)
} }
} else if (length >= rightRadius / 4 && length < 2 * rightRadius / 3) { } else if (length >= rightRadius / 4 && length < 2 * rightRadius / 3) {
val angle = atan2(coorY, coorX) val angle = atan2(coorY, coorX)
if (angle > -7 * PI / 8 && angle < -5 * PI / 8) { if (angle > -7 * PI / 8 && angle < -5 * PI / 8) {
if (currentState != CMD_WALK_L45) { if (currentState != CMD_WALK_L45) {
sendMessageAsync(CMD_WALK_L45) sendMessageAsync(CMD_WALK_L45)
currentState = CMD_WALK_L45 currentState = CMD_WALK_L45
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l45) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l45)
} }
} else if (angle > -5 * PI / 8 && angle < -3 * PI / 8) { } else if (angle > -5 * PI / 8 && angle < -3 * PI / 8) {
if (currentState != CMD_WALK_0) { if (currentState != CMD_WALK_0) {
sendMessageAsync(CMD_WALK_0) sendMessageAsync(CMD_WALK_0)
currentState = CMD_WALK_0 currentState = CMD_WALK_0
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_0) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_0)
} }
} else if (angle > -3 * PI / 8 && angle <= -PI / 8) { } else if (angle > -3 * PI / 8 && angle <= -PI / 8) {
if (currentState != CMD_WALK_R45) { if (currentState != CMD_WALK_R45) {
sendMessageAsync(CMD_WALK_R45) sendMessageAsync(CMD_WALK_R45)
currentState = CMD_WALK_R45 currentState = CMD_WALK_R45
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r45) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r45)
} }
} else if (angle > -PI / 8 && angle <= PI / 8) { } else if (angle > -PI / 8 && angle <= PI / 8) {
if (currentState != CMD_WALK_R90) { if (currentState != CMD_WALK_R90) {
sendMessageAsync(CMD_WALK_R90) sendMessageAsync(CMD_WALK_R90)
currentState = CMD_WALK_R90 currentState = CMD_WALK_R90
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r90) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r90)
} }
} else if (angle > PI / 8 && angle <= 3 * PI / 8) { } else if (angle > PI / 8 && angle <= 3 * PI / 8) {
if (currentState != CMD_WALK_R135) { if (currentState != CMD_WALK_R135) {
sendMessageAsync(CMD_WALK_R135) sendMessageAsync(CMD_WALK_R135)
currentState = CMD_WALK_R135 currentState = CMD_WALK_R135
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r135) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_r135)
} }
} else if (angle > 3 * PI / 8 && angle <= 5 * PI / 8) { } else if (angle > 3 * PI / 8 && angle <= 5 * PI / 8) {
if (currentState != CMD_WALK_180) { if (currentState != CMD_WALK_180) {
sendMessageAsync(CMD_WALK_180) sendMessageAsync(CMD_WALK_180)
currentState = CMD_WALK_180 currentState = CMD_WALK_180
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_180) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_180)
} }
} else if (angle > 5 * PI / 8 && angle <= 7 * PI / 8) { } else if (angle > 5 * PI / 8 && angle <= 7 * PI / 8) {
if (currentState != CMD_WALK_L135) { if (currentState != CMD_WALK_L135) {
sendMessageAsync(CMD_WALK_L135) sendMessageAsync(CMD_WALK_L135)
currentState = CMD_WALK_L135 currentState = CMD_WALK_L135
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l135) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l135)
} }
} else { } else {
if (currentState != CMD_WALK_L90) { if (currentState != CMD_WALK_L90) {
sendMessageAsync(CMD_WALK_L90) sendMessageAsync(CMD_WALK_L90)
currentState = CMD_WALK_L90 currentState = CMD_WALK_L90
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l90) rightControlImage!!.setImageResource(R.drawable.ic_control_circle_walk_l90)
}
}
leftControlImage!!.setImageResource(R.drawable.ic_control_left)
} else if (length >= 2 * rightRadius / 3 && length < rightRadius) {
val angle = atan2(coorY, coorX)
if (angle > -PI / 4 && angle <= PI / 4) {
if (currentState != CMD_TURNRIGHT) {
sendMessageAsync(CMD_TURNRIGHT)
currentState = CMD_TURNRIGHT
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_turnright)
}
} else if (angle > PI / 4 && angle <= 3 * PI / 4) {
if (currentState != CMD_FASTBACKWARD) {
sendMessageAsync(CMD_FASTBACKWARD)
currentState = CMD_FASTBACKWARD
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_fastbackward)
}
} else if (angle > -3 * PI / 4 && angle < -PI / 4) {
if (currentState != CMD_FASTFORWARD) {
sendMessageAsync(CMD_FASTFORWARD)
currentState = CMD_FASTFORWARD
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_fastforward)
}
} else {
if (currentState != CMD_TURNLEFT) {
sendMessageAsync(CMD_TURNLEFT)
currentState = CMD_TURNLEFT
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_turnleft)
}
}
leftControlImage!!.setImageResource(R.drawable.ic_control_left)
}
} }
} }
leftControlImage!!.setImageResource(R.drawable.ic_control_left) MotionEvent.ACTION_UP -> {
} else if (length >= 2 * rightRadius / 3 && length < rightRadius) { if (controlImg == CTRL_RIGHT) {
val angle = atan2(coorY, coorX) sendMessageAsync(CMD_STANDBY)
if (angle > -PI / 4 && angle <= PI / 4) { currentState = CMD_STANDBY
if (currentState != CMD_TURNRIGHT) { rightControlImage!!.setImageResource(R.drawable.ic_control_circle_standby)
sendMessageAsync(CMD_TURNRIGHT)
currentState = CMD_TURNRIGHT leftControlImage!!.setImageResource(R.drawable.ic_control_left)
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_turnright)
} controlImg = CTRL_LEFT
} else if (angle > PI / 4 && angle <= 3 * PI / 4) {
if (currentState != CMD_FASTBACKWARD) {
sendMessageAsync(CMD_FASTBACKWARD)
currentState = CMD_FASTBACKWARD
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_fastbackward)
}
} else if (angle > -3 * PI / 4 && angle < -PI / 4) {
if (currentState != CMD_FASTFORWARD) {
sendMessageAsync(CMD_FASTFORWARD)
currentState = CMD_FASTFORWARD
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_fastforward)
}
} else {
if (currentState != CMD_TURNLEFT) {
sendMessageAsync(CMD_TURNLEFT)
currentState = CMD_TURNLEFT
rightControlImage!!.setImageResource(R.drawable.ic_control_circle_turnleft)
} }
} }
leftControlImage!!.setImageResource(R.drawable.ic_control_left)
} }
return true return true
} }
@ -281,57 +306,77 @@ class ControlActivity : AppCompatActivity() {
leftControlImage!!.setOnTouchListener( leftControlImage!!.setOnTouchListener(
object : View.OnTouchListener { object : View.OnTouchListener {
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
val touchX = motionEvent.x when (motionEvent.action) {
val touchY = motionEvent.y MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN -> {
if (touchX < 0 || touchX > leftWidth) { if (motionEvent.action == MotionEvent.ACTION_DOWN) {
return false controlImg = CTRL_LEFT
} }
if (touchY < 0 || touchY > leftHeight) { if (controlImg == CTRL_LEFT) {
return false val touchX = motionEvent.x
} val touchY = motionEvent.y
if (touchX < 0 || touchX > leftWidth) {
return false
}
if (touchY < 0 || touchY > leftHeight) {
return false
}
if (touchX < leftWidth/2){ if (touchX < leftWidth / 2) {
if(touchY< leftHeight/3){ if (touchY < leftHeight / 3) {
if (currentState != CMD_ROTATEY) { if (currentState != CMD_ROTATEY) {
sendMessageAsync(CMD_ROTATEY) sendMessageAsync(CMD_ROTATEY)
currentState = CMD_ROTATEY currentState = CMD_ROTATEY
leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatey) leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatey)
} }
} else if( touchY >= leftHeight/3 && touchY < 2*leftHeight/3) { } else if (touchY >= leftHeight / 3 && touchY < 2 * leftHeight / 3) {
if (currentState != CMD_ROTATEX) { if (currentState != CMD_ROTATEX) {
sendMessageAsync(CMD_ROTATEX) sendMessageAsync(CMD_ROTATEX)
currentState = CMD_ROTATEX currentState = CMD_ROTATEX
leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatex) leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatex)
} }
} else { } else {
if (currentState != CMD_ROTATEZ) { if (currentState != CMD_ROTATEZ) {
sendMessageAsync(CMD_ROTATEZ) sendMessageAsync(CMD_ROTATEZ)
currentState = CMD_ROTATEZ currentState = CMD_ROTATEZ
leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatez) leftControlImage!!.setImageResource(R.drawable.ic_control_left_rotatez)
}
}
} else {
if (touchY < leftHeight / 3) {
if (currentState != CMD_CLIMBFORWARD) {
sendMessageAsync(CMD_CLIMBFORWARD)
currentState = CMD_CLIMBFORWARD
leftControlImage!!.setImageResource(R.drawable.ic_control_left_climb_forward)
}
} else if (touchY >= leftHeight / 3 && touchY < 2 * leftHeight / 3) {
if (currentState != CMD_TWIST) {
sendMessageAsync(CMD_TWIST)
currentState = CMD_TWIST
leftControlImage!!.setImageResource(R.drawable.ic_control_left_twist)
}
} else {
if (currentState != CMD_CLIMBBACKWARD) {
sendMessageAsync(CMD_CLIMBBACKWARD)
currentState = CMD_CLIMBBACKWARD
leftControlImage!!.setImageResource(R.drawable.ic_control_left_climb_backward)
}
}
}
rightControlImage!!.setImageResource(R.drawable.ic_control_circle)
} }
} }
} else { MotionEvent.ACTION_UP -> {
if(touchY< leftHeight/3){ if (controlImg == CTRL_LEFT) {
if (currentState != CMD_CLIMBFORWARD) { sendMessageAsync(CMD_STANDBY)
sendMessageAsync(CMD_CLIMBFORWARD) currentState = CMD_STANDBY
currentState = CMD_CLIMBFORWARD rightControlImage!!.setImageResource(R.drawable.ic_control_circle_standby)
leftControlImage!!.setImageResource(R.drawable.ic_control_left_climb_forward)
} leftControlImage!!.setImageResource(R.drawable.ic_control_left)
} else if( touchY >= leftHeight/3 && touchY < 2*leftHeight/3) {
if (currentState != CMD_TWIST) { controlImg = CTRL_RIGHT
sendMessageAsync(CMD_TWIST)
currentState = CMD_TWIST
leftControlImage!!.setImageResource(R.drawable.ic_control_left_twist)
}
} else {
if (currentState != CMD_CLIMBBACKWARD) {
sendMessageAsync(CMD_CLIMBBACKWARD)
currentState = CMD_CLIMBBACKWARD
leftControlImage!!.setImageResource(R.drawable.ic_control_left_climb_backward)
} }
} }
} }
rightControlImage!!.setImageResource(R.drawable.ic_control_circle)
return true return true
} }
} }
@ -458,7 +503,8 @@ class ControlActivity : AppCompatActivity() {
"Unable to connect to the Hexapod." "Unable to connect to the Hexapod."
) )
alert.setOnCancelListener { finish() } alert.setOnCancelListener { finish() }
alert.setButton(AlertDialog.BUTTON_POSITIVE, alert.setButton(
AlertDialog.BUTTON_POSITIVE,
"OK" "OK"
) { _, _ -> finish() } ) { _, _ -> finish() }
} }