car_fmw: carhw stdlib
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
object Debug {
|
||||||
|
var PROGRAM_DURATION = 1000
|
||||||
|
|
||||||
|
fun echoUsbTest() {
|
||||||
|
val command = Connection.receiveInt()
|
||||||
|
Connection.sendInt(command)
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun simpleRouteTest() {
|
||||||
|
Engine.forward()
|
||||||
|
Leds.blink()
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
|
||||||
|
Engine.right()
|
||||||
|
Leds.blink()
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
|
||||||
|
Engine.backward()
|
||||||
|
Leds.blink()
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
|
||||||
|
Engine.left()
|
||||||
|
Leds.blink()
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun blinkTest() {
|
||||||
|
Leds.blink()
|
||||||
|
Time.wait(PROGRAM_DURATION)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
fun blinkProgramm() {
|
|
||||||
while (true) {
|
|
||||||
blink()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+7
-19
@@ -1,31 +1,19 @@
|
|||||||
fun echoUsb() {
|
|
||||||
clear_buffer()
|
|
||||||
while (true) {
|
|
||||||
val command = receive_int()
|
|
||||||
send_int(command)
|
|
||||||
|
|
||||||
blink()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fun echoProto() {
|
fun echoProto() {
|
||||||
clear_buffer()
|
|
||||||
|
|
||||||
set_active_heap(MEMORY_DYNAMIC_HEAP)
|
Memory.setHeap(Memory.DYNAMIC_HEAP)
|
||||||
while (true) {
|
while (true) {
|
||||||
val route = readRoute()
|
val route = readRoute()
|
||||||
blink()
|
Leds.blink()
|
||||||
go(route)
|
go(route)
|
||||||
blink()
|
Leds.blink()
|
||||||
wait(PROGRAM_DURATION)
|
Time.wait(1000)
|
||||||
clean_dynamic_heap()
|
Memory.cleanDynamicHeap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readRoute(): RouteRequest {
|
fun readRoute(): RouteRequest {
|
||||||
val buffer = receiveByteArray()
|
val buffer = Connection.receiveByteArray()
|
||||||
val stream = CodedInputStream(buffer)
|
val stream = CodedInputStream(buffer)
|
||||||
val result = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)).parseFrom(stream).build()
|
val result = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)).parseFrom(stream).build()
|
||||||
|
|
||||||
@@ -39,6 +27,6 @@ fun writeRoute(route: RouteRequest) {
|
|||||||
|
|
||||||
route.writeTo(stream)
|
route.writeTo(stream)
|
||||||
|
|
||||||
sendByteArray(buffer)
|
Connection.sendByteArray(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
external fun car_user_btn_init(handler: () -> Unit)
|
||||||
|
external fun car_user_btn_is_pushed(): Boolean
|
||||||
|
external fun EXTI0_IRQHandler()
|
||||||
|
|
||||||
|
object Button {
|
||||||
|
fun setCallback(handler: () -> Unit) {
|
||||||
|
car_user_btn_init(handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isPushed(): Boolean = car_user_btn_is_pushed()
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
external fun car_conn_init()
|
||||||
|
external fun car_conn_rcv_buf_clear()
|
||||||
|
|
||||||
|
external fun car_conn_snd_byte(b: Byte)
|
||||||
|
external fun car_conn_snd_int(i: Int)
|
||||||
|
external fun car_conn_snd_buf(size: Int, pointer: Int)
|
||||||
|
|
||||||
|
external fun car_conn_rcv_byte(): Byte
|
||||||
|
external fun car_conn_rcv_int(): Int
|
||||||
|
external fun car_conn_rcv_buf(size: Int, pointer: Int)
|
||||||
|
|
||||||
|
object Connection {
|
||||||
|
fun init() {
|
||||||
|
car_conn_init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clearBuffer() {
|
||||||
|
car_conn_rcv_buf_clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun receiveInt(): Int = car_conn_rcv_int()
|
||||||
|
fun receiveByte(): Byte = car_conn_rcv_byte()
|
||||||
|
|
||||||
|
fun sendInt(n: Int) {
|
||||||
|
car_conn_snd_int(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendByte(b: Byte) {
|
||||||
|
car_conn_snd_byte(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun receiveByteArray(): ByteArray {
|
||||||
|
val result = ByteArray(car_conn_rcv_int())
|
||||||
|
car_conn_rcv_buf(result.size, result.data)
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendByteArray(array: ByteArray) {
|
||||||
|
car_conn_snd_int(array.size)
|
||||||
|
car_conn_rcv_buf(array.size, array.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
external fun car_engine_init()
|
||||||
|
|
||||||
|
external fun car_engine_stop()
|
||||||
|
external fun car_engine_forward()
|
||||||
|
external fun car_engine_backward()
|
||||||
|
external fun car_engine_turn_left()
|
||||||
|
external fun car_engine_turn_right()
|
||||||
|
|
||||||
|
object Engine {
|
||||||
|
fun init() {
|
||||||
|
car_engine_init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop() {
|
||||||
|
car_engine_stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun forward() {
|
||||||
|
car_engine_forward()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun backward() {
|
||||||
|
car_engine_backward()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun left() {
|
||||||
|
car_engine_turn_left()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun right() {
|
||||||
|
car_engine_turn_right()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
external fun car_leds_init()
|
||||||
|
external fun car_leds_clear_all()
|
||||||
|
external fun car_led_set(led: Int, on: Boolean)
|
||||||
|
|
||||||
|
object Leds {
|
||||||
|
val BLINK_DURATION: Int = 1000
|
||||||
|
val GREEN = 0
|
||||||
|
val ORANGE = 1
|
||||||
|
val RED = 2
|
||||||
|
val BLUE = 3
|
||||||
|
|
||||||
|
fun init() {
|
||||||
|
car_leds_init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun set(led: Int, on: Boolean) {
|
||||||
|
car_led_set(led, on)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun switchAll(on: Boolean) {
|
||||||
|
car_led_set(GREEN, on)
|
||||||
|
car_led_set(BLUE, on)
|
||||||
|
car_led_set(RED, on)
|
||||||
|
car_led_set(ORANGE, on)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun blink() {
|
||||||
|
switchAll(true)
|
||||||
|
Time.wait(BLINK_DURATION)
|
||||||
|
switchAll(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
external fun set_active_heap(heap: Int)
|
||||||
|
external fun clean_dynamic_heap()
|
||||||
|
|
||||||
|
object Memory {
|
||||||
|
val STATIC_HEAP = 0
|
||||||
|
val DYNAMIC_HEAP = 1
|
||||||
|
|
||||||
|
fun setHeap(heap: Int) {
|
||||||
|
set_active_heap(heap)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cleanDynamicHeap() {
|
||||||
|
clean_dynamic_heap()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
external fun car_time_init()
|
||||||
|
external fun car_time_wait(msec: Int)
|
||||||
|
external fun car_time_get_timestamp(): Int
|
||||||
|
|
||||||
|
object Time {
|
||||||
|
fun init() {
|
||||||
|
car_time_init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun wait(msec: Int) {
|
||||||
|
car_time_wait(msec)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTimestamp(): Int = car_time_get_timestamp()
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
external fun VCP_init()
|
|
||||||
external fun clear_buffer()
|
|
||||||
|
|
||||||
external fun send_int(i: Int)
|
|
||||||
external fun send_buffer(size: Int, pointer: Int)
|
|
||||||
|
|
||||||
external fun receive_int(): Int
|
|
||||||
external fun receive_buffer(size: Int, pointer: Int)
|
|
||||||
|
|
||||||
fun receiveByteArray(): ByteArray {
|
|
||||||
val result = ByteArray(receive_int())
|
|
||||||
receive_buffer(result.size, result.data)
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
fun sendByteArray(arr: ByteArray) {
|
|
||||||
send_buffer(arr.size, arr.data)
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
|
|
||||||
external fun engine_init()
|
|
||||||
|
|
||||||
external fun engine_stop()
|
|
||||||
external fun engine_forward()
|
|
||||||
external fun engine_backward()
|
|
||||||
external fun engine_turn_left()
|
|
||||||
external fun engine_turn_right()
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
|
|
||||||
fun init() {
|
|
||||||
time_init()
|
|
||||||
engine_init()
|
|
||||||
leds_init()
|
|
||||||
VCP_init()
|
|
||||||
clear_buffer()
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
external fun leds_init()
|
|
||||||
external fun leds_clear_all()
|
|
||||||
external fun led_set(led: Int, on: Boolean)
|
|
||||||
|
|
||||||
val LED_GREEN = 0
|
|
||||||
val LED_ORANGE = 1
|
|
||||||
val LED_RED = 2
|
|
||||||
val LED_BLUE = 3
|
|
||||||
|
|
||||||
val BLINK_DURATION: Int = 1000
|
|
||||||
|
|
||||||
fun led_on() {
|
|
||||||
led_set(LED_GREEN, true)
|
|
||||||
led_set(LED_BLUE, true)
|
|
||||||
led_set(LED_RED, true)
|
|
||||||
led_set(LED_ORANGE, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun led_off() {
|
|
||||||
led_set(LED_GREEN, false)
|
|
||||||
led_set(LED_BLUE, false)
|
|
||||||
led_set(LED_RED, false)
|
|
||||||
led_set(LED_ORANGE, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun blink() {
|
|
||||||
led_on()
|
|
||||||
wait(BLINK_DURATION)
|
|
||||||
led_off()
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
val MEMORY_STATIC_HEAP = 0
|
|
||||||
val MEMORY_DYNAMIC_HEAP = 1
|
|
||||||
|
|
||||||
external fun set_active_heap(heap: Int)
|
|
||||||
external fun clean_dynamic_heap()
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
external fun time_init()
|
|
||||||
|
|
||||||
external fun wait(msec: Int)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
external fun user_btn_init(handler: () -> Unit)
|
|
||||||
external fun user_btn_is_pushed(): Boolean
|
|
||||||
external fun EXTI0_IRQHandler()
|
|
||||||
+7
-16
@@ -1,20 +1,11 @@
|
|||||||
|
|
||||||
|
|
||||||
val PROGRAM_DURATION: Int = 1000
|
|
||||||
|
|
||||||
val ROTATE_TIME = 500
|
|
||||||
val STABILIZATION_TIME = 100
|
|
||||||
|
|
||||||
fun rotateLeftHack() {
|
|
||||||
engine_turn_left()
|
|
||||||
wait(ROTATE_TIME)
|
|
||||||
engine_forward()
|
|
||||||
wait(STABILIZATION_TIME)
|
|
||||||
engine_backward()
|
|
||||||
wait(STABILIZATION_TIME)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
init()
|
/* init hardware */
|
||||||
|
Time.init()
|
||||||
|
Engine.init()
|
||||||
|
Leds.init()
|
||||||
|
Connection.init()
|
||||||
|
|
||||||
|
/* run test */
|
||||||
echoProto()
|
echoProto()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
class DirectionRequest private constructor (var command: DirectionRequest.Command, var sid: Int) {
|
class DirectionRequest private constructor (var command: DirectionRequest.Command, var sid: Int) {
|
||||||
//========== Properties ===========
|
//========== Properties ===========
|
||||||
//enum command = 1
|
//enum command = 1
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
class RouteRequest private constructor (var distances: IntArray, var angles: IntArray) {
|
class RouteRequest private constructor (var distances: IntArray, var angles: IntArray) {
|
||||||
//========== Properties ===========
|
//========== Properties ===========
|
||||||
//repeated int32 distances = 1
|
//repeated int32 distances = 1
|
||||||
@@ -16,14 +16,14 @@ fun go(request: RouteRequest) {
|
|||||||
val action = actions[j]
|
val action = actions[j]
|
||||||
|
|
||||||
when (action) {
|
when (action) {
|
||||||
RouteType.FORWARD.id -> engine_forward()
|
RouteType.FORWARD.id -> Engine.forward()
|
||||||
RouteType.BACKWARD.id -> engine_backward()
|
RouteType.BACKWARD.id -> Engine.backward()
|
||||||
RouteType.LEFT.id -> engine_turn_left()
|
RouteType.LEFT.id -> Engine.left()
|
||||||
RouteType.RIGHT.id -> engine_turn_right()
|
RouteType.RIGHT.id -> Engine.right()
|
||||||
}
|
}
|
||||||
|
|
||||||
wait(time)
|
Time.wait(time)
|
||||||
engine_stop()
|
Engine.stop()
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
fun simpleRoute() {
|
|
||||||
while (true) {
|
|
||||||
engine_forward()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
blink()
|
|
||||||
|
|
||||||
engine_turn_right()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
blink()
|
|
||||||
|
|
||||||
engine_backward()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
blink()
|
|
||||||
|
|
||||||
engine_turn_left()
|
|
||||||
wait(PROGRAM_DURATION)
|
|
||||||
blink()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user