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() {
|
||||
clear_buffer()
|
||||
|
||||
set_active_heap(MEMORY_DYNAMIC_HEAP)
|
||||
Memory.setHeap(Memory.DYNAMIC_HEAP)
|
||||
while (true) {
|
||||
val route = readRoute()
|
||||
blink()
|
||||
Leds.blink()
|
||||
go(route)
|
||||
blink()
|
||||
wait(PROGRAM_DURATION)
|
||||
clean_dynamic_heap()
|
||||
Leds.blink()
|
||||
Time.wait(1000)
|
||||
Memory.cleanDynamicHeap()
|
||||
}
|
||||
}
|
||||
|
||||
fun readRoute(): RouteRequest {
|
||||
val buffer = receiveByteArray()
|
||||
val buffer = Connection.receiveByteArray()
|
||||
val stream = CodedInputStream(buffer)
|
||||
val result = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)).parseFrom(stream).build()
|
||||
|
||||
@@ -39,6 +27,6 @@ fun writeRoute(route: RouteRequest) {
|
||||
|
||||
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() {
|
||||
init()
|
||||
/* init hardware */
|
||||
Time.init()
|
||||
Engine.init()
|
||||
Leds.init()
|
||||
Connection.init()
|
||||
|
||||
/* run test */
|
||||
echoProto()
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
class DirectionRequest private constructor (var command: DirectionRequest.Command, var sid: Int) {
|
||||
//========== Properties ===========
|
||||
//enum command = 1
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
class RouteRequest private constructor (var distances: IntArray, var angles: IntArray) {
|
||||
//========== Properties ===========
|
||||
//repeated int32 distances = 1
|
||||
@@ -16,14 +16,14 @@ fun go(request: RouteRequest) {
|
||||
val action = actions[j]
|
||||
|
||||
when (action) {
|
||||
RouteType.FORWARD.id -> engine_forward()
|
||||
RouteType.BACKWARD.id -> engine_backward()
|
||||
RouteType.LEFT.id -> engine_turn_left()
|
||||
RouteType.RIGHT.id -> engine_turn_right()
|
||||
RouteType.FORWARD.id -> Engine.forward()
|
||||
RouteType.BACKWARD.id -> Engine.backward()
|
||||
RouteType.LEFT.id -> Engine.left()
|
||||
RouteType.RIGHT.id -> Engine.right()
|
||||
}
|
||||
|
||||
wait(time)
|
||||
engine_stop()
|
||||
Time.wait(time)
|
||||
Engine.stop()
|
||||
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