///|
fn main {
let args = @env.args()
if args.contains("--help") || args.contains("-h") || args.length() <= 1 {
print_usage()
} else if args.contains("demo") {
run_demo()
} else if args.contains("decode") {
let text = if args.length() > 2 { args[2] } else { "" }
decode_hex(text)
} else {
println("unknown command")
print_usage()
}
}
///|
fn print_usage() -> Unit {
println("canctl - deterministic MoonBit CAN inspection tool")
println("usage:")
println(" moon run cmd/canctl -- demo")
println(" moon run cmd/canctl -- decode ")
}
///|
fn run_demo() -> Unit {
let classic = @can.data_frame(0x123, [0x10, 0x20, 0x30]) catch {
_ => {
println("failed to create demo frame")
return
}
}
let fd = @can.fd_frame(0x1ABCDE, Array::make(12, 0x5A), extended=true) catch {
_ => {
println("failed to create demo CAN-FD frame")
return
}
}
println(@can.frame_summary(classic))
println(@can.frame_to_hex(classic))
println(@can.frame_summary(fd))
println(@can.frame_to_hex(fd))
println(@can.frame_metrics([classic, fd]).to_text())
}
///|
fn decode_hex(text : String) -> Unit {
try @can.frame_from_hex(text) catch {
_ => println("invalid frame encoding")
} noraise {
frame => {
println(@can.frame_summary(frame))
println("round-trip=" + @can.frame_to_hex(frame))
}
}
}